[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 ©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 ©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