[Mulgara-svn] r1762 - trunk/src/jar/querylang/java/org/mulgara/sparql

pag at mulgara.org pag at mulgara.org
Fri Jul 10 16:39:21 UTC 2009


Author: pag
Date: 2009-07-10 09:39:20 -0700 (Fri, 10 Jul 2009)
New Revision: 1762

Modified:
   trunk/src/jar/querylang/java/org/mulgara/sparql/PatternTransformer.java
   trunk/src/jar/querylang/java/org/mulgara/sparql/SparqlInterpreter.java
Log:
Added in grammar optimizations through the PatternTransformer. This was always supposed to be attached, but had been missed.

Modified: trunk/src/jar/querylang/java/org/mulgara/sparql/PatternTransformer.java
===================================================================
--- trunk/src/jar/querylang/java/org/mulgara/sparql/PatternTransformer.java	2009-07-10 16:37:58 UTC (rev 1761)
+++ trunk/src/jar/querylang/java/org/mulgara/sparql/PatternTransformer.java	2009-07-10 16:39:20 UTC (rev 1762)
@@ -16,10 +16,15 @@
 
 package org.mulgara.sparql;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.mulgara.parser.MulgaraParserException;
+import org.mulgara.query.ConstraintConjunction;
+import org.mulgara.query.ConstraintDifference;
+import org.mulgara.query.ConstraintDisjunction;
 import org.mulgara.query.ConstraintExpression;
 import org.mulgara.query.ConstraintFilter;
 import org.mulgara.query.ConstraintOptionalJoin;
@@ -78,8 +83,12 @@
   static {
     addToMap(new FilterTx());
     addToMap(new LeftJoinTx());
+    addToMap(new ConjunctionTx());
+    addToMap(new DisjunctionTx());
+    addToMap(new DifferenceTx());
   }
 
+
   /**
    * Creates a conjunction of filters, skipping any TRUE values on the way.
    * @param lhs The first filter to join
@@ -94,17 +103,36 @@
 
 
   /**
+   * Maps a list of constraint expressions to a list of transformed constraint expressions.
+   * This would be better done as a closure, but we can't, especially with the "changed" flag.
+   * @param elements The list to be transformed
+   * @return A new list full of transformed items, or else the original if nothing was changed.
+   * @throws MulgaraParserException Due to a bad transformation.
+   */
+  private static List<ConstraintExpression> txList(List<ConstraintExpression> elements) throws MulgaraParserException {
+    boolean changed = false;
+    List<ConstraintExpression> newList = new ArrayList<ConstraintExpression>();
+    for (ConstraintExpression c: elements) {
+      ConstraintExpression tx = transform(c);
+      if (tx != c) changed = true;
+      newList.add(tx);
+    }
+    return changed ? newList : elements;
+  }
+
+
+  /**
    * Map filtered constraints to the flattening operation.
    *   Filter(X1,Filter(X2,A)) => Filter(X2 && X1, A)
    */
   private static class FilterTx extends Transformer<ConstraintFilter> {
     public Class<ConstraintFilter> getTxType() { return ConstraintFilter.class; }
     public ConstraintExpression tx(ConstraintFilter constraint) throws MulgaraParserException {
-      ConstraintExpression subConstraint = constraint.getUnfilteredConstraint();
-      if (subConstraint instanceof ConstraintFilter) {
+      ConstraintExpression innerConstraint = constraint.getUnfilteredConstraint();
+      if (innerConstraint instanceof ConstraintFilter) {
         // found Filter(X1,Filter(X2,A))
-        ConstraintFilter subFilter = (ConstraintFilter)transform(subConstraint); // Filter(X2,A)
-        return new ConstraintFilter(subFilter.getUnfilteredConstraint(), and(subFilter.getFilter(), constraint.getFilter()));
+        ConstraintFilter innerFiltered = (ConstraintFilter)transform(innerConstraint); // Filter(X2,A)
+        return new ConstraintFilter(innerFiltered.getUnfilteredConstraint(), and(innerFiltered.getFilter(), constraint.getFilter()));
       }
       return constraint;
     }
@@ -123,17 +151,56 @@
         // found LeftJoin(A, Filter(X1, B), X2)
         ConstraintFilter filter = (ConstraintFilter)transform(op);  // Filter(X1, B)
         Filter f = and(filter.getFilter(), leftJoin.getFilter());  // X1 && X2
-        return new ConstraintOptionalJoin(leftJoin.getMain(), filter.getUnfilteredConstraint(), f);
+        return new ConstraintOptionalJoin(transform(leftJoin.getMain()), filter.getUnfilteredConstraint(), f);
       }
       if (op instanceof ConstraintOptionalJoin) {
         // found LeftJoin(A, LeftJoin(B, C, X1), X2)
         ConstraintOptionalJoin subJoin = (ConstraintOptionalJoin)transform(op);  // LeftJoin(B, C, X1)
         ConstraintOptionalJoin newSubJoin = new ConstraintOptionalJoin(subJoin.getMain(), subJoin.getOptional(), Bool.TRUE);
         Filter newFilter = and(subJoin.getFilter(), leftJoin.getFilter());  // X1 && X2
-        return new ConstraintOptionalJoin(leftJoin.getMain(), newSubJoin, newFilter);
+        return new ConstraintOptionalJoin(transform(leftJoin.getMain()), newSubJoin, newFilter);
       }
       return leftJoin;
     }
   }
 
