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
----------------------------------------------------------------------
----------------------------------------------------------------------