From: <cu...@us...> - 2008-09-12 22:31:58
|
Revision: 8294 http://wonder.svn.sourceforge.net/wonder/?rev=8294&view=rev Author: cug Date: 2008-09-12 22:31:56 +0000 (Fri, 12 Sep 2008) Log Message: ----------- support for hints for ERXBatchingDisplayGroup Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-09-12 22:31:11 UTC (rev 8293) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-09-12 22:31:56 UTC (rev 8294) @@ -552,6 +552,9 @@ } EOSQLExpression sqlExpr = sqlFactory.selectStatementForAttributes(attributes, false, spec, entity); String sql = sqlExpr.statement(); + if(spec.hints() != null && !spec.hints().isEmpty() && !(spec.hints().valueForKey(EODatabaseContext.CustomQueryExpressionHintKey) == null)) { + sql = (String)spec.hints().valueForKey(EODatabaseContext.CustomQueryExpressionHintKey); + } if (end >= 0) { sql = limitExpressionForSQL(sqlExpr, spec, sql, start, end); sqlExpr.setStatement(sql); @@ -559,7 +562,7 @@ return sqlExpr; } - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { throw new UnsupportedOperationException("There is no " + getClass().getSimpleName() + " implementation for generating limit expressions."); } @@ -1005,17 +1008,32 @@ int rowCount = -1; EOEntity entity = ERXEOAccessUtilities.entityNamed(ec, spec.entityName()); EOModel model = entity.model(); - if (spec.fetchLimit() > 0 || spec.sortOrderings() != null) { - spec = new EOFetchSpecification(spec.entityName(), spec.qualifier(), null); + NSArray result = null; + String sql; + if (spec.hints() == null || spec.hints().isEmpty() || spec.hints().valueForKey(EODatabaseContext.CustomQueryExpressionHintKey) == null) { + // no hints + if (spec.fetchLimit() > 0 || spec.sortOrderings() != null) { + spec = new EOFetchSpecification(spec.entityName(), spec.qualifier(), null); + } + + EOSQLExpression sqlExpression = sqlExpressionForFetchSpecification(ec, spec, 0, -1); + String statement = sqlExpression.statement(); + int index = statement.toLowerCase().indexOf(" from "); + statement = (new StringBuilder()).append("select count(*) ").append(statement.substring(index, statement.length())).toString(); + sqlExpression.setStatement(statement); + sql = statement; + result = ERXEOAccessUtilities.rawRowsForSQLExpression(ec, model.name(), sqlExpression); } + else { + // we have hints + sql = (String) spec.hints().valueForKey("EOCustomQueryExpressionHintKey"); + if (sql.endsWith(";")) { + sql = sql.substring(0, sql.length() - 1); + } + sql = "select count(*) from (" + sql + ") as result_count_temp_table;"; + result = EOUtilities.rawRowsForSQL(ec, model.name(), sql, null); + } - EOSQLExpression sql = sqlExpressionForFetchSpecification(ec, spec, 0, -1); - String statement = sql.statement(); - int index = statement.toLowerCase().indexOf(" from "); - statement = "select count(*) " + statement.substring(index, statement.length()); - sql.setStatement(statement); - NSArray result = ERXEOAccessUtilities.rawRowsForSQLExpression(ec, model.name(), sql); - if (result.count() > 0) { NSDictionary dict = (NSDictionary) result.objectAtIndex(0); NSArray values = dict.allValues(); @@ -1434,7 +1452,7 @@ } @Override - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { String limitSQL; /* * Oracle can make you puke... These are grabbed from tips all over @@ -1488,7 +1506,7 @@ public static class OpenBaseSQLHelper extends ERXSQLHelper { @Override - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { // Openbase support for limiting result set return sql + " return results " + start + " to " + end; } @@ -1537,7 +1555,7 @@ } @Override - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { // add TOP(start, (end - start)) after the SELECT word int index = sql.indexOf("select"); if (index == -1) { @@ -1642,7 +1660,7 @@ public static class MySQLSQLHelper extends ERXSQLHelper { @Override - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { return sql + " LIMIT " + start + ", " + (end - start); } @@ -1707,7 +1725,7 @@ } @Override - protected String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { + public String limitExpressionForSQL(EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end) { return sql + " LIMIT " + (end - start) + " OFFSET " + start; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cu...@us...> - 2008-09-14 23:19:40
|
Revision: 8297 http://wonder.svn.sourceforge.net/wonder/?rev=8297&view=rev Author: cug Date: 2008-09-14 23:19:38 +0000 (Sun, 14 Sep 2008) Log Message: ----------- Return "numeric" as the column type for Types.DECIMAL Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-09-14 01:47:48 UTC (rev 8296) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-09-14 23:19:38 UTC (rev 8297) @@ -1742,7 +1742,8 @@ * "serial". * * cug: There seems to be also nothing useful for "BLOB", so we return - * bytea for Type.BLOB + * bytea for Type.BLOB; int8 for BIGINT; numeric for DECIMAL; bool for + * BOOLEAN * * We know better than EOF. * @@ -1769,6 +1770,9 @@ else if (jdbcType == Types.BOOLEAN) { externalType = "bool"; } + else if (jdbcType == Types.DECIMAL) { + externalType = "numeric"; + } else { externalType = super.externalTypeForJDBCType(adaptor, jdbcType); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-10-20 19:47:04
|
Revision: 8458 http://wonder.svn.sourceforge.net/wonder/?rev=8458&view=rev Author: mschrag Date: 2008-10-20 19:45:31 +0000 (Mon, 20 Oct 2008) Log Message: ----------- change migration table name for Oracle Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-20 15:24:50 UTC (rev 8457) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-20 19:45:31 UTC (rev 8458) @@ -1521,6 +1521,11 @@ public String sqlForRegularExpressionQuery(String key, String value) { return "REGEXP_LIKE(" + key + ", " + value + ")"; } + + @Override + public String migrationTableName() { + return "dbupdater"; + } } public static class OpenBaseSQLHelper extends ERXSQLHelper { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-10-20 19:47:56
|
Revision: 8459 http://wonder.svn.sourceforge.net/wonder/?rev=8459&view=rev Author: mschrag Date: 2008-10-20 19:47:27 +0000 (Mon, 20 Oct 2008) Log Message: ----------- support for a command separator string Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-20 19:45:31 UTC (rev 8458) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-20 19:47:27 UTC (rev 8459) @@ -1194,6 +1194,12 @@ public NSArray<String> splitSQLStatements(String sql) { NSMutableArray<String> statements = new NSMutableArray<String>(); if (sql != null) { + char commandSeparatorChar = ';'; + String commandSeparatorString = commandSeparatorString(); + if (commandSeparatorString.length() > 0) { + commandSeparatorChar = commandSeparatorString.charAt(0); + } + StringBuffer statementBuffer = new StringBuffer(); int length = sql.length(); boolean inQuotes = false; @@ -1202,8 +1208,7 @@ if (ch == '\r' || ch == '\n') { // ignore } - // MS: Should this use commandSeparatorString? - else if (!inQuotes && ch == ';') { + else if (!inQuotes && ch == commandSeparatorChar) { String statement = statementBuffer.toString().trim(); if (statement.length() > 0) { statements.addObject(statement); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-10-21 01:22:06
|
Revision: 8464 http://wonder.svn.sourceforge.net/wonder/?rev=8464&view=rev Author: mschrag Date: 2008-10-21 01:21:55 +0000 (Tue, 21 Oct 2008) Log Message: ----------- * hack for command separators * support for unique indexes in oracle Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-21 01:18:32 UTC (rev 8463) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-21 01:21:55 UTC (rev 8464) @@ -1194,12 +1194,8 @@ public NSArray<String> splitSQLStatements(String sql) { NSMutableArray<String> statements = new NSMutableArray<String>(); if (sql != null) { - char commandSeparatorChar = ';'; - String commandSeparatorString = commandSeparatorString(); - if (commandSeparatorString.length() > 0) { - commandSeparatorChar = commandSeparatorString.charAt(0); - } - + char commandSeparatorChar = commandSeparatorChar(); + StringBuffer statementBuffer = new StringBuffer(); int length = sql.length(); boolean inQuotes = false; @@ -1268,6 +1264,17 @@ } } + /** + * This is totally cheating ... But I just need the separator character for now. We + * can rewrite the script parser later. Actually, somewhere on earth there is already + * a sql parser or two. Probably worth getting that one. + * + * @return the separator character used by this database + */ + protected char commandSeparatorChar() { + return ';'; + } + protected String commandSeparatorString() { String lineSeparator = System.getProperty("line.separator"); return ";" + lineSeparator; @@ -1504,6 +1511,11 @@ } @Override + protected char commandSeparatorChar() { + return '/'; + } + + @Override protected String commandSeparatorString() { String lineSeparator = System.getProperty("line.separator"); String commandSeparator = lineSeparator + "/" + lineSeparator; @@ -1519,8 +1531,16 @@ oracleExternalTypesToIgnore.addObject("BLOB"); oracleExternalTypesToIgnore.addObject("CLOB"); return super.createIndexSQLForEntities(entities, oracleExternalTypesToIgnore); - } + + @Override + public String sqlForCreateUniqueIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { + NSMutableArray<String> columnNames = new NSMutableArray<String>(); + for (ColumnIndex columnIndex : columnIndexes) { + columnNames.addObject(columnIndex.columnName()); + } + return "CREATE UNIQUE INDEX " + indexName + " ON " + tableName + "(" + columnNames.componentsJoinedByString(",") + ")"; + } @Override public String sqlForRegularExpressionQuery(String key, String value) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-10-21 01:22:57
|
Revision: 8465 http://wonder.svn.sourceforge.net/wonder/?rev=8465&view=rev Author: mschrag Date: 2008-10-21 01:22:55 +0000 (Tue, 21 Oct 2008) Log Message: ----------- create index support for Oracle Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-21 01:21:55 UTC (rev 8464) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-21 01:22:55 UTC (rev 8465) @@ -1541,6 +1541,15 @@ } return "CREATE UNIQUE INDEX " + indexName + " ON " + tableName + "(" + columnNames.componentsJoinedByString(",") + ")"; } + + @Override + public String sqlForCreateIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { + NSMutableArray<String> columnNames = new NSMutableArray<String>(); + for (ColumnIndex columnIndex : columnIndexes) { + columnNames.addObject(columnIndex.columnName()); + } + return "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnNames.componentsJoinedByString(",") + ")"; + } @Override public String sqlForRegularExpressionQuery(String key, String value) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-10-24 16:44:01
|
Revision: 8488 http://wonder.svn.sourceforge.net/wonder/?rev=8488&view=rev Author: mschrag Date: 2008-10-24 16:43:38 +0000 (Fri, 24 Oct 2008) Log Message: ----------- createDependentSchemaSQLForEntities Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-24 04:44:49 UTC (rev 8487) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-10-24 16:43:38 UTC (rev 8488) @@ -24,6 +24,7 @@ import com.webobjects.eoaccess.EOEntity; import com.webobjects.eoaccess.EOModel; import com.webobjects.eoaccess.EOQualifierSQLGeneration; +import com.webobjects.eoaccess.EORelationship; import com.webobjects.eoaccess.EOSQLExpression; import com.webobjects.eoaccess.EOSQLExpressionFactory; import com.webobjects.eoaccess.EOSchemaGeneration; @@ -209,6 +210,55 @@ } /** + * Generates table create statements for a set of entities, then finds all the entities that those entities depend on (in other models) and generates + * foreign key statements for those, so you can generate sql for cross-model. + * + * @param entities the entities to generate for + * @param adaptor the adaptor to use + * @return the sql script + */ + public String createDependentSchemaSQLForEntities(NSArray<EOEntity> entities, EOAdaptor adaptor) { + NSMutableDictionary<String, String> optionsCreateTables = new NSMutableDictionary<String, String>(); + optionsCreateTables.setObjectForKey("NO", EOSchemaGeneration.DropTablesKey); + optionsCreateTables.setObjectForKey("NO", EOSchemaGeneration.DropPrimaryKeySupportKey); + optionsCreateTables.setObjectForKey("YES", EOSchemaGeneration.CreateTablesKey); + optionsCreateTables.setObjectForKey("YES", EOSchemaGeneration.CreatePrimaryKeySupportKey); + optionsCreateTables.setObjectForKey("YES", EOSchemaGeneration.PrimaryKeyConstraintsKey); + optionsCreateTables.setObjectForKey("NO", EOSchemaGeneration.ForeignKeyConstraintsKey); + optionsCreateTables.setObjectForKey("NO", EOSchemaGeneration.CreateDatabaseKey); + optionsCreateTables.setObjectForKey("NO", EOSchemaGeneration.DropDatabaseKey); + StringBuffer sqlBuffer = new StringBuffer(); + EOSynchronizationFactory sf = ((JDBCAdaptor) adaptor).plugIn().synchronizationFactory(); + String creationScript = sf.schemaCreationScriptForEntities(entities, optionsCreateTables); + sqlBuffer.append(creationScript); + + NSMutableArray<EOEntity> foreignKeyEntities = entities.mutableClone(); + for (EOEntity entity : entities) { + for (EORelationship relationship : (NSArray<EORelationship>)entity.relationships()) { + if (!relationship.isToMany()) { + EOEntity destinationEntity = relationship.destinationEntity(); + if (destinationEntity.model() != entity.model()) { + foreignKeyEntities.addObject(destinationEntity); + } + } + } + } + + NSMutableDictionary<String, String> optionsCreateForeignKeys = new NSMutableDictionary<String, String>(); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.DropTablesKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.DropPrimaryKeySupportKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.CreateTablesKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.CreatePrimaryKeySupportKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.PrimaryKeyConstraintsKey); + optionsCreateForeignKeys.setObjectForKey("YES", EOSchemaGeneration.ForeignKeyConstraintsKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.CreateDatabaseKey); + optionsCreateForeignKeys.setObjectForKey("NO", EOSchemaGeneration.DropDatabaseKey); + String foreignKeyScript = sf.schemaCreationScriptForEntities(foreignKeyEntities, optionsCreateForeignKeys); + sqlBuffer.append(foreignKeyScript); + + return sqlBuffer.toString(); + } + /** * Creates the schema sql for a set of entities. * * @param entities This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2008-11-03 21:59:49
|
Revision: 8523 http://wonder.svn.sourceforge.net/wonder/?rev=8523&view=rev Author: mschrag Date: 2008-11-03 21:59:35 +0000 (Mon, 03 Nov 2008) Log Message: ----------- whoops left in debug println Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-11-03 21:58:22 UTC (rev 8522) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-11-03 21:59:35 UTC (rev 8523) @@ -1650,7 +1650,6 @@ else { externalType = super.externalTypeForJDBCType(adaptor, jdbcType); } - System.out.println("OracleSQLHelper.externalTypeForJDBCType: " + jdbcType + ", " + externalType); return externalType; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2008-11-12 09:32:34
|
Revision: 8575 http://wonder.svn.sourceforge.net/wonder/?rev=8575&view=rev Author: thoepfner Date: 2008-11-12 09:32:30 +0000 (Wed, 12 Nov 2008) Log Message: ----------- Fix typo Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-11-12 05:25:05 UTC (rev 8574) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-11-12 09:32:30 UTC (rev 8575) @@ -1693,7 +1693,7 @@ @Override protected String sqlForGetNextValFromSequencedNamed(String sequenceName) { - return "select from unique from " + sequenceName; + return "select unique from " + sequenceName; } @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chi...@us...> - 2008-12-05 19:55:40
|
Revision: 8724 http://wonder.svn.sourceforge.net/wonder/?rev=8724&view=rev Author: chillatgvc Date: 2008-12-05 19:55:37 +0000 (Fri, 05 Dec 2008) Log Message: ----------- Re-implementation of splitSQLStatements, handling comments. Only FrontBase comments are implemented for now. Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-05 17:58:52 UTC (rev 8723) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-05 19:55:37 UTC (rev 8724) @@ -1,10 +1,12 @@ package er.extensions.jdbc; import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; import java.lang.reflect.Method; import java.sql.SQLException; import java.sql.Types; @@ -1263,37 +1265,54 @@ NSMutableArray<String> statements = new NSMutableArray<String>(); if (sql != null) { char commandSeparatorChar = commandSeparatorChar(); - + Pattern commentPattern = commentPattern(); StringBuffer statementBuffer = new StringBuffer(); - int length = sql.length(); + BufferedReader reader = new BufferedReader(new StringReader(sql)); boolean inQuotes = false; - for (int i = 0; i < length; i++) { - char ch = sql.charAt(i); - if (ch == '\r' || ch == '\n') { - // ignore - } - else if (!inQuotes && ch == commandSeparatorChar) { - String statement = statementBuffer.toString().trim(); - if (statement.length() > 0) { - statements.addObject(statement); + + try { + String nextLine = reader.readLine(); + while (nextLine != null) { + nextLine = nextLine.trim(); + + // Skip blank lines and new lines starting with the comment pattern + if (nextLine.length() == 0 || + (statementBuffer.length() == 0 && commentPattern.matcher(nextLine).find())) { + nextLine = reader.readLine(); + continue; } - statementBuffer.setLength(0); - } - else { - // Support for escaping apostrophes, e.g. 'Mike\'s Code' - if (inQuotes && ch == '\\') { - statementBuffer.append(ch); - ch = sql.charAt(++ i); + + // Determine if the line ends inside a single quoted string + int length = nextLine.length(); + char ch = 0; + for (int i = 0; i < length; i++) { + ch = nextLine.charAt(i); + // Determine if we are in a quoted string, but ignore escaped apostrophes, e.g. 'Mike\'s Code' + if (inQuotes && ch == '\\') { + i++; + } + else if (ch == '\'') { + inQuotes = !inQuotes; + } } - else if (ch == '\'') { - inQuotes = !inQuotes; + + // If we are not in a quoted string, either this is the end of the command or we need to + // add some whitespace before the continuation of this command + statementBuffer.append(nextLine); + if (!inQuotes) { + if (ch == commandSeparatorChar) { + statements.addObject(statementBuffer.toString()); + statementBuffer.setLength(0); + } + else { + statementBuffer.append(' '); + } } - statementBuffer.append(ch); + nextLine = reader.readLine(); } } - String statement = statementBuffer.toString().trim(); - if (statement.length() > 0) { - statements.addObject(statement); + catch (IOException e) { + throw NSForwardException._runtimeExceptionForThrowable(e); } } return statements; @@ -1348,6 +1367,16 @@ return ";" + lineSeparator; } + /** + * Returns a pattern than matches only blank lines. Subclasses should implement this to return a pattern + * matching the vendor specific comment indicator(s). + * + * @return regex pattern that indicates this line is an SQL comment + */ + protected Pattern commentPattern() { + return Pattern.compile("^$"); + } + public NSMutableArray<String> columnNamesFromColumnIndexes(ColumnIndex... columnIndexes) { NSMutableArray<String> columnNames = new NSMutableArray<String>(); for (ColumnIndex columnIndex : columnIndexes) { @@ -1802,6 +1831,16 @@ }; action.perform(ec, model.name()); } + + + /** + * Returns a pattern than matches lines that start with "--". + * + * @return regex pattern that indicates this line is an SQL comment + */ + protected Pattern commentPattern() { + return Pattern.compile("^--"); + } } public static class MySQLSQLHelper extends ERXSQLHelper { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chi...@us...> - 2008-12-08 05:35:35
|
Revision: 8732 http://wonder.svn.sourceforge.net/wonder/?rev=8732&view=rev Author: chillatgvc Date: 2008-12-08 05:35:33 +0000 (Mon, 08 Dec 2008) Log Message: ----------- Add helper for Microsoft (aka SQL Server) Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-07 20:30:14 UTC (rev 8731) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-08 05:35:33 UTC (rev 8732) @@ -1475,6 +1475,9 @@ else if (databaseProductName.equalsIgnoreCase("derby")) { sqlHelper = new DerbySQLHelper(); } + else if (databaseProductName.equalsIgnoreCase("microsoft")) { + sqlHelper = new MicrosoftSQLHelper(); + } else { try { sqlHelper = (ERXSQLHelper) Class.forName(ERXSQLHelper.class.getName() + "$" + databaseProductName + "SQLHelper").newInstance(); @@ -1983,4 +1986,18 @@ } } + + + public static class MicrosoftSQLHelper extends ERXSQLHelper { + + /** + * Returns a pattern than matches lines that start with "--". + * + * @return regex pattern that indicates this line is an SQL comment + */ + protected Pattern commentPattern() { + return Pattern.compile("^--"); + } + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2008-12-11 10:46:48
|
Revision: 8747 http://wonder.svn.sourceforge.net/wonder/?rev=8747&view=rev Author: thoepfner Date: 2008-12-11 10:46:44 +0000 (Thu, 11 Dec 2008) Log Message: ----------- Added FIXME Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-11 08:52:33 UTC (rev 8746) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-11 10:46:44 UTC (rev 8747) @@ -1106,6 +1106,9 @@ EOSQLExpression sqlExpression = sqlExpressionForFetchSpecification(ec, spec, 0, -1); String statement = sqlExpression.statement(); int index = statement.toLowerCase().indexOf(" from "); + // FIXME TH: count(*) won't always yield corect results, if the spec + // is using distinct. count(pk) would be a working alternative. What + // was the easiest way to get the primary key column name again? statement = (new StringBuilder()).append("select count(*) ").append(statement.substring(index, statement.length())).toString(); sqlExpression.setStatement(statement); sql = statement; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2008-12-11 11:19:17
|
Revision: 8748 http://wonder.svn.sourceforge.net/wonder/?rev=8748&view=rev Author: thoepfner Date: 2008-12-11 11:19:12 +0000 (Thu, 11 Dec 2008) Log Message: ----------- Removed FIXME comment, fixed code instead. Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-11 10:46:44 UTC (rev 8747) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2008-12-11 11:19:12 UTC (rev 8748) @@ -32,6 +32,7 @@ import com.webobjects.eoaccess.EOSchemaGeneration; import com.webobjects.eoaccess.EOSynchronizationFactory; import com.webobjects.eoaccess.EOUtilities; +import com.webobjects.eocontrol.EOClassDescription; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.eocontrol.EOFetchSpecification; import com.webobjects.eocontrol.EOObjectStoreCoordinator; @@ -1100,16 +1101,28 @@ if (spec.hints() == null || spec.hints().isEmpty() || spec.hints().valueForKey(EODatabaseContext.CustomQueryExpressionHintKey) == null) { // no hints if (spec.fetchLimit() > 0 || spec.sortOrderings() != null) { + boolean usesDistinct=spec.usesDistinct(); spec = new EOFetchSpecification(spec.entityName(), spec.qualifier(), null); + spec.setUsesDistinct(usesDistinct); } EOSQLExpression sqlExpression = sqlExpressionForFetchSpecification(ec, spec, 0, -1); String statement = sqlExpression.statement(); int index = statement.toLowerCase().indexOf(" from "); - // FIXME TH: count(*) won't always yield corect results, if the spec - // is using distinct. count(pk) would be a working alternative. What - // was the easiest way to get the primary key column name again? - statement = (new StringBuilder()).append("select count(*) ").append(statement.substring(index, statement.length())).toString(); + + String countExpression; + if (spec.usesDistinct()) { + NSArray primaryKeyAttributeNames = entity.primaryKeyAttributeNames(); + if (primaryKeyAttributeNames.count() > 1) + log.warn("Composite primary keys are currently unsupported in rowCountForFetchSpecification, when the spec uses distinct"); + String pkAttributeName = (String) primaryKeyAttributeNames.lastObject(); + String pkColumnName = entity.attributeNamed(pkAttributeName).columnName(); + countExpression = "count(t0." + pkColumnName + ") "; + } + else { + countExpression = "count(*) "; + } + statement = (new StringBuilder()).append("select ").append(countExpression).append(statement.substring(index, statement.length())).toString(); sqlExpression.setStatement(statement); sql = statement; result = ERXEOAccessUtilities.rawRowsForSQLExpression(ec, model.name(), sqlExpression); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2009-01-13 14:48:35
|
Revision: 8806 http://wonder.svn.sourceforge.net/wonder/?rev=8806&view=rev Author: thoepfner Date: 2009-01-13 14:48:29 +0000 (Tue, 13 Jan 2009) Log Message: ----------- Testing helps sometimes... Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-13 06:22:01 UTC (rev 8805) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-13 14:48:29 UTC (rev 8806) @@ -1117,7 +1117,7 @@ log.warn("Composite primary keys are currently unsupported in rowCountForFetchSpecification, when the spec uses distinct"); String pkAttributeName = (String) primaryKeyAttributeNames.lastObject(); String pkColumnName = entity.attributeNamed(pkAttributeName).columnName(); - countExpression = "count(t0." + pkColumnName + ") "; + countExpression = "count(distinct t0." + pkColumnName + ") "; } else { countExpression = "count(*) "; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <qd...@us...> - 2009-01-16 07:06:30
|
Revision: 8812 http://wonder.svn.sourceforge.net/wonder/?rev=8812&view=rev Author: qdolan Date: 2009-01-16 07:06:27 +0000 (Fri, 16 Jan 2009) Log Message: ----------- Corrected recent logic change that meant ';' was longer being removed from the end of a statement. Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-15 19:53:56 UTC (rev 8811) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-16 07:06:27 UTC (rev 8812) @@ -1310,20 +1310,23 @@ else if (ch == '\'') { inQuotes = !inQuotes; } + if (inQuotes || ch != commandSeparatorChar) { + statementBuffer.append(ch); + } } // If we are not in a quoted string, either this is the end of the command or we need to // add some whitespace before the continuation of this command - statementBuffer.append(nextLine); if (!inQuotes) { if (ch == commandSeparatorChar) { - statements.addObject(statementBuffer.toString()); + statements.addObject(statementBuffer.toString().trim()); statementBuffer.setLength(0); } else { statementBuffer.append(' '); } } + nextLine = reader.readLine(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-01-29 03:08:53
|
Revision: 8865 http://wonder.svn.sourceforge.net/wonder/?rev=8865&view=rev Author: mschrag Date: 2009-01-29 03:08:39 +0000 (Thu, 29 Jan 2009) Log Message: ----------- fix for executing single line SQL statements without ;'s on them Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-29 01:42:14 UTC (rev 8864) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-01-29 03:08:39 UTC (rev 8865) @@ -32,7 +32,6 @@ import com.webobjects.eoaccess.EOSchemaGeneration; import com.webobjects.eoaccess.EOSynchronizationFactory; import com.webobjects.eoaccess.EOUtilities; -import com.webobjects.eocontrol.EOClassDescription; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.eocontrol.EOFetchSpecification; import com.webobjects.eocontrol.EOObjectStoreCoordinator; @@ -1329,6 +1328,10 @@ nextLine = reader.readLine(); } + String finalStatement = statementBuffer.toString().trim(); + if (finalStatement.length() > 0) { + statements.addObject(finalStatement); + } } catch (IOException e) { throw NSForwardException._runtimeExceptionForThrowable(e); @@ -1601,7 +1604,6 @@ buf.append("/"); } } - System.out.println("finished!"); return buf.toString(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2009-02-26 20:56:48
|
Revision: 8973 http://wonder.svn.sourceforge.net/wonder/?rev=8973&view=rev Author: thoepfner Date: 2009-02-26 20:56:42 +0000 (Thu, 26 Feb 2009) Log Message: ----------- Fix for problem with certain column names in ERXSQLHelper.rowCountForFetchSpecficiation() Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-02-26 06:05:47 UTC (rev 8972) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-02-26 20:56:42 UTC (rev 8973) @@ -1116,7 +1116,9 @@ log.warn("Composite primary keys are currently unsupported in rowCountForFetchSpecification, when the spec uses distinct"); String pkAttributeName = (String) primaryKeyAttributeNames.lastObject(); String pkColumnName = entity.attributeNamed(pkAttributeName).columnName(); - countExpression = "count(distinct t0." + pkColumnName + ") "; + countExpression = "count(distinct " + + quoteColumnName("t0." + pkColumnName) + + ") "; } else { countExpression = "count(*) "; @@ -1410,6 +1412,11 @@ public boolean reassignExternalTypeForValueTypeOverride(EOAttribute attribute) { return true; } + + public String quoteColumnName(String columnName){ + // just pass through by default + return columnName; + } public static ERXSQLHelper newSQLHelper(EOSQLExpression expression) { // This is REALLY hacky. @@ -1865,6 +1872,19 @@ protected Pattern commentPattern() { return Pattern.compile("^--"); } + + @Override + public String quoteColumnName(String columnName){ + if (columnName == null) + return null; + + int i = columnName.lastIndexOf(46); + + if (i == -1) + return "\"" + columnName + "\""; + + return "\"" + columnName.substring(0, i) + "\".\"" + columnName.substring(i + 1, columnName.length()) + "\""; + } } public static class MySQLSQLHelper extends ERXSQLHelper { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chi...@us...> - 2009-03-18 16:42:43
|
Revision: 9055 http://wonder.svn.sourceforge.net/wonder/?rev=9055&view=rev Author: chillatgvc Date: 2009-03-18 16:42:40 +0000 (Wed, 18 Mar 2009) Log Message: ----------- add SQL Server Implementation Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-03-18 16:03:29 UTC (rev 9054) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-03-18 16:42:40 UTC (rev 9055) @@ -863,7 +863,8 @@ * @return a SQL expression */ public String sqlForCreateUniqueIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { - throw new UnsupportedOperationException("There is no " + getClass().getSimpleName() + " implementation for generating unique index expressions."); + NSMutableArray<String> columnNames = columnNamesFromColumnIndexes(columnIndexes); + return "ALTER TABLE \"" + tableName + "\" ADD CONSTRAINT \"" + indexName + "\" UNIQUE(\"" + new NSArray<String>(columnNames).componentsJoinedByString("\", \"") + "\")"; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tho...@us...> - 2009-03-27 12:45:37
|
Revision: 9129 http://wonder.svn.sourceforge.net/wonder/?rev=9129&view=rev Author: thoepfner Date: 2009-03-27 12:45:31 +0000 (Fri, 27 Mar 2009) Log Message: ----------- Frontbase unique constraints are now DEFERRABLE INITIALLY DEFERRED Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-03-27 09:04:08 UTC (rev 9128) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-03-27 12:45:31 UTC (rev 9129) @@ -1804,7 +1804,7 @@ @Override public String sqlForCreateUniqueIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { NSMutableArray<String> columnNames = columnNamesFromColumnIndexes(columnIndexes); - return "ALTER TABLE \"" + tableName + "\" ADD CONSTRAINT \"" + indexName + "\" UNIQUE(\"" + new NSArray<String>(columnNames).componentsJoinedByString("\", \"") + "\") INITIALLY IMMEDIATE NOT DEFERRABLE"; + return "ALTER TABLE \"" + tableName + "\" ADD CONSTRAINT \"" + indexName + "\" UNIQUE(\"" + new NSArray<String>(columnNames).componentsJoinedByString("\", \"") + "\") DEFERRABLE INITIALLY DEFERRED"; } public String sqlForCreateIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chi...@us...> - 2009-06-23 03:06:23
|
Revision: 9506 http://wonder.svn.sourceforge.net/wonder/?rev=9506&view=rev Author: chillatgvc Date: 2009-06-23 03:06:14 +0000 (Tue, 23 Jun 2009) Log Message: ----------- Optimization for FrontBase Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-06-22 21:27:37 UTC (rev 9505) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-06-23 03:06:14 UTC (rev 9506) @@ -1228,7 +1228,7 @@ sqlName = e.sqlStringForAttribute(attribute); } - int maxPerQuery = 256; + int maxPerQuery = maximumElementPerInClause(); // Need to wrap this SQL in parens if there are multiple grougps if (valueArray.count() > maxPerQuery) { @@ -1269,6 +1269,16 @@ return sb.toString(); } + /** + * The database specific limit, or or most efficient number, of elements in an IN clause in a statement. If there + * are more that this number of elements, additional IN clauses will be generated, ORed to the others. + * + * @return database specific limit, or or most efficient number, of elements in an IN clause in a statement + */ + protected int maximumElementPerInClause() { + return 256; + } + protected String formatValueForAttribute(EOSQLExpression expression, Object value, EOAttribute attribute, String key) { return expression.sqlStringForValue(value, key); } @@ -1932,6 +1942,25 @@ return "\"" + columnName.substring(0, i) + "\".\"" + columnName.substring(i + 1, columnName.length()) + "\""; } + + /** + * FrontBase is exceedingly inefficient in processing OR clauses. A query like this:<br/> + * SELECT * FROM "Foo" t0 WHERE ( t0."oid" IN (431, 437, ...) OR t0."oid" IN (1479, 1480, 1481,...)...<br/> + * Completely KILLS FrontBase (30+ seconds of 100%+ CPU usage). The same query rendered as:<br/> + * SELECT * FROM "Foo" t0 WHERE t0."oid" IN (431, 437, ...) UNION SELECT * FROM "Foo" t0 WHERE t0."oid" IN (1479, 1480, 1481, ...)... + * executes in less than a tenth of the time with less high CPU load. Collapse all the ORs and INs into one and it is faster + * still. This has been tested with over 17,000 elements, so 15,000 seemed like a safe maximum. I don't know what the actual + * theoretical maximum is. + * + * @see ERXSQLHelper#maximumElementPerInClause() + * + * @return database specific limit, or or most efficient number, of elements in an IN clause in a statement + */ + @Override + protected int maximumElementPerInClause() { + return 15000; + } + } public static class MySQLSQLHelper extends ERXSQLHelper { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chi...@us...> - 2009-06-26 23:15:51
|
Revision: 9539 http://wonder.svn.sourceforge.net/wonder/?rev=9539&view=rev Author: chillatgvc Date: 2009-06-26 23:15:50 +0000 (Fri, 26 Jun 2009) Log Message: ----------- API change. No functional change, but I am contemplating one. Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-06-26 14:22:26 UTC (rev 9538) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-06-26 23:15:50 UTC (rev 9539) @@ -1228,7 +1228,7 @@ sqlName = e.sqlStringForAttribute(attribute); } - int maxPerQuery = maximumElementPerInClause(); + int maxPerQuery = maximumElementPerInClause(e.entity()); // Need to wrap this SQL in parens if there are multiple grougps if (valueArray.count() > maxPerQuery) { @@ -1273,9 +1273,10 @@ * The database specific limit, or or most efficient number, of elements in an IN clause in a statement. If there * are more that this number of elements, additional IN clauses will be generated, ORed to the others. * + * @param entity EOEntity that can be used to fine-tune the result * @return database specific limit, or or most efficient number, of elements in an IN clause in a statement */ - protected int maximumElementPerInClause() { + protected int maximumElementPerInClause(EOEntity entity) { return 256; } @@ -1952,15 +1953,21 @@ * still. This has been tested with over 17,000 elements, so 15,000 seemed like a safe maximum. I don't know what the actual * theoretical maximum is. * + * But... It looks to like the query optimizer will choose to NOT use an index if the number of elements in the IN gets close to, + * or exceeds, the number of rows (as in the case of a select based on FK with a large number of keys that don't match any rows). In + * this case it seems to fall back to table scanning (or something dreadfully slow). This only seems to have an impact when the number + * of elements in the IN is greater than 1,000. For larger sizes, the correct number for this method to return seems to depend on the + * number of rows in the tables. 1/5th of the table size may be a good place to start looking for the upper bound. + * * @see ERXSQLHelper#maximumElementPerInClause() * + * @param entity EOEntity that can be used to fine-tune the result * @return database specific limit, or or most efficient number, of elements in an IN clause in a statement */ @Override - protected int maximumElementPerInClause() { + protected int maximumElementPerInClause(EOEntity entity) { return 15000; } - } public static class MySQLSQLHelper extends ERXSQLHelper { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hp...@us...> - 2009-09-11 14:08:36
|
Revision: 9859 http://wonder.svn.sourceforge.net/wonder/?rev=9859&view=rev Author: hprange Date: 2009-09-11 14:08:25 +0000 (Fri, 11 Sep 2009) Log Message: ----------- Fixes WONDER-347: Migrations doesn't work for BLOB types using SQL Server Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-09-10 22:17:55 UTC (rev 9858) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-09-11 14:08:25 UTC (rev 9859) @@ -2171,6 +2171,15 @@ } @Override + public String externalTypeForJDBCType( JDBCAdaptor adaptor, int type ) { + if( type == Types.BLOB ) { + return "binary"; + } + + return super.externalTypeForJDBCType( adaptor, type ); + } + + @Override public String limitExpressionForSQL( EOSQLExpression expression, EOFetchSpecification fetchSpecification, String sql, long start, long end ) { if( sql == null || "".equals( sql ) ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-09-29 17:38:56
|
Revision: 9998 http://wonder.svn.sourceforge.net/wonder/?rev=9998&view=rev Author: mschrag Date: 2009-09-29 17:38:47 +0000 (Tue, 29 Sep 2009) Log Message: ----------- WONDER-309 Creation of indexes on a Postgres DB in a migration fails Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-09-29 17:37:33 UTC (rev 9997) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/jdbc/ERXSQLHelper.java 2009-09-29 17:38:47 UTC (rev 9998) @@ -2154,8 +2154,17 @@ } return "CREATE UNIQUE INDEX " + indexName + " ON " + tableName + "(" + columnNames.componentsJoinedByString(",") + ")"; } - + @Override + public String sqlForCreateIndex(String indexName, String tableName, ColumnIndex... columnIndexes) { + NSMutableArray<String> columnNames = new NSMutableArray<String>(); + for (ColumnIndex columnIndex : columnIndexes) { + columnNames.addObject(columnIndex.columnName()); + } + return "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnNames.componentsJoinedByString(",") + ")"; + } + + @Override public int varcharLargeJDBCType() { return Types.LONGVARCHAR; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |