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")
+                                                                    )
+                                                            )
+                                                    )
+                                            )
+                                    )
+                            )
+                    )
+            }
             });
         }
     }