TranslationStrategy (a test framework strategy) now verifies that the Bytecode submitted to the translator is equal to the bytecode of the generated/translated traversal. This was a nightmare to get everything working. We had so many little nick nack bugs. In particular, VertexProperty and Property GraphSON serialization needs to have their element() serialized or else you can't attach/argument. This is still a problem in Gryo and we will need to solve it for 3.3.0. In short, lots of test cases added, lots of tweaks to the various translators made, graphson.py updated significantly (though backwards compatible), etc. Crazy shiiiiiiiet.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/6aa6fc5a Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/6aa6fc5a Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/6aa6fc5a Branch: refs/heads/TINKERPOP-1520 Commit: 6aa6fc5adc47170e1c049bc47970bcaaf54b5ff2 Parents: 997e94f Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Wed Nov 16 16:08:19 2016 -0700 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Wed Nov 16 16:08:19 2016 -0700 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 6 ++ .../remote/traversal/step/map/RemoteStep.java | 8 +- .../gremlin/process/traversal/Bytecode.java | 4 +- .../finalization/MatchAlgorithmStrategy.java | 6 +- .../io/graphson/GraphSONSerializersV2d0.java | 98 +++++++++++++------- .../structure/io/graphson/GraphSONTokens.java | 1 + .../gremlin/structure/io/gryo/GryoMapper.java | 49 +++++++++- .../structure/io/gryo/GryoSerializers.java | 11 +-- .../gremlin/process/traversal/BytecodeTest.java | 4 +- .../ser/GraphSONMessageSerializerV2d0Test.java | 2 +- .../step/map/GroovyPropertiesTest.groovy | 6 ++ .../step/sideEffect/GroovySackTest.groovy | 8 +- .../gremlin/groovy/jsr223/GroovyTranslator.java | 18 +++- .../python/GraphTraversalSourceGenerator.groovy | 11 ++- .../gremlin/python/jsr223/PythonTranslator.java | 31 +++++-- .../gremlin_python/process/graph_traversal.py | 11 ++- .../jython/gremlin_python/process/strategies.py | 2 +- .../jython/gremlin_python/structure/graph.py | 11 ++- .../gremlin_python/structure/io/graphson.py | 65 ++++++++++--- .../driver/test_driver_remote_connection.py | 2 +- .../jython/tests/structure/io/test_graphson.py | 38 ++++++-- .../main/jython/tests/structure/test_graph.py | 12 ++- .../gremlin/python/jsr223/PythonProvider.java | 3 - .../RemoteGraphGroovyTranslatorProvider.java | 29 +++++- .../process/traversal/CoreTraversalTest.java | 32 +++++-- .../traversal/step/map/PropertiesTest.java | 16 ++++ .../traversal/step/sideEffect/SackTest.java | 8 +- .../decoration/TranslationStrategy.java | 16 +++- .../TinkerGraphGroovyTranslatorProvider.java | 4 - .../TinkerGraphJavaTranslatorProvider.java | 2 - .../TinkerGraphGraphSONTranslatorProvider.java | 6 -- .../gryo/TinkerGraphGryoTranslatorProvider.java | 8 +- 32 files changed, 393 insertions(+), 135 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 0613a39..c1f2a17 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,12 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Added support for `VertexProperty.element()` and `Property.element()` in GraphSON to enable attachment. +* Added `Vertex`, `Edge`, `VertexProperty`, and `Property` serializers to Gremlin-Python and exposed tests that use graph object arguments. +* `Bytecode.getSourceInstructions()` and `Bytecode.getStepInstructions()` now returns `List<Instruction>` instead of `Iterable<Instruction>`. +* Added various `TraversalStrategy` registrations with `GryoMapper`. +* Fixed a naming mistake in Gremlin-Python: `IdentityRemoveStrategy` is now called `IdentityRemovalStrategy`. +* Added `TranslationStrategy` test infrastructure that verifies `Bytecode` generated from a translation is equal to the original `Bytecode`. * Converted Spark process suite tests to "integration" tests. * Fixed a bug in `InlineFilterStrategy` having to do with folding `HasContainers` into `VertexStep`. * Deprecated `HasContainer.makeHasContainers()` which was used to dissect `AndP` and shouldn't be used at the TinkerPop-level. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java index 6b2be96..7db8e00 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java @@ -22,8 +22,10 @@ import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection; import org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException; import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraversal; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep; +import org.apache.tinkerpop.gremlin.process.traversal.util.BytecodeHelper; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.NoSuchElementException; @@ -36,6 +38,8 @@ import java.util.NoSuchElementException; */ public final class RemoteStep<S, E> extends AbstractStep<S, E> { + private static final boolean IS_TESTING = Boolean.valueOf(System.getProperty("is.testing", "false")); + private transient RemoteConnection remoteConnection; private RemoteTraversal<?, E> remoteTraversal; @@ -53,7 +57,9 @@ public final class RemoteStep<S, E> extends AbstractStep<S, E> { protected Traverser.Admin<E> processNextStart() throws NoSuchElementException { if (null == this.remoteTraversal) { try { - this.remoteTraversal = this.remoteConnection.submit(this.traversal.getBytecode()); + this.remoteTraversal = this.remoteConnection.submit(IS_TESTING ? BytecodeHelper.filterInstructions(this.traversal.getBytecode(), + instruction -> !(instruction.getOperator().equals(TraversalSource.Symbols.withStrategies) && + instruction.getArguments()[0].toString().contains("TranslationStrategy"))) : this.traversal.getBytecode()); this.traversal.setSideEffects(this.remoteTraversal.getSideEffects()); } catch (final RemoteConnectionException sce) { throw new IllegalStateException(sce); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java index da09362..d81028a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java @@ -94,7 +94,7 @@ public final class Bytecode implements Cloneable, Serializable { * * @return an iterable of instructions */ - public Iterable<Instruction> getSourceInstructions() { + public List<Instruction> getSourceInstructions() { return this.sourceInstructions; } @@ -103,7 +103,7 @@ public final class Bytecode implements Cloneable, Serializable { * * @return an iterable of instructions */ - public Iterable<Instruction> getStepInstructions() { + public List<Instruction> getStepInstructions() { return this.stepInstructions; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java index 06edc7e..a70e22a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java @@ -35,7 +35,11 @@ import java.util.Collections; public final class MatchAlgorithmStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy { private static final String MATCH_ALGORITHM = "matchAlgorithm"; - private final Class<? extends MatchStep.MatchAlgorithm> matchAlgorithmClass; + private Class<? extends MatchStep.MatchAlgorithm> matchAlgorithmClass; + + private MatchAlgorithmStrategy() { + // for serialization + } private MatchAlgorithmStrategy(final Class<? extends MatchStep.MatchAlgorithm> matchAlgorithmClass) { this.matchAlgorithmClass = matchAlgorithmClass; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV2d0.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV2d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV2d0.java index 31ca6a2..11d77a4 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV2d0.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV2d0.java @@ -35,6 +35,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.Comparators; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; @@ -54,6 +55,7 @@ import org.javatuples.Pair; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -175,8 +177,10 @@ class GraphSONSerializersV2d0 { public void serialize(final Property property, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); - jsonGenerator.writeObjectField(GraphSONTokens.KEY, property.key()); + jsonGenerator.writeStringField(GraphSONTokens.KEY, property.key()); jsonGenerator.writeObjectField(GraphSONTokens.VALUE, property.value()); + if (null != property.element()) + jsonGenerator.writeObjectField(GraphSONTokens.ELEMENT, DetachedFactory.detach(property.element(), false)); jsonGenerator.writeEndObject(); } } @@ -193,15 +197,17 @@ class GraphSONSerializersV2d0 { } @Override - public void serialize(final VertexProperty property, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) + public void serialize(final VertexProperty vertexProperty, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); - jsonGenerator.writeObjectField(GraphSONTokens.ID, property.id()); - jsonGenerator.writeObjectField(GraphSONTokens.VALUE, property.value()); + jsonGenerator.writeObjectField(GraphSONTokens.ID, vertexProperty.id()); + jsonGenerator.writeObjectField(GraphSONTokens.VALUE, vertexProperty.value()); + if (null != vertexProperty.element()) + jsonGenerator.writeObjectField(GraphSONTokens.VERTEX, DetachedFactory.detach(vertexProperty.element(), false)); if (includeLabel) - jsonGenerator.writeStringField(GraphSONTokens.LABEL, property.label()); - tryWriteMetaProperties(property, jsonGenerator, normalize); + jsonGenerator.writeStringField(GraphSONTokens.LABEL, vertexProperty.label()); + tryWriteMetaProperties(vertexProperty, jsonGenerator, normalize); jsonGenerator.writeEndObject(); } @@ -299,6 +305,7 @@ class GraphSONSerializersV2d0 { intermediate.put(GraphSONTokens.STRATEGY, pair.getValue0().toString()); intermediate.put(GraphSONTokens.CATEGORY, pair.getValue0().getTraversalCategory().getSimpleName()); intermediate.put(GraphSONTokens.TRAVERSAL, getStepsAsList(pair.getValue1())); + intermediate.put(GraphSONTokens.TRAVERSAL, getStepsAsList(pair.getValue1())); intermediates.add(intermediate); } m.put(GraphSONTokens.INTERMEDIATE, intermediates); @@ -427,8 +434,8 @@ class GraphSONSerializersV2d0 { public Vertex createObject(final Map<String, Object> vertexData) { return new DetachedVertex( vertexData.get(GraphSONTokens.ID), - vertexData.get(GraphSONTokens.LABEL).toString(), - (Map<String, Object>) vertexData.get(GraphSONTokens.PROPERTIES) + vertexData.getOrDefault(GraphSONTokens.LABEL, Vertex.DEFAULT_LABEL).toString(), + (Map<String, Object>) vertexData.getOrDefault(GraphSONTokens.PROPERTIES, Collections.emptyMap()) ); } } @@ -443,10 +450,10 @@ class GraphSONSerializersV2d0 { public Edge createObject(final Map<String, Object> edgeData) { return new DetachedEdge( edgeData.get(GraphSONTokens.ID), - edgeData.get(GraphSONTokens.LABEL).toString(), - (Map) edgeData.get(GraphSONTokens.PROPERTIES), - Pair.with(edgeData.get(GraphSONTokens.OUT), edgeData.get(GraphSONTokens.OUT_LABEL).toString()), - Pair.with(edgeData.get(GraphSONTokens.IN), edgeData.get(GraphSONTokens.IN_LABEL).toString()) + edgeData.getOrDefault(GraphSONTokens.LABEL, Edge.DEFAULT_LABEL).toString(), + (Map) edgeData.getOrDefault(GraphSONTokens.PROPERTIES, Collections.emptyMap()), + Pair.with(edgeData.get(GraphSONTokens.OUT), edgeData.getOrDefault(GraphSONTokens.OUT_LABEL, Vertex.DEFAULT_LABEL).toString()), + Pair.with(edgeData.get(GraphSONTokens.IN), edgeData.getOrDefault(GraphSONTokens.IN_LABEL, Vertex.DEFAULT_LABEL).toString()) ); } } @@ -459,9 +466,47 @@ class GraphSONSerializersV2d0 { @Override public Property createObject(final Map<String, Object> propData) { - return new DetachedProperty( - (String) propData.get(GraphSONTokens.KEY), - propData.get(GraphSONTokens.VALUE)); + return propData.containsKey(GraphSONTokens.ELEMENT) ? + new DetachedProperty((String) propData.get(GraphSONTokens.KEY), propData.get(GraphSONTokens.VALUE), getElement(propData.get(GraphSONTokens.ELEMENT))) : + new DetachedProperty((String) propData.get(GraphSONTokens.KEY), propData.get(GraphSONTokens.VALUE)); + } + + private Element getElement(final Object element) { + if (element instanceof Element) + return (Element) element; + else if (element instanceof Map) { + final Map<String, Object> map = (Map<String, Object>) element; + if (map.containsKey(GraphSONTokens.IN_LABEL)) + return new EdgeJacksonDeserializer().createObject(map); + else if (map.containsKey(GraphSONTokens.VALUE)) + return new VertexPropertyJacksonDeserializer().createObject(map); + else + return new VertexJacksonDeserializer().createObject(map); + } else + throw new IllegalArgumentException("Unknown element structure: " + element); + + } + } + + static class VertexPropertyJacksonDeserializer extends AbstractObjectDeserializer<VertexProperty> { + + protected VertexPropertyJacksonDeserializer() { + super(VertexProperty.class); + } + + @Override + public VertexProperty createObject(final Map<String, Object> propData) { + return propData.containsKey(GraphSONTokens.VERTEX) ? + new DetachedVertexProperty(propData.get(GraphSONTokens.ID), (String) propData.get(GraphSONTokens.LABEL), propData.get(GraphSONTokens.VALUE), (Map) propData.getOrDefault(GraphSONTokens.PROPERTIES, Collections.emptyMap()), getVertex(propData.get(GraphSONTokens.VERTEX))) : + new DetachedVertexProperty(propData.get(GraphSONTokens.ID), (String) propData.get(GraphSONTokens.LABEL), propData.get(GraphSONTokens.VALUE), (Map) propData.getOrDefault(GraphSONTokens.PROPERTIES, Collections.emptyMap())); + + } + + private Vertex getVertex(final Object vertex) { + if (vertex instanceof Vertex) + return (Vertex) vertex; + else + return new VertexJacksonDeserializer().createObject((Map<String, Object>) vertex); } } @@ -485,23 +530,6 @@ class GraphSONSerializersV2d0 { } } - static class VertexPropertyJacksonDeserializer extends AbstractObjectDeserializer<VertexProperty> { - - protected VertexPropertyJacksonDeserializer() { - super(VertexProperty.class); - } - - @Override - public VertexProperty createObject(final Map<String, Object> propData) { - return new DetachedVertexProperty( - propData.get(GraphSONTokens.ID), - (String) propData.get(GraphSONTokens.LABEL), - propData.get(GraphSONTokens.VALUE), - (Map) propData.get(GraphSONTokens.PROPERTIES) - ); - } - } - static class MetricsJacksonDeserializer extends AbstractObjectDeserializer<Metrics> { public MetricsJacksonDeserializer() { super(Metrics.class); @@ -509,16 +537,16 @@ class GraphSONSerializersV2d0 { @Override public Metrics createObject(final Map<String, Object> metricsData) { - final MutableMetrics m = new MutableMetrics((String)metricsData.get(GraphSONTokens.ID), (String)metricsData.get(GraphSONTokens.NAME)); + final MutableMetrics m = new MutableMetrics((String) metricsData.get(GraphSONTokens.ID), (String) metricsData.get(GraphSONTokens.NAME)); m.setDuration(Math.round((Double) metricsData.get(GraphSONTokens.DURATION) * 1000000), TimeUnit.NANOSECONDS); - for (Map.Entry<String, Long> count : ((Map<String, Long>)metricsData.getOrDefault(GraphSONTokens.COUNTS, new HashMap<>(0))).entrySet()) { + for (Map.Entry<String, Long> count : ((Map<String, Long>) metricsData.getOrDefault(GraphSONTokens.COUNTS, new HashMap<>(0))).entrySet()) { m.setCount(count.getKey(), count.getValue()); } for (Map.Entry<String, Long> count : ((Map<String, Long>) metricsData.getOrDefault(GraphSONTokens.ANNOTATIONS, new HashMap<>(0))).entrySet()) { m.setAnnotation(count.getKey(), count.getValue()); } - for (MutableMetrics nested : (List<MutableMetrics>)metricsData.getOrDefault(GraphSONTokens.METRICS, new ArrayList<>(0))) { + for (MutableMetrics nested : (List<MutableMetrics>) metricsData.getOrDefault(GraphSONTokens.METRICS, new ArrayList<>(0))) { m.addNested(nested); } return m; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java index 9f0648a..4f804ad 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java @@ -38,6 +38,7 @@ public final class GraphSONTokens { public static final String EDGES = "edges"; public static final String VERTEX = "vertex"; public static final String VERTICES = "vertices"; + public static final String ELEMENT = "element"; public static final String IN = "inV"; public static final String OUT = "outV"; public static final String IN_E = "inE"; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java index fef7288..0c8f27e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java @@ -21,6 +21,8 @@ package org.apache.tinkerpop.gremlin.structure.io.gryo; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.tinkerpop.gremlin.process.computer.GraphFilter; import org.apache.tinkerpop.gremlin.process.computer.MapReduce; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy; import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory; import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; @@ -38,12 +40,32 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.MatchAlgorithmStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.InlineFilterStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.LazyBarrierStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchPredicateStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.OrderLimitStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathProcessorStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.LambdaRestrictionStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser; @@ -350,9 +372,34 @@ public final class GryoMapper implements Mapper<Kryo> { add(GryoTypeReg.of(Column.class, 132)); add(GryoTypeReg.of(Pop.class, 133)); add(GryoTypeReg.of(SackFunctions.Barrier.class, 135)); - add(GryoTypeReg.of(TraversalOptionParent.Pick.class, 137)); // ***LAST ID*** + add(GryoTypeReg.of(TraversalOptionParent.Pick.class, 137)); add(GryoTypeReg.of(HashSetSupplier.class, 136, new UtilSerializers.HashSetSupplierSerializer())); + add(GryoTypeReg.of(ConnectiveStrategy.class, 138)); + add(GryoTypeReg.of(HaltedTraverserStrategy.class, 139)); + add(GryoTypeReg.of(PartitionStrategy.class, 140, new JavaSerializer())); + add(GryoTypeReg.of(SubgraphStrategy.class, 141, new JavaSerializer())); + add(GryoTypeReg.of(VertexProgramStrategy.class, 142, new JavaSerializer())); + add(GryoTypeReg.of(MatchAlgorithmStrategy.class, 143)); + add(GryoTypeReg.of(MatchStep.GreedyMatchAlgorithm.class, 144)); + add(GryoTypeReg.of(AdjacentToIncidentStrategy.class, 145)); + add(GryoTypeReg.of(FilterRankingStrategy.class, 146)); + add(GryoTypeReg.of(IdentityRemovalStrategy.class, 147)); + add(GryoTypeReg.of(IncidentToAdjacentStrategy.class, 148)); + add(GryoTypeReg.of(InlineFilterStrategy.class, 149)); + add(GryoTypeReg.of(LazyBarrierStrategy.class, 150)); + add(GryoTypeReg.of(MatchPredicateStrategy.class, 151)); + add(GryoTypeReg.of(OrderLimitStrategy.class, 152)); + add(GryoTypeReg.of(PathProcessorStrategy.class, 153)); + add(GryoTypeReg.of(PathRetractionStrategy.class, 154)); + add(GryoTypeReg.of(RangeByIsCountStrategy.class, 155)); + add(GryoTypeReg.of(RepeatUnrollStrategy.class, 156)); + add(GryoTypeReg.of(GraphFilterStrategy.class, 157)); + add(GryoTypeReg.of(LambdaRestrictionStrategy.class, 158)); + add(GryoTypeReg.of(ReadOnlyStrategy.class, 159)); + add(GryoTypeReg.of(MatchStep.CountMatchAlgorithm.class, 160)); // ### LAST_ID + + add(GryoTypeReg.of(TraverserSet.class, 58)); add(GryoTypeReg.of(Tree.class, 61)); add(GryoTypeReg.of(HashSet.class, 62)); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoSerializers.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoSerializers.java index dbe85ca..95d706f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoSerializers.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoSerializers.java @@ -23,13 +23,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; -import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; -import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim; @@ -41,7 +39,6 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; import org.apache.tinkerpop.gremlin.util.function.Lambda; -import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import java.util.ArrayList; import java.util.Collection; @@ -136,12 +133,8 @@ public final class GryoSerializers { public final static class BytecodeSerializer implements SerializerShim<Bytecode> { @Override public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final Bytecode bytecode) { - final List<Bytecode.Instruction> sourceInstructions = IteratorUtils.list( - IteratorUtils.filter(bytecode.getSourceInstructions().iterator(), - i -> !i.getOperator().equals("withStrategies") && !i.getOperator().equals("withComputer"))); - writeInstructions(kryo, output, sourceInstructions); - final List<Bytecode.Instruction> stepInstructions = IteratorUtils.list(bytecode.getStepInstructions().iterator()); - writeInstructions(kryo, output, stepInstructions); + writeInstructions(kryo, output, bytecode.getSourceInstructions()); + writeInstructions(kryo, output, bytecode.getStepInstructions()); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java index 1b655ca..a34778f 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java @@ -102,7 +102,7 @@ public class BytecodeTest { public void shouldConvertStrategies() { final GraphTraversalSource g = EmptyGraph.instance().traversal(); Bytecode bytecode = g.withStrategies(ReadOnlyStrategy.instance()).getBytecode(); - assertEquals(ReadOnlyStrategy.instance(), bytecode.getSourceInstructions().iterator().next().getArguments()[0]); + assertEquals(ReadOnlyStrategy.instance(), bytecode.getSourceInstructions().get(0).getArguments()[0]); bytecode = g.withStrategies(SubgraphStrategy.build().edges(__.hasLabel("knows")).create()).getBytecode(); assertEquals(SubgraphStrategy.build().edges(__.hasLabel("knows")).create().getEdgeCriterion().asAdmin().getBytecode(), ((SubgraphStrategy) bytecode.getSourceInstructions().iterator().next().getArguments()[0]).getEdgeCriterion().asAdmin().getBytecode()); @@ -112,7 +112,7 @@ public class BytecodeTest { public void shouldConvertComputer() { final GraphTraversalSource g = EmptyGraph.instance().traversal(); Bytecode bytecode = g.withComputer(Computer.compute().workers(10)).getBytecode(); - assertEquals(VertexProgramStrategy.build().create(), bytecode.getSourceInstructions().iterator().next().getArguments()[0]); + assertEquals(VertexProgramStrategy.build().create(), bytecode.getSourceInstructions().get(0).getArguments()[0]); assertEquals(VertexProgramStrategy.build().workers(10).create().getConfiguration().getInt(VertexProgramStrategy.WORKERS), ((VertexProgramStrategy) bytecode.getSourceInstructions().iterator().next().getArguments()[0]).getConfiguration().getInt(VertexProgramStrategy.WORKERS)); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java ---------------------------------------------------------------------- diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java index d3dbecc..2c824a5 100644 --- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java +++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java @@ -316,7 +316,7 @@ public class GraphSONMessageSerializerV2d0Test { assertEquals(1, friendProperties.size()); final JsonNode friendsProperty = friendProperties.get(0).get(GraphSONTokens.VALUEPROP); assertNotNull(friendsProperty); - assertEquals(3, friendsProperty.size()); + assertEquals(4, friendsProperty.size()); final String object1 = friendsProperty.get(GraphSONTokens.VALUE).get(0).asText(); assertEquals("x", object1); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy ---------------------------------------------------------------------- diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy index eb161d7..c74e823 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy @@ -49,6 +49,12 @@ public abstract class GroovyPropertiesTest { public Traversal<Vertex, VertexProperty<String>> get_g_V_hasXageX_propertiesXnameX() { new ScriptTraversal<>(g, "gremlin-groovy", "g.V.has('age').properties('name')") } + + @Override + public Traversal<VertexProperty<String>, String> get_g_injectXg_VX1X_propertiesXnameX_nextX_value( + final Object v1Id) { + new ScriptTraversal<>(g, "gremlin-groovy", "g.inject(g.V(v1Id).properties('name').next()).value()", "v1Id", v1Id) + } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy ---------------------------------------------------------------------- diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy index 9df18ad..a478f6f 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy @@ -36,22 +36,22 @@ public abstract class GroovySackTest { @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0f).V.outE.sack(sum).by('weight').inV.sack.sum()") + new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0d).V.outE.sack(sum).by('weight').inV.sack.sum()") } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0f).V.repeat(__.outE.sack(sum).by('weight').inV).times(2).sack()") + new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0d).V.repeat(__.outE.sack(sum).by('weight').inV).times(2).sack()") } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0f).V().outE.sack(sum, 'weight').inV.sack.sum()") + new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0d).V().outE.sack(sum, 'weight').inV.sack.sum()") } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0f).V.repeat(__.outE.sack(sum, 'weight').inV).times(2).sack") + new ScriptTraversal<>(g, "gremlin-groovy", "g.withSack(0.0d).V.repeat(__.outE.sack(sum, 'weight').inV).times(2).sack") } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java index d102037..a92d920 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java @@ -31,7 +31,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.function.Lambda; @@ -156,9 +158,19 @@ public final class GroovyTranslator implements Translator.ScriptTranslator { return "TraversalOptionParent.Pick." + object.toString(); else if (object instanceof Enum) return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString(); - else if (object instanceof Element) - return convertToString(((Element) object).id()); // hack - else if (object instanceof Lambda) { + else if (object instanceof Element) { + final String id = convertToString(((Element) object).id()); + String temp = this.traversalSource.equals("__") ? "g" : this.traversalSource; + if (object instanceof Vertex) + temp = temp + ".V(" + id + ").next()"; + else if (object instanceof Edge) + temp = temp + ".E(" + id + ").next()"; + else { + final VertexProperty vertexProperty = (VertexProperty) object; + temp = temp + ".V(" + convertToString(vertexProperty.element().id()) + ").properties(" + convertToString(vertexProperty.key()) + ").hasId(" + id + ").next()"; + } + return temp; + } else if (object instanceof Lambda) { final String lambdaString = ((Lambda) object).getLambdaScript().trim(); return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}"; } else if (object instanceof TraversalStrategyProxy) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy index ed377bd..1470757 100644 --- a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy +++ b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy @@ -131,11 +131,16 @@ under the License. Traversal.__init__(self, graph, traversal_strategies, bytecode) def __getitem__(self, index): if isinstance(index, int): - return self.range(long(index), long(index + 1)) + return self.range(long(index),long(index)+1) elif isinstance(index, slice): - return self.range(long(0) if index.start is None else long(index.start), long(sys.maxsize) if index.stop is None else long(index.stop)) + low = long(0) if index.start is None else long(index.start) + high = long(sys.maxsize) if index.stop is None else long(index.stop) + if low == long(0): + return self.limit(high) + else: + return self.range(low,high) else: - raise TypeError("Index must be int or slice") + raise TypeError("Index must be an int or slice") def __getattr__(self, key): return self.values(key) """) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java index 0739c92..71e610f 100644 --- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java +++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java @@ -33,8 +33,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.function.Lambda; @@ -113,9 +115,12 @@ public class PythonTranslator implements Translator.ScriptTranslator { continue; else if (0 == arguments.length) traversalScript.append(".").append(SymbolHelper.toPython(methodName)).append("()"); - else if (methodName.equals("range") && 2 == arguments.length) - traversalScript.append("[").append(arguments[0]).append(":").append(arguments[1]).append("]"); - else if (methodName.equals("limit") && 1 == arguments.length) + else if (methodName.equals("range") && 2 == arguments.length && ((Number) arguments[0]).intValue() != 0) { + if (((Number) arguments[0]).longValue() + 1 == ((Number) arguments[1]).longValue()) + traversalScript.append("[").append(arguments[0]).append("]"); + else + traversalScript.append("[").append(arguments[0]).append(":").append(arguments[1]).append("]"); + } else if (methodName.equals("limit") && 1 == arguments.length) traversalScript.append("[0:").append(arguments[0]).append("]"); else if (methodName.equals("values") && 1 == arguments.length && traversalScript.length() > 3 && !STEP_NAMES.contains(arguments[0].toString())) traversalScript.append(".").append(arguments[0]); @@ -136,7 +141,7 @@ public class PythonTranslator implements Translator.ScriptTranslator { return traversalScript.toString(); } - private String convertToString(final Object object) { + protected String convertToString(final Object object) { if (object instanceof Bytecode.Binding) return ((Bytecode.Binding) object).variable(); else if (object instanceof Bytecode) @@ -190,9 +195,21 @@ public class PythonTranslator implements Translator.ScriptTranslator { return convertStatic(((Enum) object).getDeclaringClass().getSimpleName() + ".") + SymbolHelper.toPython(object.toString()); else if (object instanceof P) return convertPToString((P) object, new StringBuilder()).toString(); - else if (object instanceof Element) - return convertToString(((Element) object).id()); // hack - else if (object instanceof Lambda) + else if (object instanceof Element) { + final String id = convertToString(((Element) object).id()); + if (object instanceof Vertex) + return "Vertex(" + id + "," + convertToString(((Vertex) object).label()) + ")"; + else if (object instanceof Edge) { + final Edge edge = (Edge) object; + return "Edge(" + id + "," + + convertToString(edge.outVertex()) + "," + + convertToString(edge.label()) + "," + + convertToString(edge.inVertex()) + ")"; + } else { + final VertexProperty vertexProperty = (VertexProperty) object; + return "VertexProperty(" + id + "," + convertToString(vertexProperty.label()) + "," + convertToString(vertexProperty.value()) + "," + convertToString(vertexProperty.element()) + ")"; + } + } else if (object instanceof Lambda) return convertLambdaToString((Lambda) object); else return null == object ? "None" : object.toString(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py index 6165ed3..9f9a31b 100644 --- a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py +++ b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py @@ -89,11 +89,16 @@ class GraphTraversal(Traversal): Traversal.__init__(self, graph, traversal_strategies, bytecode) def __getitem__(self, index): if isinstance(index, int): - return self.range(long(index), long(index + 1)) + return self.range(long(index),long(index)+1) elif isinstance(index, slice): - return self.range(long(0) if index.start is None else long(index.start), long(sys.maxsize) if index.stop is None else long(index.stop)) + low = long(0) if index.start is None else long(index.start) + high = long(sys.maxsize) if index.stop is None else long(index.stop) + if low == long(0): + return self.limit(high) + else: + return self.range(low,high) else: - raise TypeError("Index must be int or slice") + raise TypeError("Index must be an int or slice") def __getattr__(self, key): return self.values(key) def V(self, *args): http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/gremlin_python/process/strategies.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/process/strategies.py b/gremlin-python/src/main/jython/gremlin_python/process/strategies.py index 4d4cbda..8eb7fbd 100644 --- a/gremlin-python/src/main/jython/gremlin_python/process/strategies.py +++ b/gremlin-python/src/main/jython/gremlin_python/process/strategies.py @@ -114,7 +114,7 @@ class FilterRankingStrategy(TraversalStrategy): TraversalStrategy.__init__(self) -class IdentityRemoveStrategy(TraversalStrategy): +class IdentityRemovalStrategy(TraversalStrategy): def __init__(self): TraversalStrategy.__init__(self) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/gremlin_python/structure/graph.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/graph.py b/gremlin-python/src/main/jython/gremlin_python/structure/graph.py index d77cde1..c917213 100644 --- a/gremlin-python/src/main/jython/gremlin_python/structure/graph.py +++ b/gremlin-python/src/main/jython/gremlin_python/structure/graph.py @@ -66,25 +66,30 @@ class Edge(Element): class VertexProperty(Element): - def __init__(self, id, label, value): + def __init__(self, id, label, value, vertex): Element.__init__(self, id, label) self.value = value self.key = self.label + self.vertex = vertex def __repr__(self): return "vp[" + str(self.label) + "->" + str(self.value)[0:20] + "]" class Property(object): - def __init__(self, key, value): + def __init__(self, key, value, element): self.key = key self.value = value + self.element = element def __repr__(self): return "p[" + str(self.key) + "->" + str(self.value)[0:20] + "]" def __eq__(self, other): - return isinstance(other, self.__class__) and self.key == other.key and self.value == other.value + return isinstance(other, self.__class__) and \ + self.key == other.key and \ + self.value == other.value and \ + self.element == other.element def __hash__(self): return hash(self.key) + hash(self.value) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py index d516058..85dc726 100644 --- a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py +++ b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphson.py @@ -25,7 +25,6 @@ from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, T from gremlin_python.process.traversal import Binding, Bytecode, P, Traversal, Traverser, TraversalStrategy from gremlin_python.structure.graph import Edge, Property, Vertex, VertexProperty, Path - _serializers = {} _deserializers = {} @@ -56,9 +55,9 @@ class GraphSONUtil(object): def formatType(cls, prefix, type_name): return "%s:%s" % (prefix, type_name) + # Read/Write classes split to follow precedence of the Java API class GraphSONWriter(object): - def __init__(self, serializer_map=None): """ :param serializer_map: map from Python type to serializer instance implementing `dictify` @@ -88,7 +87,6 @@ class GraphSONWriter(object): class GraphSONReader(object): - def __init__(self, deserializer_map=None): """ :param deserializer_map: map from GraphSON type tag to deserializer instance implementing `objectify` @@ -139,7 +137,6 @@ class _GraphSONTypeIO(object): class _BytecodeSerializer(_GraphSONTypeIO): - @classmethod def _dictify_instructions(cls, instructions, writer): out = [] @@ -169,6 +166,51 @@ class BytecodeSerializer(_BytecodeSerializer): python_type = Bytecode +class VertexSerializer(_GraphSONTypeIO): + python_type = Vertex + graphson_type = "g:Vertex" + + @classmethod + def dictify(cls, vertex, writer): + return GraphSONUtil.typedValue("Vertex", {"id": writer.toDict(vertex.id), + "label": writer.toDict(vertex.label)}) + + +class EdgeSerializer(_GraphSONTypeIO): + python_type = Edge + graphson_type = "g:Edge" + + @classmethod + def dictify(cls, edge, writer): + return GraphSONUtil.typedValue("Edge", {"id": writer.toDict(edge.id), + "outV": writer.toDict(edge.outV), + "label": writer.toDict(edge.label), + "inV": writer.toDict(edge.inV)}) + + +class VertexPropertySerializer(_GraphSONTypeIO): + python_type = VertexProperty + graphson_type = "g:VertexProperty" + + @classmethod + def dictify(cls, vertex_property, writer): + return GraphSONUtil.typedValue("VertexProperty", {"id": writer.toDict(vertex_property.id), + "label": writer.toDict(vertex_property.label), + "value": writer.toDict(vertex_property.value), + "vertex": writer.toDict(vertex_property.vertex)}) + + +class PropertySerializer(_GraphSONTypeIO): + python_type = Property + graphson_type = "g:Property" + + @classmethod + def dictify(cls, property, writer): + return GraphSONUtil.typedValue("Property", {"key": writer.toDict(property.key), + "value": writer.toDict(property.value), + "element": writer.toDict(property.element)}) + + class TraversalStrategySerializer(_GraphSONTypeIO): python_type = TraversalStrategy @@ -208,7 +250,7 @@ class PSerializer(_GraphSONTypeIO): def dictify(cls, p, writer): out = {"predicate": p.operator, "value": [writer.toDict(p.value), writer.toDict(p.other)] if p.other is not None else - writer.toDict(p.value)} + writer.toDict(p.value)} return GraphSONUtil.typedValue("P", out) @@ -251,7 +293,6 @@ class TypeSerializer(_GraphSONTypeIO): class _NumberIO(_GraphSONTypeIO): - @classmethod def dictify(cls, n, writer): if isinstance(n, bool): # because isinstance(False, int) and isinstance(True, int) @@ -291,7 +332,7 @@ class VertexDeserializer(_GraphSONTypeIO): @classmethod def objectify(cls, d, reader): - return Vertex(reader.toObject(d["id"]), d.get("label", "")) + return Vertex(reader.toObject(d["id"]), d.get("label", "vertex")) class EdgeDeserializer(_GraphSONTypeIO): @@ -301,7 +342,7 @@ class EdgeDeserializer(_GraphSONTypeIO): def objectify(cls, d, reader): return Edge(reader.toObject(d["id"]), Vertex(reader.toObject(d["outV"]), ""), - d.get("label", "vertex"), + d.get("label", "edge"), Vertex(reader.toObject(d["inV"]), "")) @@ -310,8 +351,10 @@ class VertexPropertyDeserializer(_GraphSONTypeIO): @classmethod def objectify(cls, d, reader): - return VertexProperty(reader.toObject(d["id"]), d["label"], - reader.toObject(d["value"])) + return VertexProperty(reader.toObject(d["id"]), + d["label"], + reader.toObject(d["value"]), + reader.toObject(d["vertex"])) class PropertyDeserializer(_GraphSONTypeIO): @@ -319,7 +362,7 @@ class PropertyDeserializer(_GraphSONTypeIO): @classmethod def objectify(cls, d, reader): - return Property(d["key"], reader.toObject(d["value"])) + return Property(d["key"], reader.toObject(d["value"]), reader.toObject(d["element"])) class PathDeserializer(_GraphSONTypeIO): http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py index 9f3e466..5039aaf 100644 --- a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py +++ b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py @@ -56,7 +56,7 @@ class TestDriverRemoteConnection(TestCase): assert "ripple" in results # assert 10 == g.V().repeat(both()).times(5)[0:10].count().next() - assert 1 == g.V().repeat(both()).times(5)[0].count().next() + assert 1 == g.V().repeat(both()).times(5)[0:1].count().next() assert 0 == g.V().repeat(both()).times(5)[0:0].count().next() assert 4 == g.V()[2:].count().next() assert 2 == g.V()[:2].count().next() http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py b/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py index f0e8130..5fc797e 100644 --- a/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py +++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphson.py @@ -27,7 +27,7 @@ from unittest import TestCase import six from gremlin_python.statics import * -from gremlin_python.structure.graph import Vertex +from gremlin_python.structure.graph import Vertex, Edge, Property, VertexProperty from gremlin_python.structure.graph import Path from gremlin_python.structure.io.graphson import GraphSONWriter, GraphSONReader, GraphSONUtil import gremlin_python.structure.io.graphson @@ -125,13 +125,12 @@ class TestGraphSONReader(TestCase): class TestGraphSONWriter(TestCase): - graphson_writer = GraphSONWriter() def test_number_output(self): - assert {"@type":"g:Int64","@value":2} == json.loads(self.graphson_writer.writeObject(long(2))) - assert {"@type":"g:Int32","@value":1} == json.loads(self.graphson_writer.writeObject(1)) - assert {"@type":"g:Double","@value":3.2} == json.loads(self.graphson_writer.writeObject(3.2)) + assert {"@type": "g:Int64", "@value": 2} == json.loads(self.graphson_writer.writeObject(long(2))) + assert {"@type": "g:Int32", "@value": 1} == json.loads(self.graphson_writer.writeObject(1)) + assert {"@type": "g:Double", "@value": 3.2} == json.loads(self.graphson_writer.writeObject(3.2)) assert """true""" == self.graphson_writer.writeObject(True) def test_numbers(self): @@ -146,13 +145,38 @@ class TestGraphSONWriter(TestCase): def test_strategies(self): # we have a proxy model for now given that we don't want to have to have g:XXX all registered on the Gremlin traversal machine (yet) - assert {"@type": "g:SubgraphStrategy", "@value": {}} == json.loads(self.graphson_writer.writeObject(SubgraphStrategy)) + assert {"@type": "g:SubgraphStrategy", "@value": {}} == json.loads( + self.graphson_writer.writeObject(SubgraphStrategy)) assert {"@type": "g:SubgraphStrategy", "@value": { "vertices": {"@type": "g:Bytecode", "@value": {"step": [["has", "name", "marko"]]}}}} == json.loads( self.graphson_writer.writeObject(SubgraphStrategy(vertices=__.has("name", "marko")))) - def test_custom_mapping(self): + def test_graph(self): + assert {"@type": "g:Vertex", + "@value": {"id": {"@type": "g:Int64", "@value": 12}, "label": "person"}} == json.loads( + self.graphson_writer.writeObject(Vertex(12l, "person"))) + assert {"@type": "g:Edge", "@value": {"id": {"@type": "g:Int32", "@value": 7}, + "outV": {"@type": "g:Vertex", + "@value": {"id": { + "@type": "g:Int32", + "@value": 0}, "label": "vertex"}}, + "label": "knows", + "inV": {"@type": "g:Vertex", "@value": { + "id": {"@type": "g:Int32", "@value": 1}, + "label": "vertex"}}}} == json.loads( + self.graphson_writer.writeObject(Edge(7, Vertex(0), "knows", Vertex(1)))) + assert {"@type": "g:VertexProperty", "@value": {"id": "blah", "label": "keyA", "value": True, + "vertex": {"@type": "g:Vertex", + "@value": {"id": "stephen", + "label": "vertex"}}}} == json.loads( + self.graphson_writer.writeObject(VertexProperty("blah", "keyA", True, Vertex("stephen")))) + assert {"@type": "g:Property", "@value": {"key": "name", "value": "marko", "element": {"@type": "g:Vertex", + "@value": { + "id": "bob", + "label": "guy"}}}} == json.loads( + self.graphson_writer.writeObject(Property("name", "marko", Vertex("bob", "guy")))) + def test_custom_mapping(self): # extended mapping class X(object): pass http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/main/jython/tests/structure/test_graph.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/structure/test_graph.py b/gremlin-python/src/main/jython/tests/structure/test_graph.py index c619ad2..e055b93 100644 --- a/gremlin-python/src/main/jython/tests/structure/test_graph.py +++ b/gremlin-python/src/main/jython/tests/structure/test_graph.py @@ -48,23 +48,25 @@ class TestGraph(TestCase): assert "phrase" == edge.inV.label assert edge.inV != edge.outV # - vertex_property = VertexProperty(long(24), "name", "marko") + vertex_property = VertexProperty(long(24), "name", "marko", Vertex(1)) assert "vp[name->marko]" == str(vertex_property) assert "name" == vertex_property.label assert "name" == vertex_property.key assert "marko" == vertex_property.value assert long(24) == vertex_property.id + assert Vertex(1) == vertex_property.vertex assert isinstance(vertex_property.id, long) - assert vertex_property == VertexProperty(long(24), "name", "marko") + assert vertex_property == VertexProperty(long(24), "name", "marko", Vertex(1)) # - property = Property("age", 29) + property = Property("age", 29, Vertex(1)) assert "p[age->29]" == str(property) assert "age" == property.key assert 29 == property.value + assert Vertex(1) == property.element assert isinstance(property.value, int) - assert property == Property("age", 29) + assert property == Property("age", 29, Vertex(1)) if not six.PY3: - assert property != Property("age", long(29)) + assert property != Property("age", long(29), Vertex(1)) # for i in [vertex, edge, vertex_property, property]: for j in [vertex, edge, vertex_property, property]: http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java ---------------------------------------------------------------------- diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java index fe04156..6d9b8d5 100644 --- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java +++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonProvider.java @@ -66,10 +66,7 @@ public class PythonProvider extends AbstractGraphProvider { private static Set<String> SKIP_TESTS = new HashSet<>(Arrays.asList( "testProfileStrategyCallback", "testProfileStrategyCallbackSideEffect", - "g_withSideEffectXa_setX_V_both_name_storeXaX_capXaX", "g_VX1X_out_injectXv2X_name", - "shouldNeverPropagateANoBulkTraverser", - "shouldNeverPropagateANullValuedTraverser", "shouldHidePartitionKeyForValues", "g_withSackXBigInteger_TEN_powX1000X_assignX_V_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack", // http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java index e170cb1..7f4d58e 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/groovy/jsr223/RemoteGraphGroovyTranslatorProvider.java @@ -19,19 +19,44 @@ package org.apache.tinkerpop.gremlin.groovy.jsr223; +import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.driver.remote.RemoteGraphProvider; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategy; import org.apache.tinkerpop.gremlin.structure.Graph; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class RemoteGraphGroovyTranslatorProvider extends RemoteGraphProvider { + private static boolean SKIP = false; + + private static Set<String> SKIP_TESTS = new HashSet<>(Arrays.asList( + "g_injectXg_VX1X_propertiesXnameX_nextX_value")); + + + @Override + public Map<String, Object> getBaseConfiguration(final String graphName, final Class<?> test, final String testMethodName, + final LoadGraphWith.GraphData loadGraphWith) { + + final Map<String, Object> config = super.getBaseConfiguration(graphName, test, testMethodName, loadGraphWith); + SKIP = SKIP_TESTS.contains(testMethodName) || SKIP_TESTS.contains(test.getCanonicalName()); + return config; + } + @Override public GraphTraversalSource traversal(final Graph graph) { - final GraphTraversalSource g = graph.traversal(); - return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g"))); + if (SKIP) + return graph.traversal(); + else { + final GraphTraversalSource g = graph.traversal(); + return g.withStrategies(new TranslationStrategy(g, GroovyTranslator.of("g"))); + } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java index 68f8217..cefbf39 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java @@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException; import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -43,9 +44,14 @@ import java.util.Set; import java.util.stream.Collectors; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inject; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out; import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -62,17 +68,25 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest { @Test @LoadGraphWith public void shouldNeverPropagateANoBulkTraverser() { - assertFalse(g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).hasNext()); - assertEquals(0, g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).toList().size()); - g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).sideEffect(t -> fail("this should not have happened")).iterate(); + try { + assertFalse(g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).hasNext()); + assertEquals(0, g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).toList().size()); + g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).sideEffect(t -> fail("this should not have happened")).iterate(); + } catch (VerificationException e) { + // its okay if lambdas can't be serialized by the test suite + } } @Test @LoadGraphWith public void shouldNeverPropagateANullValuedTraverser() { - assertFalse(g.V().map(t -> null).hasNext()); - assertEquals(0, g.V().map(t -> null).toList().size()); - g.V().map(t -> null).sideEffect(t -> fail("this should not have happened")).iterate(); + try { + assertFalse(g.V().map(t -> null).hasNext()); + assertEquals(0, g.V().map(t -> null).toList().size()); + g.V().map(t -> null).sideEffect(t -> fail("this should not have happened")).iterate(); + } catch (VerificationException e) { + // its okay if lambdas can't be serialized by the test suite + } } @Test @@ -298,7 +312,7 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest { GraphTraversal.Admin<Object, Object> nestedTraversalAdmin = nestedTraversal.asAdmin(); nestedTraversalAdmin.reset(); - nestedTraversalAdmin.addStart(nestedTraversalAdmin.getTraverserGenerator().generate(g.V().has("name", "marko").next(), (Step)traversal.asAdmin().getStartStep(), 1l)); + nestedTraversalAdmin.addStart(nestedTraversalAdmin.getTraverserGenerator().generate(g.V().has("name", "marko").next(), (Step) traversal.asAdmin().getStartStep(), 1l)); try { nestedTraversal.next(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java index b5b4310..2b665dc 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java @@ -22,6 +22,7 @@ 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.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; @@ -51,6 +52,8 @@ public abstract class PropertiesTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, VertexProperty<String>> get_g_V_hasXageX_propertiesXnameX(); + public abstract Traversal<VertexProperty<String>, String> get_g_injectXg_VX1X_propertiesXnameX_nextX_value(final Object v1Id); + @Test @LoadGraphWith(MODERN) public void g_V_hasXageX_propertiesXname_ageX_value() { @@ -118,6 +121,14 @@ public abstract class PropertiesTest extends AbstractGremlinProcessTest { assertEquals(4, ids.size()); } + @Test + @LoadGraphWith(MODERN) + public void g_injectXg_VX1X_propertiesXnameX_nextX_value() { + final Traversal<VertexProperty<String>, String> traversal = get_g_injectXg_VX1X_propertiesXnameX_nextX_value(convertToVertexId(graph, "marko")); + printTraversalForm(traversal); + checkResults(Collections.singletonList("marko"), traversal); + } + public static class Traversals extends PropertiesTest { @Override public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() { @@ -138,6 +149,11 @@ public abstract class PropertiesTest extends AbstractGremlinProcessTest { public Traversal<Vertex, VertexProperty<String>> get_g_V_hasXageX_propertiesXnameX() { return (Traversal<Vertex, VertexProperty<String>>) g.V().has("age").<String>properties("name"); } + + @Override + public Traversal<VertexProperty<String>, String> get_g_injectXg_VX1X_propertiesXnameX_nextX_value(final Object v1Id) { + return g.<VertexProperty<String>>inject((VertexProperty) g.V(v1Id).properties("name").next()).value(); + } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java index 678cdb3..07cc143 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java @@ -177,22 +177,22 @@ public abstract class SackTest extends AbstractGremlinProcessTest { @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() { - return g.withSack(0.0f).V().outE().sack(sum).by("weight").inV().sack().sum(); + return g.withSack(0.0d).V().outE().sack(sum).by("weight").inV().sack().sum(); } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack() { - return g.withSack(0.0f).V().repeat(outE().sack(sum).by("weight").inV()).times(2).sack(); + return g.withSack(0.0d).V().repeat(outE().sack(sum).by("weight").inV()).times(2).sack(); } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum() { - return g.withSack(0.0f).V().outE().sack(sum, "weight").inV().sack().sum(); + return g.withSack(0.0d).V().outE().sack(sum, "weight").inV().sack().sum(); } @Override public Traversal<Vertex, Double> get_g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() { - return g.withSack(0.0f).V().repeat(outE().sack(sum, "weight").inV()).times(2).sack(); + return g.withSack(0.0d).V().repeat(outE().sack(sum, "weight").inV()).times(2).sack(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java index c3aa9e0..cf93acf 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java @@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException; +import org.apache.tinkerpop.gremlin.process.traversal.util.BytecodeHelper; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import javax.script.Bindings; @@ -41,6 +42,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import static org.junit.Assert.assertEquals; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -48,6 +51,7 @@ public final class TranslationStrategy extends AbstractTraversalStrategy<Travers private final TraversalSource traversalSource; private final Translator translator; + private final boolean IS_TESTING = Boolean.valueOf(System.getProperty("is.testing", "false")); private static final Set<Class<? extends DecorationStrategy>> POSTS = new HashSet<>(Arrays.asList( ConnectiveStrategy.class, @@ -73,7 +77,7 @@ public final class TranslationStrategy extends AbstractTraversalStrategy<Travers return; // verifications to ensure unsupported steps do not exist in the traversal - if (Boolean.valueOf(System.getProperty("is.testing", "false"))) { + if (IS_TESTING) { if (traversal.getBytecode().toString().contains("$") || traversal.getBytecode().toString().contains("HashSetSupplier")) throw new VerificationException("Test suite does not support lambdas", traversal); if (TraversalHelper.hasStepOfAssignableClassRecursively(ProgramVertexProgramStep.class, traversal)) @@ -81,7 +85,7 @@ public final class TranslationStrategy extends AbstractTraversalStrategy<Travers } final Traversal.Admin<?, ?> translatedTraversal; - final Bytecode bytecode = Boolean.valueOf(System.getProperty("is.testing", "false")) ? + final Bytecode bytecode = IS_TESTING ? insertBindingsForTesting(traversal.getBytecode()) : traversal.getBytecode(); //////////////// @@ -103,6 +107,14 @@ public final class TranslationStrategy extends AbstractTraversalStrategy<Travers throw new IllegalArgumentException("TranslationStrategy does not know how to process the provided translator type: " + this.translator.getClass().getSimpleName()); } //////////////// + if (IS_TESTING && // this tests to ensure that the bytecode going in is the same as the bytecode coming out + !BytecodeHelper.getLambdaLanguage(traversal.getBytecode()).isPresent()) + assertEquals(BytecodeHelper.filterInstructions(traversal.getBytecode(), + instruction -> + !(instruction.getOperator().equals(TraversalSource.Symbols.withStrategies) && + instruction.getArguments()[0] instanceof TranslationStrategy)), + translatedTraversal.getBytecode()); + //////////////// assert !translatedTraversal.isLocked(); assert !traversal.isLocked(); traversal.setSideEffects(translatedTraversal.getSideEffects()); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java index dd118d7..f7e8cc4 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/groovy/jsr223/TinkerGraphGroovyTranslatorProvider.java @@ -47,10 +47,6 @@ public class TinkerGraphGroovyTranslatorProvider extends TinkerGraphProvider { private static Set<String> SKIP_TESTS = new HashSet<>(Arrays.asList( "testProfileStrategyCallback", "testProfileStrategyCallbackSideEffect", - "g_withSideEffectXa_setX_V_both_name_storeXaX_capXaX", - "g_VX1X_out_injectXv2X_name", - "shouldNeverPropagateANoBulkTraverser", - "shouldNeverPropagateANullValuedTraverser", GraphComputerTest.class.getCanonicalName(), ProgramTest.Traversals.class.getCanonicalName(), TraversalInterruptionTest.class.getCanonicalName(), http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/jsr223/TinkerGraphJavaTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/jsr223/TinkerGraphJavaTranslatorProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/jsr223/TinkerGraphJavaTranslatorProvider.java index f40a8c7..011ad5d 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/jsr223/TinkerGraphJavaTranslatorProvider.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/jsr223/TinkerGraphJavaTranslatorProvider.java @@ -47,8 +47,6 @@ public class TinkerGraphJavaTranslatorProvider extends TinkerGraphProvider { "testProfileStrategyCallbackSideEffect", TraversalInterruptionTest.class.getCanonicalName(), TraversalInterruptionComputerTest.class.getCanonicalName(), - "shouldNeverPropagateANoBulkTraverser", - "shouldNeverPropagateANullValuedTraverser", ElementIdStrategyProcessTest.class.getCanonicalName(), EventStrategyProcessTest.class.getCanonicalName(), ProgramTest.Traversals.class.getCanonicalName())); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6aa6fc5a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/TinkerGraphGraphSONTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/TinkerGraphGraphSONTranslatorProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/TinkerGraphGraphSONTranslatorProvider.java index 88a2327..54a0f5e 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/TinkerGraphGraphSONTranslatorProvider.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/io/graphson/TinkerGraphGraphSONTranslatorProvider.java @@ -49,16 +49,10 @@ public class TinkerGraphGraphSONTranslatorProvider extends TinkerGraphProvider { "testProfileStrategyCallback", "testProfileStrategyCallbackSideEffect", // - "g_VX1X_out_injectXv2X_name", - "g_VXlistXv1_v2_v3XX_name", - "g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX", - "g_VXv1X_hasXage_gt_30X", - // ProgramTest.Traversals.class.getCanonicalName(), TraversalInterruptionTest.class.getCanonicalName(), TraversalInterruptionComputerTest.class.getCanonicalName(), EventStrategyProcessTest.class.getCanonicalName(), - CoreTraversalTest.class.getCanonicalName(), ElementIdStrategyProcessTest.class.getCanonicalName()));