You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/15 22:12:51 UTC

incubator-tinkerpop git commit: No more WhereStartEndStrategy needed. WhereStep follows the recursive compilation model of XMatchStep.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/xmatch a1dbb1b37 -> a97e675c7


No more WhereStartEndStrategy needed. WhereStep follows the recursive compilation model of XMatchStep.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/a97e675c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/a97e675c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/a97e675c

Branch: refs/heads/xmatch
Commit: a97e675c7121d44bf9e37e721946879134fd7756
Parents: a1dbb1b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Jun 15 14:12:44 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Jun 15 14:12:44 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalStrategies.java  |   2 -
 .../traversal/step/filter/WhereStep.java        |  41 ++++++-
 .../traversal/step/filter/exp/XMatchStep.java   |   6 +-
 .../decoration/WhereStartEndStrategy.java       | 108 -------------------
 4 files changed, 43 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a97e675c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index e119ebe..857b3c3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.gremlin.process.traversal;
 
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.WhereStartEndStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.EngineDependentStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ScopingStrategy;
@@ -198,7 +197,6 @@ public interface TraversalStrategies extends Serializable, Cloneable {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
             coreStrategies.addStrategies(
                     ConjunctionStrategy.instance(),
-                    WhereStartEndStrategy.instance(),
                     EngineDependentStrategy.instance(),
                     ProfileStrategy.instance(),
                     ScopingStrategy.instance(),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a97e675c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index 24df57f..f78d2ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
 import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -28,12 +29,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.WhereStartEndStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
 import org.apache.tinkerpop.gremlin.process.traversal.util.ConjunctionP;
 import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
 import org.apache.tinkerpop.gremlin.process.traversal.util.ScopeP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalP;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
@@ -58,18 +60,53 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
         this.scope = scope;
         this.predicate = convertToTraversalP(startKey, predicate);
         this.predicate.getTraversals().forEach(this::integrateChild);
+        this.predicate.getTraversals().forEach(this::configureStartAndEndSteps);
     }
 
     public WhereStep(final Traversal.Admin traversal, final Scope scope, final P<?> predicate) {
         this(traversal, scope, Optional.empty(), predicate);
     }
 
+    private void configureStartAndEndSteps(final Traversal.Admin<?, ?> whereTraversal) {
+        ConjunctionStrategy.instance().apply(whereTraversal);
+        //// START STEP to SelectOneStep
+        final Step<?, ?> startStep = whereTraversal.getStartStep();
+        if (startStep instanceof ConjunctionStep) {
+            ((ConjunctionStep<?>) startStep).getLocalChildren().forEach(this::configureStartAndEndSteps);
+        } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
+            if (startStep.getLabels().size() > 1)
+                throw new IllegalArgumentException("The start step of a where()-traversal predicate can only have one label: " + startStep);
+            TraversalHelper.replaceStep(whereTraversal.getStartStep(), new SelectOneStep<>(whereTraversal, this.scope, Pop.head, startStep.getLabels().iterator().next()), whereTraversal);
+        }
+        //// END STEP to IsStep(ScopeP)
+        final Step<?, ?> endStep = whereTraversal.getEndStep();
+        if (!endStep.getLabels().isEmpty()) {
+            if (endStep.getLabels().size() > 1)
+                throw new IllegalArgumentException("The end step of a where()-traversal predicate can only have one label: " + endStep);
+            final String label = endStep.getLabels().iterator().next();
+            endStep.removeLabel(label);
+            final IsStep<?> isStep = new IsStep<>(whereTraversal, new ScopeP<>(P.eq(label)));
+            whereTraversal.addStep(isStep);
+        }
+    }
+
+    private void getScopeP(final List<IsStep<?>> list, final TraversalParent traversalParent) {
+        traversalParent.getLocalChildren().forEach(traversal -> {
+            if (traversal.getStartStep() instanceof ConjunctionStep) {
+                getScopeP(list, (ConjunctionStep) traversal.getStartStep());
+            }
+            if (traversal.getEndStep() instanceof IsStep && ((IsStep) traversal.getEndStep()).getPredicate() instanceof ScopeP) {
+                list.add((IsStep) traversal.getEndStep());
+            }
+        });
+    }
+
     @Override
     protected boolean filter(final Traverser.Admin<S> traverser) {
         if (this.first) {
             this.first = false;
             this.scopePEndSteps = new ArrayList<>();
-            WhereStartEndStrategy.getScopeP(this.scopePEndSteps, this);
+            this.getScopeP(this.scopePEndSteps, this);
         }
         for (final IsStep<?> isStep : this.scopePEndSteps) {
             ((ScopeP) isStep.getPredicate()).bind(this, traverser);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a97e675c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
index a0ae8eb..9e72bc5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
@@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionSte
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
@@ -67,10 +68,11 @@ public final class XMatchStep<S> extends ComputerAwareStep<S, S> implements Trav
         super(traversal);
         this.conjunction = conjunction;
         this.conjunctionTraversals = (List) Stream.of(conjunctionTraversals).map(Traversal::asAdmin).map(this::integrateChild).collect(Collectors.toList());
-        this.conjunctionTraversals.forEach(this::addSelectOneStartStep); // recursively convert to SelectOneStep, XMatchStep, or XMatchEndStep
+        this.conjunctionTraversals.forEach(this::configureStartAndEndSteps); // recursively convert to SelectOneStep, XMatchStep, or XMatchEndStep
     }
 
-    private void addSelectOneStartStep(final Traversal.Admin<?, ?> conjunctionTraversal) {
+    private void configureStartAndEndSteps(final Traversal.Admin<?, ?> conjunctionTraversal) {
+        ConjunctionStrategy.instance().apply(conjunctionTraversal);
         // START STEP to SelectOneStep OR XMatchStep
         final Step<?, ?> startStep = conjunctionTraversal.getStartStep();
         if (startStep instanceof ConjunctionStep) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a97e675c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/WhereStartEndStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/WhereStartEndStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/WhereStartEndStrategy.java
deleted file mode 100644
index 62626c2..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/WhereStartEndStrategy.java
+++ /dev/null
@@ -1,108 +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.
- *
- */
-
-package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ScopeP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class WhereStartEndStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
-
-    private static final WhereStartEndStrategy INSTANCE = new WhereStartEndStrategy();
-
-    private static final Set<Class<? extends DecorationStrategy>> PRIORS = new HashSet<>();
-
-    static {
-        PRIORS.add(ConjunctionStrategy.class);
-    }
-
-
-    private WhereStartEndStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        Step<?, ?> whereStep = traversal.getParent().asStep();
-        while (!(whereStep instanceof EmptyStep || whereStep instanceof WhereStep)) {
-            whereStep = whereStep.getTraversal().getParent().asStep();
-        }
-
-        if (whereStep instanceof WhereStep) {
-            final Step<?, ?> startStep = traversal.getStartStep();
-            if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
-                if (startStep.getLabels().size() > 1)
-                    throw new IllegalArgumentException("The start step of a where()-traversal predicate can only have one label: " + startStep);
-                TraversalHelper.replaceStep(traversal.getStartStep(), new SelectOneStep<>(traversal, ((WhereStep) whereStep).getScope(), Pop.head, startStep.getLabels().iterator().next()), traversal);
-            }
-            //// END STEP
-            final Step<?, ?> endStep = traversal.getEndStep();
-            if (!endStep.getLabels().isEmpty()) {
-                if (endStep.getLabels().size() > 1)
-                    throw new IllegalArgumentException("The end step of a where()-traversal predicate can only have one label: " + endStep);
-                final String label = endStep.getLabels().iterator().next();
-                endStep.removeLabel(label);
-                final IsStep<?> isStep = new IsStep<>(traversal, new ScopeP<>(P.eq(label)));
-                traversal.addStep(isStep);
-            }
-        }
-    }
-
-    public static void getScopeP(final List<IsStep<?>> list, final TraversalParent traversalParent) {
-        traversalParent.getLocalChildren().forEach(traversal -> {
-            if (traversal.getEndStep() instanceof IsStep && ((IsStep) traversal.getEndStep()).getPredicate() instanceof ScopeP) {
-                list.add((IsStep) traversal.getEndStep());
-            }
-            for (final Step<?, ?> step : traversal.getSteps()) {
-                if (step instanceof TraversalParent)
-                    getScopeP(list, (TraversalParent) step);
-            }
-
-        });
-    }
-
-    @Override
-    public Set<Class<? extends DecorationStrategy>> applyPrior() {
-        return PRIORS;
-    }
-
-    public static WhereStartEndStrategy instance() {
-        return INSTANCE;
-    }
-}
\ No newline at end of file