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