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/16 00:08:32 UTC

[31/31] incubator-tinkerpop git commit: simpler determination of start and end keys in XMatchStep. This bad boy is nearly done.

simpler determination of start and end keys in XMatchStep. This bad boy is nearly done.


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

Branch: refs/heads/master
Commit: 55d2565cfebd5adfbb5c947e2ad182df9b63c7c0
Parents: 538af16
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Jun 15 15:59:01 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Jun 15 15:59:01 2015 -0600

----------------------------------------------------------------------
 .../traversal/step/filter/exp/XMatchStep.java   | 59 +++++++-------------
 .../tinkergraph/structure/TinkerGraphTest.java  |  2 +-
 2 files changed, 20 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/55d2565c/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 8debce5..e7399ed 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
@@ -63,8 +63,8 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
 
     private List<Traversal.Admin<Object, Object>> conjunctionTraversals = new ArrayList<>();
     private boolean first = true;
-    private Set<String> matchStartLabels = null;
-    private Set<String> matchEndLabels = null;
+    private Set<String> matchStartLabels = new HashSet<>();
+    private Set<String> matchEndLabels = new HashSet<>();
     private final Conjunction conjunction;
     private final String startKey;
     private final MatchAlgorithm matchAlgorithm = new GreedyMatchAlgorithm();
@@ -86,13 +86,14 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
                     startStep instanceof AndStep ? XMatchStep.Conjunction.AND : XMatchStep.Conjunction.OR,
                     ((ConjunctionStep<?>) startStep).getLocalChildren().toArray(new Traversal[((ConjunctionStep<?>) startStep).getLocalChildren().size()]));
             TraversalHelper.replaceStep(startStep, xMatchStep, conjunctionTraversal);
+            this.matchStartLabels.addAll(xMatchStep.matchStartLabels);
+            this.matchEndLabels.addAll(xMatchStep.matchEndLabels);
         } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
             if (startStep.getLabels().size() > 1)
                 throw new IllegalArgumentException("The start step of a match()-traversal can only have one label: " + startStep);
             final String label = startStep.getLabels().iterator().next();
-            final Step selectOneStep = new SelectOneStep<>(conjunctionTraversal, Scope.global, Pop.head, label);
-            selectOneStep.addLabel(label);
-            TraversalHelper.replaceStep(conjunctionTraversal.getStartStep(), selectOneStep, conjunctionTraversal);
+            this.matchStartLabels.add(label);
+            TraversalHelper.replaceStep(conjunctionTraversal.getStartStep(), new SelectOneStep<>(conjunctionTraversal, Scope.global, Pop.head, label), conjunctionTraversal);
         }
         // END STEP to XMatchStep
         final Step<?, ?> endStep = conjunctionTraversal.getEndStep();
@@ -102,36 +103,12 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
             final String label = endStep.getLabels().size() == 0 ? null : endStep.getLabels().iterator().next();
             if (null != label) endStep.removeLabel(label);
             final Step<?, ?> xMatchEndStep = new XMatchEndStep(conjunctionTraversal, label);
-            if (null != label) xMatchEndStep.addLabel(label);
-            conjunctionTraversal.asAdmin().addStep(xMatchEndStep);
-        }
-    }
-
-    public Set<String> getMatchStartLabels() {
-        if (null == this.matchStartLabels) {
-            this.matchStartLabels = new HashSet<>();
-            for (final Traversal.Admin<Object, Object> conjunctionTraversal : this.conjunctionTraversals) {
-                this.matchStartLabels.addAll(conjunctionTraversal.getStartStep() instanceof XMatchStep ?
-                        ((XMatchStep) conjunctionTraversal.getStartStep()).getMatchStartLabels() :
-                        ((SelectOneStep) conjunctionTraversal.getStartStep()).getScopeKeys());
-            }
-            this.matchStartLabels = Collections.unmodifiableSet(this.matchStartLabels);
-        }
-        return this.matchStartLabels;
-    }
-
-    public Set<String> getMatchEndLabels() {
-        if (null == this.matchEndLabels) {
-            this.matchEndLabels = new HashSet<>();
-            for (final Traversal.Admin<Object, Object> conjunctionTraversal : this.conjunctionTraversals) {
-                if (conjunctionTraversal.getStartStep() instanceof XMatchStep) {
-                    this.matchEndLabels.addAll(((XMatchStep) conjunctionTraversal.getStartStep()).getMatchEndLabels());
-                }
-                this.matchEndLabels.add(((XMatchEndStep) (Step<?, ?>) conjunctionTraversal.getEndStep()).matchKey);
+            if (null != label) {
+                this.matchEndLabels.add(label);
+                xMatchEndStep.addLabel(label);
             }
-            this.matchEndLabels = Collections.unmodifiableSet(this.matchEndLabels);
+            conjunctionTraversal.asAdmin().addStep(xMatchEndStep);
         }
-        return this.matchEndLabels;
     }
 
     public List<Traversal.Admin<Object, Object>> getGlobalChildren() {
@@ -155,7 +132,10 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.getMatchEndLabels();
+        final HashSet<String> scopedKeys = new HashSet<>();
+        scopedKeys.addAll(this.matchStartLabels);
+        scopedKeys.addAll(this.matchEndLabels);
+        return scopedKeys;
     }
 
     @Override
@@ -189,7 +169,6 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
                 counter++;
             }
         }
-        // if (counter == 0) traverser.path().addLabel(this.startKey); // for computer to add the start key
         return this.conjunctionTraversals.size() == counter;
     }
 
@@ -197,9 +176,9 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
         final Map<String, E> bindings = new HashMap<>();
         traverser.path().forEach((object, labels) -> {
             for (final String label : labels) {
-                if (this.getMatchEndLabels().contains(label)) {
+                if (this.matchEndLabels.contains(label)) {
                     bindings.put(label, (E) object);
-                } else if (this.getMatchStartLabels().contains(label)) {
+                } else if (this.matchStartLabels.contains(label)) {
                     bindings.put(label, (E) object);
                 }
             }
@@ -222,9 +201,9 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
                     }
                 }
             }
-            if (null == traverser) {
+            if (null == traverser)
                 traverser = this.starts.next();
-            } else if (hasMatched(this.conjunction, traverser))
+            else if (hasMatched(this.conjunction, traverser))
                 return IteratorUtils.of(traverser.split(this.getBindings(traverser), this));
 
             if (this.conjunction == Conjunction.AND) {
@@ -324,7 +303,7 @@ public final class XMatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
         public static Set<String> getStartLabels(final Traversal.Admin<Object, Object> traversal) {
             final Step<?, ?> startStep = traversal.getStartStep();
             if (startStep instanceof XMatchStep)
-                return ((XMatchStep) startStep).getMatchStartLabels();
+                return ((XMatchStep) startStep).matchStartLabels;
             else if (startStep instanceof SelectOneStep)
                 return ((SelectOneStep) startStep).getScopeKeys();
             else

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/55d2565c/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 12995fe..4c0fd39 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -166,7 +166,7 @@ public class TinkerGraphTest {
                                 as("a").out("created").has("name", "ripple"),
                                 as("a").out().out()
                         )
-                ));
+                )).select().by("name");
         /*
                 g.V().as("a").xmatch(
                         as("a").out("knows").as("b"),