+  /**
+   * Recurse the transformations down.
+   * Normalization to sum of products can be done here (but isn't).
+   */
+  private static class DifferenceTx extends Transformer<ConstraintDifference> {
+    public Class<ConstraintDifference> getTxType() { return ConstraintDifference.class; }
+    public ConstraintExpression tx(ConstraintDifference constraint) throws MulgaraParserException {
+      ConstraintExpression minuend = transform(constraint.getLhs());
+      ConstraintExpression subtrahend = transform(constraint.getRhs());
+      return minuend == constraint.getLhs() && subtrahend == constraint.getRhs() ?
+             new ConstraintDifference(minuend, subtrahend) : constraint;
+    }
+  }
+
+  /**
+   * Recurse the transformations down.
+   * Normalization to sum of products can be done here (but isn't).
+   */
+  private static class ConjunctionTx extends Transformer<ConstraintConjunction> {
+    public Class<ConstraintConjunction> getTxType() { return ConstraintConjunction.class; }
+    public ConstraintExpression tx(ConstraintConjunction constraint) throws MulgaraParserException {
+      List<ConstraintExpression> elements = constraint.getElements();
+      List<ConstraintExpression> newElements = txList(elements);
+      return elements != newElements ? new ConstraintConjunction(newElements) : constraint;
+    }
+  }
+
+  /**
+   * Recurse the transformations down.
+   * Normalization to sum of products can be done here (but isn't).
+   */
+  private static class DisjunctionTx extends Transformer<ConstraintDisjunction> {
+    public Class<ConstraintDisjunction> getTxType() { return ConstraintDisjunction.class; }
+    public ConstraintExpression tx(ConstraintDisjunction constraint) throws MulgaraParserException {
+      List<ConstraintExpression> elements = constraint.getElements();
+      List<ConstraintExpression> newElements = txList(elements);
+      return elements != newElements ? new ConstraintDisjunction(newElements) : constraint;
+    }
+  }
 }

Modified: trunk/src/jar/querylang/java/org/mulgara/sparql/SparqlInterpreter.java
===================================================================
--- trunk/src/jar/querylang/java/org/mulgara/sparql/SparqlInterpreter.java	2009-07-10 16:37:58 UTC (rev 1761)
+++ trunk/src/jar/querylang/java/org/mulgara/sparql/SparqlInterpreter.java	2009-07-10 16:39:20 UTC (rev 1762)
@@ -483,6 +483,9 @@
     List<IRIReference> namedFroms = getNamedFroms(queryStruct);
     if (!namedFroms.isEmpty()) result = addNamedFroms(result, namedFroms, patternMapper.getGraphVars());
     // possible to ask for non-variables that were employed in GRAPH statements as a parser check.
+
+    // grammar-level optimizations
+    result = PatternTransformer.transform(result);
     return result;
   }
 




More information about the Mulgara-svn mailing list