You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/06/22 17:49:52 UTC
incubator-tinkerpop git commit: worked on ConjunctionStrategy. allow
deep nesting; added some crazy test cases
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 58830d811 -> 859e90c4b
worked on ConjunctionStrategy. allow deep nesting; added some crazy test cases
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/859e90c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/859e90c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/859e90c4
Branch: refs/heads/master
Commit: 859e90c4be08636389f9f5d98ec94c77b8e40f3b
Parents: 58830d8
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Jun 22 17:49:34 2015 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Jun 22 17:49:34 2015 +0200
----------------------------------------------------------------------
.../decoration/ConjunctionStrategy.java | 77 +++++++++++---------
.../decoration/ConjunctionStrategyTest.java | 59 ++++++++++++++-
2 files changed, 101 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/859e90c4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
index a894c71..b88a917 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionSte
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
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.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -54,49 +55,57 @@ public final class ConjunctionStrategy extends AbstractTraversalStrategy<Travers
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.hasStepOfAssignableClass(ConjunctionStep.class, traversal))
- return;
+ if (TraversalHelper.hasStepOfAssignableClass(ConjunctionStep.class, traversal)) {
+ processConjunctionMarkers(traversal);
+ }
+ }
+
+ private static boolean legalCurrentStep(final Step<?, ?> step) {
+ return !(step instanceof EmptyStep || step instanceof GraphStep || step instanceof ComputerAwareStep.EndStep ||
+ (step instanceof StartStep && (null != ((StartStep) step).getStart() || step.getLabels().isEmpty())));
+ }
+ private static void processConjunctionMarkers(final Traversal.Admin<?, ?> traversal) {
processConjunctionMarker(OrStep.class, traversal);
processConjunctionMarker(AndStep.class, traversal);
}
+ private static void processConjunctionMarker(final Class<? extends ConjunctionStep> markerClass, final Traversal.Admin<?, ?> traversal) {
- private static final boolean legalCurrentStep(final Step<?, ?> step) {
- return !(step instanceof EmptyStep || step instanceof GraphStep || (step instanceof StartStep && (null != ((StartStep) step).getStart() || step.getLabels().isEmpty())));
- }
-
- private static final void processConjunctionMarker(final Class<? extends ConjunctionStep> markerClass, final Traversal.Admin<?, ?> traversal) {
TraversalHelper.getStepsOfClass(markerClass, traversal).stream()
.filter(conjunctionStep -> conjunctionStep.getLocalChildren().isEmpty())
- .forEach(conjunctionStep -> {
- Step<?, ?> currentStep = conjunctionStep.getNextStep();
- final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
- if (!conjunctionStep.getLabels().isEmpty()) {
- final StartStep<?> startStep = new StartStep<>(rightTraversal);
- final Set<String> conjunctionLabels = ((Step<?, ?>) conjunctionStep).getLabels();
- conjunctionLabels.forEach(startStep::addLabel);
- conjunctionLabels.forEach(label -> conjunctionStep.removeLabel(label));
- rightTraversal.addStep(startStep);
- }
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> nextStep = currentStep.getNextStep();
- rightTraversal.addStep(currentStep);
- traversal.removeStep(currentStep);
- currentStep = nextStep;
- }
+ .findFirst().ifPresent(conjunctionStep -> {
+
+ Step<?, ?> currentStep = conjunctionStep.getNextStep();
+ final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
+ if (!conjunctionStep.getLabels().isEmpty()) {
+ final StartStep<?> startStep = new StartStep<>(rightTraversal);
+ final Set<String> conjunctionLabels = ((Step<?, ?>) conjunctionStep).getLabels();
+ conjunctionLabels.forEach(startStep::addLabel);
+ conjunctionLabels.forEach(label -> conjunctionStep.removeLabel(label));
+ rightTraversal.addStep(startStep);
+ }
+ while (legalCurrentStep(currentStep)) {
+ final Step<?, ?> nextStep = currentStep.getNextStep();
+ rightTraversal.addStep(currentStep);
+ traversal.removeStep(currentStep);
+ currentStep = nextStep;
+ }
+ processConjunctionMarkers(rightTraversal);
+
+ currentStep = conjunctionStep.getPreviousStep();
+ final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
+ while (legalCurrentStep(currentStep)) {
+ final Step<?, ?> previousStep = currentStep.getPreviousStep();
+ leftTraversal.addStep(0, currentStep);
+ traversal.removeStep(currentStep);
+ currentStep = previousStep;
+ }
+ processConjunctionMarkers(leftTraversal);
- currentStep = conjunctionStep.getPreviousStep();
- final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> previousStep = currentStep.getPreviousStep();
- leftTraversal.addStep(0, currentStep);
- traversal.removeStep(currentStep);
- currentStep = previousStep;
- }
- conjunctionStep.addLocalChild(leftTraversal);
- conjunctionStep.addLocalChild(rightTraversal);
- });
+ conjunctionStep.addLocalChild(leftTraversal);
+ conjunctionStep.addLocalChild(rightTraversal);
+ });
}
public static ConjunctionStrategy instance() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/859e90c4/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
index 6bfb28a..c177d87 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
@@ -122,7 +122,64 @@ public class ConjunctionStrategyTest {
{__.as("1").out("a").out("b").as("2").and().as("3").out("c").as("4").or().as("5").out("d").as("6"), __.or(__.and(__.as("1").out("a").out("b").as("2"), __.as("3").out("c").as("4")), __.as("5").out("d").as("6"))},
{__.as("1").out("a").out("b").and().as("3").out("c").or().as("5").out("d"), __.or(__.and(__.as("1").out("a").out("b"), __.as("3").out("c")), __.as("5").out("d"))},
{__.as("1").out("a").out("b").or().as("3").out("c").and().as("5").out("d"), __.or(__.as("1").out("a").out("b"), __.and(__.as("3").out("c"), __.as("5").out("d")))},
- {__.as("a").out().as("b").and().as("c").in().as("d"), __.and(__.as("a").out().as("b"), __.as("c").in().as("d"))}
+ {__.as("a").out().as("b").and().as("c").in().as("d"), __.and(__.as("a").out().as("b"), __.as("c").in().as("d"))},
+ {__.union(__.as("a").out("l1").as("b").or().as("c").in("l2").as("d"), __.as("e").out("l3").as("f").and().as("g").in("l4").as("h")), __.union(__.or(__.as("a").out("l1").as("b"), __.as("c").in("l2").as("d")), __.and(__.as("e").out("l3").as("f"), __.as("g").in("l4").as("h")))},
+ {__
+ .as("a1").out("a").as("a2").or()
+ .as("b1").out("b").as("b2").and()
+ .as("c1").out("c").as("c2").or()
+ .as("d1").out("d").as("d2").or()
+ .as("e1").out("e").as("e2").and()
+ .as("f1").out("f").as("f2").and()
+ .as("g1").out("g").as("g2").or()
+ .as("h1").out("h").as("h2").or(__
+ .as("i1").out("i").as("i2").or()
+ .as("j1").out("j").as("j2").and()
+ .as("k1").out("k").as("k2")).and()
+ .as("l1").out("l").as("l2").and()
+ .as("m1").out("m").as("m2").and()
+ .as("n1").out("n").as("n2"),
+ // EXPECT:
+ __.or(
+ __.as("a1").out("a").as("a2"),
+ __.or(
+ __.and(
+ __.as("b1").out("b").as("b2"),
+ __.as("c1").out("c").as("c2")
+ ),
+ __.or(
+ __.as("d1").out("d").as("d2"),
+ __.or(
+ __.and(
+ __.as("e1").out("e").as("e2"),
+ __.and(
+ __.as("f1").out("f").as("f2"),
+ __.as("g1").out("g").as("g2")
+ )
+ ),
+ __.and(
+ __.as("h1").out("h").as("h2").or(
+ __.or(
+ __.as("i1").out("i").as("i2"),
+ __.and(
+ __.as("j1").out("j").as("j2"),
+ __.as("k1").out("k").as("k2")
+ )
+ )
+ ),
+ __.and(
+ __.as("l1").out("l").as("l2"),
+ __.and(
+ __.as("m1").out("m").as("m2"),
+ __.as("n1").out("n").as("n2")
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ }
});
}
}