You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2015/08/11 01:32:09 UTC

vxquery git commit: Shivani's changes for different issues I have been working on (Q14, Q19 and desc-self).

Repository: vxquery
Updated Branches:
  refs/heads/master d94c51f41 -> 3e40e5a71


Shivani's changes for different issues I have been working on (Q14, Q19 and desc-self).


Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/3e40e5a7
Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/3e40e5a7
Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/3e40e5a7

Branch: refs/heads/master
Commit: 3e40e5a712e1edfb244d1f9b67961f947fcbe8c6
Parents: d94c51f
Author: Preston Carman <pr...@apache.org>
Authored: Mon Aug 10 16:13:21 2015 -0700
Committer: Preston Carman <pr...@apache.org>
Committed: Mon Aug 10 16:13:21 2015 -0700

----------------------------------------------------------------------
 .../compiler/rewriter/RewriteRuleset.java       |   3 +
 .../rules/ConsolidateDescandantChild.java       | 104 +++++++++++++++++++
 .../vxquery/context/StaticContextImpl.java      |   5 +-
 .../step/DescendantOrSelfPathStepUnnesting.java |  33 ++++--
 .../strings/FnStringScalarEvaluatorFactory.java |  14 ++-
 .../vxquery/xmlparser/SAXContentHandler.java    |  20 +++-
 .../xmlquery/translator/XMLQueryTranslator.java |  17 ++-
 .../XQuery/XMark/Original/simple_query1.xq      |  22 ----
 .../XQuery/XMark/Original/simple_query2.xq      |  22 ----
 .../src/test/resources/XMarkCatalog.xml         |  13 ---
 .../test/resources/cat/XMarkOriginalQueries.xml |  10 --
 11 files changed, 180 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/RewriteRuleset.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/RewriteRuleset.java b/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/RewriteRuleset.java
index 687164e..7b55856 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/RewriteRuleset.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/RewriteRuleset.java
@@ -19,6 +19,7 @@ package org.apache.vxquery.compiler.rewriter;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.vxquery.compiler.rewriter.rules.ConsolidateDescandantChild;
 import org.apache.vxquery.compiler.rewriter.rules.ConsolidateAssignAggregateRule;
 import org.apache.vxquery.compiler.rewriter.rules.ConvertAssignToUnnestRule;
 import org.apache.vxquery.compiler.rewriter.rules.ReplaceSourceMapInDocExpression;
