[Mulgara-svn] r461 - in branches/nw-interface/src/jar: content-rdfxml/java/org/mulgara/content/rdfxml/writer itql/java/org/mulgara/itql query/java/org/mulgara/query resolver/java/org/mulgara/resolver resolver-relational/java/org/mulgara/resolver/relational resolver-relational/java/org/mulgara/resolver/relational/d2rq tuples/java/org/mulgara/store/tuples tuples-hybrid/java/org/mulgara/store/xa

pag at mulgara.org pag at mulgara.org
Tue Oct 2 17:41:15 UTC 2007


Author: pag
Date: 2007-10-02 12:41:13 -0500 (Tue, 02 Oct 2007)
New Revision: 461

Added:
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DefaultConstraintHandlers.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MutableLocalQueryImpl.java
Removed:
   branches/nw-interface/src/jar/query/java/org/mulgara/query/Transformable.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
Modified:
   branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/RDFXMLWriter.java
   branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/TestStatementsComparator.java
   branches/nw-interface/src/jar/itql/java/org/mulgara/itql/ItqlInterpreter.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelExpression.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelIntersection.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelLiteral.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelOperation.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelPartition.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelResource.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelUnion.java
   branches/nw-interface/src/jar/query/java/org/mulgara/query/Query.java
   branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/RelationalResolution.java
   branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/d2rq/Definition.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ConstraintOperations.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/Database.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java
   branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
   branches/nw-interface/src/jar/tuples-hybrid/java/org/mulgara/store/xa/HybridTuples.java
   branches/nw-interface/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java
Log:
Applied the following merges from 'trunk'. Followed up with some small updates to allow for a full build. Now building, but not tested. Expect that the tests won't work yet.


svn merge -c 375 https://mulgara.org/svn/mulgara/trunk
U src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java
U src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java

svn merge -c 388 https://mulgara.org/svn/mulgara/trunk
U src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java

svn merge -c 389 https://mulgara.org/svn/mulgara/trunk
C src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java # resolved
U src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java

svn merge -c 425 https://mulgara.org/svn/mulgara/trunk
D src/jar/query/java/org/mulgara/query/Transformable.java
C src/jar/query/java/org/mulgara/query/Query.java # resolved
U src/jar/query/java/org/mulgara/query/ModelResource.java
C src/jar/query/java/org/mulgara/query/ModelUnion.java # resolved
U src/jar/query/java/org/mulgara/query/ModelLiteral.java
U src/jar/query/java/org/mulgara/query/ModelExpression.java
C src/jar/query/java/org/mulgara/query/ModelIntersection.java # resolved
C src/jar/query/java/org/mulgara/query/ModelOperation.java # resolved
C src/jar/query/java/org/mulgara/query/ModelPartition.java # resolved
U src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
G src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java
C src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java # resolved
A src/jar/resolver/java/org/mulgara/resolver/MutableLocalQueryImpl.java
U src/jar/resolver/java/org/mulgara/resolver/Database.java
U src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
C src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java # resolved

svn merge -c 429 https://mulgara.org/svn/mulgara/trunk
G src/jar/query/java/org/mulgara/query/Query.java

svn merge -c 431 https://mulgara.org/svn/mulgara/trunk
Skipped 'src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java'
C src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java # resolved
G src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
C src/jar/resolver/java/org/mulgara/resolver/ConstraintOperations.java # resolved
A src/jar/resolver/java/org/mulgara/resolver/DefaultConstraintHandlers.java

svn rm --force src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java

svn merge -c 440 https://mulgara.org/svn/mulgara/trunk
G src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java

svn merge -c 441 https://mulgara.org/svn/mulgara/trunk
U src/jar/resolver-relational/java/org/mulgara/resolver/relational/RelationalResolution.java
U src/jar/resolver-relational/java/org/mulgara/resolver/relational/d2rq/Definition.java

svn merge -c 442 https://mulgara.org/svn/mulgara/trunk
U src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/TestStatementsComparator.java

svn merge -c 443 https://mulgara.org/svn/mulgara/trunk
U src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/RDFXMLWriter.java

svn merge -c 451 https://mulgara.org/svn/mulgara/trunk
U src/jar/itql/java/org/mulgara/itql/ItqlInterpreter.java

svn merge -c 452 https://mulgara.org/svn/mulgara/trunk
U src/jar/tuples-hybrid/java/org/mulgara/store/xa/HybridTuples.java




Modified: branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/RDFXMLWriter.java
===================================================================
--- branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/RDFXMLWriter.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/RDFXMLWriter.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -184,11 +184,13 @@
 
     // Statements may be lazily evaluated. Materializing caches them
     Tuples tuples = new StatementsWrapperTuples(statements);
-    tuples = TuplesOperations.materialize(tuples);
+    Tuples materializedTuples = TuplesOperations.materialize(tuples);
+    tuples.close();
 
     // ensure variables are in the right order
