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 2016/02/23 01:21:53 UTC

incubator-tinkerpop git commit: Fixed a bug in FoldStep, got GroupStep working perfectly (both OLTP and OLAP -- but there is still one awakward hack). Need to spend some more cycles on GroupStep and then once I get that clean, clean, clean, I will map th

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1166 338912259 -> 9f8252b81


Fixed a bug in FoldStep, got GroupStep working perfectly (both OLTP and OLAP -- but there is still one awakward hack). Need to spend some more cycles on GroupStep and then once I get that clean, clean, clean, I will map that pattern over to GroupStepV3d0 and that will be that.


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

Branch: refs/heads/TINKERPOP-1166
Commit: 9f8252b816432249a0667e654b682293b77ec3c1
Parents: 3389122
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Feb 22 17:21:48 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Feb 22 17:21:48 2016 -0700

----------------------------------------------------------------------
 .../process/traversal/step/map/FoldStep.java    | 28 ++++----
 .../traversal/step/map/GroupCountStep.java      | 14 ++--
 .../process/traversal/step/map/GroupStep.java   | 68 +++++++++++++++-----
 3 files changed, 77 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
index ca45767..d9dec06 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
 import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
 
 import java.io.Serializable;
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
@@ -39,23 +39,33 @@ import java.util.function.Supplier;
 public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+    private final boolean listFold;
 
     public FoldStep(final Traversal.Admin traversal) {
         this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) new ListBiOperator<>());
     }
 
-    @Override
-    public E projectTraverser(final Traverser.Admin<S> traverser) {
-        return (E) Collections.singletonList(traverser.get());
-    }
-
     public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
         super(traversal);
+        this.listFold = foldFunction instanceof ListBiOperator;
         this.setSeedSupplier(seed);
         this.setReducingBiOperator(new FoldBiOperator<>(foldFunction));
     }
 
     @Override
+    public E projectTraverser(final Traverser.Admin<S> traverser) {
+        if (this.listFold) {
+            final List<S> list = new ArrayList<>();
+            for (long i = 0; i < traverser.bulk(); i++) {
+                list.add(traverser.get());
+            }
+            return (E) list;
+        } else {
+            return (E) traverser.get();
+        }
+    }
+
+    @Override
     public Set<TraverserRequirement> getRequirements() {
         return REQUIREMENTS;
     }
@@ -63,18 +73,14 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
     /////////
 
     private static class ListBiOperator<S> implements BinaryOperator<List<S>>, Serializable {
-
         @Override
         public List<S> apply(final List<S> mutatingSeed, final List<S> list) {
             mutatingSeed.addAll(list);
             return mutatingSeed;
         }
-
     }
 