@@ -118,6 +119,8 @@ public class RewriteRuleset {
         normalization.add(new IntroduceCollectionRule());
         normalization.add(new RemoveUnusedAssignAndAggregateRule());
 
+        normalization.add(new ConsolidateDescandantChild());
+
         normalization.add(new ReplaceSourceMapInDocExpression());
         // Adds child steps to the data source scan.
         // TODO Replace consolidate with a new child function that takes multiple paths.

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/ConsolidateDescandantChild.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/ConsolidateDescandantChild.java b/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/ConsolidateDescandantChild.java
new file mode 100644
index 0000000..a83b952
--- /dev/null
+++ b/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/ConsolidateDescandantChild.java
@@ -0,0 +1,104 @@
+package org.apache.vxquery.compiler.rewriter.rules;
+
+import java.util.List;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.vxquery.compiler.rewriter.rules.util.ExpressionToolbox;
+import org.apache.vxquery.compiler.rewriter.rules.util.OperatorToolbox;
+import org.apache.vxquery.functions.BuiltinOperators;
+
+import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
+import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractUnnestOperator;
+import edu.uci.ics.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
+
+/**
+ * The rule searches for assign operator with an aggregate function expression
+ * immediately following an aggregate operator with a sequence expression.
+ * XQuery aggregate functions are implemented in both scalar (one XDM Instance
+ * input as a sequence) and iterative (a stream of XDM Instances each one is
+ * single object).
+ * 
+ * <pre>
+ * Before 
+ * 
+ *   plan__parent
+ *   UNNEST( $v3 : fn:child( args[$v1], args[$filter]  ) )
+ *   UNNEST( $v1 : fn:descandant( args[$v0] ) )
+ *   plan__child
+ *   
+ * After
+ * 
+ *   plan__parent
+ *   UNNEST( $v3 : fn:descandant( args[$v0], args[$filter] ) )
+ *   plan__child
+ * 
+ * 
+ * </pre>
+ * 
+ * @author shivanimall
+ */
+
+public class ConsolidateDescandantChild implements IAlgebraicRewriteRule {
+
+    @Override
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+        return false;
+    }
+
+    @Override
+    public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
+
+        ILogicalOperator lo = opRef.getValue();
+        if (!(lo.getOperatorTag().equals(LogicalOperatorTag.UNNEST))) {
+            return false;
+        }
+        AbstractUnnestOperator auo = (AbstractUnnestOperator) lo;
+        Mutable<ILogicalExpression> childExpression = ExpressionToolbox.findFirstFunctionExpression(
+                auo.getExpressionRef(), BuiltinOperators.CHILD.getFunctionIdentifier());
+        if (childExpression == null) {
+            return false;
+        }
+        AbstractFunctionCallExpression childFnCall = (AbstractFunctionCallExpression) childExpression.getValue();
+        List<Mutable<ILogicalExpression>> list = (List<Mutable<ILogicalExpression>>) childFnCall.getArguments();
+        Mutable<ILogicalExpression> mle = (Mutable<ILogicalExpression>) (list).get(0);
+        ILogicalExpression le = mle.getValue();
+        if (!(le.getExpressionTag().equals(LogicalExpressionTag.VARIABLE))) {
+            return false;
+        }
+        VariableReferenceExpression varLogicalExpression = (VariableReferenceExpression) le;
+        Mutable<ILogicalOperator> lop = OperatorToolbox.findProducerOf(opRef,
+                varLogicalExpression.getVariableReference());
+        ILogicalOperator lop1 = lop.getValue();
+        if (!(lop1.getOperatorTag().equals(LogicalOperatorTag.UNNEST))) {
+            return false;
+        }
+        if (OperatorToolbox.getExpressionOf(lop, varLogicalExpression.getVariableReference()) == null) {
+            return false;
+        }
+        ILogicalExpression variableLogicalExpression = (ILogicalExpression) OperatorToolbox.getExpressionOf(lop,
+                varLogicalExpression.getVariableReference()).getValue();
+        if (!(variableLogicalExpression.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL))) {
+            return false;
+        }
+        AbstractFunctionCallExpression afce = (AbstractFunctionCallExpression) variableLogicalExpression;
+        if (!(afce.getFunctionIdentifier().equals(BuiltinOperators.DESCENDANT_OR_SELF.getFunctionIdentifier()))) {
+            return false;
+        }
+        //All conditions have been met.
+        childFnCall.setFunctionInfo(BuiltinOperators.DESCENDANT_OR_SELF);
+        childFnCall.getArguments().get(0).setValue(afce.getArguments().get(0).getValue());
+        ILogicalOperator lo1 = opRef.getValue();
+        Mutable<ILogicalOperator> mlistOfLo = lo1.getInputs().get(0).getValue().getInputs().get(0);
+        ILogicalOperator ilo = (ILogicalOperator) mlistOfLo.getValue();
+        lo.getInputs().get(0).setValue((ILogicalOperator) ilo);
+        return true;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/context/StaticContextImpl.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/context/StaticContextImpl.java b/vxquery-core/src/main/java/org/apache/vxquery/context/StaticContextImpl.java
index d244595..09cfaff 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/context/StaticContextImpl.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/context/StaticContextImpl.java
@@ -379,10 +379,7 @@ public class StaticContextImpl implements StaticContext {
             sequenceTypeList.add(type);
             return code;
         }
