Index: QueryStatement.java =================================================================== RCS file: /cvsroot/jpox/JPOX/Core/src/java/org/jpox/store/query/QueryStatement.java,v retrieving revision 1.29 diff -u -r1.29 QueryStatement.java --- QueryStatement.java 26 Jul 2005 19:59:48 -0000 1.29 +++ QueryStatement.java 19 Aug 2005 09:05:13 -0000 @@ -895,12 +895,13 @@ { if (this.stmtText == null) { + final RDBMSAdapter rdbmsAdapter = (RDBMSAdapter)dba; StatementText stmtText = new StatementText("SELECT "); if (rangeOffset > -1 || rangeCount > -1) { // Add a LIMIT clause to SELECT if it is supported - stmtText.append(((RDBMSAdapter)dba).getRangeByLimitSelectClause(rangeOffset, rangeCount)); + stmtText.append(rdbmsAdapter.getRangeByLimitSelectClause(rangeOffset, rangeCount)); } boolean usingDistinct = false; @@ -922,10 +923,10 @@ stmtText.append(','); } } - if ((rangeOffset > -1 || rangeCount > -1) && ((RDBMSAdapter)dba).getRangeByRowNumberColumn().length() > 0) + if ((rangeOffset > -1 || rangeCount > -1) && rdbmsAdapter.getRangeByRowNumberColumn().length() > 0) { // Add a ROW NUMBER column if supported as the means of handling ranges by the RDBMS - stmtText.append(',').append(((RDBMSAdapter)dba).getRangeByRowNumberColumn()); + stmtText.append(',').append(rdbmsAdapter.getRangeByRowNumberColumn()); } } else @@ -942,11 +943,19 @@ stmtText.append(stmtAliasTablesSeparator).append(iterator.next()); } + // Add any locking of the rows for datastores that require WITH option to be placed after the FROM clause + if (lock && rdbmsAdapter.getSelectWithLockOption() != null && rdbmsAdapter.getPlaceWithOptionAfterFromClause()) + { + stmtText.append(" WITH " + rdbmsAdapter.getSelectWithLockOption()); + } + + List sorted = sortJoins(joins); Join[] sortedJoins = (Join[]) sorted.toArray(new Join[sorted.size()]); for( int i=0; i -1 || rangeCount > -1) && ((RDBMSAdapter)dba).getRangeByRowNumberColumn().length() > 0) + if ((rangeOffset > -1 || rangeCount > -1) && rdbmsAdapter.getRangeByRowNumberColumn().length() > 0) { // Add a condition on the row number where the RDBMS supports that means of range specification if (whereExpr != null) @@ -962,7 +971,7 @@ stmtText.append(" AND "); if (rangeOffset > -1) { - stmtText.append(((RDBMSAdapter)dba).getRangeByRowNumberColumn()).append(">=").append("" + rangeOffset); + stmtText.append(rdbmsAdapter.getRangeByRowNumberColumn()).append(">=").append("" + rangeOffset); } if (rangeCount > -1) { @@ -970,7 +979,7 @@ { stmtText.append(" AND "); } - stmtText.append(((RDBMSAdapter)dba).getRangeByRowNumberColumn()).append("<").append("" + (rangeCount - rangeOffset)); + stmtText.append(rdbmsAdapter.getRangeByRowNumberColumn()).append("<").append("" + (rangeCount - rangeOffset)); } } else @@ -978,7 +987,7 @@ stmtText.append(" WHERE "); if (rangeOffset > -1) { - stmtText.append(((RDBMSAdapter)dba).getRangeByRowNumberColumn()).append(">=").append("" + rangeOffset); + stmtText.append(rdbmsAdapter.getRangeByRowNumberColumn()).append(">=").append("" + rangeOffset); } if (rangeCount > -1) { @@ -986,7 +995,7 @@ { stmtText.append(" AND "); } - stmtText.append(((RDBMSAdapter)dba).getRangeByRowNumberColumn()).append("<").append("" + (rangeCount - rangeOffset)); + stmtText.append(rdbmsAdapter.getRangeByRowNumberColumn()).append("<").append("" + (rangeCount - rangeOffset)); } } } @@ -1046,7 +1055,7 @@ iterator = union.iterator(); while (iterator.hasNext()) { - if (((RDBMSAdapter)dba).useUnionAll()) + if (rdbmsAdapter.useUnionAll()) { stmtText.append(" UNION ALL "); } @@ -1071,13 +1080,13 @@ if (rangeOffset > -1 || rangeCount > -1) { // Add a LIMIT clause to WHERE if it is supported - stmtText.append(((RDBMSAdapter)dba).getRangeByLimitWhereClause(rangeOffset, rangeCount)); + stmtText.append(rdbmsAdapter.getRangeByLimitWhereClause(rangeOffset, rangeCount)); } // Add any required locking based on the RDBMS capability - if (lock && ((RDBMSAdapter)dba).supportsLockWithSelectForUpdate()) + if (lock && rdbmsAdapter.supportsLockWithSelectForUpdate()) { - if (usingDistinct && !((RDBMSAdapter)dba).supportsDistinctWithSelectForUpdate()) + if (usingDistinct && !rdbmsAdapter.supportsDistinctWithSelectForUpdate()) { JPOXLogger.JDO_QUERY.warn(LOCALISER.msg("QueryStatement.DistinctWithForUpdateNotAllowedForRDBMS")); } @@ -1086,9 +1095,9 @@ stmtText.append(" FOR UPDATE"); } } - else if (lock && ((RDBMSAdapter)dba).getSelectWithLockOption() != null) + else if (lock && !rdbmsAdapter.getPlaceWithOptionAfterFromClause() && rdbmsAdapter.getSelectWithLockOption() != null) { - stmtText.append(" WITH " + ((RDBMSAdapter)dba).getSelectWithLockOption()); + stmtText.append(" WITH " + rdbmsAdapter.getSelectWithLockOption()); } this.stmtText = stmtText; } @@ -1157,21 +1166,29 @@ this.tblExpr = tblExpr; } - /** - * Accessor for the join statement - * @return The join statement - */ - public String toString() - { + public String toString(RDBMSAdapter rdbmsAdapter, boolean lock) { if (type != null) { - return type + " " + tblExpr + " ON " + expr.eq(expr2).toStatementText(); + StringBuffer result = new StringBuffer(type + " " + tblExpr); + if (lock && rdbmsAdapter.getPlaceWithOptionWithinJoinClauses()) { + result.append(" WITH ").append(rdbmsAdapter.getSelectWithLockOption()); + } + return result.append(" ON " + expr.eq(expr2).toStatementText()).toString(); } else { return "" + tblExpr; } } + + /** + * Accessor for the join statement + * @return The join statement + */ + public String toString() + { + return toString(null, false); + } } /**