-    ///////
-
-    public static class FoldBiOperator<E> implements BinaryOperator<E>, Serializable {
+    private static class FoldBiOperator<E> implements BinaryOperator<E>, Serializable {
 
         private final BiFunction biFunction;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
index e669bca..966d17a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
@@ -42,7 +42,7 @@ import java.util.function.BinaryOperator;
  */
 public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements TraversalParent, ByModulating {
 
-    private Traversal.Admin<S, E> groupTraversal = null;
+    private Traversal.Admin<S, E> keyTraversal = null;
 
     public GroupCountStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -53,17 +53,17 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
 
     @Override
     public void modulateBy(final Traversal.Admin<?, ?> keyTraversal) {
-        this.groupTraversal = this.integrateChild(keyTraversal);
+        this.keyTraversal = this.integrateChild(keyTraversal);
     }
 
     @Override
     public List<Traversal.Admin<S, E>> getLocalChildren() {
-        return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+        return null == this.keyTraversal ? Collections.emptyList() : Collections.singletonList(this.keyTraversal);
     }
 
     public Map<E, Long> projectTraverser(final Traverser.Admin<S> traverser) {
         final Map<E, Long> map = new HashMap<>(); // TODO: make singleton map
-        map.put(TraversalUtil.applyNullable(traverser, this.groupTraversal), traverser.bulk());
+        map.put(TraversalUtil.applyNullable(traverser, this.keyTraversal), traverser.bulk());
         return map;
     }
 
@@ -75,8 +75,8 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
     @Override
     public GroupCountStep<S, E> clone() {
         final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
-        if (null != this.groupTraversal)
-            clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+        if (null != this.keyTraversal)
+            clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
         return clone;
     }
 
@@ -91,7 +91,7 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.groupTraversal);
+        return StringFactory.stepString(this, this.keyTraversal);
     }
 
     ///////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
index 1051c01..35d0acd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
@@ -18,11 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.GroupStepHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
@@ -39,11 +39,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BinaryOperator;
+import java.util.function.Supplier;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements TraversalParent, ByModulating {
+public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements TraversalParent, GraphComputing, ByModulating {
 
     private char state = 'k';
 
@@ -52,25 +53,33 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
     private Traversal.Admin<?, V> reduceTraversal = this.integrateChild(__.fold().asAdmin());      // used in OLAP
     private Traversal.Admin<S, V> valueReduceTraversal = this.integrateChild(__.fold().asAdmin()); // used in OLTP
 
+    private boolean onComputer = false;
+
     public GroupStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(HashMapSupplier.instance());
-        this.setReducingBiOperator(new GroupBiOperator<>());
+        this.setSeedSupplier((Supplier) new GroupStepHelper.GroupMapSupplier());
+        this.setReducingBiOperator(new GroupStandardBiOperator<>(this));
     }
 
     @Override
     public Map<K, V> projectTraverser(final Traverser.Admin<S> traverser) {
-        final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
-        this.valueTraversal.addStart(traverser);
-        final TraverserSet<?> value = new TraverserSet<>();
-        this.valueTraversal.forEachRemaining(t -> {
-            Traverser.Admin x = traverser.split(t, (Step) this);
-            x.setBulk(1l);
-            value.add(x);
-        });
-        final Map<K, V> map = new HashMap<>();
-        map.put(key, (V) value);
-        return map;
+           if(this.onComputer) {
+               final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
+               this.valueTraversal.reset();
+               this.valueTraversal.addStart(traverser);
+               final TraverserSet traverserSet = new TraverserSet();
+               this.valueTraversal.getEndStep().forEachRemaining(t -> traverserSet.add(t.asAdmin()));
+               final Map<K, V> map = new HashMap<>();
+               map.put(key, (V) traverserSet);
+               return map;
+           } else {
+               final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
+               final TraverserSet traverserSet = new TraverserSet();
+               traverserSet.add(traverser);
+               final Map<K, V> map = new HashMap<>();
+               map.put(key, (V) traverserSet);
+               return map;
+           }
     }
 
     @Override
@@ -139,6 +148,13 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
         return reducedMap;
     }
 
+    @Override
+    public void onGraphComputer() {
+        this.onComputer = true;
+        this.setSeedSupplier(HashMapSupplier.instance());
+        this.setReducingBiOperator(new GroupBiOperator<>());
+    }
+
     ///////////
 
     private static class GroupBiOperator<S, K, V> implements BinaryOperator<Map<K, V>>, Serializable {
@@ -159,4 +175,26 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
             return mutatingSeed;
         }
     }
+
+    private static class GroupStandardBiOperator<S, K, V> implements BinaryOperator<Map<K, V>>, Serializable {
+
+        private final GroupStep groupStep;
+
+        private GroupStandardBiOperator(final GroupStep groupStep) {
+            this.groupStep = groupStep;
+        }
+
+        @Override
+        public Map<K, V> apply(final Map<K, V> mutatingSeed, final Map<K, V> map) {
+            for (final K key : map.keySet()) {
+                Traversal.Admin reduce = (Traversal.Admin) mutatingSeed.get(key);
+                if (null == reduce) {
+                    reduce = this.groupStep.valueReduceTraversal.clone();
+                    mutatingSeed.put(key, (V) reduce);
+                }
+                ((TraverserSet<?>) map.get(key)).forEach(reduce::addStart);
+            }
+            return mutatingSeed;
+        }
+    }
 }
\ No newline at end of file