Merge branch 'tp33' Conflicts: gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f88ace14 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f88ace14 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f88ace14 Branch: refs/heads/TINKERPOP-1967 Commit: f88ace1420be0034108bf5f3c0c5c1d1973009c8 Parents: 9357d6a b12a3fd Author: Stephen Mallette <sp...@genoprime.com> Authored: Thu Aug 9 10:51:01 2018 -0400 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Thu Aug 9 10:51:01 2018 -0400 ---------------------------------------------------------------------- .../gremlin/process/remote/RemoteGraph.java | 17 --- .../io/graphson/TraversalSerializersV2d0.java | 4 - .../ModernGraphTypeInformation.cs | 4 + .../DriverRemoteTraversalSideEffects.java | 3 +- .../test/cucumber/feature-steps.js | 15 ++- .../glv/GraphTraversalSource.template | 2 +- .../gremlin_python/process/graph_traversal.py | 2 +- .../RemoteGraphGroovyTranslatorProvider.java | 3 +- gremlin-test/features/map/PageRank.feature | 132 +++++++++++++++++++ gremlin-test/features/map/PeerPressure.feature | 77 +++++++++++ .../process/AbstractGremlinProcessTest.java | 26 ++-- .../traversal/step/map/PageRankTest.java | 37 +++--- .../traversal/step/map/PeerPressureTest.java | 24 ++-- .../TranslationStrategyProcessTest.java | 3 + .../gremlin/process/FeatureCoverageTest.java | 6 +- 15 files changed, 284 insertions(+), 71 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js ---------------------------------------------------------------------- diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js index 83dfe22,0cddc02..96eeaaf --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js @@@ -62,7 -63,18 +63,19 @@@ const ignoreReason = const ignoredScenarios = { // An associative array containing the scenario name as key, for example: - // 'g_V_asXa_bX_out_asXcX_path_selectXkeysX': new IgnoreError(ignoreReason.embeddedListAssertion), + 'g_V_pageRank_hasXpageRankX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_outXcreatedX_pageRank_byXbothEX_byXprojectRankX_timesX0X_valueMapXname_projectRankX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_pageRank_order_byXpageRank_decrX_byXnameX_name': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_pageRank_order_byXpageRank_decrX_name_limitX2X': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_pageRank_byXoutEXknowsXX_byXfriendRankX_valueMapXname_friendRankX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_hasLabelXpersonX_pageRank_byXpageRankX_order_byXpageRankX_valueMapXname_pageRankX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_pageRank_byXpageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_byXinEXcreatedXX_timesX1X_byXpriorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_byXpageRankX_byXinEX_timesX1X_inXcreatedX_groupXmX_byXpageRankX_capXmX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_peerPressure_hasXclusterX': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_peerPressure_byXclusterX_byXoutEXknowsXX_pageRankX1X_byXrankX_byXoutEXknowsXX_timesX2X_group_byXclusterX_byXrank_sumX_limitX100X': new IgnoreError(ignoreReason.computerNotSupported), + 'g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX': new IgnoreError(ignoreReason.computerNotSupported), ++ 'g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX': new IgnoreError(ignoreReason.computerNotSupported), }; defineSupportCode(function(methods) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-test/features/map/PeerPressure.feature ---------------------------------------------------------------------- diff --cc gremlin-test/features/map/PeerPressure.feature index 0000000,83f5bb2..d7368e9 mode 000000,100644..100644 --- a/gremlin-test/features/map/PeerPressure.feature +++ b/gremlin-test/features/map/PeerPressure.feature @@@ -1,0 -1,60 +1,77 @@@ + # 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. + + Feature: Step - peerPressure() + + Scenario: g_V_peerPressure_hasXclusterX + Given the modern graph + And the traversal of + """ + g.withComputer().V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster") + """ + When iterated to list + Then the result should be unordered + | result | + | v[marko] | + | v[vadas] | + | v[lop] | + | v[josh] | + | v[ripple] | + | v[peter] | + And the graph should return 6 for count of "g.withComputer().V().peerPressure().has(\"gremlin.peerPressureVertexProgram.cluster\")" + + Scenario: g_V_peerPressure_byXclusterX_byXoutEXknowsXX_pageRankX1X_byXrankX_byXoutEXknowsXX_timesX2X_group_byXclusterX_byXrank_sumX_limitX100X + Given an unsupported test + Then nothing should happen because + """ + The result returned is not supported under GraphSON 2.x and therefore cannot be properly asserted. More + specifically it has long keys which basically get toString()'d under GraphSON 2.x. This test can be supported + with GraphSON 3.x. + """ + + Scenario: g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX + Given the modern graph + And the traversal of + """ + g.withComputer().V().has("name", "ripple").in("created").peerPressure().by(__.outE()).by("cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster") + """ + When iterated to list + Then the result should be unordered + | result | + | m[{"name": ["marko"], "cluster": [1]}] | + | m[{"name": ["vadas"], "cluster": [2]}] | + | m[{"name": ["lop"], "cluster": [4]}] | + | m[{"name": ["josh"], "cluster": [4]}] | + | m[{"name": ["ripple"], "cluster": [4]}] | + | m[{"name": ["peter"], "cluster": [6]}] | ++ ++ Scenario: g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX ++ Given the modern graph ++ And the traversal of ++ """ ++ g.withComputer().V().has("name", "ripple").in("created").peerPressure().with("~tinkerpop.peerPressure.edges",__.outE()).with("~tinkerpop.peerPressure.propertyName", "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster") ++ """ ++ When iterated to list ++ Then the result should be unordered ++ | result | ++ | m[{"name": ["marko"], "cluster": [1]}] | ++ | m[{"name": ["vadas"], "cluster": [2]}] | ++ | m[{"name": ["lop"], "cluster": [4]}] | ++ | m[{"name": ["josh"], "cluster": [4]}] | ++ | m[{"name": ["ripple"], "cluster": [4]}] | ++ | m[{"name": ["peter"], "cluster": [6]}] | ++ http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java ---------------------------------------------------------------------- diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java index b70cb02,be4ce9a..d53ec3e --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java @@@ -22,8 -22,8 +22,9 @@@ package org.apache.tinkerpop.gremlin.pr import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.TestHelper; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; + import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram; +import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PeerPressure; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.structure.Vertex; @@@ -51,20 -54,12 +55,14 @@@ public abstract class PeerPressureTest public abstract Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + public abstract Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + @Test @LoadGraphWith(MODERN) - public void g_V_peerPressure() { - final Traversal<Vertex, Vertex> traversal = get_g_V_peerPressure(); + public void g_V_peerPressure_hasXclusterX() { + final Traversal<Vertex, Vertex> traversal = get_g_V_peerPressure_hasXclusterX(); printTraversalForm(traversal); - int counter = 0; - while (traversal.hasNext()) { - final Vertex vertex = traversal.next(); - counter++; - assertTrue(vertex.property(PeerPressureVertexProgram.CLUSTER).isPresent()); - } - assertEquals(6, counter); + assertEquals(6, IteratorUtils.count(traversal)); } @Test @@@ -102,29 -97,7 +100,29 @@@ assertTrue(ids.contains(convertToVertexId("josh"))); assertTrue(ids.contains(convertToVertexId("peter"))); } - + + @Test + @LoadGraphWith(MODERN) + public void g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX() { + TestHelper.assumeNonDeterministic(); + final Traversal<Vertex, Map<String, List<Object>>> traversal = get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + printTraversalForm(traversal); + final List<Map<String, List<Object>>> results = traversal.toList(); + assertEquals(6, results.size()); + final Map<String, Object> clusters = new HashMap<>(); + results.forEach(m -> clusters.put((String) m.get("name").get(0), m.get("cluster").get(0))); + assertEquals(2, results.get(0).size()); + assertEquals(6, clusters.size()); + assertEquals(clusters.get("josh"), clusters.get("ripple")); + assertEquals(clusters.get("josh"), clusters.get("lop")); + final Set<Object> ids = new HashSet<>(clusters.values()); + assertEquals(4, ids.size()); + assertTrue(ids.contains(convertToVertexId("marko"))); + assertTrue(ids.contains(convertToVertexId("vadas"))); + assertTrue(ids.contains(convertToVertexId("josh"))); + assertTrue(ids.contains(convertToVertexId("peter"))); + } - ++ public static class Traversals extends PeerPressureTest { @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f88ace14/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/process/FeatureCoverageTest.java ---------------------------------------------------------------------- diff --cc gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/process/FeatureCoverageTest.java index 5739629,2cca50b..e09156b --- a/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/process/FeatureCoverageTest.java +++ b/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/process/FeatureCoverageTest.java @@@ -53,10 -53,11 +53,12 @@@ import org.apache.tinkerpop.gremlin.pro import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest; + import org.apache.tinkerpop.gremlin.process.traversal.step.map.PageRankTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest; + import org.apache.tinkerpop.gremlin.process.traversal.step.map.PeerPressureTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProjectTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.ReadTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest; import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;