-    Tuples projectedTuples = TuplesOperations.project(tuples,
+    Tuples projectedTuples = TuplesOperations.project(materializedTuples,
         Arrays.asList(vars));
+    materializedTuples.close();
 
     // tuples must be sorted by subject for writing
     Tuples sortedTuples = TuplesOperations.sort(projectedTuples);

Modified: branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/TestStatementsComparator.java
===================================================================
--- branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/TestStatementsComparator.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/TestStatementsComparator.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -246,7 +246,7 @@
     Tuples materializedTuples = TuplesOperations.materialize(tuples);
     tuples.close();
 
-    Tuples sortedTuples = TuplesOperations.sort(tuples);
+    Tuples sortedTuples = TuplesOperations.sort(materializedTuples);
     materializedTuples.close();
 
     Tuples projectedTuples = TuplesOperations.project(sortedTuples,

Modified: branches/nw-interface/src/jar/itql/java/org/mulgara/itql/ItqlInterpreter.java
===================================================================
--- branches/nw-interface/src/jar/itql/java/org/mulgara/itql/ItqlInterpreter.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/itql/java/org/mulgara/itql/ItqlInterpreter.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -2195,7 +2195,11 @@
         // set the auto commit status
         if (session != null) {
           this.getSession().setAutoCommit(optionSet);
-          update();
+          // set the state of a transaction to clean, only if we have just finished a transaction
+          if (!autoCommit && optionSet) {
+            autoCommit = optionSet;
+            update();
+          }
         }
         autoCommit = optionSet;
 

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelExpression.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelExpression.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelExpression.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -27,9 +27,9 @@
 
 package org.mulgara.query;
 
-// used only in doc comments
 import java.net.*;
 import java.util.*;
+import java.io.Serializable;
 
 /**
  * An expression whose leaves are the {@link URL}s of RDF models.
@@ -49,7 +49,7 @@
  *
  * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
  */
-public interface ModelExpression extends Transformable, Cloneable {
+public interface ModelExpression extends Cloneable, Serializable {
 
   /**
    * Allow newer compiled version of the stub to operate when changes
@@ -70,27 +70,6 @@
   public Set<URI> getDatabaseURIs();
 
   /**
-   * Generate the WHERE constraint equivalent to this FROM constraint. This
-   * method is really part of query resolution, and properly would belong in the
-   * resolver package.
-   *
-   * @param constraint the WHERE constraint which we want to further constraint
-   *      according to this FROM clause
-   * @param transformation localizing transformation
-   * @param modelProperty the local node representing the
-   *   <code>mulgara:model</code> property
-   * @param systemModel the local node representing the system model
-   *   (<code>#</code>)
-   * @param variableFactory a factory for anonymous link variables
-   * @return the expanded WHERE constraint, incorporating this FROM clause
-   * @throws TransformationException if <var>transformation</var> fails to
-   *      convert a model resource from the global (RDF) namespace
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-      Transformation transformation, Value modelProperty, Value systemModel,
-      VariableFactory variableFactory) throws TransformationException;
-
-  /**
    * Clones sets of models in the rhs and lhs objects.
    */
   public Object clone();

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelIntersection.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelIntersection.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelIntersection.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -70,25 +70,6 @@
   }
 
   /**
-   * {@inheritDoc}
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-
-  // (s p o m)
-  Transformation transformation, Value modelProperty,
-  // mulgara:model
-  Value systemModel,
-  // #SYSTEM
-  VariableFactory variableFactory) throws TransformationException {
-
-    return new ConstraintConjunction(getLHS().toConstraintExpression(constraint,
-        transformation, modelProperty, systemModel, variableFactory),
-      getRHS().toConstraintExpression(constraint, transformation,
-        modelProperty, systemModel, variableFactory));
-  }
-
-
-  /**
    * Legible representation
    *
    * @return RETURNED VALUE TO DO

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelLiteral.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelLiteral.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelLiteral.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -149,44 +149,7 @@
     return in;
   }
 
-  /**
-   * @param constraint PARAMETER TO DO
-   * @param transformation PARAMETER TO DO
-   * @param modelProperty PARAMETER TO DO
-   * @param systemModel PARAMETER TO DO
-   * @param variableFactory PARAMETER TO DO
-   * @return RETURNED VALUE TO DO
-   * @throws UnsupportedOperationException always
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-      // (s p o m)
-      Transformation transformation, Value modelProperty,
-      // mulgara:model
-      Value systemModel,
-      // #SYSTEM
-      VariableFactory variableFactory) {
-
-    throw new UnsupportedOperationException(
-        "Literal models can't be converted to WHERE clauses yet");
-  }
-
   //
-  // Methods implementing Transformable
-  //
-
-  /**
-   * Transforms the constraints to/from global or local nodes.
-   *
-   * @param transformation The {@link Transformation} object to apply.
-   * @throws TransformationException If there was an error transforming.
-   */
-  public void transform(Transformation transformation) throws
-      TransformationException {
-
-    logger.warn("ModelLiteral.transform is not yet implemented");
-  }
-
-  //
   // Methods of Object
   //
 

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelOperation.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelOperation.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelOperation.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -147,43 +147,6 @@
   /**
    * Transform to an equivalent WHERE clause expression.
    *
-   * @param constraint The constraint to transform with this expression.
-   * @param transformation The transformation to apply to the constraint leaf nodes.
-   * @param modelProperty PARAMETER TO DO
-   * @param systemModel name of the system model
-   * @param variableFactory factory for building variables
-   * @return A {@link ConstraintExpression} that represents the transformed constraint.
-   * @throws TransformationException Unable to perform the transformation
-   */
-  public abstract ConstraintExpression toConstraintExpression(
-      Constraint constraint,
-      // (s p o m)
-      Transformation transformation,
-      Value modelProperty,
-      // mulgara:model
-      Value systemModel,
-      // #SYSTEM
-      VariableFactory variableFactory) throws TransformationException;
-
-  
-  /**
-   * Transform the left and right hand sides of this operation.
-   *
-   * @param transformation the {@link Transformation} to apply
-   * @throws TransformationException if the transformation fails
-   */
-  public void transform(Transformation transformation) throws
-      TransformationException {
-
-    lhs.transform(transformation);
-    rhs.transform(transformation);
-  }
-
-  /**
-   * Compares this model expression to another object. Compares true if of the same
-   * expression type (intersection/partition/union) and operates on objects that also
-   * compare equal.
-   *
    * @param m The object to compare against.
    * @return <code>true</code> if the objects are the same type,
    *         and applied to the same operands 

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelPartition.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelPartition.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelPartition.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -83,26 +83,6 @@
   }
 
   /**
-   * {@inheritDoc}
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-
-  // (s p o m)
-  Transformation transformation, Value modelProperty,
-  // mulgara:model
-  Value systemModel,
-  // #SYSTEM
-  VariableFactory variableFactory) throws TransformationException {
-
-    logger.warn("Replacing partition operation with disjunction");
-
-    return new ConstraintDisjunction(getLHS().toConstraintExpression(constraint,
-        transformation, modelProperty, systemModel, variableFactory),
-      getRHS().toConstraintExpression(constraint, transformation,
-        modelProperty, systemModel, variableFactory));
-  }
-
-  /**
    * Legible representation
    *
    * @return RETURNED VALUE TO DO

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelResource.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelResource.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelResource.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -145,57 +145,7 @@
     return uri;
   }
 
-  /**
-   * METHOD TO DO
-   *
-   * @param constraint PARAMETER TO DO
-   * @param transformation PARAMETER TO DO
-   * @param modelProperty PARAMETER TO DO
-   * @param systemModel PARAMETER TO DO
-   * @param variableFactory PARAMETER TO DO
-   * @return RETURNED VALUE TO DO
-   * @throws TransformationException EXCEPTION TO DO
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-      // (s p o m)
-      Transformation transformation, Value modelProperty,
-      // mulgara:model
-      Value systemModel,
-      // #SYSTEM
-      VariableFactory variableFactory) throws TransformationException {
-
-    // Localize this model resource
-    Value model = transformation.transform(new URIReferenceImpl(uri));
-
-    // Generate the anonymous join variable $group
-    Variable group = variableFactory.newVariable();
-
-    // Return (s p o m) or ((s p o $group) and ($group mulgara:model m #SYSTEM))
-    return new ConstraintDisjunction(new ConstraintImpl(constraint.getElement(0),
-        constraint.getElement(1), constraint.getElement(2), model),
-        new ConstraintConjunction(new ConstraintImpl(constraint.getElement(0),
-        constraint.getElement(1), constraint.getElement(2), group),
-        new ConstraintImpl(group, modelProperty, model, systemModel)));
-  }
-
   //
-  // Methods implementing Transformable
-  //
-
-  /**
-   * Transforms the constraints to/from global or local nodes.
-   *
-   * @param transformation The {@link Transformation} object to apply.
-   * @throws TransformationException If there was an error transforming.
-   */
-  public void transform(Transformation transformation)
-      throws TransformationException {
-
-    // because ModelResource currently wraps a URI rather than a Value,
-    // no transformation is required
-  }
-
-  //
   // Methods extending Object
   //
 

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelUnion.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelUnion.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/ModelUnion.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -70,24 +70,6 @@
   }
 
   /**
-   * {@inheritDoc}
-   */
-  public ConstraintExpression toConstraintExpression(Constraint constraint,
-
-  // (s p o m)
-  Transformation transformation, Value modelProperty,
-  // mulgara:model
-  Value systemModel,
-  // #SYSTEM
-  VariableFactory variableFactory) throws TransformationException {
-
-    return new ConstraintDisjunction(getLHS().toConstraintExpression(constraint,
-        transformation, modelProperty, systemModel, variableFactory),
-      getRHS().toConstraintExpression(constraint, transformation,
-        modelProperty, systemModel, variableFactory));
-  }
-
-  /**
    * Legible representation
    *
    * @return RETURNED VALUE TO DO

Modified: branches/nw-interface/src/jar/query/java/org/mulgara/query/Query.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/Query.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/Query.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -188,6 +188,31 @@
     this.answer = answer;
   }
 
+  /**
+   * Construct a new query equivalent to substituing 'where' for the
+   * where-clause in the original query.
+   */
+  public Query(Query query, ConstraintExpression where) {
+    this.mutableVariableList = query.mutableVariableList;
+    this.variableList = query.variableList;
+    this.modelExpression = query.modelExpression;
+    this.constraintExpression = where;
+    this.havingConstraint = query.havingConstraint;
+    this.orderList = query.orderList;
+    this.limit = query.limit;
+    this.offset = query.offset;
+    this.answer = (Answer)query.answer.clone();
+    /*
+      this(query.getVariableList(),
+          query.getModelExpression(),
+          where,
+          query.getHavingExpression(),
+          query.getOrderList(),
+          query.getLimit(),
+          query.getOffset(),
+          (Answer)query.getGiven().clone());
+    */
+  }
 
   /**
    * Cloning must always be supported.
@@ -203,8 +228,26 @@
     }
 
     // Copy mutable fields by value
-    cloned.mutableVariableList = (variableList == null) ? null : new ArrayList<Object>(variableList);
-    cloned.variableList = (variableList == null) ? null : Collections.unmodifiableList(cloned.mutableVariableList);
+    if (variableList == null) {
+      cloned.mutableVariableList = null;
+      cloned.variableList = null;
+    } else {
+      cloned.variableList = new ArrayList();
+      Iterator i = variableList.iterator();
+      while (i.hasNext()) {
+        Object o = i.next();
+        if (o instanceof Subquery) {
+          Subquery s = (Subquery)o;
+          cloned.variableList.add(new Subquery(s.getVariable(), (Query)s.getQuery().clone()));
+        } else if (o instanceof Count) {
+          Count a = (Count)o;
+          cloned.variableList.add(new Count(a.getVariable(), (Query)a.getQuery().clone()));
+        } else {
+          cloned.variableList.add(o);
+        }
+      }
+      cloned.mutableVariableList = Collections.unmodifiableList(cloned.variableList);
+    }
     cloned.modelExpression = modelExpression;  // FIXME: should be cloned
     cloned.answer = (Answer)answer.clone();
 

Deleted: branches/nw-interface/src/jar/query/java/org/mulgara/query/Transformable.java
===================================================================
--- branches/nw-interface/src/jar/query/java/org/mulgara/query/Transformable.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/query/java/org/mulgara/query/Transformable.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -1,68 +0,0 @@
-/*
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is the Kowari Metadata Store.
- *
- * The Initial Developer of the Original Code is Plugged In Software Pty
- * Ltd (http://www.pisoftware.com, mailto:info at pisoftware.com). Portions
- * created by Plugged In Software Pty Ltd are Copyright (C) 2001,2002
- * Plugged In Software Pty Ltd. All Rights Reserved.
- *
- * Contributor(s): N/A.
- *
- * [NOTE: The text of this Exhibit A may differ slightly from the text
- * of the notices in the Source Code files of the Original Code. You
- * should use the text of this Exhibit A rather than the text found in the
- * Original Code Source Code for Your Modifications.]
- *
- */
-
-package org.mulgara.query;
-
-
-// Java 2 standard packages
-import java.io.Serializable;
-
-/**
- * An interface marking the capability to globalize and localize data structures
- * built from {@link Value}s. <p>
- *
- * The entire point of localization and globalization is to be able to ship
- * classes to different sites. This is the reason this interface extends {@link
- * Serializable}. </p>
- *
- * @created 2001-08-13
- *
- * @author <a href="http://staff.pisoftware.com/raboczi">Simon Raboczi</a>
- *
- * @version $Revision: 1.8 $
- *
- * @modified $Date: 2005/01/05 04:58:20 $ by $Author: newmana $
- *
- * @maintenanceAuthor $Author: newmana $
- *
- * @copyright &copy;2001-2003
- *   <a href="http://www.pisoftware.com/">Plugged In Software Pty Ltd</a>
- *
- * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
- */
-public interface Transformable extends Serializable {
-
-  /**
-   * Transform all the {@link Value}s in this instance.
-   *
-   * @param transformation a {@link Transformation} from the current type to the
-   *      desired type
-   * @throws TransformationException if the transformation can't be performed
-   */
-  public void transform(Transformation transformation)
-    throws TransformationException;
-}

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -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 LocalQueryResolver context;
+
   /**
    * 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,
+      LocalQueryResolver context, 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.context = context;
+    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.resolve(createBindingMap(this.tuples));
+        Tuples tuples = context.resolveMap(query, createBindingMap(this.tuples));
 
         if (logger.isDebugEnabled()) {
           logger.debug("Resolved aggregate to " + tuples);
@@ -311,8 +301,8 @@
     Map<Variable,Value> bindings = new HashMap<Variable,Value>();
     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/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ConstraintOperations.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ConstraintOperations.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ConstraintOperations.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -80,6 +80,10 @@
   static Map<Class<? extends ConstraintExpression>,Object> constraintModelRewrites =
       new HashMap<Class<? extends ConstraintExpression>,Object>();
 
+  static {
+    DefaultConstraintHandlers.initializeHandlers();
+  }
+
   static void addConstraintResolutionHandlers(NVPair<Class<? extends ConstraintExpression>,Object>[] resolutionHandlers) throws RuntimeException {
     addToMap(resolutionHandlers, constraintResolutionHandlers,
              ConstraintExpression.class, ConstraintResolutionHandler.class);

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/Database.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/Database.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/Database.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -1206,7 +1206,7 @@
       setter.invoke(null, new Object[] { names });
     } catch (Exception e) {
       /* Not much that can be done here */
-      logger.warn("Unable to set the host names for Server Info", e);
+      logger.info("Unable to set the host names for Server Info", e);
     }
   }
 }

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -734,19 +734,19 @@
     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();
