[Mulgara-svn] r412 - branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver

andrae at mulgara.org andrae at mulgara.org
Mon Sep 10 09:51:45 UTC 2007


Author: andrae
Date: 2007-09-10 04:51:45 -0500 (Mon, 10 Sep 2007)
New Revision: 412

Modified:
   branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
   branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
   branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
Log:
Almost finished completely decoupling LocalQuery from AppendAggregateTuples and
LocalQueryResolver.



Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java	2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java	2007-09-10 09:51:45 UTC (rev 412)
@@ -72,14 +72,14 @@
   /**
    * The aggregate functions extracted from the <code>SELECT</code> clause.
    */
-  private List localQueryList;
+  private List<Query> queryList;
 
   /**
    * Whether the corresponding index of this instance is an index into
-   * the {@link #localQueryList} (if <code>true</code>) or the wrapped
+   * the {@link #queryList} (if <code>true</code>) or the wrapped
    * {@link #tuples} (if <code>false</code>).
    */
-  private boolean[] columnIsLocalQuery;
+  private boolean[] columnIsAggregate;
 
   private int[] columnAggregateIndex;
 
@@ -95,6 +95,9 @@
   /** Whether the {@link #cache} is valid for the current row.  */
   private boolean[] isCacheValid;
 
+  /** Exists *only* so we can call resolveMap() */
+  private LocalQuery localQuery;
+
   /**
    * Wrap an {@link Answer} instance.
    *
@@ -109,7 +112,7 @@
    * @throws TuplesException  if there's trouble reading <var>tuples</var>
    */
   AppendAggregateTuples(ResolverSession session,
-      DatabaseOperationContext context, Tuples tuples,
+      LocalQuery localQuery, Tuples tuples,
       List variableList) throws TuplesException {
     if (logger.isDebugEnabled()) {
       logger.debug("Generating variable list for " + tuples + " and " +
@@ -124,7 +127,8 @@
     }
 
     // Initialize fields
-    this.columnIsLocalQuery = new boolean[variableList.size()];
+    this.localQuery = localQuery;
+    this.columnIsAggregate = new boolean[variableList.size()];
     this.columnAggregateIndex = new int[variableList.size()];
     this.session = session;
     this.tuples = (Tuples) tuples.clone();
@@ -141,7 +145,7 @@
       if (logger.isDebugEnabled()) {
         logger.debug("" + hashCode() + " columnAggregateIndex[" + i + "] = -1");
       }
-      columnIsLocalQuery[i] = false;
+      columnIsAggregate[i] = false;
     }
     if (logger.isDebugEnabled()) {
       logger.debug("" + hashCode() + " tupleVars.length = " + tupleVars.length);
@@ -149,7 +153,7 @@
 
     // Calculate the rest of the variable list
     int aggregateIndex = 0;
-    localQueryList = new ArrayList();
+    queryList = new ArrayList<Query>();
     for (int i = 0; i < variableList.size(); i++) {
       Object element = variableList.get(i);
       if (element instanceof Count) {
@@ -160,17 +164,11 @@
               tupleVars.length + aggregateIndex + "] = " + aggregateIndex);
         }
         newVariableList.add(((Count) element).getVariable());
-        columnIsLocalQuery[tupleVars.length + aggregateIndex] = true;
+        columnIsAggregate[tupleVars.length + aggregateIndex] = true;
         aggregateIndex++;
 
-        try {
-          Query query = ((Count) element).getQuery();
-          localQueryList.add(new LocalQuery(query, session, context));
-        }
-        catch (LocalizeException e) {
-          throw new TuplesException(
-              "Couldn't localize aggregate function query " + element, e);
-        }
+        Query query = ((Count)element).getQuery();
+        queryList.add((Query)query.clone());
       }
     }
 
@@ -184,8 +182,8 @@
       logger.debug("Set variable list " + Arrays.asList(getVariables()));
     }
 
-    // Initialize cache fields dependent on localQueryList
-    cache = new long[localQueryList.size()];
+    // Initialize cache fields dependent on queryList
+    cache = new long[queryList.size()];
     isCacheValid = new boolean[cache.length];
   }
 
@@ -212,18 +210,17 @@
     AppendAggregateTuples cloned = (AppendAggregateTuples)super.clone();
 
     cloned.session = session;
-    cloned.columnIsLocalQuery = cloned.columnIsLocalQuery;
+    cloned.columnIsAggregate = cloned.columnIsAggregate;
     cloned.tuples = (Tuples) tuples.clone();
     cloned.cache = (long[]) cache.clone();
     cloned.isCacheValid = (boolean[]) isCacheValid.clone();
-    cloned.localQueryList = new ArrayList();
-    for (Iterator i = localQueryList.iterator(); i.hasNext(); ) {
-      cloned.localQueryList.add(((LocalQuery) i.next()).clone());
+    cloned.queryList = new ArrayList<Query>();
+    for (Query query : queryList) {
+      cloned.queryList.add((Query)query.clone());
     }
 
     if (logger.isDebugEnabled()) {
-      logger.debug("AppendAggregateTuples clone " + cloned.hashCode() +
-          " from " + hashCode());
+      logger.debug("AppendAggregateTuples clone " + cloned.hashCode() + " from " + hashCode());
     }
     return cloned;
   }
@@ -232,18 +229,11 @@
     if (logger.isDebugEnabled()) {
       logger.debug("closing AppendAggregateTuples " + hashCode(), new Throwable());
     }
