[Mulgara-svn] r412 - branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver
andrae at mulgara.org
andrae at mulgara.org
Mon Sep 10 09:51:45 UTC 2007
Author: andrae
Date: 2007-09-10 04:51:45 -0500 (Mon, 10 Sep 2007)
New Revision: 412
Modified:
branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
Log:
Almost finished completely decoupling LocalQuery from AppendAggregateTuples and
LocalQueryResolver.
Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java 2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/AppendAggregateTuples.java 2007-09-10 09:51:45 UTC (rev 412)
@@ -72,14 +72,14 @@
/**
* The aggregate functions extracted from the <code>SELECT</code> clause.
*/
- private List localQueryList;
+ private List<Query> queryList;
/**
* Whether the corresponding index of this instance is an index into
- * the {@link #localQueryList} (if <code>true</code>) or the wrapped
+ * the {@link #queryList} (if <code>true</code>) or the wrapped
* {@link #tuples} (if <code>false</code>).
*/
- private boolean[] columnIsLocalQuery;
+ private boolean[] columnIsAggregate;
private int[] columnAggregateIndex;
@@ -95,6 +95,9 @@
/** Whether the {@link #cache} is valid for the current row. */
private boolean[] isCacheValid;
+ /** Exists *only* so we can call resolveMap() */
+ private LocalQuery localQuery;
+
/**
* Wrap an {@link Answer} instance.
*
@@ -109,7 +112,7 @@
* @throws TuplesException if there's trouble reading <var>tuples</var>
*/
AppendAggregateTuples(ResolverSession session,
- DatabaseOperationContext context, Tuples tuples,
+ LocalQuery localQuery, Tuples tuples,
List variableList) throws TuplesException {
if (logger.isDebugEnabled()) {
logger.debug("Generating variable list for " + tuples + " and " +
@@ -124,7 +127,8 @@
}
// Initialize fields
- this.columnIsLocalQuery = new boolean[variableList.size()];
+ this.localQuery = localQuery;
+ this.columnIsAggregate = new boolean[variableList.size()];
this.columnAggregateIndex = new int[variableList.size()];
this.session = session;
this.tuples = (Tuples) tuples.clone();
@@ -141,7 +145,7 @@
if (logger.isDebugEnabled()) {
logger.debug("" + hashCode() + " columnAggregateIndex[" + i + "] = -1");
}
- columnIsLocalQuery[i] = false;
+ columnIsAggregate[i] = false;
}
if (logger.isDebugEnabled()) {
logger.debug("" + hashCode() + " tupleVars.length = " + tupleVars.length);
@@ -149,7 +153,7 @@
// Calculate the rest of the variable list
int aggregateIndex = 0;
- localQueryList = new ArrayList();
+ queryList = new ArrayList<Query>();
for (int i = 0; i < variableList.size(); i++) {
Object element = variableList.get(i);
if (element instanceof Count) {
@@ -160,17 +164,11 @@
tupleVars.length + aggregateIndex + "] = " + aggregateIndex);
}
newVariableList.add(((Count) element).getVariable());
- columnIsLocalQuery[tupleVars.length + aggregateIndex] = true;
+ columnIsAggregate[tupleVars.length + aggregateIndex] = true;
aggregateIndex++;
- try {
- Query query = ((Count) element).getQuery();
- localQueryList.add(new LocalQuery(query, session, context));
- }
- catch (LocalizeException e) {
- throw new TuplesException(
- "Couldn't localize aggregate function query " + element, e);
- }
+ Query query = ((Count)element).getQuery();
+ queryList.add((Query)query.clone());
}
}
@@ -184,8 +182,8 @@
logger.debug("Set variable list " + Arrays.asList(getVariables()));
}
- // Initialize cache fields dependent on localQueryList
- cache = new long[localQueryList.size()];
+ // Initialize cache fields dependent on queryList
+ cache = new long[queryList.size()];
isCacheValid = new boolean[cache.length];
}
@@ -212,18 +210,17 @@
AppendAggregateTuples cloned = (AppendAggregateTuples)super.clone();
cloned.session = session;
- cloned.columnIsLocalQuery = cloned.columnIsLocalQuery;
+ cloned.columnIsAggregate = cloned.columnIsAggregate;
cloned.tuples = (Tuples) tuples.clone();
cloned.cache = (long[]) cache.clone();
cloned.isCacheValid = (boolean[]) isCacheValid.clone();
- cloned.localQueryList = new ArrayList();
- for (Iterator i = localQueryList.iterator(); i.hasNext(); ) {
- cloned.localQueryList.add(((LocalQuery) i.next()).clone());
+ cloned.queryList = new ArrayList<Query>();
+ for (Query query : queryList) {
+ cloned.queryList.add((Query)query.clone());
}
if (logger.isDebugEnabled()) {
- logger.debug("AppendAggregateTuples clone " + cloned.hashCode() +
- " from " + hashCode());
+ logger.debug("AppendAggregateTuples clone " + cloned.hashCode() + " from " + hashCode());
}
return cloned;
}
@@ -232,18 +229,11 @@
if (logger.isDebugEnabled()) {
logger.debug("closing AppendAggregateTuples " + hashCode(), new Throwable());
}
- for (Iterator i = localQueryList.iterator(); i.hasNext(); ) {
- LocalQuery lc = ((LocalQuery) i.next());
+ for (Query query : queryList) {
if (logger.isDebugEnabled()) {
- logger.debug("AppendAggregateTuples " + hashCode() +
- " closing LocalQuery " + lc.hashCode());
+ logger.debug("AppendAggregateTuples " + hashCode() + " closing Query " + query.hashCode());
}
- try {
- lc.close();
- }
- catch (QueryException eq) {
- throw new TuplesException("Error closing subquery", eq);
- }
+ query.close();
}
tuples.close();
@@ -268,14 +258,14 @@
try {
// Add the values of the current row to the WHERE clause of the
// aggregate function's query
- LocalQuery localQuery = (LocalQuery) localQueryList.get(index);
+ Query query = queryList.get(index);
if (logger.isDebugEnabled()) {
- logger.debug("" + hashCode() + " Base aggregate query: " + localQuery);
+ logger.debug("" + hashCode() + " Base aggregate query: " + query);
}
// Evaluate the aggregate query
- Tuples tuples = localQuery.resolveMap(createBindingMap(this.tuples));
+ Tuples tuples = localQuery.resolveMap(query, createBindingMap(this.tuples));
if (logger.isDebugEnabled()) {
logger.debug("Resolved aggregate to " + tuples);
@@ -311,8 +301,8 @@
Map bindings = new HashMap();
Variable[] vars = tuples.getVariables();
- for (int i = 0; i < columnIsLocalQuery.length; i++) {
- if (!columnIsLocalQuery[i]) {
+ for (int i = 0; i < columnIsAggregate.length; i++) {
+ if (!columnIsAggregate[i]) {
long columnValue = tuples.getColumnValue(i);
if (columnValue != Tuples.UNBOUND) {
bindings.put(vars[i], new LocalNode(columnValue));
Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java 2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java 2007-09-10 09:51:45 UTC (rev 412)
@@ -770,19 +770,20 @@
return tuples;
}
- Tuples innerCount(LocalQuery localQuery) throws QueryException {
- if (localQuery == null) {
+ Tuples innerCount(Query query) throws QueryException {
+ if (query == null) {
throw new IllegalArgumentException("Null \"query\" parameter");
}
if (logger.isInfoEnabled()) {
- logger.info("Inner Count: " + localQuery);
+ logger.info("Inner Count: " + query);
}
try {
- LocalQuery lq = (LocalQuery)localQuery.clone();
+ LocalQuery lq = new LocalQuery(query, systemResolver, this);
transform(lq);
Tuples result = lq.resolveE();
lq.close();
+ query.close();
return result;
} catch (QueryException eq) {
Modified: branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
===================================================================
--- branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java 2007-09-10 09:12:35 UTC (rev 411)
+++ branches/mgr-69/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java 2007-09-10 09:51:45 UTC (rev 412)
@@ -98,6 +98,8 @@
/** Variable list from select clause */
private List select;
+ private QueryEvaluationContext context;
+
//
// Constructor
//
@@ -162,12 +164,22 @@
// API methods
//
- Tuples resolveMap(Map outerBindings) throws QueryException
+ Tuples resolveMap(Query query, Map outerBindings) throws QueryException
{
try {
- return context.innerCount(new LocalQuery(this,
- new ConstraintConjunction(ConstraintOperations.bindVariables(outerBindings, constraintExpression),
- constrainBindings(outerBindings))));
+ Query newQuery = new Query(
+ query.getVariableList(),
+ query.getModelExpression(),
+ new ConstraintConjunction(
+ ConstraintOperations.bindVariables(outerBindings, query.getConstraintExpression()),
+ constrainBindings(outerBindings)),
+ query.getHavingExpression(),
+ query.getOrderList(),
+ query.getLimit(),
+ query.getOffset(),
+ (Answer)query.getGiven().clone());
+
+ return context.innerCount(newQuery);
} catch (LocalizeException el) {
throw new QueryException("Failed to resolve inner local query", el);
}
@@ -208,7 +220,8 @@
logger.debug("Stacktrace: ", new Throwable());
}
- Tuples result = resolveMECE(modelExpression, constraintExpression);
+ Tuples result = ConstraintOperations.resolveConstraintExpression(
+ new LocalQueryResolver(context, resolverSession), modelExpression, constraintExpression);
if (logger.isDebugEnabled()) {
logger.debug("Tuples result = " + TuplesOperations.formatTuplesTree(result));
@@ -262,7 +275,7 @@
{
if (result.getRowCardinality() != Tuples.ZERO) {
Tuples tmp = result;
- result = new AppendAggregateTuples(resolverSession, context, result, filterSubqueries(select));
+ result = new AppendAggregateTuples(resolverSession, this, result, filterSubqueries(select));
tmp.close();
}
@@ -329,32 +342,7 @@
return result;
}
- //
- // Internal methods
- //
- /**
- * Localize and resolve the <code>FROM</code> and <code>WHERE</code> clause
- * product.
- *
- * @param modelExpression the <code>FROM<code> clause to resolve
- * @param constraintExpression the <code>WHERE</code> clause to resolve
- * @throws QueryException if resolution can't be obtained
- */
- Tuples resolveMECE(ModelExpression modelExpression,
- ConstraintExpression constraintExpression)
- throws QueryException
- {
- return ConstraintOperations.resolveConstraintExpression(
- new LocalQueryResolver(context, resolverSession), modelExpression, constraintExpression);
- }
-
-
- ResolverSession getResolverSession() {
- return resolverSession;
- }
-
-
public Object clone()
{
try {
@@ -378,11 +366,6 @@
}
}
- public String toString()
- {
- return "where " + constraintExpression;
- }
-
/**
* Mutator for {@link LocalQuery}.
*/
More information about the Mulgara-svn
mailing list