[Mulgara-svn] r894 - trunk/src/jar/resolver/java/org/mulgara/resolver
pag at mulgara.org
pag at mulgara.org
Sat May 3 03:13:12 UTC 2008
Author: pag
Date: 2008-05-02 20:13:08 -0700 (Fri, 02 May 2008)
New Revision: 894
Modified:
trunk/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
Log:
expanded to accept variables not present in the tuples
Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java 2008-05-02 16:40:22 UTC (rev 893)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java 2008-05-03 03:13:08 UTC (rev 894)
@@ -71,6 +71,10 @@
/** The target <code>SELECT</code> clause */
private List<? extends SelectElement> variableList;
+ /** The variables which are not bound */
+ private List<Variable> unboundVars = new ArrayList<Variable>();
+
+ /** All selected variables */
private Variable[] variables;
/** The current database session for this query. */
@@ -132,7 +136,8 @@
try {
if (!empty) tuples.getColumnIndex(variables[i]);
} catch (TuplesException e) {
- throw new IllegalArgumentException(variables[i] + " does not appear in the \"tuples\" parameter");
+ unboundVars.add(variables[i]);
+ if (logger.isDebugEnabled()) logger.debug(variables[i] + " does not appear in the \"tuples\" parameter");
}
} else if (element instanceof ConstantValue) {
variables[i] = ((ConstantValue) element).getVariable();
@@ -181,20 +186,22 @@
if (logger.isDebugEnabled()) {
logger.debug("Getting object " + column + " from variableList " + variableList);
}
- Object object = variableList.get(column);
+ SelectElement element = variableList.get(column);
- if (object instanceof Variable) {
- return super.getObject(super.getColumnIndex((Variable) object));
- } else if (object instanceof ConstantValue) {
- return ((ConstantValue) object).getValue();
- } else if (object instanceof Count) {
+ if (element instanceof Variable) {
+ Variable var = (Variable)element;
+ if (unboundVars.contains(var)) return null;
+ return super.getObject(super.getColumnIndex(var));
+ } else if (element instanceof ConstantValue) {
+ return ((ConstantValue) element).getValue();
+ } else if (element instanceof Count) {
// Atomic aggregate, already resolved by SelectedTuples
- return super.getObject(super.getColumnIndex(((Count) object).getVariable()));
- } else if (object instanceof Subquery) {
+ return super.getObject(super.getColumnIndex(((Count) element).getVariable()));
+ } else if (element instanceof Subquery) {
// Answer-valued aggregate, not yet resolved by SelectedTuples
try {
- if (logger.isDebugEnabled()) logger.debug("Resolving Subquery in SubqueryAnswer: " + object);
- return resolveSubquery((Subquery) object);
+ if (logger.isDebugEnabled()) logger.debug("Resolving Subquery in SubqueryAnswer: " + element);
+ return resolveSubquery((Subquery) element);
} catch (QueryException e) {
throw new TuplesException("Couldn't evaluate aggregate", e);
} catch (RuntimeException t) {
@@ -202,12 +209,21 @@
throw t;
}
} else {
- throw new TuplesException("Unknown type in SELECT clause: " + object.getClass());
+ throw new TuplesException("Unknown type in SELECT clause: " + element.getClass());
}
}
+ /**
+ * Return the column with a given name. This only applies to variables.
+ * @see org.mulgara.resolver.GlobalizedAnswer#getObject(java.lang.String)
+ * @return The bound value for the variable column with that name, or <code>null</code>
+ * if that variable is unbound.
+ * @throws TuplesException If there is no variable with that name.
+ */
public Object getObject(String columnName) throws TuplesException {
- throw new TuplesException("Not implemented for " + getClass());
+ for (Variable v: unboundVars) if (v.getName().equals(columnName)) return null;
+ for (Variable v: variables) if (v.getName().equals(columnName)) return super.getObject(super.getColumnIndex(v));
+ throw new TuplesException("Variable not found");
}
public Variable getVariable(int column) {
@@ -215,7 +231,7 @@
}
public Variable[] getVariables() {
- return variables;
+ return (Variable[])variables.clone();
}
//
More information about the Mulgara-svn
mailing list