-      transform(lq);
-      Tuples result = lq.resolve();
-      lq.close();
+      query = transform(query);
+      LocalQueryResolver lq = new LocalQueryResolver(this, systemResolver);
+      Tuples result = lq.resolveE(query);
+      query.close();
 
       return result;
     } catch (QueryException eq) {
@@ -792,51 +792,56 @@
   public Answer doQuery(Query query) throws Exception {
     TransactionalAnswer result;
 
-    LocalQuery localQuery = new LocalQuery(query, systemResolver, this);
+    query = transform(query);
 
-    transform(localQuery);
+    LocalQueryResolver localQuery = new LocalQueryResolver(this, systemResolver);
 
     // Complete the numerical phase of resolution
-    Tuples tuples = localQuery.resolve();
+    Tuples tuples = localQuery.resolveE(query);
     result = new TransactionalAnswer(transaction, new SubqueryAnswer(this, systemResolver, tuples, query.getVariableList()));
     answers.put(result, null);
     tuples.close();
-    localQuery.close();
 
     return result;
   }
 
   /**
-   *
-   * Perform in-place transformation of localQuery.
-   * Note: we really want to convert this to a functional form eventually.
+   * Apply the registered transformations to the query until we reach a
+   * fixed-point.
    */
-  void transform(LocalQuery localQuery) throws Exception {
+  Query transform(Query query) throws Exception {
     // Start with the symbolic phase of resolution
-    LocalQuery.MutableLocalQueryImpl mutableLocalQueryImpl =
-      localQuery.new MutableLocalQueryImpl();
     if (symbolicLogger.isDebugEnabled()) {
-      symbolicLogger.debug("Before transformation: " + mutableLocalQueryImpl);
+      symbolicLogger.debug("Before transformation: " + query);
     }
+
+    MutableLocalQueryImpl mutable = new MutableLocalQueryImpl(query);
     Iterator<SymbolicTransformation> i = symbolicTransformationList.iterator();
     while (i.hasNext()) {
       SymbolicTransformation symbolicTransformation = i.next();
       assert symbolicTransformation != null;
-      symbolicTransformation.transform(this, mutableLocalQueryImpl);
-      if (mutableLocalQueryImpl.isModified()) {
-        // When a transformation succeeds, we rewind and start from the
-        // beginning of the symbolicTransformationList again
+
+      symbolicTransformation.transform(this, mutable);
+
+      // When a transformation succeeds, we rewind and start from the
+      // beginning of the symbolicTransformationList again
+      if (mutable.isModified()) {
         if (symbolicLogger.isDebugEnabled()) {
-          symbolicLogger.debug("Symbolic transformation: " +
-                               mutableLocalQueryImpl);
+          symbolicLogger.debug("Symbolic transformation: " + mutable);
         }
-        mutableLocalQueryImpl.close();
-        mutableLocalQueryImpl = localQuery.new MutableLocalQueryImpl();
+
+        Query tmp = query;
+        query = new Query(query, mutable.getConstraintExpression());
+        tmp.close();
+
+        mutable = new MutableLocalQueryImpl(query);
+
         // start again
         i = symbolicTransformationList.iterator();
       }
     }
-    mutableLocalQueryImpl.close();
+
+    return query;
   }
 
   void clear() throws QueryException {

Copied: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/DefaultConstraintHandlers.java (from rev 431, trunk/src/jar/resolver/java/org/mulgara/resolver/DefaultConstraintHandlers.java)

Deleted: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -1,497 +0,0 @@
-/*
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is the Kowari Metadata Store.
- *
- * The Initial Developer of the Original Code is Plugged In Software Pty
- * Ltd (http://www.pisoftware.com, mailto:info at pisoftware.com). Portions
- * created by Plugged In Software Pty Ltd are Copyright (C) 2001,2002
- * Plugged In Software Pty Ltd. All Rights Reserved.
- *
- * Contributor(s): N/A.
- *
- * [NOTE: The text of this Exhibit A may differ slightly from the text
- * of the notices in the Source Code files of the Original Code. You
- * should use the text of this Exhibit A rather than the text found in the
- * Original Code Source Code for Your Modifications.]
- *
- */
-
-package org.mulgara.resolver;
-
-// Java 2 standard packages
-import java.util.*;
-
-// Third party packages
-import org.apache.log4j.Logger;
-import org.jrdf.graph.Node;
-import org.jrdf.graph.URIReference;
-
-// Local packages
-import org.mulgara.query.*;
-import org.mulgara.query.rdf.BlankNodeImpl;
-import org.mulgara.query.rdf.LiteralImpl;
-import org.mulgara.query.rdf.URIReferenceImpl;
-import org.mulgara.resolver.spi.GlobalizeException;
-import org.mulgara.resolver.spi.LocalizeException;
-import org.mulgara.resolver.spi.LocalizedTuples;
-import org.mulgara.resolver.spi.MutableLocalQuery;
-import org.mulgara.resolver.spi.QueryEvaluationContext;
-import org.mulgara.resolver.spi.ResolverSession;
-import org.mulgara.resolver.spi.SymbolicTransformation;
-import org.mulgara.store.nodepool.NodePool;
-import org.mulgara.store.tuples.RestrictPredicateFactory;
-import org.mulgara.store.tuples.Tuples;
-import org.mulgara.store.tuples.TuplesOperations;
-
-/**
- * Localized version of a global {@link Query}.
- *
- * As well as providing coordinate transformation from global to local
- * coordinates, this adds methods to partially resolve the query.
- *
- * @created 2004-05-06
- * @author <a href="http://www.pisoftware.com/raboczi">Simon Raboczi</a>
- * @version $Revision: 1.13 $
- * @modified $Date: 2005/06/09 09:26:02 $
- * @maintenanceAuthor $Author: raboczi $
- * @company <a href="mailto:info at PIsoftware.com">Plugged In Software</a>
- * @copyright &copy;2004 <a href="http://www.tucanatech.com/">Tucana
- *   Technology, Inc</a>
- * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
- */
-class LocalQuery implements Cloneable
-{
-  /** Logger.  */
-  private static final Logger logger =
-    Logger.getLogger(LocalQuery.class.getName());
-
-  /** The current localisation/globalisation session.  */
-  private final ResolverSession resolverSession;
-
-  /** The session this query is local to.  */
-  private final DatabaseOperationContext context;
-
-  /** The constraint expression. */
-  private ConstraintExpression constraintExpression;
-
-  /** The model expression. */
-  private ModelExpression modelExpression;
-
-  /** The having clause */
-  private ConstraintHaving having;
-
-  /** The various components of the select clause. */
-  private final List orderList;
-  private final int offset;
-  private final Integer limit;
-  private Tuples given;
-
-  /** Variable list from select clause */
-  private List select;
-
-  private Map cachedResults;
-
-  //
-  // Constructor
-  //
-
-  /**
-   * Construct a database.
-   *
-   * @param query  the query to localize
-   * @param resolverSession  the database session to localize the
-   *   <var>query</var> against
-   * @throws IllegalArgumentException if <var>query</var> or
-   *   <var>resolverSession</var> are <code>null</code>
-   * @throws LocalizeException if the <var>query</var> can't be localized
-   */
-  LocalQuery(Query query, ResolverSession resolverSession, DatabaseOperationContext context)
-    throws LocalizeException, TuplesException
-  {
-    if (logger.isDebugEnabled()) {
-      logger.debug("Constructing local query for " + query);
-    }
-
-    // Validate "query" parameter
-    if (query == null) {
-      throw new IllegalArgumentException("Null \"query\" parameter");
-    }
-
-    // Validate "resolverSession" parameter
-    if (resolverSession == null) {
-      throw new IllegalArgumentException("Null \"resolverSession\" parameter");
-    }
-
-    // Initialize fields
-    this.constraintExpression = query.getConstraintExpression();
-    this.resolverSession = resolverSession;
-    this.context = context;
-    this.modelExpression = (ModelExpression)query.getModelExpression().clone();
-    this.orderList = query.getOrderList();
-    this.offset = query.getOffset();
-    this.limit = query.getLimit();
-    this.given = new LocalizedTuples(resolverSession, query.getGiven());
-    this.having = query.getHavingExpression();
-    this.select = query.getVariableList();
-    this.cachedResults = new HashMap();
-
-    if (logger.isDebugEnabled()) {
-      logger.debug("Constructed local query");
-    }
-  }
-
-  LocalQuery(LocalQuery localQuery, ConstraintExpression constraintExpression) {
-    this.constraintExpression = constraintExpression;
-    this.resolverSession = localQuery.resolverSession;
-    this.context = localQuery.context;
-    this.modelExpression = localQuery.modelExpression;
-    this.orderList = localQuery.orderList;
-    this.offset = localQuery.offset;
-    this.limit = localQuery.limit;
-    this.given = (Tuples)localQuery.given.clone();
-    this.select = localQuery.select;
-    this.cachedResults = new HashMap();
-  }
-
-  //
-  // API methods
-  //
-
-  /**
-   * Attempt to apply a symbolic query transformation.
-   *
-   * Symbolic transformations modify the values of query clauses without
-   * resolving any {@link Constraint} into {@link Tuples}.
-   *
-   * @param symbolicTransformation  the transformation to apply, never
-   *   <code>null</code>
-   * @return <code>true</code> if the application modified this instance
-   */
-  boolean apply(SymbolicTransformation symbolicTransformation)
-    throws QueryException
-  {
-    /*
-    MutableLocalQuery mutableLocalQuery = this.new MutableLocalQueryImpl();
-    symbolicTransformation.apply(mutableLocalQuery);
-    return mutableLocalQuery.isModified();
-    */
-    return false;
-  }
-
-  Tuples resolve(Map<Variable,Value> outerBindings) throws QueryException
-  {
-    try {
-      return context.innerCount(new LocalQuery(this,
-          new ConstraintConjunction(ConstraintOperations.bindVariables(outerBindings, constraintExpression),
-                                    constrainBindings(outerBindings))));
-    } catch (LocalizeException el) {
-      throw new QueryException("Failed to resolve inner local query", el);
-    }
-  }
-
-
-  // FIXME: This method should be using a LiteralTuples.  Also I believe MULGARA_IS is now preallocated.
-  // Someone needs to try making the change and testing.
-  private ConstraintExpression constrainBindings(Map<Variable,Value> bindings) throws LocalizeException {
-    List<ConstraintExpression> args = new ArrayList<ConstraintExpression>();
-    logger.info("FIXME:localize should be lookup, need to preallocate MULGARA_IS");
-    for (Map.Entry<Variable,Value> entry: bindings.entrySet()) {
-      args.add(ConstraintIs.newLocalConstraintIs(
-                  entry.getKey(),
-                  new LocalNode(resolverSession.localize(ConstraintIs.MULGARA_IS)),
-                  entry.getValue(),
-                  null));
-    }
-
-    return new ConstraintConjunction(args);
-  }
-
-
-  Tuples resolve(ConstraintExpression whereExtension) throws QueryException {
-    return resolve(constraintExpression, whereExtension);
-  }
-
-
-  Tuples resolve(Constraint constraint) throws QueryException {
-    return context.resolve(constraint);
-  }
-
-
-  Tuples resolve(ConstraintExpression baseExpression, ConstraintExpression whereExtension) throws QueryException
-  {
-    try {
-      if (logger.isDebugEnabled()) {
-        logger.debug("Resolving query " + modelExpression + " . " + constraintExpression);
-      }
-
-      if (logger.isDebugEnabled()) {
-        logger.debug("Stacktrace: ", new Throwable());
-      }
-
-      ConstraintExpression tmpConstraint = new ConstraintConjunction(
-          whereExtension, baseExpression);
-
-      Tuples result = resolve(modelExpression, tmpConstraint);
-
-      if (logger.isDebugEnabled()) {
-        logger.debug("Tuples result = " + TuplesOperations.formatTuplesTree(result));
-      }
-
-      result = projectSelectClause(result);
-      result = appendAggregates(result);
-      result = applyHaving(result);
-      result = orderResult(result);
-      result = offsetResult(result);
-      result = limitResult(result);
-
-      return result;
-    } catch (TuplesException et) {
-      throw new QueryException("Failed to resolve query", et);
-    }
-  }
-
-
-  /**
-   * @return the solution to this query
-   * @throws QueryException if resolution can't be obtained
-   */
-  Tuples resolve() throws QueryException
-  {
-    try {
-      return resolve(new ConstraintConjunction(new ArrayList()));
-    } catch (QueryException eq) {
-      logger.warn("QueryException thrown in resolve: ", eq);
-      throw eq;
-    } catch (Exception e) {
-      logger.warn("Exception thrown in resolve: ", e);
-      throw new QueryException("Exception thrown in resolve", e);
-    }
-  }
-
-
-  private Tuples projectSelectClause(Tuples result) throws TuplesException
-  {
-    if (result.getRowCardinality() > Cursor.ZERO) {
-      Tuples tmp = result;
-      try {
-        List variables = new ArrayList(select.size());
-
-      /*
-       * Note that this code need not concern itself with the order of the select-list,
-       * only the contents.  The mapping is handled by the subsequent Answer object,
-       * and only becomes important if the row-order is important and is therefore
-       * deferred to order-by resolution.
-       */
-        Variable[] vars = result.getVariables();
-        for (int i = 0; i < vars.length; i++) {
-          if (select.contains(vars[i])) {
-            variables.add(vars[i]);
-          }
-        }
-
-        result = TuplesOperations.project(result, variables);
-      } finally {
-        tmp.close();
-      }
-    }
-
-    return result;
-  }
-
-
-  private Tuples appendAggregates(Tuples result) throws TuplesException
-  {
-    if (result.getRowCardinality() != Tuples.ZERO) {
-      Tuples tmp = result;
-      result = new AppendAggregateTuples(resolverSession, context, result, filterSubqueries(select));
-      tmp.close();
-    }
-
-    return result;
-  }
-
-  private List filterSubqueries(List select) {
-    List result = new ArrayList();
-    Iterator i = select.iterator();
-    while (i.hasNext()) {
-      Object o = i.next();
-      if (!(o instanceof Subquery)) {
-        result.add(o);
-      }
-    }
-
-    return result;
-  }
-
-
-  private Tuples applyHaving(Tuples result) throws TuplesException {
-    Tuples tmp = result;
-    if (having != null) {
-      result = TuplesOperations.restrict(
-                  result, RestrictPredicateFactory.getPredicate(having, resolverSession));
-      tmp.close();
-    }
-
-    return result;
-  }
-
-
-  private Tuples orderResult(Tuples result) throws TuplesException, QueryException {
-    if (orderList.size() > 0 && result.getRowCardinality() > Cursor.ONE) {
-      Tuples tmp = result;
-      result = TuplesOperations.sort(result,
-                 new OrderByRowComparator(result, orderList, resolverSession));
-      tmp.close();
-    }
-
-    return result;
-  }
-
-  private Tuples offsetResult(Tuples result) throws TuplesException
-  {
-    if (offset > 0) {
-      Tuples tmp = result;
-      result = TuplesOperations.offset(result, offset);
-      tmp.close();
-    }
-
-    return result;
-  }
-
-
-  private Tuples limitResult(Tuples result)  throws TuplesException
-  {
-    if (limit != null) {
-      Tuples tmp = result;
-      result = TuplesOperations.limit(result, limit.intValue());
-      tmp.close();
-    }
-
-    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 resolve(ModelExpression      modelExpression,
-                 ConstraintExpression constraintExpression)
-    throws QueryException
-  {
-    QueryEvaluationContext context = new LocalQueryResolver(this, resolverSession);
-
-    return ConstraintOperations.resolveConstraintExpression(context, modelExpression, constraintExpression);
-  }
-
-
-  ResolverSession getResolverSession() {
-    return resolverSession;
-  }
-
-
-  public Object clone()
-  {
-    try {
-      LocalQuery query = (LocalQuery)super.clone();
-      query.modelExpression = (ModelExpression)modelExpression.clone();
-      query.given = (Tuples)given.clone();
-
-      return query;
-    } catch (CloneNotSupportedException ec) {
-      throw new Error("Object threw CloneNotSupportedException", ec);
-    }
-  }
-
-
-  public void close() throws QueryException
-  {
-    try {
-      given.close();
-    } catch (TuplesException et) {
-      throw new QueryException("Failed to close given clause", et);
-    }
-  }
-
-  public String toString()
-  {
-    return "where " + constraintExpression;
-  }
-
-  /**
-   * Mutator for {@link LocalQuery}.
-   */
-  class MutableLocalQueryImpl implements MutableLocalQuery
-  {
-    private boolean closed = false;
-    private boolean modified = false;
-
-    /**
-     * Once called, this instance can no longer be used for modifications.
-     */
-    void close()
-    {
-      closed = true;
-    }
-
-    /**
-     * @return whether this instance has been used to mutate the value of the
-     *   outer class
-     */
-    boolean isModified()
-    {
-      return modified;
-    }
-
-    //
-    // Methods implementing LocalQuery
-    //
-
-    public ConstraintExpression getConstraintExpression()
-    {
-      return constraintExpression;
-    }
-
-    public void setConstraintExpression(ConstraintExpression constraintExpression)
-    {
-      // Validate state
-      if (closed) {
-        throw new IllegalStateException();
-      }
-
-      // Validate "constraintExpression" parameter
-      if (constraintExpression == null) {
-        throw new IllegalArgumentException("Null \"constraintExpression\" parameter");
-      }
-
-      // Update fields
-      LocalQuery.this.constraintExpression = constraintExpression;
-      modified = true;
-    }
-
-    //
-    // Methods overriding Object
-    //
-
-    public String toString()
-    {
-      return LocalQuery.this.toString();
-    }
-  }
-}

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -49,7 +49,7 @@
 import java.util.*;
 
 // Third party packages
-// import org.apache.log4j.Logger;
+import org.apache.log4j.Logger;
 import org.jrdf.graph.Node;
 import org.jrdf.graph.URIReference;
 
@@ -67,6 +67,7 @@
 import org.mulgara.resolver.spi.ModelResolutionHandler;
 import org.mulgara.resolver.spi.QueryEvaluationContext;
 import org.mulgara.resolver.spi.ResolverSession;
+import org.mulgara.store.tuples.RestrictPredicateFactory;
 import org.mulgara.store.tuples.Tuples;
 import org.mulgara.store.tuples.TuplesOperations;
 import org.mulgara.util.NVPair;
@@ -89,260 +90,25 @@
  */
 @SuppressWarnings({ "unchecked", "unchecked", "unchecked" })
 class LocalQueryResolver implements QueryEvaluationContext {
-  // /** Logger.  */
-  // private static final Logger logger = Logger.getLogger(LocalQueryResolver.class.getName());
+  /** Logger.  */
+  private static final Logger logger = Logger.getLogger(LocalQueryResolver.class.getName());
 
-  private LocalQuery localQuery;
+  private DatabaseOperationContext operationContext;
 
   private ResolverSession resolverSession;
 
-  //
   // Constructor
-  //
-
-  /**
-   * Construct a database.
-   *
-   * @param localQuery  the query to localize
-   * @param resolverSession  the database session to localize the
-   *   <var>localQuery</var> against
-   * @throws IllegalArgumentException if <var>query</var> or
-   *   <var>resolverSession</var> are <code>null</code>
-   * @throws LocalizeException if the <var>query</var> can't be localized
-   */
-  LocalQueryResolver(LocalQuery localQuery, ResolverSession resolverSession) {
-    // Validate "query" parameter
-    if (localQuery == null) {
-      throw new IllegalArgumentException("Null 'localQuery' parameter");
+  LocalQueryResolver(DatabaseOperationContext operationContext, ResolverSession resolverSession) {
+    if (operationContext == null) {
+      throw new IllegalArgumentException("Null 'operationContext' parameter");
+    } else if (resolverSession == null) {
+      throw new IllegalArgumentException("Null 'resolverSession' parameter");
     }
 
-    // Initialize fields
-    this.localQuery = localQuery;
+    this.operationContext = operationContext;
     this.resolverSession = resolverSession;
   }
 
-  static {
-    ConstraintOperations.addModelResolutionHandlers(new NVPair[]
-      {
-        new NVPair<Class<? extends ModelExpression>,Object>(ModelUnion.class, new ModelResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr,
-                                Constraint constraint) throws Exception {
-            return TuplesOperations.append(
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint),
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint));
-          }
-        }),
-        new NVPair<Class<? extends ModelExpression>,Object>(ModelIntersection.class, new ModelResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr,
-                                Constraint constraint) throws Exception {
-            return TuplesOperations.join(
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint),
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint));
-          }
-        }),
-        new NVPair<Class<? extends ModelExpression>,Object>(ModelResource.class, new ModelResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr,
-                                Constraint constraint) throws Exception {
-            return context.resolve((ModelResource)modelExpr, (Constraint)constraint);
-          }
-        })
-      });
-  }
-
-  static {
-    ConstraintOperations.addConstraintResolutionHandlers(new NVPair[]
-      {
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintConjunction.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return TuplesOperations.join(
-              context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintDisjunction.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return TuplesOperations.append(
-                context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintDifference.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            List<Tuples> args = context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr);
-            assert args.size() == 2;
-            return TuplesOperations.subtract(args.get(0), args.get(1));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintIs.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            ConstraintIs constraint = (ConstraintIs)constraintExpr;
-            return TuplesOperations.assign((Variable)context.localize(constraint.getVariable()),
-                                           ((LocalNode)context.localize(constraint.getValueNode())).getValue());
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintImpl.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            ConstraintElement constraintElem =
-              ((ConstraintImpl) constraintExpr).getModel();
-            assert constraintElem != null;
-            if (constraintElem.equals(Variable.FROM)) {
-              return ConstraintOperations.resolveModelExpression(context, modelExpr, (Constraint)constraintExpr);
-            }
-            else if (constraintElem instanceof URIReference) {
-              return ConstraintOperations.resolveModelExpression(context, new ModelResource(((URIReference)constraintElem).getURI()), (Constraint)constraintExpr);
-            }
-            else if (constraintElem instanceof LocalNode) {
-              return context.resolve(null, (ConstraintImpl)constraintExpr);
-            }
-            else if (constraintElem instanceof Variable) {
-              return context.resolve(null, (ConstraintImpl)constraintExpr);
-            }
-            else {
-              throw new QueryException("Specified model not a URIReference/Variable: " + constraintElem +" is a " + constraintElem.getClass().getName() );
-            }
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintNegation.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            if (((ConstraintNegation)constraintExpr).getModel().equals(Variable.FROM)) {
-              return ConstraintOperations.resolveModelExpression(context, modelExpr, (Constraint)constraintExpr);
-            } else {
-              ConstraintElement constraintElem = ((ConstraintNegation)constraintExpr).getElement(3);
-              if (constraintElem instanceof URIReference) {
-                return ConstraintOperations.resolveModelExpression(context, new ModelResource(((URIReference)constraintElem).getURI()), (Constraint)constraintExpr);
-              } else {
-                throw new QueryException("Specified model not a URIReference: " + constraintElem +" is a " + constraintElem.getClass().getName() );
-              }
-            }
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(WalkConstraint.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return WalkFunction.walk(context, (WalkConstraint)constraintExpr, modelExpr, context.getResolverSession());
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(SingleTransitiveConstraint.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            SingleTransitiveConstraint constraint = (SingleTransitiveConstraint)constraintExpr;
-            if (constraint.isAnchored()) {
-              return DirectTransitiveFunction.infer(context, constraint, modelExpr, context.getResolverSession());
-            } else {
-              return ExhaustiveTransitiveFunction.infer(context, constraint, modelExpr, context.getResolverSession());
-            }
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(TransitiveConstraint.class, new ConstraintResolutionHandler() {
-          public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return ExhaustiveTransitiveFunction.infer(context, (TransitiveConstraint)constraintExpr, modelExpr, context.getResolverSession());
-          }
-        }),
-      });
-  }
-
-  static {
-    ConstraintOperations.addConstraintBindingHandlers(new NVPair[]
-      {
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintTrue.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return constraintExpr;
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintFalse.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return constraintExpr;
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintImpl.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return ConstraintOperations.replace(bindings, (Constraint)constraintExpr);
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintIs.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return ConstraintOperations.replace(bindings, (Constraint)constraintExpr);
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(SingleTransitiveConstraint.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return new SingleTransitiveConstraint(ConstraintOperations.replace(bindings, (Constraint)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(TransitiveConstraint.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            TransitiveConstraint tc = (TransitiveConstraint)constraintExpr;
-            return new TransitiveConstraint(ConstraintOperations.replace(bindings, tc.getAnchoredConstraint()),
-                                            ConstraintOperations.replace(bindings, tc.getUnanchoredConstraint()));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(WalkConstraint.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            WalkConstraint wc = (WalkConstraint)constraintExpr;
-            return new WalkConstraint(ConstraintOperations.replace(bindings, wc.getAnchoredConstraint()),
-                                      ConstraintOperations.replace(bindings, wc.getUnanchoredConstraint()));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintNegation.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return new ConstraintNegation(ConstraintOperations.replace(bindings, (Constraint)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintConjunction.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return new ConstraintConjunction(ConstraintOperations.replaceOperationArgs(bindings, (ConstraintOperation)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintDisjunction.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            return new ConstraintDisjunction(ConstraintOperations.replaceOperationArgs(bindings, (ConstraintOperation)constraintExpr));
-          }
-        }),
-        new NVPair<Class<? extends ConstraintExpression>,Object>(ConstraintDifference.class, new ConstraintBindingHandler() {
-          public ConstraintExpression bindVariables(Map<Variable,Value> bindings, ConstraintExpression constraintExpr) throws Exception {
-            List args = ConstraintOperations.replaceOperationArgs(bindings, (ConstraintOperation)constraintExpr);
-            return new ConstraintDifference((ConstraintExpression)args.get(0), (ConstraintExpression)args.get(1));
-          }
-        }),
-      });
-  }
-
-
-  static {
-    ConstraintOperations.addConstraintModelRewrites(new NVPair[]
-      {
-        new NVPair<Class<? extends Constraint>,Object>(ConstraintImpl.class, new ConstraintModelRewrite() {
-          public Constraint rewrite(ConstraintElement newModel, Constraint constraint) throws Exception {
-            return new ConstraintImpl(constraint.getElement(0), constraint.getElement(1), constraint.getElement(2), newModel);
-          }
-        }),
-        new NVPair<Class<? extends Constraint>,Object>(ConstraintNegation.class, new ConstraintModelRewrite() {
-          public Constraint rewrite(ConstraintElement newModel, Constraint constraint) throws Exception {
-            return new ConstraintNegation(new ConstraintImpl(constraint.getElement(0), constraint.getElement(1), constraint.getElement(2), newModel));
-          }
-        }),
-      });
-  }
-
-  static {
-    ConstraintOperations.addConstraintLocalizations(new NVPair[]
-      {
-        new NVPair<Class<? extends Constraint>,Object>(ConstraintImpl.class, new ConstraintLocalization() {
-          public Constraint localize(QueryEvaluationContext context, Constraint constraint) throws Exception {
-            return new ConstraintImpl(context.localize(constraint.getElement(0)),
-                context.localize(constraint.getElement(1)),
-                context.localize(constraint.getElement(2)),
-                context.localize(constraint.getElement(3)));
-          }
-        }),
-        new NVPair<Class<? extends Constraint>,Object>(ConstraintNegation.class, new ConstraintLocalization() {
-          public Constraint localize(QueryEvaluationContext context, Constraint constraint) throws Exception {
-            return new ConstraintNegation(new ConstraintImpl(
-                context.localize(constraint.getElement(0)),
-                context.localize(constraint.getElement(1)),
-                context.localize(constraint.getElement(2)),
-                context.localize(constraint.getElement(3))));
-          }
-        }),
-      });
-  }
-
   public List resolveConstraintOperation(ModelExpression modelExpr,
                                          ConstraintOperation constraintOper)
       throws QueryException
@@ -424,7 +190,7 @@
             localize(new URIReferenceImpl(modelResource.getURI())), localized);
       }
 
-      Tuples result = localQuery.resolve(localized);
+      Tuples result = operationContext.resolve(localized);
 
       return result;
     } catch (LocalizeException e) {
@@ -439,11 +205,195 @@
 
 
   public Tuples resolve(ModelExpression modelExpression, ConstraintExpression constraintExpression) throws QueryException {
-    return localQuery.resolve(modelExpression, constraintExpression);
+    return ConstraintOperations.resolveConstraintExpression(this, modelExpression, constraintExpression);
   }
 
 
   public ResolverSession getResolverSession() {
     return resolverSession;
   }
+
+  Tuples resolveMap(Query query, Map outerBindings) throws QueryException
+  {
+    try {
+      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 operationContext.innerCount(newQuery);
+    } catch (LocalizeException el) {
+      throw new QueryException("Failed to resolve inner local query", el);
+    }
+  }
+
+
+  // FIXME: This method should be using a LiteralTuples.  Also I believe MULGARA_IS is now preallocated.
+  // Someone needs to try making the change and testing.
+  private ConstraintExpression constrainBindings(Map bindings) throws LocalizeException {
+    List args = new ArrayList();
+    Iterator i = bindings.entrySet().iterator();
+    logger.info("FIXME:localize should be lookup, need to preallocate MULGARA_IS");
+    while (i.hasNext()) {
+      Map.Entry entry = (Map.Entry)i.next();
+      args.add(ConstraintIs.newLocalConstraintIs(
+                  (Variable)entry.getKey(),
+                  new LocalNode(resolverSession.localize(ConstraintIs.MULGARA_IS)),
+                  (Value)entry.getValue(),
+                  null));
+    }
+
+    return new ConstraintConjunction(args);
+  }
+
+  /**
+   * @return the solution to this query
+   * @throws QueryException if resolution can't be obtained
+   */
+  Tuples resolveE(Query query) throws QueryException
+  {
+    if (query == null) {
+      throw new IllegalArgumentException("Query null in LocalQuery::resolveE");
+    }
+
+    try {
+      if (logger.isDebugEnabled()) {
+        logger.debug("Resolving query " + query);
+      }
+
+      if (logger.isDebugEnabled()) {
+        logger.debug("Stacktrace: ", new Throwable());
+      }
+
+      Tuples result = ConstraintOperations.resolveConstraintExpression(this,
+          query.getModelExpression(), query.getConstraintExpression());
+
+      if (logger.isDebugEnabled()) {
+        logger.debug("Tuples result = " + TuplesOperations.formatTuplesTree(result));
+      }
+
+      result = projectSelectClause(query, result);
+      result = appendAggregates(query, result);
+      result = applyHaving(query, result);
+      result = orderResult(query, result);
+      result = offsetResult(query, result);
+      result = limitResult(query, result);
+
+      return result;
+    } catch (TuplesException et) {
+      throw new QueryException("Failed to resolve query", et);
+    }
+  }
+
+
+  private Tuples projectSelectClause(Query query, Tuples result) throws TuplesException
+  {
+    if (result.getRowCardinality() > Cursor.ZERO) {
+      Tuples tmp = result;
+      try {
+        List variables = new ArrayList();
+
+      /*
+       * Note that this code need not concern itself with the order of the select-list,
+       * only the contents.  The mapping is handled by the subsequent Answer object,
+       * and only becomes important if the row-order is important and is therefore
+       * deferred to order-by resolution.
+       */
+        Variable[] vars = result.getVariables();
+        for (int i = 0; i < vars.length; i++) {
+          if (query.getVariableList().contains(vars[i])) {
+            variables.add(vars[i]);
+          }
+        }
+
+        result = TuplesOperations.project(result, variables);
+      } finally {
+        tmp.close();
+      }
+    }
+
+    return result;
+  }
+
+
+  private Tuples appendAggregates(Query query, Tuples result) throws TuplesException
+  {
+    if (result.getRowCardinality() != Tuples.ZERO) {
+      Tuples tmp = result;
+      result = new AppendAggregateTuples(resolverSession, this, result,
+          filterSubqueries(query.getVariableList()));
+      tmp.close();
+    }
+
+    return result;
+  }
+
+  private List filterSubqueries(List select) {
+    List result = new ArrayList();
+    for (Object o : select) {
+      if (!(o instanceof Subquery)) {
+        result.add(o);
+      }
+    }
+
+    return result;
+  }
+
+
+  private Tuples applyHaving(Query query, Tuples result) throws TuplesException {
+    ConstraintHaving having = query.getHavingExpression();
+    Tuples tmp = result;
+    if (having != null) {
+      result = TuplesOperations.restrict(
+                  result, RestrictPredicateFactory.getPredicate(having, resolverSession));
+      tmp.close();
+    }
+
+    return result;
+  }
+
+
+  private Tuples orderResult(Query query, Tuples result) throws TuplesException, QueryException {
+    List orderList = query.getOrderList();
+    if (orderList.size() > 0 && result.getRowCardinality() > Cursor.ONE) {
+      Tuples tmp = result;
+      result = TuplesOperations.sort(result,
+                 new OrderByRowComparator(result, orderList, resolverSession));
+      tmp.close();
+    }
+
+    return result;
+  }
+
+  private Tuples offsetResult(Query query, Tuples result) throws TuplesException
+  {
+    int offset = query.getOffset();
+    if (offset > 0) {
+      Tuples tmp = result;
+      result = TuplesOperations.offset(result, offset);
+      tmp.close();
+    }
+
+    return result;
+  }
+
+
+  private Tuples limitResult(Query query, Tuples result)  throws TuplesException
+  {
+    Integer limit = query.getLimit();
+    if (limit != null) {
+      Tuples tmp = result;
+      result = TuplesOperations.limit(result, limit.intValue());
+      tmp.close();
+    }
+
+    return result;
+  }
 }

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -198,7 +198,7 @@
         Variable[] vars = answer.getVariables();
         assert vars.length == 3;
         statements = new TuplesWrapperStatements(
-            new LocalizedTuples(systemResolver, answer, true),
+            new LocalizedTuples(systemResolver, answer, insert),
             vars[0], vars[1], vars[2]);
       } finally {
         answer.close();

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -493,18 +493,24 @@
       try {
         errorReport(errorMessage + " - Aborting", cause);
       } finally { try {
+        if (transaction != null) {
+          transaction.rollback();
+        }
+      } finally { try {
         manager.transactionAborted(this);
       } finally { try {
         abortEnlistedResources();
       } finally { try {
         context.clear();
       } finally { try {
+        enlisted.clear();
+      } finally { try {
         transaction = null;
       } finally { try {
         manager = null;
       } finally {
         state = State.FAILED;
-      } } } } } }
+      } } } } } } } }
       return new MulgaraTransactionException(errorMessage + " - Aborting", cause);
     } catch (Throwable th) {
       throw new MulgaraTransactionException(errorMessage + " - Failed to abort cleanly", th);

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -167,7 +167,7 @@
    */
   private MulgaraTransaction obtainWriteLock(DatabaseSession session)
       throws MulgaraTransactionException {
-    while (currentWritingSession != null || writeLockReserved()) {
+    while (writeLockHeld() || writeLockReserved()) {
       try {
         writeLockCondition.await();
       } catch (InterruptedException ei) {
@@ -532,6 +532,9 @@
     mutex.lock();
   }
 
+  /**
+   * Used to reserve the write lock during a commit or rollback.
+   */
   private void reserveWriteLock() throws MulgaraTransactionException {
     if (!mutex.isHeldByCurrentThread()) {
       throw new IllegalStateException("Attempt to set modify without holding mutex");
@@ -552,9 +555,14 @@
   }
 
   private boolean writeLockReserved() {
+    // TRUE iff there is a reserving thread AND it is different thread to the current thread.
     return reservingThread != null && !Thread.currentThread().equals(reservingThread);
   }
 
+  private boolean writeLockHeld() {
+    return currentWritingSession != null;
+  }
+
   private void releaseMutex() {
     if (!mutex.isHeldByCurrentThread()) {
       throw new IllegalStateException("Attempt to release mutex without holding mutex");

Copied: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/MutableLocalQueryImpl.java (from rev 425, trunk/src/jar/resolver/java/org/mulgara/resolver/MutableLocalQueryImpl.java)

Modified: branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
===================================================================
--- branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -278,14 +278,7 @@
           ConstraintOperations.bindVariables(bindings, query.getConstraintExpression()),
           constrainBindings(bindings));
 
-      query = new Query(query.getVariableList(),
-          query.getModelExpression(),
-          where,
-          null,
-          query.getOrderList(),
-          query.getLimit(),
-          query.getOffset(),
-          query.getGiven());
+      query = new Query(query, where);
 
       if (logger.isDebugEnabled()) {
         logger.debug("Generated subquery: " + query);

Modified: branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/RelationalResolution.java
===================================================================
--- branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/RelationalResolution.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/RelationalResolution.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -292,20 +292,23 @@
       throw new TuplesException("RelationalResolution does not support suffix != 0");
     }
 
-    List result = new ArrayList();
     Iterator i = constraint.getRdfTypeConstraints().iterator();
     if (!i.hasNext()) {
       this.result = new EmptyResolution(constraint, true);
     } else {
-      while (i.hasNext()) {
-        Constraint head = (Constraint)i.next();
-        
-        result.add(resolveInstance(head, constraint, conn, defn));
+      List result = new ArrayList();
+      try {
+        while (i.hasNext()) {
+          Constraint head = (Constraint)i.next();
+          result.add(resolveInstance(head, constraint, conn, defn));
+        }
+
+        this.result = TuplesOperations.join(result);
+      } finally {
+        close((Tuples[]) result.toArray(new Tuples[result.size()]));
       }
     }
 
-    
-    this.result = TuplesOperations.join(result);
     // It is possible that the join may have no variables but only if the query returns empty.
     if (this.result.getRowCardinality() != Cursor.ZERO) {
       Variable[] local = this.getVariables();

Modified: branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/d2rq/Definition.java
===================================================================
--- branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/d2rq/Definition.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/resolver-relational/java/org/mulgara/resolver/relational/d2rq/Definition.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -129,9 +129,15 @@
 
     LocalNode belongs = new LocalNode(session.localize(Constants.belongsToClassMap));
     LocalNode propBridge = new LocalNode(session.localize(Constants.TypeObjectPropertyBridge));
-    Tuples props = TuplesOperations.join(
-      resolver.resolve(new ConstraintImpl(subj, belongs, map, model)),
-      resolver.resolve(new ConstraintImpl(subj, type, propBridge, model)));
+    Tuples lhs = resolver.resolve(new ConstraintImpl(subj, belongs, map, model));
+    Tuples rhs = resolver.resolve(new ConstraintImpl(subj, type, propBridge, model));
+    Tuples props;
+    try {
+      props = TuplesOperations.join(lhs, rhs);
+    } finally {
+      lhs.close();
+      rhs.close();
+    }
     props.beforeFirst();
     while (props.next()) {
       long prop = props.getColumnValue(0);
@@ -152,9 +158,15 @@
 
     LocalNode belongs = new LocalNode(session.localize(Constants.belongsToClassMap));
     LocalNode propBridge = new LocalNode(session.localize(Constants.TypeDatatypePropertyBridge));
-    Tuples props = TuplesOperations.join(
-      resolver.resolve(new ConstraintImpl(subj, belongs, map, model)),
-      resolver.resolve(new ConstraintImpl(subj, type, propBridge, model)));
+    Tuples lhs = resolver.resolve(new ConstraintImpl(subj, belongs, map, model));
+    Tuples rhs = resolver.resolve(new ConstraintImpl(subj, type, propBridge, model));
+    Tuples props;
+    try {
+      props = TuplesOperations.join(lhs, rhs);
+    } finally {
+      lhs.close();
+      rhs.close();
+    }
     props.beforeFirst();
     while (props.next()) {
       long prop = props.getColumnValue(0);

Modified: branches/nw-interface/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java
===================================================================
--- branches/nw-interface/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -322,7 +322,13 @@
         sortedSubtrahend = (null == subtrahend.getComparator()) ? sort(subtrahend) : subtrahend;
       }
       // return the difference
-      return new Difference(minuend, sortedSubtrahend);
+      try {
+        return new Difference(minuend, sortedSubtrahend);
+      } finally {
+        if (sortedSubtrahend != subtrahend) {
+          sortedSubtrahend.close();
+        }
+      }
 
     } catch (RuntimeException re) {
       logger.warn("RuntimeException thrown in subtraction", re);
@@ -355,7 +361,6 @@
       while (i.hasNext()) {
         operands.add(((Tuples)i.next()).clone());
       }
-      operand.close();
     } else {
       operands.add(operand.clone());
     }

Modified: branches/nw-interface/src/jar/tuples-hybrid/java/org/mulgara/store/xa/HybridTuples.java
===================================================================
--- branches/nw-interface/src/jar/tuples-hybrid/java/org/mulgara/store/xa/HybridTuples.java	2007-09-28 19:06:27 UTC (rev 460)
+++ branches/nw-interface/src/jar/tuples-hybrid/java/org/mulgara/store/xa/HybridTuples.java	2007-10-02 17:41:13 UTC (rev 461)
@@ -334,8 +334,8 @@
     tuples = null;
     if (blockFile != null && --blockFileRefCount.refCount == 0) {
       try {
-        blockFile.delete();
-      } catch (Throwable ie) {
+        delete();
+      } catch (IOException ie) {
         logger.warn("Failed to delete blockFile", ie);
         throw new TuplesException("Failed to delete blockFile", ie);
       }




More information about the Mulgara-svn mailing list