You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/08/05 16:17:48 UTC
svn commit: r562871 - in
/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src:
main/java/org/apache/cayenne/access/jdbc/
main/java/org/apache/cayenne/ejbql/parser/
test/java/org/apache/cayenne/access/
Author: aadamchik
Date: Sun Aug 5 07:17:47 2007
New Revision: 562871
URL: http://svn.apache.org/viewvc?view=rev&rev=562871
Log:
CAY-840 EJBQL Subquery support
(ALL subselect)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLSubqueryTest.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?view=diff&rev=562871&r1=562870&r2=562871
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Sun Aug 5 07:17:47 2007
@@ -82,6 +82,11 @@
context.append(" EXISTS");
return true;
}
+
+ public boolean visitAll(EJBQLExpression expression) {
+ context.append(" ALL");
+ return true;
+ }
public boolean visitOr(EJBQLExpression expression, int finishedChildIndex) {
afterChild(expression, " OR", finishedChildIndex);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java?view=diff&rev=562871&r1=562870&r2=562871
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java Sun Aug 5 07:17:47 2007
@@ -68,10 +68,6 @@
DbAttribute dbAttribute = (DbAttribute) attribute.getDbAttribute();
- // TODO: andrus 6/27/2007 - the last parameter is an unofficial "jdbcType"
- // pending CAY-813 implementation, switch to #column directive
- String columnAlias = context.nextColumnAlias();
-
if (context.isAppendingResultColumns()) {
context.append(" #result('");
}
@@ -82,6 +78,11 @@
context.append(alias).append('.').append(dbAttribute.getName());
if (context.isAppendingResultColumns()) {
+ String columnAlias = context.nextColumnAlias();
+
+ // TODO: andrus 6/27/2007 - the last parameter is an unofficial
+ // "jdbcType"
+ // pending CAY-813 implementation, switch to #column directive
context
.append("' '")
.append(attribute.getType())
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java?view=diff&rev=562871&r1=562870&r2=562871
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java Sun Aug 5 07:17:47 2007
@@ -44,6 +44,10 @@
*/
class Compiler {
+ // a flag indicating whether column expressions should be treated as result columns or
+ // not.
+ private boolean appendingResultColumns;
+
private String rootId;
private EntityResolver resolver;
private Map descriptorsById;
@@ -135,6 +139,16 @@
class CompilationVisitor extends EJBQLBaseVisitor {
+ public boolean visitSelect(EJBQLExpression expression) {
+ appendingResultColumns = true;
+ return true;
+ }
+
+ public boolean visitFrom(EJBQLExpression expression, int finishedChildIndex) {
+ appendingResultColumns = false;
+ return true;
+ }
+
public boolean visitSelectExpression(EJBQLExpression expression) {
expression.visit(rootDescriptorVisitor);
return false;
@@ -310,12 +324,14 @@
}
private void addResultSetColumn() {
- if (resultSetMapping == null) {
- resultSetMapping = new SQLResultSetMapping();
- }
+ if (appendingResultColumns) {
+ if (resultSetMapping == null) {
+ resultSetMapping = new SQLResultSetMapping();
+ }
- String column = "sc" + resultSetMapping.getColumnResults().size();
- resultSetMapping.addColumnResult(column);
+ String column = "sc" + resultSetMapping.getColumnResults().size();
+ resultSetMapping.addColumnResult(column);
+ }
}
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLSubqueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLSubqueryTest.java?view=diff&rev=562871&r1=562870&r2=562871
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLSubqueryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLSubqueryTest.java Sun Aug 5 07:17:47 2007
@@ -58,4 +58,28 @@
assertTrue(ids.contains(new Integer(33001)));
assertTrue(ids.contains(new Integer(33003)));
}
+
+ public void testAll() throws Exception {
+ createTestData("prepare");
+
+ String ejbql = "SELECT p FROM Painting p"
+ + " WHERE p.estimatedPrice > ALL ("
+ + " SELECT p1.estimatedPrice FROM Painting p1"
+ + " WHERE p1.paintingTitle = 'P2'"
+ + ")";
+
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+ List objects = createDataContext().performQuery(query);
+ assertEquals(2, objects.size());
+
+ Set ids = new HashSet();
+ Iterator it = objects.iterator();
+ while (it.hasNext()) {
+ Object id = DataObjectUtils.pkForObject((Persistent) it.next());
+ ids.add(id);
+ }
+
+ assertTrue(ids.contains(new Integer(33003)));
+ assertTrue(ids.contains(new Integer(33004)));
+ }
}