Repository: tinkerpop Updated Branches: refs/heads/master 137f1e593 -> a35f009a0
Fixed the behavior of `min()`, `max()`, `mean()` and `sum()`. If no input is given, these steps will now throw a `FastNoElementException`. Also adjusted existing test cases to be in line with the new behavior. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/32014426 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/32014426 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/32014426 Branch: refs/heads/master Commit: 32014426f12478e13d73b3c1bdca8df6d79d08da Parents: 3858818 Author: Daniel Kuppitz <daniel_kupp...@hotmail.com> Authored: Tue Feb 27 10:15:07 2018 -0700 Committer: Daniel Kuppitz <daniel_kupp...@hotmail.com> Committed: Fri Mar 2 13:39:26 2018 -0700 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 2 + .../traversal/step/map/ComputerResultStep.java | 4 +- .../process/traversal/step/filter/AndStep.java | 2 +- .../traversal/step/map/MaxGlobalStep.java | 8 ++- .../traversal/step/map/MaxLocalStep.java | 9 ++- .../traversal/step/map/MeanGlobalStep.java | 6 ++ .../traversal/step/map/MeanLocalStep.java | 4 +- .../traversal/step/map/MinGlobalStep.java | 6 ++ .../traversal/step/map/MinLocalStep.java | 9 ++- .../traversal/step/map/SumGlobalStep.java | 8 ++- .../traversal/step/map/SumLocalStep.java | 9 ++- .../Gherkin/GherkinTestRunner.cs | 2 +- gremlin-test/features/branch/Union.feature | 3 +- gremlin-test/features/map/Max.feature | 29 ++++++++++ gremlin-test/features/map/Mean.feature | 31 +++++++++- gremlin-test/features/map/Min.feature | 29 ++++++++++ gremlin-test/features/map/Order.feature | 7 +-- gremlin-test/features/map/Sum.feature | 33 ++++++++++- gremlin-test/features/sideEffect/Group.feature | 4 +- .../process/computer/GraphComputerTest.java | 12 ++-- .../traversal/step/branch/UnionTest.java | 2 +- .../process/traversal/step/map/MaxTest.java | 48 +++++++++++++++- .../process/traversal/step/map/MeanTest.java | 43 ++++++++++++-- .../process/traversal/step/map/MinTest.java | 46 +++++++++++++++ .../process/traversal/step/map/OrderTest.java | 18 ++---- .../process/traversal/step/map/SumTest.java | 60 ++++++++++++++++++-- .../traversal/step/sideEffect/GroupTest.java | 11 +--- .../SparkStarBarrierInterceptor.java | 36 ++++++------ .../structure/TinkerGraphPlayTest.java | 7 +-- 29 files changed, 395 insertions(+), 93 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index a3de12f..0bad01a 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -25,6 +25,8 @@ NEED AND IMAGE This release also includes changes from <<release-3-3-2, 3.3.2>>. +* Fixed a bug in `ReducingBarrierStep`, that returned the provided seed value despite no elements being available. + == TinkerPop 3.3.0 (Gremlin Symphony #40 in G Minor) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java index b5fd8e8..95e572d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java @@ -66,7 +66,9 @@ public final class ComputerResultStep<S> extends AbstractStep<ComputerResult, S> return this.currentIterator.next(); else { final ComputerResult result = this.starts.next().get(); - this.currentIterator = attach(result.memory().<TraverserSet<S>>get(TraversalVertexProgram.HALTED_TRAVERSERS).iterator(), result.graph()); + this.currentIterator = attach(result.memory().exists(TraversalVertexProgram.HALTED_TRAVERSERS) + ? result.memory().<TraverserSet<S>>get(TraversalVertexProgram.HALTED_TRAVERSERS).iterator() + : EmptyIterator.instance(), result.graph()); } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java index 5d9d124..5c20cd8 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java @@ -39,4 +39,4 @@ public final class AndStep<S> extends ConnectiveStep<S> { } return true; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java index 954dbfe..8cb798c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java @@ -41,7 +41,13 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S } @Override - public S projectTraverser(Traverser.Admin<S> traverser) { + public void processAllStarts() { + if (this.starts.hasNext()) + super.processAllStarts(); + } + + @Override + public S projectTraverser(final Traverser.Admin<S> traverser) { return traverser.get(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java index 2baca28..909a4c7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import java.util.Collections; import java.util.Iterator; @@ -40,17 +41,15 @@ public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends @Override protected E map(final Traverser.Admin<S> traverser) { - Number result; final Iterator<E> iterator = traverser.get().iterator(); if (iterator.hasNext()) { - result = iterator.next(); + Number result = iterator.next(); while (iterator.hasNext()) { result = max(iterator.next(), result); } - } else { - result = Double.NaN; + return (E) result; } - return (E) result; + throw FastNoSuchElementException.instance(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java index 2f1c1dc..5e90336 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java @@ -49,6 +49,12 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re } @Override + public void processAllStarts() { + if (this.starts.hasNext()) + super.processAllStarts(); + } + + @Override public E projectTraverser(final Traverser.Admin<S> traverser) { return (E) new MeanNumber(traverser.get(), traverser.bulk()); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java index 99005c9..91447fd 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java @@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.util.NumberHelper; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import java.util.Collections; import java.util.Iterator; @@ -48,9 +49,8 @@ public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extend counter++; } return NumberHelper.div(result, counter, true); - } else { - return Double.NaN; } + throw FastNoSuchElementException.instance(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java index 7d0eb56..e476f5c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java @@ -41,6 +41,12 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S } @Override + public void processAllStarts() { + if (this.starts.hasNext()) + super.processAllStarts(); + } + + @Override public S projectTraverser(final Traverser.Admin<S> traverser) { return traverser.get(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java index e7e001c..64c89e3 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import java.util.Collections; import java.util.Iterator; @@ -40,17 +41,15 @@ public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends @Override protected E map(final Traverser.Admin<S> traverser) { - Number result; final Iterator<E> iterator = traverser.get().iterator(); if (iterator.hasNext()) { - result = iterator.next(); + Number result = iterator.next(); while (iterator.hasNext()) { result = min(iterator.next(), result); } - } else { - result = Double.NaN; + return (E) result; } - return (E) result; + throw FastNoSuchElementException.instance(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java index 7942d9b..3711cfe 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java @@ -48,6 +48,12 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S } @Override + public void processAllStarts() { + if (this.starts.hasNext()) + super.processAllStarts(); + } + + @Override public S projectTraverser(final Traverser.Admin<S> traverser) { return (S) mul(traverser.get(), traverser.bulk()); } @@ -57,4 +63,4 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S public Set<TraverserRequirement> getRequirements() { return REQUIREMENTS; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java index b062a7e..72e6539 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java @@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.util.NumberHelper; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import java.util.Collections; import java.util.Iterator; @@ -39,17 +40,15 @@ public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends @Override protected E map(final Traverser.Admin<S> traverser) { - Number result; final Iterator<E> iterator = traverser.get().iterator(); if (iterator.hasNext()) { - result = iterator.next(); + Number result = iterator.next(); while (iterator.hasNext()) { result = NumberHelper.add(result, iterator.next()); } - } else { - result = 0; + return (E) result; } - return (E) result; + throw FastNoSuchElementException.instance(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs index eb0a7e1..db29abf 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs @@ -384,4 +384,4 @@ namespace Gremlin.Net.IntegrationTest.Gherkin return rootDir.FullName; } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/branch/Union.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/branch/Union.feature b/gremlin-test/features/branch/Union.feature index 83318f6..8f5297e 100644 --- a/gremlin-test/features/branch/Union.feature +++ b/gremlin-test/features/branch/Union.feature @@ -135,7 +135,6 @@ Feature: Step - union() | d[3].l | | d[0].l | | d[1.9].d | - | d[0].i | | d[0].l | | d[1].l | @@ -151,4 +150,4 @@ Feature: Step - union() Then the result should be unordered | result | | d[1].l | - | d[1].l | \ No newline at end of file + | d[1].l | http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/map/Max.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/map/Max.feature b/gremlin-test/features/map/Max.feature index ad0a270..7139f65 100644 --- a/gremlin-test/features/map/Max.feature +++ b/gremlin-test/features/map/Max.feature @@ -28,6 +28,35 @@ Feature: Step - max() | result | | d[35].i | + Scenario: g_V_foo_max + Given the modern graph + And the traversal of + """ + g.V().values("foo").max() + """ + When iterated to list + Then the result should be empty + + Scenario: g_V_age_fold_maxXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("age").fold().max(Scope.local) + """ + When iterated to list + Then the result should be unordered + | result | + | d[35].i | + + Scenario: g_V_foo_fold_maxXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("foo").fold().max(Scope.local) + """ + When iterated to list + Then the result should be empty + Scenario: g_V_repeatXbothX_timesX5X_age_max Given the modern graph And the traversal of http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/map/Mean.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/map/Mean.feature b/gremlin-test/features/map/Mean.feature index b109356..dc28ecb 100644 --- a/gremlin-test/features/map/Mean.feature +++ b/gremlin-test/features/map/Mean.feature @@ -28,6 +28,35 @@ Feature: Step - mean() | result | | d[30.75].d | + Scenario: g_V_foo_mean + Given the modern graph + And the traversal of + """ + g.V().values("foo").mean() + """ + When iterated to list + Then the result should be empty + + Scenario: g_V_age_fold_meanXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("age").fold().mean(Scope.local) + """ + When iterated to list + Then the result should be unordered + | result | + | d[30.75].d | + + Scenario: g_V_foo_fold_meanXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("foo").fold().mean(Scope.local) + """ + When iterated to list + Then the result should be empty + Scenario: g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX Given the modern graph And the traversal of @@ -37,4 +66,4 @@ Feature: Step - mean() When iterated to list Then the result should be unordered | result | - | m[{"ripple":"d[1.0].d","lop":"d[0.3333333333333333].d"}] | \ No newline at end of file + | m[{"ripple":"d[1.0].d","lop":"d[0.3333333333333333].d"}] | http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/map/Min.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/map/Min.feature b/gremlin-test/features/map/Min.feature index d77e9f3..6e3fb5d 100644 --- a/gremlin-test/features/map/Min.feature +++ b/gremlin-test/features/map/Min.feature @@ -28,6 +28,35 @@ Feature: Step - min() | result | | d[27].i | + Scenario: g_V_foo_min + Given the modern graph + And the traversal of + """ + g.V().values("foo").min() + """ + When iterated to list + Then the result should be empty + + Scenario: g_V_age_fold_minXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("age").fold().min(Scope.local) + """ + When iterated to list + Then the result should be unordered + | result | + | d[27].i | + + Scenario: g_V_foo_fold_minXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("foo").fold().min(Scope.local) + """ + When iterated to list + Then the result should be empty + Scenario: g_V_repeatXbothX_timesX5X_age_min Given the modern graph And the traversal of http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/map/Order.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/map/Order.feature b/gremlin-test/features/map/Order.feature index 6dd8ac4..8347ad2 100644 --- a/gremlin-test/features/map/Order.feature +++ b/gremlin-test/features/map/Order.feature @@ -192,13 +192,13 @@ Feature: Step - order() When iterated to list Then the result should be ordered | result | - | m[{"vadas":"d[0].i","peter":"d[0.2].d","josh":"d[1.4].d","marko":"d[1.9].d"}] | + | m[{"peter":"d[0.2].d","josh":"d[1.4].d","marko":"d[1.9].d"}] | - Scenario: g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX + Scenario: g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX Given the modern graph And the traversal of """ - g.V().local(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local), Order.decr) + g.V().map(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local), Order.decr) """ When iterated to list Then the result should be ordered @@ -233,7 +233,6 @@ Feature: Step - order() | m[{"marko":"d[1.9].d"}] | | m[{"josh":"d[1.4].d"}] | | m[{"peter":"d[0.2].d"}] | - | m[{"vadas":"d[0].i"}] | Scenario: g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_decrX Given the modern graph http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/map/Sum.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/map/Sum.feature b/gremlin-test/features/map/Sum.feature index 2c89946..0e20368 100644 --- a/gremlin-test/features/map/Sum.feature +++ b/gremlin-test/features/map/Sum.feature @@ -17,7 +17,7 @@ Feature: Step - sum() - Scenario: g_V_valuesXageX_sum + Scenario: g_V_age_sum Given the modern graph And the traversal of """ @@ -28,6 +28,35 @@ Feature: Step - sum() | result | | d[123].l | + Scenario: g_V_foo_sum + Given the modern graph + And the traversal of + """ + g.V().values("foo").sum() + """ + When iterated to list + Then the result should be empty + + Scenario: g_V_age_fold_sumXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("age").fold().sum(Scope.local) + """ + When iterated to list + Then the result should be unordered + | result | + | d[123].i | + + Scenario: g_V_foo_fold_sumXlocalX + Given the modern graph + And the traversal of + """ + g.V().values("foo").fold().sum(Scope.local) + """ + When iterated to list + Then the result should be empty + Scenario: g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX Given the modern graph And the traversal of @@ -37,4 +66,4 @@ Feature: Step - sum() When iterated to list Then the result should be unordered | result | - | m[{"ripple":"d[1.0].d","lop":"d[1.0].d"}] | \ No newline at end of file + | m[{"ripple":"d[1.0].d","lop":"d[1.0].d"}] | http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/features/sideEffect/Group.feature ---------------------------------------------------------------------- diff --git a/gremlin-test/features/sideEffect/Group.feature b/gremlin-test/features/sideEffect/Group.feature index 94d2191..2686f09 100644 --- a/gremlin-test/features/sideEffect/Group.feature +++ b/gremlin-test/features/sideEffect/Group.feature @@ -101,7 +101,7 @@ Feature: Step - group() When iterated to list Then the result should be unordered | result | - | m[{"software":"d[0].i", "person":"d[3.5].d"}] | + | m[{"person":"d[3.5].d"}] | Scenario: g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX Given the grateful graph @@ -207,7 +207,7 @@ Feature: Step - group() When iterated to list Then the result should be unordered | result | - | m[{"cover":{"followedBy":"d[777982].l", "sungBy":"d[0].i", "writtenBy":"d[0].i"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l", "sungBy":"d[0].i", "writtenBy":"d[0].i"}}] | + | m[{"cover":{"followedBy":"d[777982].l"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l"}}] | Scenario: g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX Given the modern graph http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java index 2f4f103..228b975 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java @@ -1347,13 +1347,13 @@ public class GraphComputerTest extends AbstractGremlinProcessTest { assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next()); assertEquals(Long.valueOf(0l), result.graph().traversal().V().values().count().next()); assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next()); - assertEquals(0, result.graph().traversal().V().values("money").sum().next()); + assertFalse(result.graph().traversal().V().values("money").sum().hasNext()); /// assertEquals(Long.valueOf(6l), graph.traversal().V().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().count().next()); assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next()); - assertEquals(0, graph.traversal().V().values("money").sum().next()); + assertFalse(graph.traversal().V().values("money").sum().hasNext()); } } @@ -1373,7 +1373,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest { assertEquals(Long.valueOf(6l), graph.traversal().E().count().next()); assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next()); - assertEquals(0, graph.traversal().V().values("money").sum().next()); + assertFalse(graph.traversal().V().values("money").sum().hasNext()); } } @@ -1393,7 +1393,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest { assertEquals(Long.valueOf(6l), graph.traversal().E().count().next()); assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next()); - assertEquals(0, graph.traversal().V().values("money").sum().next()); + assertFalse(graph.traversal().V().values("money").sum().hasNext()); } } @@ -1407,13 +1407,13 @@ public class GraphComputerTest extends AbstractGremlinProcessTest { assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next()); assertEquals(Long.valueOf(12l), result.graph().traversal().V().values().count().next()); assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next()); - assertEquals(0, result.graph().traversal().V().values("money").sum().next()); + assertFalse(result.graph().traversal().V().values("money").sum().hasNext()); /// assertEquals(Long.valueOf(6l), graph.traversal().V().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().count().next()); assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next()); assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next()); - assertEquals(0, graph.traversal().V().values("money").sum().next()); + assertFalse(graph.traversal().V().values("money").sum().hasNext()); } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java index 1c06943..bbe5eff 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java @@ -135,7 +135,7 @@ public abstract class UnionTest extends AbstractGremlinProcessTest { public void g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX() { final Traversal<Vertex, Number> traversal = get_g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX(convertToVertexId("marko"), convertToVertexId("vadas")); printTraversalForm(traversal); - checkResults(Arrays.asList(0l, 0l, 0, 3l, 1l, 1.9d), traversal); + checkResults(Arrays.asList(3L, 0L, 1.9, 0L, 1L), traversal); } @Test http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java index fae3f92..f13cdb5 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; @@ -41,6 +42,12 @@ public abstract class MaxTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Integer> get_g_V_age_max(); + public abstract Traversal<Vertex, Integer> get_g_V_age_fold_maxXlocalX(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_max(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_fold_maxXlocalX(); + public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max(); public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_maxX(); @@ -55,6 +62,30 @@ public abstract class MaxTest extends AbstractGremlinProcessTest { @Test @LoadGraphWith(MODERN) + public void g_V_age_fold_maxXlocalX() { + final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_maxXlocalX(); + printTraversalForm(traversal); + checkResults(Arrays.asList(35), traversal); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_max() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_max(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_fold_maxXlocalX() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_maxXlocalX(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) public void g_V_repeatXbothX_timesX5X_age_max() { final Traversal<Vertex, Integer> traversal = get_g_V_repeatXbothX_timesX5X_age_max(); printTraversalForm(traversal); @@ -82,6 +113,21 @@ public abstract class MaxTest extends AbstractGremlinProcessTest { } @Override + public Traversal<Vertex, Integer> get_g_V_age_fold_maxXlocalX() { + return g.V().values("age").fold().max(Scope.local); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_max() { + return g.V().values("foo").max(); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_fold_maxXlocalX() { + return g.V().values("foo").fold().max(Scope.local); + } + + @Override public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() { return g.V().repeat(both()).times(5).values("age").max(); } @@ -91,4 +137,4 @@ public abstract class MaxTest extends AbstractGremlinProcessTest { return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").max()); } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java index ab47605..34bef6d 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java @@ -21,11 +21,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Arrays; import java.util.Map; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; @@ -40,16 +42,32 @@ public abstract class MeanTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Double> get_g_V_age_mean(); + public abstract Traversal<Vertex, Double> get_g_V_age_fold_meanXlocalX(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_mean(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_fold_meanXlocalX(); + public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX(); @Test @LoadGraphWith(MODERN) public void g_V_age_mean() { - final Traversal<Vertex, Double> traversal = get_g_V_age_mean(); - printTraversalForm(traversal); - final Double mean = traversal.next(); - assertEquals(30.75, mean, 0.05); - assertFalse(traversal.hasNext()); + for (final Traversal<Vertex, Double> traversal : Arrays.asList(get_g_V_age_mean(), get_g_V_age_fold_meanXlocalX())) { + printTraversalForm(traversal); + final Double mean = traversal.next(); + assertEquals(30.75, mean, 0.05); + assertFalse(traversal.hasNext()); + } + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_mean() { + for (final Traversal<Vertex, Number> traversal : Arrays.asList(get_g_V_foo_mean(), get_g_V_foo_fold_meanXlocalX())) { + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } } @Test @@ -73,6 +91,21 @@ public abstract class MeanTest extends AbstractGremlinProcessTest { } @Override + public Traversal<Vertex, Double> get_g_V_age_fold_meanXlocalX() { + return g.V().values("age").fold().mean(Scope.local); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_mean() { + return g.V().values("foo").mean(); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_fold_meanXlocalX() { + return g.V().values("foo").fold().mean(Scope.local); + } + + @Override public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX() { return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").mean()); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java index 947137f..10f6bc8 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; @@ -43,6 +44,12 @@ public abstract class MinTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Integer> get_g_V_age_min(); + public abstract Traversal<Vertex, Integer> get_g_V_age_fold_minXlocalX(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_min(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_fold_minXlocalX(); + public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min(); public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_minX(); @@ -59,6 +66,30 @@ public abstract class MinTest extends AbstractGremlinProcessTest { @Test @LoadGraphWith(MODERN) + public void g_V_age_fold_minXlocalX() { + final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_minXlocalX(); + printTraversalForm(traversal); + checkResults(Arrays.asList(27), traversal); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_min() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_min(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_fold_minXlocalX() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_minXlocalX(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) public void g_V_repeatXbothX_timesX5X_age_min() { final Traversal<Vertex, Integer> traversal = get_g_V_repeatXbothX_timesX5X_age_min(); printTraversalForm(traversal); @@ -96,6 +127,21 @@ public abstract class MinTest extends AbstractGremlinProcessTest { } @Override + public Traversal<Vertex, Integer> get_g_V_age_fold_minXlocalX() { + return g.V().values("age").fold().min(Scope.local); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_min() { + return g.V().values("foo").min(); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_fold_minXlocalX() { + return g.V().values("foo").fold().min(Scope.local); + } + + @Override public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() { return g.V().repeat(both()).times(5).values("age").min(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java index bbf63ef..d5cd6fd 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java @@ -76,7 +76,7 @@ public abstract class OrderTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX(); - public abstract Traversal<Vertex, List<Double>> get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX(); + public abstract Traversal<Vertex, List<Double>> get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX(); public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_decrX(); @@ -244,8 +244,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest { @Test @LoadGraphWith(MODERN) - public void g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX() { - final Traversal<Vertex, List<Double>> traversal = get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX(); + public void g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX() { + final Traversal<Vertex, List<Double>> traversal = get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX(); final List<List<Double>> list = traversal.toList(); assertEquals(list.get(0).size(), 3); assertEquals(list.get(1).size(), 3); @@ -386,12 +386,9 @@ public abstract class OrderTest extends AbstractGremlinProcessTest { assertTrue(traversal.hasNext()); final Map<String, Number> m = traversal.next(); assertFalse(traversal.hasNext()); - assertEquals(4, m.size()); + assertEquals(3, m.size()); final Iterator<Map.Entry<String, Number>> iterator = m.entrySet().iterator(); Map.Entry<String, Number> entry = iterator.next(); - assertEquals("vadas", entry.getKey()); - assertEquals(0.0, entry.getValue().doubleValue(), 0.0001); - entry = iterator.next(); assertEquals("peter", entry.getKey()); assertEquals(0.2, entry.getValue().doubleValue(), 0.0001); entry = iterator.next(); @@ -417,9 +414,6 @@ public abstract class OrderTest extends AbstractGremlinProcessTest { entry = traversal.next(); assertEquals("peter", entry.getKey()); assertEquals(0.2, entry.getValue().doubleValue(), 0.0001); - entry = traversal.next(); - assertEquals("vadas", entry.getKey()); - assertEquals(0.0, entry.getValue().doubleValue(), 0.0001); assertFalse(traversal.hasNext()); } @@ -485,8 +479,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest { } @Override - public Traversal<Vertex, List<Double>> get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX() { - return g.V().local(__.bothE().<Double>values("weight").fold()).order().by(__.sum(Scope.local), Order.decr); + public Traversal<Vertex, List<Double>> get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX() { + return g.V().map(__.bothE().<Double>values("weight").fold()).order().by(__.sum(Scope.local), Order.decr); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java index 1183863..f8bfbcb 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; @@ -39,17 +40,49 @@ import static org.junit.Assert.*; @RunWith(GremlinProcessRunner.class) public abstract class SumTest extends AbstractGremlinProcessTest { - public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum(); + public abstract Traversal<Vertex, Number> get_g_V_age_sum(); + + public abstract Traversal<Vertex, Number> get_g_V_age_fold_sumXlocalX(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_sum(); + + public abstract Traversal<Vertex, Number> get_g_V_foo_fold_sumXlocalX(); public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX(); @Test @LoadGraphWith(MODERN) - public void g_V_valuesXageX_sum() { - final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum(); + public void g_V_age_sum() { + final Traversal<Vertex, Number> traversal = get_g_V_age_sum(); + printTraversalForm(traversal); + final Number sum = traversal.next(); + assertEquals(123, sum.intValue()); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_age_fold_sumXlocalX() { + final Traversal<Vertex, Number> traversal = get_g_V_age_fold_sumXlocalX(); printTraversalForm(traversal); final Number sum = traversal.next(); - assertEquals(123L, sum); + assertEquals(123, sum.intValue()); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_sum() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_sum(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_foo_fold_sumXlocalX() { + final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_sumXlocalX(); + printTraversalForm(traversal); assertFalse(traversal.hasNext()); } @@ -69,13 +102,28 @@ public abstract class SumTest extends AbstractGremlinProcessTest { public static class Traversals extends SumTest { @Override - public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() { + public Traversal<Vertex, Number> get_g_V_age_sum() { return g.V().values("age").sum(); } @Override + public Traversal<Vertex, Number> get_g_V_age_fold_sumXlocalX() { + return g.V().values("age").fold().sum(Scope.local); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_sum() { + return g.V().values("foo").sum(); + } + + @Override + public Traversal<Vertex, Number> get_g_V_foo_fold_sumXlocalX() { + return g.V().values("foo").fold().sum(Scope.local); + } + + @Override public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX() { return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").sum()); } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java index 3e1e53b..6a58aa7 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java @@ -218,8 +218,7 @@ public abstract class GroupTest extends AbstractGremlinProcessTest { assertTrue(traversal.hasNext()); final Map<String, Number> map = traversal.next(); assertFalse(traversal.hasNext()); - assertEquals(2, map.size()); - assertEquals(0, map.get("software")); + assertEquals(1, map.size()); assertEquals(3.5d, (double) map.get("person"), 0.01d); checkSideEffects(traversal.asAdmin().getSideEffects(), "a", HashMap.class); } @@ -424,16 +423,12 @@ public abstract class GroupTest extends AbstractGremlinProcessTest { assertEquals(179350, subMap.get("followedBy").intValue()); // subMap = map.get("original"); - assertEquals(3, subMap.size()); + assertEquals(1, subMap.size()); assertEquals(2185613, subMap.get("followedBy").intValue()); - assertEquals(0, subMap.get("writtenBy").intValue()); - assertEquals(0, subMap.get("sungBy").intValue()); // subMap = map.get("cover"); - assertEquals(3, subMap.size()); + assertEquals(1, subMap.size()); assertEquals(777982, subMap.get("followedBy").intValue()); - assertEquals(0, subMap.get("writtenBy").intValue()); - assertEquals(0, subMap.get("sungBy").intValue()); } @Test http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java ---------------------------------------------------------------------- diff --git a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java index 3c74e5a..6509928 100644 --- a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java +++ b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java @@ -45,6 +45,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Subgra import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; +import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.spark.process.computer.SparkMemory; import org.apache.tinkerpop.gremlin.spark.process.computer.traversal.strategy.SparkVertexProgramInterceptor; @@ -52,6 +53,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.ElementHelper; import org.apache.tinkerpop.gremlin.util.NumberHelper; import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier; +import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import java.util.ArrayList; @@ -96,25 +98,25 @@ public final class SparkStarBarrierInterceptor implements SparkVertexProgramInte // USE SPARK DSL FOR THE RESPECTIVE END REDUCING BARRIER STEP OF THE TRAVERSAL final Object result; if (endStep instanceof CountGlobalStep) - result = nextRDD.map(Traverser::bulk).fold(0l, (a, b) -> a + b); - else if (endStep instanceof SumGlobalStep) - result = nextRDD + result = nextRDD.map(Traverser::bulk).fold(0L, (a, b) -> a + b); + else if (endStep instanceof SumGlobalStep) { + result = nextRDD.isEmpty() ? null : nextRDD .map(traverser -> NumberHelper.mul(traverser.bulk(), (Number) traverser.get())) .fold(0, NumberHelper::add); - else if (endStep instanceof MeanGlobalStep) - result = nextRDD + } else if (endStep instanceof MeanGlobalStep) { + result = nextRDD.isEmpty() ? null : nextRDD .map(traverser -> new MeanGlobalStep.MeanNumber((Number) traverser.get(), traverser.bulk())) - .fold(new MeanGlobalStep.MeanNumber(), MeanGlobalStep.MeanNumber::add) + .fold(MeanNumberSupplier.instance().get(), MeanGlobalStep.MeanNumber::add) .getFinal(); - else if (endStep instanceof MinGlobalStep) - result = nextRDD + } else if (endStep instanceof MinGlobalStep) { + result = nextRDD.isEmpty() ? null : nextRDD .map(traverser -> (Number) traverser.get()) - .fold(Integer.MAX_VALUE, NumberHelper::min); - else if (endStep instanceof MaxGlobalStep) - result = nextRDD + .fold(Double.NaN, NumberHelper::min); + } else if (endStep instanceof MaxGlobalStep) { + result = nextRDD.isEmpty() ? null : nextRDD .map(traverser -> (Number) traverser.get()) - .fold(Integer.MIN_VALUE, NumberHelper::max); - else if (endStep instanceof FoldStep) { + .fold(Double.NaN, NumberHelper::max); + } else if (endStep instanceof FoldStep) { final BinaryOperator biOperator = endStep.getBiOperator(); result = nextRDD.map(traverser -> { if (endStep.getSeedSupplier() instanceof ArrayListSupplier) { @@ -148,9 +150,11 @@ public final class SparkStarBarrierInterceptor implements SparkVertexProgramInte /////////////////////////////// // generate the HALTED_TRAVERSERS for the memory - final TraverserSet<Long> haltedTraversers = new TraverserSet<>(); - haltedTraversers.add(traversal.getTraverserGenerator().generate(result, endStep, 1l)); // all reducing barrier steps produce a result of bulk 1 - memory.set(TraversalVertexProgram.HALTED_TRAVERSERS, haltedTraversers); + if (result != null) { + final TraverserSet<Long> haltedTraversers = new TraverserSet<>(); + haltedTraversers.add(traversal.getTraverserGenerator().generate(result, endStep, 1l)); // all reducing barrier steps produce a result of bulk 1 + memory.set(TraversalVertexProgram.HALTED_TRAVERSERS, haltedTraversers); + } memory.incrIteration(); // any local star graph reduction takes a single iteration return inputRDD; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/32014426/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java index a13a4ad..eacc3db 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java @@ -132,11 +132,8 @@ public class TinkerGraphPlayTest { public void testPlayDK() throws Exception { Graph graph = TinkerGraph.open(); - GraphTraversalSource g = graph.traversal(); - graph.io(GraphMLIo.build()).readGraph("/projects/apache/tinkerpop/data/grateful-dead.xml"); - System.out.println(g.V().filter(outE("sungBy").count().is(0)).explain()); - System.out.println(g.V().filter(outE("sungBy").count().is(lt(1))).explain()); - System.out.println(g.V().filter(outE("sungBy").count().is(1)).explain()); + GraphTraversalSource g = graph.traversal().withComputer(); + g.V().values("test").max().forEachRemaining(System.out::println); } @Test