-    for (Iterator i = localQueryList.iterator(); i.hasNext(); ) {
-      LocalQuery lc = ((LocalQuery) i.next());
+    for (Query query : queryList) {
       if (logger.isDebugEnabled()) {
-        logger.debug("AppendAggregateTuples " + hashCode() +
-            " closing LocalQuery " + lc.hashCode());
+        logger.debug("AppendAggregateTuples " + hashCode() + " closing Query " + query.hashCode());
       }
-      try {
-        lc.close();
-      }
-      catch (QueryException eq) {
-        throw new TuplesException("Error closing subquery", eq);
-      }
+      query.close();
     }
 
     tuples.close();
@@ -268,14 +258,14 @@
       try {
         // Add the values of the current row to the WHERE clause of the
         // aggregate function's query
-        LocalQuery localQuery = (LocalQuery) localQueryList.get(index);
+        Query query = queryList.get(index);
 
         if (logger.isDebugEnabled()) {
-          logger.debug("" + hashCode() + " Base aggregate query: " + localQuery);
+          logger.debug("" + hashCode() + " Base aggregate query: " + query);
         }
 
         // Evaluate the aggregate query
-        Tuples tuples = localQuery.resolveMap(createBindingMap(this.tuples));
+        Tuples tuples = localQuery.resolveMap(query, createBindingMap(this.tuples));
 
         if (logger.isDebugEnabled()) {
           logger.debug("Resolved aggregate to " + tuples);
@@ -311,8 +301,8 @@
     Map bindings = new HashMap();
     Variable[] vars = tuples.getVariables();
 
-    for (int i = 0; i < columnIsLocalQuery.length; i++) {
-      if (!columnIsLocalQuery[i]) {
+    for (int i = 0; i < columnIsAggregate.length; i++) {
+      if (!columnIsAggregate[i]) {
         long columnValue = tuples.getColumnValue(i);
         if (columnValue != Tuples.UNBOUND) {
           bindings.put(vars[i], new LocalNode(columnValue));

Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-09-10 09:51:45 UTC (rev 412)
@@ -770,19 +770,20 @@
     return tuples;
   }
 
-  Tuples innerCount(LocalQuery localQuery) throws QueryException {
-    if (localQuery == null) {
+  Tuples innerCount(Query query) throws QueryException {
+    if (query == null) {
       throw new IllegalArgumentException("Null \"query\" parameter");
     }
 
     if (logger.isInfoEnabled()) {
-      logger.info("Inner Count: " + localQuery);
+      logger.info("Inner Count: " + query);
     }
     try {
-      LocalQuery lq = (LocalQuery)localQuery.clone();
+      LocalQuery lq = new LocalQuery(query, systemResolver, this);
       transform(lq);
       Tuples result = lq.resolveE();
       lq.close();
+      query.close();
 
       return result;
     } catch (QueryException eq) {

Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java	2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java	2007-09-10 09:51:45 UTC (rev 412)
@@ -98,6 +98,8 @@
   /** Variable list from select clause */
   private List select;
 
+  private QueryEvaluationContext context;
+
   //
   // Constructor
   //
@@ -162,12 +164,22 @@
   // API methods
   //
 
-  Tuples resolveMap(Map outerBindings) throws QueryException
+  Tuples resolveMap(Query query, Map outerBindings) throws QueryException
   {
     try {
-      return context.innerCount(new LocalQuery(this,
-          new ConstraintConjunction(ConstraintOperations.bindVariables(outerBindings, constraintExpression),
-                                    constrainBindings(outerBindings))));
+      Query newQuery = new Query(
+          query.getVariableList(),
+          query.getModelExpression(),
+          new ConstraintConjunction(
+              ConstraintOperations.bindVariables(outerBindings, query.getConstraintExpression()),
+              constrainBindings(outerBindings)),
+          query.getHavingExpression(),
+          query.getOrderList(),
+          query.getLimit(),
+          query.getOffset(),
+          (Answer)query.getGiven().clone());
+          
+      return context.innerCount(newQuery);
     } catch (LocalizeException el) {
       throw new QueryException("Failed to resolve inner local query", el);
     }
@@ -208,7 +220,8 @@
         logger.debug("Stacktrace: ", new Throwable());
       }
 
-      Tuples result = resolveMECE(modelExpression, constraintExpression);
+      Tuples result = ConstraintOperations.resolveConstraintExpression(
+          new LocalQueryResolver(context, resolverSession), modelExpression, constraintExpression);
 
       if (logger.isDebugEnabled()) {
         logger.debug("Tuples result = " + TuplesOperations.formatTuplesTree(result));
@@ -262,7 +275,7 @@
   {
     if (result.getRowCardinality() != Tuples.ZERO) {
       Tuples tmp = result;
-      result = new AppendAggregateTuples(resolverSession, context, result, filterSubqueries(select));
+      result = new AppendAggregateTuples(resolverSession, this, result, filterSubqueries(select));
       tmp.close();
     }
 
@@ -329,32 +342,7 @@
     return result;
   }
 
-  //
-  // Internal methods
-  //
 
-  /**
-   * Localize and resolve the <code>FROM</code> and <code>WHERE</code> clause
-   * product.
-   *
-   * @param modelExpression the <code>FROM<code> clause to resolve
-   * @param constraintExpression the <code>WHERE</code> clause to resolve
-   * @throws QueryException if resolution can't be obtained
-   */
-  Tuples resolveMECE(ModelExpression      modelExpression,
-                 ConstraintExpression constraintExpression)
-    throws QueryException
-  {
-    return ConstraintOperations.resolveConstraintExpression(
-        new LocalQueryResolver(context, resolverSession), modelExpression, constraintExpression);
-  }
-
-
-  ResolverSession getResolverSession() {
-    return resolverSession;
-  }
-
-
   public Object clone()
   {
     try {
@@ -378,11 +366,6 @@
     }
   }
 
-  public String toString()
-  {
-    return "where " + constraintExpression;
-  }
-
   /**
    * Mutator for {@link LocalQuery}.
    */




More information about the Mulgara-svn mailing list