You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2015/02/10 18:23:36 UTC

[1/2] incubator-tinkerpop git commit: added FilterByCountOptimizerStrategy

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 712b11437 -> 174ebc02c


added FilterByCountOptimizerStrategy


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

Branch: refs/heads/master
Commit: d3043ed31a37f4dbfe97e4819ca6d8946032678b
Parents: 712b114
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Tue Feb 10 18:00:44 2015 +0100
Committer: Stephen Mallette <sp...@apache.org>
Committed: Tue Feb 10 12:07:59 2015 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 .../gremlin/process/TraversalStrategies.java    |  14 +--
 .../graph/traversal/step/filter/IsStep.java     |   8 ++
 .../FilterByCountOptimizerStrategy.java         | 101 +++++++++++++++++++
 4 files changed, 112 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d3043ed3/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 1c5eb33..5a64125 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -9,6 +9,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Added `FilterByCountOptimizerStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
 * Added `CoalesceStep` / `.coalesce()` that emits the first traversal which emits at least one element.
 * Added more syntactic sugar tricks to the Gremlin sugar plugin -- `&`, `|`, `select from`, `gt`, etc.
 * `Traversal.Admin` is consistent internal to steps, traversals, strategies, etc. For the user, `Traversal` is all they see.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d3043ed3/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
index 7984c26..18c9eb9 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -19,18 +19,7 @@
 package com.tinkerpop.gremlin.process;
 
 import com.tinkerpop.gremlin.process.graph.traversal.__;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ComparatorHolderRemovalStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ConjunctionStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.DedupOptimizerStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.EngineDependentStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.IdentityRemovalStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.LabeledEndStepStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.MatchWhereStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ProfileStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ReducingStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.SideEffectCapStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.SideEffectRegistrationStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategy;
+import com.tinkerpop.gremlin.process.graph.traversal.strategy.*;
 import com.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
 import com.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
 import com.tinkerpop.gremlin.structure.Edge;
@@ -166,6 +155,7 @@ public interface TraversalStrategies extends Cloneable {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
             coreStrategies.addStrategies(
                     DedupOptimizerStrategy.instance(),
+                    FilterByCountOptimizerStrategy.instance(),
                     IdentityRemovalStrategy.instance(),
                     SideEffectCapStrategy.instance(),
                     MatchWhereStrategy.instance(),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d3043ed3/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
index 463e591..991037a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
@@ -51,4 +51,12 @@ public final class IsStep<S> extends FilterStep<S> implements Reversible {
     public Set<TraverserRequirement> getRequirements() {
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public BiPredicate<S, Object> getPredicate() {
+        return predicate;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d3043ed3/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
new file mode 100644
index 0000000..293c6cc
--- /dev/null
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
@@ -0,0 +1,101 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.graph.traversal.strategy;
+
+import com.tinkerpop.gremlin.process.Step;
+import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.TraversalEngine;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.map.CountStep;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.structure.Compare;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public class FilterByCountOptimizerStrategy extends AbstractTraversalStrategy {
+
+    private static final FilterByCountOptimizerStrategy INSTANCE = new FilterByCountOptimizerStrategy();
+
+    private FilterByCountOptimizerStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
+        final int size = traversal.getSteps().size();
+        Step prev = null;
+        for (int i = 0; i < size; i++) {
+            final Step curr = traversal.getSteps().get(i);
+            if (curr instanceof CountStep && i < size - 1) {
+                final Step next = traversal.getSteps().get(i + 1);
+                if (next instanceof IsStep && !(prev instanceof RangeStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
+                    final IsStep isStep = (IsStep) next;
+                    final Object value = isStep.getValue();
+                    final BiPredicate predicate = isStep.getPredicate();
+                    if (value instanceof Number) {
+                        final long highRangeOffset;
+                        final boolean replaceIsStep;
+                        if (predicate.equals(Compare.eq) || predicate.equals(Compare.lte) || predicate.equals(Compare.neq)) {
+                            highRangeOffset = 1L;
+                            replaceIsStep = false;
+                        } else if (predicate.equals(Compare.lt)) {
+                            highRangeOffset = 0L;
+                            replaceIsStep = false;
+                        } else if (predicate.equals(Compare.gt)) {
+                            highRangeOffset = 1L;
+                            replaceIsStep = true;
+                        } else if (predicate.equals(Compare.gte)) {
+                            highRangeOffset = 0L;
+                            replaceIsStep = true;
+                        } else continue;
+
+                        final long highRange = ((Number) value).longValue() + highRangeOffset;
+                        TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                        if (replaceIsStep) {
+                            TraversalHelper.replaceStep(isStep, new IsStep<>(traversal, Compare.eq, highRange), traversal);
+                        }
+                    }
+                    if (value instanceof Collection && (predicate.equals(Compare.inside) || predicate.equals(Compare.outside))) {
+                        final Iterator iterator = ((Collection) value).iterator();
+                        if (iterator.hasNext()) iterator.next();
+                        else continue;
+                        if (iterator.hasNext()) {
+                            final Object high = iterator.next();
+                            if (high instanceof Number && !iterator.hasNext()) {
+                                final long highRangeOffset = predicate.equals(Compare.inside) ? 0L : 1L;
+                                final long highRange = ((Number) high).longValue() + highRangeOffset;
+                                TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                            }
+                        }
+                    }
+                }
+            }
+            prev = curr;
+        }
+    }
+
+    public static FilterByCountOptimizerStrategy instance() {
+        return INSTANCE;
+    }
+}


[2/2] incubator-tinkerpop git commit: This closes #4 - merging in FilterByCountOptimizerStrategy

Posted by sp...@apache.org.
This closes #4 - merging in FilterByCountOptimizerStrategy


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

Branch: refs/heads/master
Commit: 174ebc02cf0597e3d1fdc67bcaf4f71258be923a
Parents: d3043ed
Author: Stephen Mallette <sp...@apache.org>
Authored: Tue Feb 10 12:23:27 2015 -0500
Committer: Stephen Mallette <sp...@apache.org>
Committed: Tue Feb 10 12:23:27 2015 -0500

----------------------------------------------------------------------

----------------------------------------------------------------------