Thread: [Squirrel-sql-commits] sql12/plugins/codecompletion/src/net/sourceforge/squirrel_sql/plugins/codecom
A Java SQL client for any JDBC compliant database
Brought to you by:
colbell,
gerdwagner
From: Gerd W. <ger...@us...> - 2004-10-25 20:51:08
|
Update of /cvsroot/squirrel-sql/sql12/plugins/codecompletion/src/net/sourceforge/squirrel_sql/plugins/codecompletion/completionfunctions In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24865 Added Files: AbstractJoin.java CodeCompletionFunction.java GenericCodeCompletionInfo.java InnerJoin.java Join.java LeftJoin.java RightJoin.java TestCompletionFunction.java Log Message: add join generation functions --- NEW FILE: InnerJoin.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; import java.util.Hashtable; import java.util.Vector; public class InnerJoin extends AbstractJoin { public InnerJoin(ISession session) { super(session); } public String getCompareString() { return "#i"; } public String getCompletionString() { return "#i,<table1>,<table2>,...<tableN>,"; } public String toString() { return getCompletionString() + " inner join"; } protected String getJoinClause(String fkName, String table1, String table2, Hashtable colBuffersByFkName) { return "INNER JOIN "; } } --- NEW FILE: GenericCodeCompletionInfo.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionInfo; public class GenericCodeCompletionInfo extends CodeCompletionInfo { private String _completionString; private String _toString; public GenericCodeCompletionInfo(String completionString) { _completionString = completionString; _toString = _completionString.replace('\n', ' '); } public String getCompareString() { return _completionString; } public String toString() { return _toString; } } --- NEW FILE: RightJoin.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; import java.util.Hashtable; import java.util.Vector; public class RightJoin extends AbstractJoin { public RightJoin(ISession session) { super(session); } public String getCompareString() { return "#r"; } public String getCompletionString() { return "#r,<table1>,<table2>,...<tableN>,"; } public String toString() { return getCompletionString() + " right join"; } protected String getJoinClause(String fkName, String table1, String table2, Hashtable colBuffersByFkName) { return "RIGHT JOIN "; } } --- NEW FILE: Join.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionInfo; import java.util.Hashtable; import java.util.Vector; public class Join extends AbstractJoin { private ISession _session; private boolean _returnedLeftJoinBefore; public Join(ISession session) { super(session); _session = session; } public String getCompareString() { return "#j"; } public String getCompletionString() { return "#j,<table1>,<table2>,...<tableN>,"; } public String toString() { return getCompletionString() + " inner/left join"; } public CodeCompletionInfo[] getFunctionResults(String functionSting) { _returnedLeftJoinBefore = false; return super.getFunctionResults(functionSting); } protected String getJoinClause(String fkName, String table1, String table2, Hashtable colBuffersByFkName) { if(_returnedLeftJoinBefore) { return "LEFT JOIN "; } ExtendedColumnInfo[] extCols1 = _session.getSchemaInfo().getExtendedColumnInfos(table1); ExtendedColumnInfo[] extCols2 = _session.getSchemaInfo().getExtendedColumnInfos(table2); Vector colBufs = (Vector) colBuffersByFkName.get(fkName); for (int i = 0; i < colBufs.size(); i++) { ColBuffer colBuf = (ColBuffer) colBufs.get(i); if(colBuf.tableName.equalsIgnoreCase(table1)) { if(isNullable(colBuf.colName , extCols1)) { _returnedLeftJoinBefore = true; return "LEFT JOIN "; } } if(colBuf.tableName.equalsIgnoreCase(table2)) { if(isNullable(colBuf.colName , extCols2)) { _returnedLeftJoinBefore = true; return "LEFT JOIN "; } } } return "INNER JOIN "; } private boolean isNullable(String colName, ExtendedColumnInfo[] extCols) { for (int i = 0; i < extCols.length; i++) { if(extCols[i].getColumnName().equalsIgnoreCase(colName)) { return extCols[i].isNullable(); } } throw new IllegalArgumentException("Column " + colName + " not found"); } } --- NEW FILE: CodeCompletionFunction.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionInfo; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionCandidates; public abstract class CodeCompletionFunction extends CodeCompletionInfo { public abstract CodeCompletionInfo[] getFunctionResults(String functionSting); protected boolean functionMatches(String functionSting) { return functionSting.toUpperCase().startsWith(getCompareString().toUpperCase()); } } --- NEW FILE: TestCompletionFunction.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionInfo; public class TestCompletionFunction extends CodeCompletionFunction { public String getCompareString() { return "#gwa"; } public String getCompletionString() { return "#gwa,<table>"; } public String toString() { return getCompletionString() + " test"; } public CodeCompletionInfo[] getFunctionResults(String functionSting) { if(false == functionMatches(functionSting)) { return null; } return new CodeCompletionInfo[]{new GenericCodeCompletionInfo("Hallo gwa comp")}; } } --- NEW FILE: LeftJoin.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; import java.util.Hashtable; import java.util.Vector; public class LeftJoin extends AbstractJoin { public LeftJoin(ISession session) { super(session); } public String getCompareString() { return "#l"; } public String getCompletionString() { return "#l,<table1>,<table2>,...<tableN>,"; } public String toString() { return getCompletionString() + " left join"; } protected String getJoinClause(String fkName, String table1, String table2, Hashtable colBuffersByFkName) { return "LEFT JOIN "; } } --- NEW FILE: AbstractJoin.java --- package net.sourceforge.squirrel_sql.plugins.codecompletion.completionfunctions; import net.sourceforge.squirrel_sql.plugins.codecompletion.CodeCompletionInfo; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; import java.util.StringTokenizer; import java.util.Vector; import java.util.Hashtable; import java.util.Enumeration; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.DatabaseMetaData; public abstract class AbstractJoin extends CodeCompletionFunction { private ISession _session; public AbstractJoin(ISession session) { _session = session; } public CodeCompletionInfo[] getFunctionResults(String functionSting) { try { if(false == functionMatches(functionSting)) { return null; } StringTokenizer st = new StringTokenizer(functionSting, ","); if(3 > st.countTokens()) { return null; } if(false == functionSting.endsWith(",")) { return null; } st.nextToken(); // remove the function name Vector tables = new Vector(); while(st.hasMoreTokens()) { String table = st.nextToken().trim(); if(false == _session.getSchemaInfo().isTable(table)) { return null; } tables.add(table); } DatabaseMetaData jdbcMetaData = _session.getSQLConnection().getSQLMetaData().getJDBCMetaData(); String catalog = _session.getSQLConnection().getCatalog(); ResultSet resSchema = jdbcMetaData.getTables(catalog, null, (String) tables.get(0), new String[]{"TABLE"}); resSchema.next(); String schema = resSchema.getString("TABLE_SCHEM"); Vector completions = new Vector(); completions.add(""); for (int i = 1; i < tables.size(); i++) { Hashtable conditionByFkName = new Hashtable(); Hashtable colBuffersByFkName = new Hashtable(); ResultSet res; res = jdbcMetaData.getImportedKeys(catalog, schema, (String) tables.get(i-1)); fillConditionByFkName(res, (String)tables.get(i-1), (String)tables.get(i), conditionByFkName, colBuffersByFkName); res = jdbcMetaData.getExportedKeys(catalog, schema, (String) tables.get(i-1)); fillConditionByFkName(res, (String)tables.get(i-1), (String)tables.get(i), conditionByFkName, colBuffersByFkName); Vector twoTableCompletions = new Vector(); for(Enumeration e=conditionByFkName.keys(); e.hasMoreElements();) { String fkName = (String) e.nextElement(); String joinClause = getJoinClause(fkName, (String)tables.get(i-1), (String)tables.get(i), colBuffersByFkName); StringBuffer sb = new StringBuffer(); sb.append(joinClause).append(tables.get(i)).append(" ON "); Vector conditions = (Vector) conditionByFkName.get(fkName); if(1 == conditions.size()) { sb.append(conditions.get(0)); } else if(1 < conditions.size()) { sb.append("("); sb.append(conditions.get(0)); for (int j = 1; j < conditions.size(); j++) { sb.append(" AND ").append(conditions.get(j)); } sb.append(")"); } sb.append("\n"); twoTableCompletions.add(sb.toString()); } if(0 == conditionByFkName.size()) { twoTableCompletions.add("INNER JOIN " + tables.get(i) + " ON " + tables.get(i-1) + ". = " + tables.get(i) + ".\n"); } Vector newCompletions = new Vector(); for (int j = 0; j < completions.size(); j++) { String begin = (String) completions.get(j); for (int k = 0; k < twoTableCompletions.size(); k++) { String end = (String) twoTableCompletions.get(k); newCompletions.add(begin + end); } } completions = newCompletions; } GenericCodeCompletionInfo[] ret = new GenericCodeCompletionInfo[completions.size()]; for (int i = 0; i < completions.size(); i++) { ret[i] = new GenericCodeCompletionInfo((String) completions.get(i)); } return ret; } catch (SQLException e) { throw new RuntimeException(e); } } protected abstract String getJoinClause(String fkName, String table1, String table2, Hashtable colBuffersByFkName); private void fillConditionByFkName(ResultSet res, String table1, String table2, Hashtable conditionByFkName, Hashtable colBuffersByFkName) throws SQLException { while(res.next()) { if ( (res.getString("PKTABLE_NAME").equalsIgnoreCase((String) table2) && res.getString("FKTABLE_NAME").equalsIgnoreCase((String) table1)) || (res.getString("FKTABLE_NAME").equalsIgnoreCase((String) table2) && res.getString("PKTABLE_NAME").equalsIgnoreCase((String) table1)) ) { String fkName = "" + res.getString("FK_NAME"); Vector conditions = (Vector) conditionByFkName.get(fkName); if(null == conditions) { conditions = new Vector(); conditionByFkName.put(fkName, conditions); } conditions.add(res.getString("PKTABLE_NAME") + "." + res.getString("PKCOLUMN_NAME") + " = " + res.getString("FKTABLE_NAME") + "." + res.getString("FKCOLUMN_NAME")); Vector cols = (Vector) colBuffersByFkName.get(fkName); if(null == cols) { cols = new Vector(); colBuffersByFkName.put(fkName, cols); } cols.add(new ColBuffer(res.getString("FKTABLE_NAME"), res.getString("FKCOLUMN_NAME"))); } } } static class ColBuffer { String tableName; String colName; public ColBuffer(String tableName, String colName) { this.tableName = tableName; this.colName = colName; } } } |