You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tf...@apache.org on 2013/02/15 01:30:18 UTC
svn commit: r1446412 - in /db/torque/torque4/trunk/torque-runtime/src:
main/java/org/apache/torque/criteria/ main/java/org/apache/torque/sql/
test/java/org/apache/torque/sql/
Author: tfischer
Date: Fri Feb 15 00:30:18 2013
New Revision: 1446412
URL: http://svn.apache.org/r1446412
Log:
TORQUE-266 Add row level locking (select for update)
Modified:
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/criteria/Criteria.java
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/Query.java
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/SqlBuilder.java
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/sql/SqlBuilderTest.java
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/criteria/Criteria.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/criteria/Criteria.java?rev=1446412&r1=1446411&r2=1446412&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/criteria/Criteria.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/criteria/Criteria.java Fri Feb 15 00:30:18 2013
@@ -158,6 +158,9 @@ public class Criteria
/** The having clause in a query. */
private Criterion having = null;
+ /** Whether a FOR UPDATE clause should be added. */
+ private boolean forUpdate = false;
+
/** The criterion objects, keyed by the column. */
private Criterion topLevelCriterion;
@@ -394,6 +397,41 @@ public class Criteria
}
/**
+ * Sets that FOR UPDATE clause should be added to the query.
+ *
+ * @return this object.
+ */
+ public Criteria forUpdate()
+ {
+ forUpdate = true;
+ return this;
+ }
+
+ /**
+ * Sets whether FOR UPDATE clause should be added to the query.
+ *
+ * @param forUpdate true if a FOR UPDATE clause should be added,
+ * false if not.
+ *
+ * @return this object.
+ */
+ public Criteria setForUpdate(boolean forUpdate)
+ {
+ this.forUpdate = forUpdate;
+ return this;
+ }
+
+ /**
+ * Returns whether a FOR UPDATE clause is added.
+ *
+ * @return true if a FOR UPDATE clause is added, false otherwise.
+ */
+ public boolean isForUpdate()
+ {
+ return forUpdate;
+ }
+
+ /**
* Adds a join to the criteria, E.g. to create the condition
* <p>
* AND PROJECT.PROJECT_ID=FOO.PROJECT_ID
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/Query.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/Query.java?rev=1446412&r1=1446411&r2=1446412&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/Query.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/Query.java Fri Feb 15 00:30:18 2013
@@ -83,6 +83,8 @@ public class Query
private static final String OFFSET = " OFFSET ";
/** Constant for text " SET ROWCOUNT ". */
private static final String SET_ROWCOUNT = " SET ROWCOUNT ";
+ /** Constant for text " FOR UPDATE". */
+ private static final String FOR_UPDATE = " FOR UPDATE";
/**
* The select modifiers. E.g. DISTINCT.
@@ -151,6 +153,11 @@ public class Query
*/
private String rowcount;
+ /**
+ * Whether a FOR UPDATE clause should be rendered.
+ */
+ private boolean forUpdate;
+
/** The type of the statement. */
private Type type = Type.SELECT;
@@ -387,6 +394,29 @@ public class Query
}
/**
+ * Sets whether FOR UPDATE clause should be added to the query.
+ *
+ * @param forUpdate true if a FOR UPDATE clause should be added,
+ * false if not.
+ *
+ * @return this object.
+ */
+ public void setForUpdate(boolean forUpdate)
+ {
+ this.forUpdate = forUpdate;
+ }
+
+ /**
+ * Returns whether a FOR UPDATE clause is added.
+ *
+ * @return true if a FOR UPDATE clause is added, false otherwise.
+ */
+ public boolean isForUpdate()
+ {
+ return forUpdate;
+ }
+
+ /**
* True if this query has a limit clause registered.
*
* @return true if a limit clause exists.
@@ -553,6 +583,10 @@ public class Query
{
stringBuilder.append(postLimit);
}
+ if (Type.SELECT == type && forUpdate)
+ {
+ stringBuilder.append(FOR_UPDATE);
+ }
return stringBuilder;
}
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/SqlBuilder.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/SqlBuilder.java?rev=1446412&r1=1446411&r2=1446412&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/SqlBuilder.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/sql/SqlBuilder.java Fri Feb 15 00:30:18 2013
@@ -170,6 +170,7 @@ public final class SqlBuilder
processOrderBy(crit, sqlStatement);
processLimits(crit, sqlStatement);
processFromElements(crit, sqlStatement);
+ processForUpdate(crit, sqlStatement);
sqlStatement.setFetchSize(crit.getFetchSize());
return sqlStatement;
@@ -674,6 +675,19 @@ public final class SqlBuilder
}
/**
+ * Adds a possible FOR UPDATE Clause to the query
+ *
+ * @param criteria the criteria from which the query should be built.
+ * @param query the query to build.
+ */
+ private static void processForUpdate(
+ final Criteria criteria,
+ final Query query)
+ {
+ query.setForUpdate(criteria.isForUpdate());
+ }
+
+ /**
* Returns the tablename which can be added to a From Clause.
* This takes care of any aliases that might be defined.
* For example, if an alias "a" for the table AUTHOR is defined
Modified: db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/sql/SqlBuilderTest.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/sql/SqlBuilderTest.java?rev=1446412&r1=1446411&r2=1446412&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/sql/SqlBuilderTest.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/sql/SqlBuilderTest.java Fri Feb 15 00:30:18 2013
@@ -27,7 +27,6 @@ import java.util.List;
import org.apache.torque.BaseTestCase;
import org.apache.torque.Column;
import org.apache.torque.ColumnImpl;
-import org.apache.torque.Database;
import org.apache.torque.TorqueException;
import org.apache.torque.criteria.Criteria;
import org.apache.torque.criteria.Criterion;
@@ -1464,6 +1463,66 @@ public class SqlBuilderTest extends Base
query.toString());
}
+ public void testLimitOracle() throws Exception
+ {
+ Criteria criteria = new Criteria();
+ criteria.addSelectColumn(stringColumnMap);
+ criteria.setLimit(20);
+ criteria.setDbName(databaseOracle.getName());
+ Query query = SqlBuilder.buildQuery(criteria);
+ assertEquals("SELECT B.* FROM ("
+ + " SELECT A.*, rownum AS TORQUE$ROWNUM FROM "
+ + "( SELECT TABLE.COLUMN1 FROM TABLE ) A ) B"
+ + " WHERE B.TORQUE$ROWNUM <= 20",
+ query.toString());
+ }
+
+ public void testOffsetOracle() throws Exception
+ {
+ Criteria criteria = new Criteria();
+ criteria.addSelectColumn(stringColumnMap);
+ criteria.setOffset(10);
+ criteria.setDbName(databaseOracle.getName());
+ Query query = SqlBuilder.buildQuery(criteria);
+ assertEquals("SELECT B.* FROM ("
+ + " SELECT A.*, rownum AS TORQUE$ROWNUM FROM "
+ + "( SELECT TABLE.COLUMN1 FROM TABLE ) A ) B"
+ + " WHERE B.TORQUE$ROWNUM > 10",
+ query.toString());
+ }
+
+ public void testLimitOffsetOracle() throws Exception
+ {
+ Criteria criteria = new Criteria();
+ criteria.addSelectColumn(stringColumnMap);
+ criteria.setLimit(20);
+ criteria.setOffset(10);
+ criteria.setDbName(databaseOracle.getName());
+ Query query = SqlBuilder.buildQuery(criteria);
+ assertEquals("SELECT B.* FROM ("
+ + " SELECT A.*, rownum AS TORQUE$ROWNUM FROM "
+ + "( SELECT TABLE.COLUMN1 FROM TABLE ) A ) B"
+ + " WHERE B.TORQUE$ROWNUM > 10 AND B.TORQUE$ROWNUM <= 30",
+ query.toString());
+ }
+
+ public void testSelectForUpdate() throws Exception
+ {
+ Criteria criteria = new Criteria()
+ .addSelectColumn(stringColumnMap)
+ .setLimit(20)
+ .setOffset(10)
+ .forUpdate();
+ criteria.setDbName(databaseOracle.getName());
+ Query query = SqlBuilder.buildQuery(criteria);
+ assertEquals("SELECT B.* FROM ("
+ + " SELECT A.*, rownum AS TORQUE$ROWNUM FROM "
+ + "( SELECT TABLE.COLUMN1 FROM TABLE ) A ) B"
+ + " WHERE B.TORQUE$ROWNUM > 10 AND B.TORQUE$ROWNUM <= 30"
+ + " FOR UPDATE",
+ query.toString());
+ }
+
public void testHaving() throws Exception
{
Criteria criteria = new Criteria();
---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org