-        if (sequenceTypeMap.containsKey(type)) {
-            return sequenceTypeMap.get(type);
-        }
-        return -1;
+        return code;
     }
 
     List<SequenceType> getSequenceTypeList() {

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/step/DescendantOrSelfPathStepUnnesting.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/step/DescendantOrSelfPathStepUnnesting.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/step/DescendantOrSelfPathStepUnnesting.java
index 090655b..d03e441 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/step/DescendantOrSelfPathStepUnnesting.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/step/DescendantOrSelfPathStepUnnesting.java
@@ -26,10 +26,13 @@ import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
 import org.apache.vxquery.datamodel.values.ValueTag;
 import org.apache.vxquery.exceptions.ErrorCode;
 import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.step.NodeTestFilter.INodeFilter;
+import org.apache.vxquery.types.SequenceType;
 
 import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.data.std.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 
 public class DescendantOrSelfPathStepUnnesting extends AbstractForwardAxisPathStep {
     private boolean testSelf;
@@ -39,10 +42,14 @@ public class DescendantOrSelfPathStepUnnesting extends AbstractForwardAxisPathSt
     private List<Integer> indexSequence = new ArrayList<Integer>();
     private List<Integer> returnSequence = new ArrayList<Integer>();
 
+    private final IntegerPointable ip = (IntegerPointable) IntegerPointable.FACTORY.createPointable();
     private final SequencePointable seqNtp = (SequencePointable) SequencePointable.FACTORY.createPointable();
     private final TaggedValuePointable tvpItem = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
     private final TaggedValuePointable tvpNtp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
     private final TaggedValuePointable tvpStep = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    private INodeFilter filter;
+    private int filterLookupID = -1;
+    private boolean isfilter = false;
 
     public DescendantOrSelfPathStepUnnesting(IHyracksTaskContext ctx, PointablePool pp, boolean testSelf) {
         super(ctx, pp);
@@ -55,6 +62,18 @@ public class DescendantOrSelfPathStepUnnesting extends AbstractForwardAxisPathSt
         indexSequence.add(0);
         returnSequence.add(0);
 
+        if (args.length > 1) {
+            isfilter = true;
+            if (args[1].getTag() != ValueTag.XS_INT_TAG) {
+                throw new IllegalArgumentException("Expected int value tag, got: " + args[1].getTag());
+            }
+            args[1].getValue(ip);
+            if (ip.getInteger() != filterLookupID) {
+                filterLookupID = ip.getInteger();
+                SequenceType sType = dCtx.getStaticContext().lookupSequenceType(ip.getInteger());
+                filter = NodeTestFilter.getNodeTestFilter(sType);
+            }
+        }
         // Check the argument passed in as sequence or node tree.
         if (args[0].getTag() == ValueTag.SEQUENCE_TAG) {
             args[0].getValue(seqNtp);
@@ -99,14 +118,15 @@ public class DescendantOrSelfPathStepUnnesting extends AbstractForwardAxisPathSt
             returnSelf = false;
             tvpItem.set(rootTVP);
             try {
-                setNodeToResult(tvpItem, result);
-                return true;
+                if (!isfilter || (isfilter && filter.accept(ntp, tvpItem))) {
+                    setNodeToResult(tvpItem, result);
+                    return true;
+                }
             } catch (IOException e) {
                 String description = ErrorCode.SYSE0001 + ": " + ErrorCode.SYSE0001.getDescription();
                 throw new AlgebricksException(description);
             }
         }
-
         // Solve for descendants.
         return stepNodeTree(rootTVP, 0, result);
     }
@@ -132,12 +152,13 @@ public class DescendantOrSelfPathStepUnnesting extends AbstractForwardAxisPathSt
             while (indexSequence.get(level) < seqLength) {
                 // Get the next item
                 seqItem.getEntry(indexSequence.get(level), tvpItem);
-
                 // Check current node
                 if (indexSequence.get(level) == returnSequence.get(level)) {
                     returnSequence.set(level, returnSequence.get(level) + 1);
-                    setNodeToResult(tvpItem, result);
-                    return true;
+                    if (!isfilter || (isfilter && filter.accept(ntp, tvpItem))) {
+                        setNodeToResult(tvpItem, result);
+                        return true;
+                    }
                 }
                 // Check children nodes
                 if (level + 1 <= indexSequence.size()) {

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringScalarEvaluatorFactory.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringScalarEvaluatorFactory.java
index d248502..fa929da 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringScalarEvaluatorFactory.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringScalarEvaluatorFactory.java
@@ -28,12 +28,14 @@ import org.apache.vxquery.exceptions.SystemException;
 import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
 import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
 import org.apache.vxquery.runtime.functions.cast.CastToStringOperation;
+import org.apache.vxquery.runtime.functions.util.AtomizeHelper;
 
 import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
 import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.data.std.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
 import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class FnStringScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
@@ -50,6 +52,9 @@ public class FnStringScalarEvaluatorFactory extends AbstractTaggedValueArgumentS
         final DataOutput dOut = abvs.getDataOutput();
         final CastToStringOperation castToString = new CastToStringOperation();
         final TypedPointables tp = new TypedPointables();
+        final AtomizeHelper ah = new AtomizeHelper();
+        final UTF8StringPointable stringNode = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable();
+        final TaggedValuePointable tvpNode = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
 
         return new AbstractTaggedValueArgumentScalarEvaluator(args) {
             @Override
@@ -57,6 +62,7 @@ public class FnStringScalarEvaluatorFactory extends AbstractTaggedValueArgumentS
                 TaggedValuePointable tvp1 = args[0];
                 try {
                     abvs.reset();
+
                     switch (tvp1.getTag()) {
                         case ValueTag.XS_ANY_URI_TAG:
                             tvp1.getValue(tp.utf8sp);
@@ -182,11 +188,15 @@ public class FnStringScalarEvaluatorFactory extends AbstractTaggedValueArgumentS
                                 XDMConstants.setEmptyString(result);
                                 return;
                             }
-                            // Pass through if not empty sequence.
+                        case ValueTag.NODE_TREE_TAG:
+                            ah.atomize(tvp1, ppool, tvpNode);
+                            tvpNode.getValue(stringNode);
+                            castToString.convertUntypedAtomic(stringNode, dOut);
+                            break;
+                        // Pass through if not empty sequence.
                         default:
                             throw new SystemException(ErrorCode.XPDY0002);
                     }
-
                     result.set(abvs);
                 } catch (IOException e) {
                     throw new SystemException(ErrorCode.SYSE0001, e);

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
index 296d062..323b608 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
@@ -282,12 +282,23 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         }
     }
 
+    /**
+     * The filter settings here are similar to one in the class linked below.
+     * 
+     * @see org.apache.vxquery.runtime.functions.step.NodeTestFilter.java
+     */
     private boolean startElementChildPathStep(String uri, String localName) {
         if (subElement != null && depth <= subElement.length) {
             // Check path step if it exists.
-            if (uri.compareTo(childUri[depth - 1]) == 0) {
-                if (localName.compareTo(childLocalName[depth - 1]) == 0) {
-                    subElement[depth - 1] = true;
+            subElement[depth - 1] = true;
+            if (uri != null) {
+                if (childUri[depth - 1] != null && uri.compareTo(childUri[depth - 1]) != 0) {
+                    subElement[depth - 1] = false;
+                }
+            }
+            if (localName != null) {
+                if (childLocalName[depth - 1] != null && localName.compareTo(childLocalName[depth - 1]) != 0) {
+                    subElement[depth - 1] = false;
                 }
             }
         }
@@ -535,6 +546,9 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     }
 
     private String getStringFromBytes(byte[] bytes) {
+        if (bytes == null) {
+            return null;
+        }
         StringBuilder sb = new StringBuilder();
         UTF8StringPointable.toString(sb, bytes, 0);
         return sb.toString();

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java
index a8ffade..2507d6c 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java
@@ -161,7 +161,6 @@ import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalPlan;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractLogicalExpression;
 import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AggregateFunctionCallExpression;
 import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
@@ -1446,8 +1445,23 @@ public class XMLQueryTranslator {
             for (RelativePathExprNode rpen : pe.getPaths()) {
                 boolean asc = true;
                 if (PathType.SLASH_SLASH.equals(rpen.getPathType())) {
+                    tCtx = tCtx.pushContext();
+                    tCtx.pushVariableScope();
+                    iterateOver(ctxExpr, tCtx);
+                    ctxExpr = vre(tCtx.varScope.lookupVariable(XMLQueryCompilerConstants.DOT_VAR_NAME)
+                            .getLogicalVariable());
                     ctxExpr = sfce(BuiltinOperators.DESCENDANT_OR_SELF,
                             treat(ctxExpr, SequenceType.create(AnyNodeType.INSTANCE, Quantifier.QUANT_STAR)));
+                    List<LogicalVariable> vars = new ArrayList<LogicalVariable>();
+                    List<Mutable<ILogicalExpression>> exprs = new ArrayList<Mutable<ILogicalExpression>>();
+                    LogicalVariable var = newLogicalVariable();
+                    vars.add(var);
+                    exprs.add(mutable(afce(BuiltinOperators.SEQUENCE, false, ctxExpr)));
+                    AggregateOperator aop = new AggregateOperator(vars, exprs);
+                    aop.getInputs().add(mutable(tCtx.op));
+                    tCtx.op = aop;
+                    tCtx = tCtx.popContext();
+                    ctxExpr = vre(var);
                 }
                 boolean popScope = false;
                 if (ctxExpr != null) {
@@ -1484,6 +1498,7 @@ public class XMLQueryTranslator {
                     throw new IllegalStateException("Unknown path node: " + pathNode.getTag());
                 }
                 if (predicates != null && !predicates.isEmpty()) {
+                    ctxExpr = vre(createAssignment(ctxExpr, tCtx));
                     ctxExpr = sfce(asc ? BuiltinOperators.SORT_DISTINCT_NODES_ASC_OR_ATOMICS
                             : BuiltinOperators.SORT_DISTINCT_NODES_DESC_OR_ATOMICS, ctxExpr);
                     for (ASTNode pn : predicates) {

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query1.xq
----------------------------------------------------------------------
diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query1.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query1.xq
deleted file mode 100644
index 4938f64..0000000
--- a/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query1.xq
+++ /dev/null
@@ -1,22 +0,0 @@
-(: Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
-   
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License. :)
-
-(: XMark Query see README.md for full details. :)
-
-let $test := "auction_data"
-for $x in ($test)
-return $x
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query2.xq
----------------------------------------------------------------------
diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query2.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query2.xq
deleted file mode 100644
index 4bd3ab8..0000000
--- a/vxquery-xtest/src/test/resources/Queries/XQuery/XMark/Original/simple_query2.xq
+++ /dev/null
@@ -1,22 +0,0 @@
-(: Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
-   
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License. :)
-
-(: XMark Query see README.md for full details. :)
-
-let $test := "auction_data"
-for $b in doc($test)/site/catgraph 
-return $b

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-xtest/src/test/resources/XMarkCatalog.xml
----------------------------------------------------------------------
diff --git a/vxquery-xtest/src/test/resources/XMarkCatalog.xml b/vxquery-xtest/src/test/resources/XMarkCatalog.xml
index c3829a0..11e9a92 100644
--- a/vxquery-xtest/src/test/resources/XMarkCatalog.xml
+++ b/vxquery-xtest/src/test/resources/XMarkCatalog.xml
@@ -45,19 +45,6 @@
    <source ID="auction_data" FileName="TestSources/XMark/SingleFile/auction.xml" Creator="Shivani Mall">
        <description last-mod="2015-03-25">Collection of files</description>
    </source>
-   <test-group name="SingleQuery" featureOwner="Preston Carman">
-      <GroupInfo>
-         <title>Single Query</title>
-         <description/>
-      </GroupInfo>
-      <test-group name="SingleTest" featureOwner="Preston Carman">
-         <GroupInfo>
-            <title>Single Test</title>
-            <description/>
-         </GroupInfo>
-         &SingleQuery;
-      </test-group>
-   </test-group>
    <test-group name="XMarkQueries" featureOwner="Shivani Mall">
       <GroupInfo>
          <title>XMark Queries</title>

http://git-wip-us.apache.org/repos/asf/vxquery/blob/3e40e5a7/vxquery-xtest/src/test/resources/cat/XMarkOriginalQueries.xml
----------------------------------------------------------------------
diff --git a/vxquery-xtest/src/test/resources/cat/XMarkOriginalQueries.xml b/vxquery-xtest/src/test/resources/cat/XMarkOriginalQueries.xml
index 87a57d1..8fdcf51 100644
--- a/vxquery-xtest/src/test/resources/cat/XMarkOriginalQueries.xml
+++ b/vxquery-xtest/src/test/resources/cat/XMarkOriginalQueries.xml
@@ -120,14 +120,4 @@
       <query name="q20" date="2015-03-25"/>
       <output-file compare="Text">q20.txt</output-file>
    </test-case>
-      <test-case name="Simple-Query-1" FilePath="XMark/Original/" Creator="Shivani Mall">
-      <description>Simple Query 1</description>
-      <query name="simple_query1" date="2015-03-25"/>
-      <output-file compare="Text">simple_query1.txt</output-file>
-   </test-case>
-  <test-case name="Simple-Query-2" FilePath="XMark/Original/" Creator="Shivani Mall">
-      <description>Simple Query 2</description>
-      <query name="simple_query2" date="2015-03-25"/>
-      <output-file compare="Text">simple_query2.txt</output-file>
-   </test-case>
 </test-group>
\ No newline at end of file