You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/08/22 01:53:49 UTC

svn commit: r433431 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/mai...

Author: awhite
Date: Mon Aug 21 16:53:49 2006
New Revision: 433431

URL: http://svn.apache.org/viewvc?rev=433431&view=rev
Log:
No need for parser to populate separate QueryExpressions.aggregate member now 
that we can visit the projection values to see if they're aggregates.


Modified:
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java Mon Aug 21 16:53:49 2006
@@ -131,7 +131,7 @@
         ClassMetaData base, ClassMetaData[] metas, boolean subclasses,
         ExpressionFactory[] facts, QueryExpressions[] exps, Object[] params,
         boolean lrs, long startIdx, long endIdx) {
-        if (metas.length > 1 && exps[0].aggregate)
+        if (metas.length > 1 && exps[0].isAggregate())
             throw new UserException(Localizer.forPackage(JDBCStoreQuery.class)
                 .get("mult-mapping-aggregate", Arrays.asList(metas)));
 

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java Mon Aug 21 16:53:49 2006
@@ -177,8 +177,8 @@
                 // get unique candidate values) and needed field values and
                 // applies the where conditions; the outer select applies
                 // ordering, grouping, etc
-                if (exps.aggregate || (exps.distinct & exps.DISTINCT_TRUE) == 0)
-                {
+                if (exps.isAggregate() 
+                    || (exps.distinct & exps.DISTINCT_TRUE) == 0) {
                     DBDictionary dict = store.getDBDictionary();
                     dict.assertSupport(dict.supportsSubselect,
                         "SupportsSubselect");
@@ -186,7 +186,7 @@
                     Select inner = sel;
                     sel = store.getSQLFactory().newSelect();
                     sel.setParent(parent, alias);
-                    sel.setDistinct(exps.aggregate
+                    sel.setDistinct(exps.isAggregate()
                         && (exps.distinct & exps.DISTINCT_TRUE) != 0);
                     sel.setFromSelect(inner);
                 }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java Mon Aug 21 16:53:49 2006
@@ -349,7 +349,7 @@
         }
 
         public final boolean isAggregate(StoreQuery q) {
-            return assertQueryExpression().aggregate;
+            return assertQueryExpression().isAggregate();
         }
 
         public final boolean hasGrouping(StoreQuery q) {

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/InMemoryExpressionFactory.java Mon Aug 21 16:53:49 2006
@@ -221,7 +221,7 @@
             return matches;
 
         // if an ungrouped aggregate, evaluate the whole matches list
-        if (exps.grouping.length == 0 && exps.aggregate) {
+        if (exps.grouping.length == 0 && exps.isAggregate()) {
             Object[] projection = project(matches, exps, true, ctx, params);
             return Arrays.asList(new Object[]{ projection });
         }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java Mon Aug 21 16:53:49 2006
@@ -37,7 +37,11 @@
     public static final int DISTINCT_FALSE = 2 << 2;
     public static final Value[] EMPTY_VALUES = new Value[0];
 
-    public boolean aggregate = false;
+    /**
+     * Map of {@link FieldMetaData},{@link Value} for update statements.
+     */
+    public Map updates = null;
+
     public int distinct = DISTINCT_AUTO;
     public String alias = null;
     public Value[] projections = EMPTY_VALUES;
@@ -55,9 +59,51 @@
     public int operation = QueryOperations.OP_SELECT;
     public ClassMetaData[] accessPath = StoreQuery.EMPTY_METAS;
     public String[] fetchPaths = StoreQuery.EMPTY_STRINGS;
+    private Boolean _aggregate = null;
+
+    public boolean isAggregate() {
+        if (projections.length == 0)
+            return false; 
+        if (_aggregate == null)
+            _aggregate = (AggregateExpressionVisitor.isAggregate(projections))
+                ? Boolean.TRUE : Boolean.FALSE;
+        return _aggregate.booleanValue();    
+    }
 
     /**
-     * Map of {@link FieldMetaData},{@link Value} for update statements.
+     * Visitor to determine whether our projections are aggregates.
      */
-    public Map updates = null;
+    private static class AggregateExpressionVisitor
+        extends AbstractExpressionVisitor {
+        
+        private Value _sub = null;
+        private boolean _agg = false;
+
+        /**
+         * Return whether the given values include projections.
+         */
+        public static boolean isAggregate(Value[] vals) {
+            if (vals.length == 0)
+                return false;
+            AggregateExpressionVisitor v = new AggregateExpressionVisitor();
+            for (int i = 0; i < vals.length && !v._agg; i++)
+                vals[i].acceptVisit(v);
+            return v._agg;
+        }
+
+        public void enter(Value val) {
+            if (_agg)
+                return;
+            if (_sub == null) {
+                if (val.isAggregate())
+                    _agg = true;
+            } else if (val instanceof Subquery)
+                _sub = val;
+        }
+
+        public void exit(Value val) {
+            if (val == _sub)
+                _sub = null;
+        }
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=433431&r1=433430&r2=433431&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Mon Aug 21 16:53:49 2006
@@ -286,7 +286,6 @@
             JPQLNode parent = parametersNode.getChild(i);
             JPQLNode node = onlyChild(parent);
             Value proj = getValue(node);
-            exps.aggregate = exps.aggregate || node.id == JJTAGGREGATE;
             exps.projections[i] = proj;
             exps.projectionAliases[i] = nextAlias();