Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1278 e65ff9e7c -> e50f62c1d
added withBindings() which allows Java, Groovy, Python, etc. to defined bindings for Bytecode. That is, a Binding is a fundamental concept in Bytecode. A binding is a variable/value that when translated, will translate to variable name (e.g. with Groovy/Python) or to the value object (e.g. with Java). Created GraphSON serializer/deserislizers for it. Also, was able to simplify PythonGraphTraversal as now we don't need to check for bindings in GraphTraverasl, but at the Bytecode level. Have only done manual testing thus far. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/e50f62c1 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/e50f62c1 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/e50f62c1 Branch: refs/heads/TINKERPOP-1278 Commit: e50f62c1df7293bac2e8eb9cb2f8dd7225728e46 Parents: e65ff9e Author: Marko A. Rodriguez <[email protected]> Authored: Mon Aug 8 10:09:12 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Mon Aug 8 10:09:12 2016 -0600 ---------------------------------------------------------------------- gremlin-console/bin/gremlin.sh | 4 +- .../gremlin/process/traversal/Bindings.java | 44 +++ .../gremlin/process/traversal/Bytecode.java | 81 ++++- .../process/traversal/TraversalSource.java | 7 + .../traversal/dsl/graph/GraphTraversal.java | 14 +- .../dsl/graph/GraphTraversalSource.java | 6 + .../process/traversal/util/JavaTranslator.java | 17 +- .../structure/io/graphson/GraphSONModule.java | 2 + .../graphson/GraphSONTraversalSerializers.java | 37 ++ .../gremlin/groovy/GroovyTranslatorTest.java | 2 +- .../AbstractImportCustomizerProvider.java | 2 +- .../jsr223/GremlinGroovyScriptEngine.java | 1 - .../gremlin/groovy/jsr223/GroovyTranslator.java | 178 ++++++++++ .../java/translator/GroovyTranslator.java | 176 ---------- gremlin-python/pom.xml | 2 +- .../python/GraphTraversalSourceGenerator.groovy | 9 - .../python/TraversalSourceGenerator.groovy | 23 +- .../gremlin/python/jsr223/PythonTranslator.java | 4 +- .../driver/rest_remote_connection.py | 2 +- .../gremlin_python/process/graph_traversal.py | 340 +------------------ .../jython/gremlin_python/process/traversal.py | 23 +- .../RemoteGraphGroovyTranslatorProvider.java | 1 + .../TinkerGraphGroovyTranslatorProvider.java | 1 + 23 files changed, 411 insertions(+), 565 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-console/bin/gremlin.sh ---------------------------------------------------------------------- diff --git a/gremlin-console/bin/gremlin.sh b/gremlin-console/bin/gremlin.sh index 5fb65ac..d0d3240 100755 --- a/gremlin-console/bin/gremlin.sh +++ b/gremlin-console/bin/gremlin.sh @@ -20,5 +20,5 @@ # OPTS=$@ -set JAVA_OPTIONS="-Dtinkerpop.ext=/../target/apache-gremlin-*-standalone/ext -Dlog4j.configuration=conf/log4j-console.properties -Dgremlin.log4j.level=$GREMLIN_LOG_LEVEL" -`dirname $0`/../target/apache-gremlin-*-standalone/bin/gremlin.sh $OPTS +set JAVA_OPTIONS="-Dtinkerpop.ext=/../target/apache-tinkerpop-gremlin-*-standalone/ext -Dlog4j.configuration=conf/log4j-console.properties -Dgremlin.log4j.level=$GREMLIN_LOG_LEVEL" +`dirname $0`/../target/apache-tinkerpop-gremlin-*-standalone/bin/gremlin.sh $OPTS http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bindings.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bindings.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bindings.java new file mode 100644 index 0000000..e641e57 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bindings.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tinkerpop.gremlin.process.traversal; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public class Bindings { + + private final Map<Object, String> map = new HashMap<>(); + + public <V> V of(final String variable, final V value) { + this.map.put(value, variable); + return value; + } + + public <V> String get(final V value) { + return this.map.get(value); + } + + public void clear() { + this.map.clear(); + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/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 3fd6daf..0ace6e9 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 @@ -25,7 +25,9 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * When a {@link TraversalSource} is manipulated, a {@link Traversal} is spawned and then mutated, a language @@ -40,14 +42,22 @@ public final class Bytecode implements Cloneable, Serializable { private List<Instruction> sourceInstructions = new ArrayList<>(); private List<Instruction> stepInstructions = new ArrayList<>(); - // private transient List<Instruction> instructions = null; + private transient Bindings bindings = null; + private Map<String, Object> map = new HashMap<>(); public void addSource(final String sourceName, final Object... arguments) { - this.sourceInstructions.add(new Instruction(sourceName, flattenArguments(arguments))); + if (sourceName.equals(TraversalSource.Symbols.withBindings)) { + this.bindings = (Bindings) arguments[0]; + this.bindings.clear(); + } else { + this.sourceInstructions.add(new Instruction(sourceName, flattenArguments(arguments))); + if (null != this.bindings) this.bindings.clear(); + } } public void addStep(final String stepName, final Object... arguments) { this.stepInstructions.add(new Instruction(stepName, flattenArguments(arguments))); + if (null != this.bindings) this.bindings.clear(); } public List<Instruction> getSourceInstructions() { @@ -58,14 +68,9 @@ public final class Bytecode implements Cloneable, Serializable { return Collections.unmodifiableList(this.stepInstructions); } - /*public List<Instruction> getInstructions() { - if (null == this.instructions) { - this.instructions = new ArrayList<>(); - this.instructions.addAll(this.sourceInstructions); - this.instructions.addAll(this.stepInstructions); - } - return this.instructions; - }*/ + public Map<String, Object> getBindings() { + return this.map; + } @Override public String toString() { @@ -91,7 +96,6 @@ public final class Bytecode implements Cloneable, Serializable { final Bytecode clone = (Bytecode) super.clone(); clone.sourceInstructions = new ArrayList<>(this.sourceInstructions); clone.stepInstructions = new ArrayList<>(this.stepInstructions); - //clone.instructions = null; return clone; } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); @@ -142,9 +146,45 @@ public final class Bytecode implements Cloneable, Serializable { } + public static class Binding<V> { + + private final String variable; + private final V value; + + public Binding(final String variable, final V value) { + this.variable = variable; + this.value = value; + } + + public String variable() { + return this.variable; + } + + public V value() { + return this.value; + } + + @Override + public String toString() { + return "binding[" + this.variable + "=" + this.value + "]"; + } + + @Override + public boolean equals(final Object object) { + return object instanceof Binding && + this.variable.equals(((Binding) object).variable) && + this.value.equals(((Binding) object).value); + } + + @Override + public int hashCode() { + return this.variable.hashCode() + this.value.hashCode(); + } + } + ///// - private static final Object[] flattenArguments(final Object... arguments) { + private final Object[] flattenArguments(final Object... arguments) { if (arguments.length == 0) return new Object[]{}; final List<Object> flatArguments = new ArrayList<>(); @@ -159,7 +199,20 @@ public final class Bytecode implements Cloneable, Serializable { return flatArguments.toArray(); } - private static final Object convertArgument(final Object argument) { - return argument instanceof Traversal ? ((Traversal) argument).asAdmin().getBytecode() : argument; + private final Object convertArgument(final Object argument) { + if (argument instanceof Traversal) { + ((Traversal) argument).asAdmin().getBytecode().getBindings().forEach(this.map::put); + return ((Traversal) argument).asAdmin().getBytecode(); + } + + if (null != this.bindings) { + final String variable = this.bindings.get(argument); + if (null != variable) { + this.map.put(variable, argument); + return new Binding<>(variable, argument); + } + } + + return argument; } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java index 5491c84..0b9a2d6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java @@ -79,6 +79,7 @@ public interface TraversalSource extends Cloneable { // static fields only } + public static final String withBindings = "withBindings"; public static final String withSack = "withSack"; public static final String withStrategies = "withStrategies"; public static final String withoutStrategies = "withoutStrategies"; @@ -129,6 +130,12 @@ public interface TraversalSource extends Cloneable { return clone; } + public default TraversalSource withBindings(final Bindings bindings) { + final TraversalSource clone = this.clone(); + clone.getBytecode().addSource(Symbols.withBindings, bindings); + return clone; + } + /** * Add a {@link Function} that will generate a {@link GraphComputer} from the {@link Graph} that will be used to execute the traversal. * This adds a {@link VertexProgramStrategy} to the strategies. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java index b00cfcb..4c08068 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java @@ -1270,7 +1270,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) { - return this.branch(__.map(function)); + this.asAdmin().getBytecode().addStep(Symbols.branch, function); + final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin()); + branchStep.setBranchTraversal((Traversal.Admin<E, M>) __.map(function)); + return this.asAdmin().addStep(branchStep); } public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) { @@ -1285,16 +1288,19 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) { - return this.choose(__.map(new FunctionTraverser<>(choiceFunction))); + this.asAdmin().getBytecode().addStep(Symbols.choose, choiceFunction); + return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) __.map(new FunctionTraverser<>(choiceFunction)))); } public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) { - return this.choose(__.filter(new PredicateTraverser<>(choosePredicate)), trueChoice, falseChoice); + this.asAdmin().getBytecode().addStep(Symbols.choose, choosePredicate, trueChoice, falseChoice); + return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) __.filter(new PredicateTraverser<>(choosePredicate)), (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice)); } public default <E2> GraphTraversal<S, E2> optional(final Traversal<?, E2> optionalTraversal) { - return this.choose(optionalTraversal, optionalTraversal.asAdmin().clone(), __.identity()); + this.asAdmin().getBytecode().addStep(Symbols.optional, optionalTraversal); + return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) optionalTraversal, (Traversal.Admin<E, E2>) optionalTraversal.asAdmin().clone(), (Traversal.Admin<E, E2>) __.<E2>identity())); } public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java index 4197988..828f3b2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph; import org.apache.tinkerpop.gremlin.process.computer.Computer; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; +import org.apache.tinkerpop.gremlin.process.traversal.Bindings; import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.Translator; import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; @@ -113,6 +114,11 @@ public class GraphTraversalSource implements TraversalSource { //// CONFIGURATIONS @Override + public GraphTraversalSource withBindings(final Bindings bindings) { + return (GraphTraversalSource) TraversalSource.super.withBindings(bindings); + } + + @Override public GraphTraversalSource withTranslator(final Translator translator) { return (GraphTraversalSource) TraversalSource.super.withTranslator(translator); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/JavaTranslator.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/JavaTranslator.java index fc271e0..891440c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/JavaTranslator.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/JavaTranslator.java @@ -121,6 +121,12 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal } } /// + for (int i = 0; i < arguments.length; i++) { + if (arguments[i] instanceof Bytecode.Binding) + arguments[i] = ((Bytecode.Binding) arguments[i]).value(); + else if (arguments[i] instanceof Bytecode) + arguments[i] = translateFromAnonymous((Bytecode) arguments[i]); + } try { for (final Method method : methodCache.get(methodName)) { if (returnType.isAssignableFrom(method.getReturnType())) { @@ -133,9 +139,7 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal Object[] varArgs = (Object[]) Array.newInstance(parameters[i].getType().getComponentType(), arguments.length - i); int counter = 0; for (int j = i; j < arguments.length; j++) { - varArgs[counter++] = arguments[j] instanceof Bytecode ? - this.translateFromAnonymous((Bytecode) arguments[j]) : - arguments[j]; + varArgs[counter++] = arguments[j]; } newArguments[i] = varArgs; break; @@ -146,11 +150,8 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal (Number.class.isAssignableFrom(arguments[i].getClass()) || arguments[i].getClass().equals(Boolean.class) || arguments[i].getClass().equals(Byte.class) || - arguments[i].getClass().equals(Character.class))) || - (parameters[i].getType().isAssignableFrom(Traversal.class) && arguments[i] instanceof Bytecode))) { - newArguments[i] = arguments[i] instanceof Bytecode ? - this.translateFromAnonymous((Bytecode) arguments[i]) : - arguments[i]; + arguments[i].getClass().equals(Character.class))))) { + newArguments[i] = arguments[i]; } else { found = false; break; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java index d625125..a4850f7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java @@ -140,11 +140,13 @@ abstract class GraphSONModule extends SimpleModule { addSerializer(T.class, new GraphSONTraversalSerializers.EnumJacksonSerializer()); addSerializer(P.class, new GraphSONTraversalSerializers.PJacksonSerializer()); addSerializer(Lambda.class, new GraphSONTraversalSerializers.LambdaJacksonSerializer()); + addSerializer(Bytecode.Binding.class, new GraphSONTraversalSerializers.BindingJacksonSerializer()); // -- deserializers for traversal addDeserializer(Bytecode.class, new GraphSONTraversalSerializers.BytecodeJacksonDeserializer()); addDeserializer(Enum.class, new GraphSONTraversalSerializers.EnumJacksonDeserializer()); addDeserializer(P.class, new GraphSONTraversalSerializers.PJacksonDeserializer()); addDeserializer(Lambda.class, new GraphSONTraversalSerializers.LambdaJacksonDeserializer()); + addDeserializer(Bytecode.Binding.class, new GraphSONTraversalSerializers.BindingJacksonDeserializer()); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java index 78ca36e..faea5b9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializers.java @@ -170,6 +170,24 @@ public final class GraphSONTraversalSerializers { } + final static class BindingJacksonSerializer extends StdSerializer<Bytecode.Binding> { + + public BindingJacksonSerializer() { + super(Bytecode.Binding.class); + } + + @Override + public void serialize(final Bytecode.Binding binding, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) + throws IOException { + jsonGenerator.writeStartObject(); + jsonGenerator.writeStringField("@type", "Binding"); + jsonGenerator.writeStringField("variable", binding.variable()); + jsonGenerator.writeObjectField("value", binding.value()); + jsonGenerator.writeEndObject(); + } + + } + /////////////////// // DESERIALIZERS // ////////////////// @@ -190,6 +208,8 @@ public final class GraphSONTraversalSerializers { final String type = argument.get("@type").textValue(); if (type.equals("Bytecode")) arguments.add(oc.readValue(argument.traverse(oc), Bytecode.class)); + else if (type.equals("Binding")) + arguments.add(oc.readValue(argument.traverse(oc), Bytecode.Binding.class)); else if (type.equals("P")) arguments.add(oc.readValue(argument.traverse(oc), P.class)); else if (type.equals("Lambda")) @@ -333,5 +353,22 @@ public final class GraphSONTraversalSerializers { } } + final static class BindingJacksonDeserializer extends StdDeserializer<Bytecode.Binding> { + + public BindingJacksonDeserializer() { + super(Bytecode.Binding.class); + } + + @Override + public Bytecode.Binding deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + final ObjectCodec oc = jsonParser.getCodec(); + final JsonNode node = oc.readTree(jsonParser); + assert node.get("@type").textValue().equals("Binding"); + final String variable = node.get("variable").textValue(); + final Object value = oc.readValue(node.get("value").traverse(oc), Object.class); + return new Bytecode.Binding<>(variable, value); + } + } + } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java index 9a936c1..f76fa7a 100644 --- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java +++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java @@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.groovy; import org.apache.tinkerpop.gremlin.AbstractGremlinTest; import org.apache.tinkerpop.gremlin.LoadGraphWith; -import org.apache.tinkerpop.gremlin.java.translator.GroovyTranslator; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyTranslator; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java index 3f7eec2..27939b1 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java @@ -23,7 +23,7 @@ import groovy.json.JsonBuilder; import org.apache.commons.configuration.Configuration; import org.apache.tinkerpop.gremlin.groovy.function.GFunction; import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader; -import org.apache.tinkerpop.gremlin.java.translator.GroovyTranslator; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyTranslator; import org.apache.tinkerpop.gremlin.process.computer.Computer; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.computer.bulkdumping.BulkDumperVertexProgram; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java index 1a0ae41..e5f4bca 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java @@ -38,7 +38,6 @@ import groovy.lang.MissingMethodException; import groovy.lang.MissingPropertyException; import groovy.lang.Script; import groovy.lang.Tuple; -import org.apache.tinkerpop.gremlin.java.translator.GroovyTranslator; import org.apache.tinkerpop.gremlin.jsr223.Customizer; import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngine; import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngineFactory; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/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 new file mode 100644 index 0000000..ee233c4 --- /dev/null +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tinkerpop.gremlin.groovy.jsr223; + +import org.apache.tinkerpop.gremlin.process.computer.Computer; +import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; +import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; +import org.apache.tinkerpop.gremlin.process.traversal.Translator; +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.ConnectiveP; +import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.StringFactory; +import org.apache.tinkerpop.gremlin.util.function.Lambda; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class GroovyTranslator implements Translator.ScriptTranslator { + + private final String traversalSource; + private final String anonymousTraversal; + + private GroovyTranslator(final String traversalSource, final String anonymousTraversal) { + this.traversalSource = traversalSource; + this.anonymousTraversal = anonymousTraversal; + } + + public static final GroovyTranslator of(final String traversalSource, final String anonymousTraversal) { + return new GroovyTranslator(traversalSource, anonymousTraversal); + } + + public static final GroovyTranslator of(final String traversalSource) { + return new GroovyTranslator(traversalSource, "__"); + } + + /////// + + @Override + public String translate(final Bytecode bytecode) { + return this.internalTranslate(this.traversalSource, bytecode); + } + + @Override + public String getTargetLanguage() { + return "gremlin-groovy"; + } + + @Override + public String toString() { + return StringFactory.translatorString(this); + } + + @Override + public String getTraversalSource() { + return this.traversalSource; + } + + @Override + public String getAnonymousTraversal() { + return this.anonymousTraversal; + } + + /////// + + private String internalTranslate(final String start, final Bytecode bytecode) { + final StringBuilder traversalScript = new StringBuilder(start); + final Bytecode clone = BytecodeHelper.filterInstructions(bytecode, + instruction -> !Arrays.asList("withTranslator", "withStrategies").contains(instruction.getOperator())); + for (final Bytecode.Instruction instruction : clone.getSourceInstructions()) { + processInstruction(traversalScript, instruction); + } + for (final Bytecode.Instruction instruction : clone.getStepInstructions()) { + processInstruction(traversalScript, instruction); + } + final String script = traversalScript.toString(); + if (script.contains("$")) + throw new VerificationException("Lambdas are currently not supported: " + script, EmptyTraversal.instance()); + return script; + } + + private void processInstruction(final StringBuilder traversalScript, final Bytecode.Instruction instruction) { + final String methodName = instruction.getOperator(); + final Object[] arguments = instruction.getArguments(); + final List<Object> objects = Arrays.asList(arguments); + if (objects.isEmpty()) + traversalScript.append(".").append(methodName).append("()"); + else { + traversalScript.append("."); + String temp = methodName + "("; + for (final Object object : objects) { + temp = temp + convertToString(object) + ","; + } + traversalScript.append(temp.substring(0, temp.length() - 1) + ")"); + } + } + + private String convertToString(final Object object) { + if (object instanceof Bytecode.Binding) + return ((Bytecode.Binding) object).variable(); + else if (object instanceof String) + return "\"" + object + "\""; + else if (object instanceof List) { + final List<String> list = new ArrayList<>(((List) object).size()); + for (final Object item : (List) object) { + list.add(convertToString(item)); + } + return list.toString(); + } else if (object instanceof Long) + return object + "L"; + else if (object instanceof Double) + return object + "d"; + else if (object instanceof Float) + return object + "f"; + else if (object instanceof Integer) + return "(int) " + object; + else if (object instanceof Class) + return ((Class) object).getCanonicalName(); + else if (object instanceof P) + return convertPToString((P) object, new StringBuilder()).toString(); + else if (object instanceof SackFunctions.Barrier) + return "SackFunctions.Barrier." + object.toString(); + else if (object instanceof VertexProperty.Cardinality) + return "VertexProperty.Cardinality." + 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 Computer) { // TODO: blow out + return ""; + } else if (object instanceof Lambda) { + final String lambdaString = ((Lambda) object).getLambdaScript(); + return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}"; + } else if (object instanceof Bytecode) + return this.internalTranslate(this.anonymousTraversal, (Bytecode) object); + else + return null == object ? "null" : object.toString(); + } + + private StringBuilder convertPToString(final P p, final StringBuilder current) { + if (p instanceof ConnectiveP) { + final List<P<?>> list = ((ConnectiveP) p).getPredicates(); + for (int i = 0; i < list.size(); i++) { + convertPToString(list.get(i), current); + if (i < list.size() - 1) + current.append(p instanceof OrP ? ".or(" : ".and("); + } + current.append(")"); + } else + current.append("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")"); + return current; + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java deleted file mode 100644 index 39c60df..0000000 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/java/translator/GroovyTranslator.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tinkerpop.gremlin.java.translator; - -import org.apache.tinkerpop.gremlin.process.computer.Computer; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; -import org.apache.tinkerpop.gremlin.process.traversal.Translator; -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.ConnectiveP; -import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal; -import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; -import org.apache.tinkerpop.gremlin.structure.Element; -import org.apache.tinkerpop.gremlin.structure.VertexProperty; -import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.util.function.Lambda; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public final class GroovyTranslator implements Translator.ScriptTranslator { - - private final String traversalSource; - private final String anonymousTraversal; - - private GroovyTranslator(final String traversalSource, final String anonymousTraversal) { - this.traversalSource = traversalSource; - this.anonymousTraversal = anonymousTraversal; - } - - public static final GroovyTranslator of(final String traversalSource, final String anonymousTraversal) { - return new GroovyTranslator(traversalSource, anonymousTraversal); - } - - public static final GroovyTranslator of(final String traversalSource) { - return new GroovyTranslator(traversalSource, "__"); - } - - /////// - - @Override - public String translate(final Bytecode bytecode) { - return this.internalTranslate(this.traversalSource, bytecode); - } - - @Override - public String getTargetLanguage() { - return "gremlin-groovy"; - } - - @Override - public String toString() { - return StringFactory.translatorString(this); - } - - @Override - public String getTraversalSource() { - return this.traversalSource; - } - - @Override - public String getAnonymousTraversal() { - return this.anonymousTraversal; - } - - /////// - - private String internalTranslate(final String start, final Bytecode bytecode) { - final StringBuilder traversalScript = new StringBuilder(start); - final Bytecode clone = BytecodeHelper.filterInstructions(bytecode, - instruction -> !Arrays.asList("withTranslator", "withStrategies").contains(instruction.getOperator())); - for (final Bytecode.Instruction instruction : clone.getSourceInstructions()) { - processInstruction(traversalScript, instruction); - } - for (final Bytecode.Instruction instruction : clone.getStepInstructions()) { - processInstruction(traversalScript, instruction); - } - final String script = traversalScript.toString(); - if (script.contains("$")) - throw new VerificationException("Lambdas are currently not supported: " + script, EmptyTraversal.instance()); - return script; - } - - private void processInstruction(final StringBuilder traversalScript, final Bytecode.Instruction instruction) { - final String methodName = instruction.getOperator(); - final Object[] arguments = instruction.getArguments(); - final List<Object> objects = Arrays.asList(arguments); - if (objects.isEmpty()) - traversalScript.append(".").append(methodName).append("()"); - else { - traversalScript.append("."); - String temp = methodName + "("; - for (final Object object : objects) { - temp = temp + convertToString(object) + ","; - } - traversalScript.append(temp.substring(0, temp.length() - 1) + ")"); - } - } - - private String convertToString(final Object object) { - if (object instanceof String) - return "\"" + object + "\""; - else if (object instanceof List) { - final List<String> list = new ArrayList<>(((List) object).size()); - for (final Object item : (List) object) { - list.add(convertToString(item)); - } - return list.toString(); - } else if (object instanceof Long) - return object + "L"; - else if (object instanceof Double) - return object + "d"; - else if (object instanceof Float) - return object + "f"; - else if (object instanceof Integer) - return "(int) " + object; - else if (object instanceof Class) - return ((Class) object).getCanonicalName(); - else if (object instanceof P) - return convertPToString((P) object, new StringBuilder()).toString(); - else if (object instanceof SackFunctions.Barrier) - return "SackFunctions.Barrier." + object.toString(); - else if (object instanceof VertexProperty.Cardinality) - return "VertexProperty.Cardinality." + 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 Computer) { // TODO: blow out - return ""; - } else if (object instanceof Lambda) { - final String lambdaString = ((Lambda) object).getLambdaScript(); - return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}"; - } else if (object instanceof Bytecode) - return this.internalTranslate(this.anonymousTraversal, (Bytecode) object); - else - return null == object ? "null" : object.toString(); - } - - private StringBuilder convertPToString(final P p, final StringBuilder current) { - if (p instanceof ConnectiveP) { - final List<P<?>> list = ((ConnectiveP) p).getPredicates(); - for (int i = 0; i < list.size(); i++) { - convertPToString(list.get(i), current); - if (i < list.size() - 1) - current.append(p instanceof OrP ? ".or(" : ".and("); - } - current.append(")"); - } else - current.append("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")"); - return current; - } -} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-python/pom.xml ---------------------------------------------------------------------- diff --git a/gremlin-python/pom.xml b/gremlin-python/pom.xml index 92f1c2f..7e6030c 100644 --- a/gremlin-python/pom.xml +++ b/gremlin-python/pom.xml @@ -24,7 +24,7 @@ <parent> <groupId>org.apache.tinkerpop</groupId> <artifactId>tinkerpop</artifactId> - <version>3.2.1-SNAPSHOT</version> + <version>3.2.2-SNAPSHOT</version> </parent> <artifactId>gremlin-python</artifactId> <name>Apache TinkerPop :: Gremlin Python</name> http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/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 0992beb..f507171 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 @@ -91,9 +91,6 @@ under the License. """ def ${method}(self, *args): traversal = GraphTraversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) traversal.bytecode.add_step("${method}", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return traversal """) } else if (TraversalSource.isAssignableFrom(returnType)) { @@ -101,9 +98,6 @@ under the License. """ def ${method}(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("${method}", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source """) } @@ -132,9 +126,6 @@ under the License. pythonClass.append( """ def ${method}(self, *args): self.bytecode.add_step("${method}", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self """) } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/TraversalSourceGenerator.groovy ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/TraversalSourceGenerator.groovy b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/TraversalSourceGenerator.groovy index f2a95bf..59d09a4 100644 --- a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/TraversalSourceGenerator.groovy +++ b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/TraversalSourceGenerator.groovy @@ -66,7 +66,6 @@ class Traversal(object): self.side_effects = {} self.traversers = None self.last_traverser = None - self.bindings = {} def __repr__(self): return str(self.bytecode) @@ -217,6 +216,7 @@ class Bytecode(object): def __init__(self, bytecode=None): self.source_instructions = [] self.step_instructions = [] + self.bindings = {} if bytecode is not None: self.source_instructions = list(bytecode.source_instructions) self.step_instructions = list(bytecode.step_instructions) @@ -224,23 +224,36 @@ class Bytecode(object): def add_source(self, source_name, *args): newArgs = () for arg in args: - newArgs = newArgs + (Bytecode.__convertArgument(arg),) + newArgs = newArgs + (self.__convertArgument(arg),) self.source_instructions.append((source_name, newArgs)) return def add_step(self, step_name, *args): newArgs = () for arg in args: - newArgs = newArgs + (Bytecode.__convertArgument(arg),) + newArgs = newArgs + (self.__convertArgument(arg),) self.step_instructions.append((step_name, newArgs)) return - @staticmethod - def __convertArgument(arg): + def __convertArgument(self,arg): if isinstance(arg, Traversal): + self.bindings.update(arg.bytecode.bindings) return arg.bytecode + elif isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): + self.bindings[arg[0]] = arg[1] + return Binding(arg[0],arg[1]) else: return arg + +''' +BINDING +''' + +class Binding(object): + def __init__(self,variable,value): + self.variable = variable + self.value = value + """) ////////////// http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/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 efe1768..b2d1cb1 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 @@ -160,7 +160,9 @@ public final class PythonTranslator implements Translator.ScriptTranslator { } private String convertToString(final Object object) { - if (object instanceof String) + if (object instanceof Bytecode.Binding) + return ((Bytecode.Binding) object).variable(); + else if (object instanceof String) return "\"" + object + "\""; else if (object instanceof List) { final List<String> list = new ArrayList<>(((List) object).size()); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-python/src/main/jython/gremlin_python/driver/rest_remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/rest_remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/rest_remote_connection.py index f204d15..3346b74 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/rest_remote_connection.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/rest_remote_connection.py @@ -35,7 +35,7 @@ class RESTRemoteConnection(RemoteConnection): def submit(self, target_language, bytecode): response = requests.post(self.url, data=json.dumps( - {"gremlin": bytecode, "source": self.traversal_source, "language": target_language, "bindings": None})) + {"gremlin": bytecode, "source": self.traversal_source, "language": target_language, "bindings": bytecode.bindings})) if response.status_code != requests.codes.ok: raise BaseException(response.text) traversers = [] http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/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 5c6be95..be05299 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 @@ -32,86 +32,54 @@ class GraphTraversalSource(object): def E(self, *args): traversal = GraphTraversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) traversal.bytecode.add_step("E", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return traversal def V(self, *args): traversal = GraphTraversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) traversal.bytecode.add_step("V", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return traversal def addV(self, *args): traversal = GraphTraversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) traversal.bytecode.add_step("addV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return traversal def inject(self, *args): traversal = GraphTraversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) traversal.bytecode.add_step("inject", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return traversal + def withBindings(self, *args): + source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) + source.bytecode.add_source("withBindings", *args) + return source def withBulk(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withBulk", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withComputer(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withComputer", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withPath(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withPath", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withSack(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withSack", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withSideEffect(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withSideEffect", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withStrategies(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withStrategies", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withTranslator(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withTranslator", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source def withoutStrategies(self, *args): source = GraphTraversalSource(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) source.bytecode.add_source("withoutStrategies", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return source @@ -120,603 +88,303 @@ class GraphTraversal(Traversal): Traversal.__init__(self, graph, traversal_strategies, bytecode) def V(self, *args): self.bytecode.add_step("V", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _and(self, *args): self.bytecode.add_step("_and", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _as(self, *args): self.bytecode.add_step("_as", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _from(self, *args): self.bytecode.add_step("_from", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _in(self, *args): self.bytecode.add_step("_in", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _is(self, *args): self.bytecode.add_step("_is", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _not(self, *args): self.bytecode.add_step("_not", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def _or(self, *args): self.bytecode.add_step("_or", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def addE(self, *args): self.bytecode.add_step("addE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def addInE(self, *args): self.bytecode.add_step("addInE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def addOutE(self, *args): self.bytecode.add_step("addOutE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def addV(self, *args): self.bytecode.add_step("addV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def aggregate(self, *args): self.bytecode.add_step("aggregate", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def asAdmin(self, *args): self.bytecode.add_step("asAdmin", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def barrier(self, *args): self.bytecode.add_step("barrier", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def both(self, *args): self.bytecode.add_step("both", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def bothE(self, *args): self.bytecode.add_step("bothE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def bothV(self, *args): self.bytecode.add_step("bothV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def branch(self, *args): self.bytecode.add_step("branch", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def by(self, *args): self.bytecode.add_step("by", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def cap(self, *args): self.bytecode.add_step("cap", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def choose(self, *args): self.bytecode.add_step("choose", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def coalesce(self, *args): self.bytecode.add_step("coalesce", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def coin(self, *args): self.bytecode.add_step("coin", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def constant(self, *args): self.bytecode.add_step("constant", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def count(self, *args): self.bytecode.add_step("count", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def cyclicPath(self, *args): self.bytecode.add_step("cyclicPath", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def dedup(self, *args): self.bytecode.add_step("dedup", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def drop(self, *args): self.bytecode.add_step("drop", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def emit(self, *args): self.bytecode.add_step("emit", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def filter(self, *args): self.bytecode.add_step("filter", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def flatMap(self, *args): self.bytecode.add_step("flatMap", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def fold(self, *args): self.bytecode.add_step("fold", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def group(self, *args): self.bytecode.add_step("group", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def groupCount(self, *args): self.bytecode.add_step("groupCount", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def groupV3d0(self, *args): self.bytecode.add_step("groupV3d0", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def has(self, *args): self.bytecode.add_step("has", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def hasId(self, *args): self.bytecode.add_step("hasId", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def hasKey(self, *args): self.bytecode.add_step("hasKey", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def hasLabel(self, *args): self.bytecode.add_step("hasLabel", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def hasNot(self, *args): self.bytecode.add_step("hasNot", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def hasValue(self, *args): self.bytecode.add_step("hasValue", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def id(self, *args): self.bytecode.add_step("id", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def identity(self, *args): self.bytecode.add_step("identity", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def inE(self, *args): self.bytecode.add_step("inE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def inV(self, *args): self.bytecode.add_step("inV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def inject(self, *args): self.bytecode.add_step("inject", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def iterate(self, *args): self.bytecode.add_step("iterate", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def key(self, *args): self.bytecode.add_step("key", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def label(self, *args): self.bytecode.add_step("label", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def limit(self, *args): self.bytecode.add_step("limit", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def local(self, *args): self.bytecode.add_step("local", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def loops(self, *args): self.bytecode.add_step("loops", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def map(self, *args): self.bytecode.add_step("map", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def mapKeys(self, *args): self.bytecode.add_step("mapKeys", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def mapValues(self, *args): self.bytecode.add_step("mapValues", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def match(self, *args): self.bytecode.add_step("match", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def max(self, *args): self.bytecode.add_step("max", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def mean(self, *args): self.bytecode.add_step("mean", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def min(self, *args): self.bytecode.add_step("min", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def option(self, *args): self.bytecode.add_step("option", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def optional(self, *args): self.bytecode.add_step("optional", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def order(self, *args): self.bytecode.add_step("order", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def otherV(self, *args): self.bytecode.add_step("otherV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def out(self, *args): self.bytecode.add_step("out", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def outE(self, *args): self.bytecode.add_step("outE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def outV(self, *args): self.bytecode.add_step("outV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def pageRank(self, *args): self.bytecode.add_step("pageRank", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def path(self, *args): self.bytecode.add_step("path", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def peerPressure(self, *args): self.bytecode.add_step("peerPressure", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def profile(self, *args): self.bytecode.add_step("profile", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def program(self, *args): self.bytecode.add_step("program", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def project(self, *args): self.bytecode.add_step("project", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def properties(self, *args): self.bytecode.add_step("properties", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def property(self, *args): self.bytecode.add_step("property", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def propertyMap(self, *args): self.bytecode.add_step("propertyMap", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def range(self, *args): self.bytecode.add_step("range", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def repeat(self, *args): self.bytecode.add_step("repeat", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def sack(self, *args): self.bytecode.add_step("sack", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def sample(self, *args): self.bytecode.add_step("sample", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def select(self, *args): self.bytecode.add_step("select", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def sideEffect(self, *args): self.bytecode.add_step("sideEffect", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def simplePath(self, *args): self.bytecode.add_step("simplePath", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def store(self, *args): self.bytecode.add_step("store", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def subgraph(self, *args): self.bytecode.add_step("subgraph", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def sum(self, *args): self.bytecode.add_step("sum", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def tail(self, *args): self.bytecode.add_step("tail", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def timeLimit(self, *args): self.bytecode.add_step("timeLimit", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def times(self, *args): self.bytecode.add_step("times", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def to(self, *args): self.bytecode.add_step("to", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def toE(self, *args): self.bytecode.add_step("toE", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def toV(self, *args): self.bytecode.add_step("toV", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def tree(self, *args): self.bytecode.add_step("tree", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def unfold(self, *args): self.bytecode.add_step("unfold", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def union(self, *args): self.bytecode.add_step("union", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def until(self, *args): self.bytecode.add_step("until", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def value(self, *args): self.bytecode.add_step("value", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def valueMap(self, *args): self.bytecode.add_step("valueMap", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def values(self, *args): self.bytecode.add_step("values", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self def where(self, *args): self.bytecode.add_step("where", *args) - for arg in args: - if isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): - self.bindings[arg[0]] = arg[1] return self http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-python/src/main/jython/gremlin_python/process/traversal.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/process/traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/traversal.py index 1d9aa18..3703e5d 100644 --- a/gremlin-python/src/main/jython/gremlin_python/process/traversal.py +++ b/gremlin-python/src/main/jython/gremlin_python/process/traversal.py @@ -28,7 +28,6 @@ class Traversal(object): self.side_effects = {} self.traversers = None self.last_traverser = None - self.bindings = {} def __repr__(self): return str(self.bytecode) @@ -297,6 +296,7 @@ class Bytecode(object): def __init__(self, bytecode=None): self.source_instructions = [] self.step_instructions = [] + self.bindings = {} if bytecode is not None: self.source_instructions = list(bytecode.source_instructions) self.step_instructions = list(bytecode.step_instructions) @@ -304,20 +304,33 @@ class Bytecode(object): def add_source(self, source_name, *args): newArgs = () for arg in args: - newArgs = newArgs + (Bytecode.__convertArgument(arg),) + newArgs = newArgs + (self.__convertArgument(arg),) self.source_instructions.append((source_name, newArgs)) return def add_step(self, step_name, *args): newArgs = () for arg in args: - newArgs = newArgs + (Bytecode.__convertArgument(arg),) + newArgs = newArgs + (self.__convertArgument(arg),) self.step_instructions.append((step_name, newArgs)) return - @staticmethod - def __convertArgument(arg): + def __convertArgument(self,arg): if isinstance(arg, Traversal): + self.bindings.update(arg.bytecode.bindings) return arg.bytecode + elif isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): + self.bindings[arg[0]] = arg[1] + return Binding(arg[0],arg[1]) else: return arg + +''' +BINDING +''' + +class Binding(object): + def __init__(self,variable,value): + self.variable = variable + self.value = value + http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/java/translator/RemoteGraphGroovyTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/java/translator/RemoteGraphGroovyTranslatorProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/java/translator/RemoteGraphGroovyTranslatorProvider.java index d7c2399..074e220 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/java/translator/RemoteGraphGroovyTranslatorProvider.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/java/translator/RemoteGraphGroovyTranslatorProvider.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.java.translator; import org.apache.tinkerpop.gremlin.driver.remote.RemoteGraphProvider; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyTranslator; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Graph; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e50f62c1/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/java/translator/TinkerGraphGroovyTranslatorProvider.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/java/translator/TinkerGraphGroovyTranslatorProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/java/translator/TinkerGraphGroovyTranslatorProvider.java index aa84ff0..b5f6b1d 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/java/translator/TinkerGraphGroovyTranslatorProvider.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/java/translator/TinkerGraphGroovyTranslatorProvider.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.java.translator; import org.apache.tinkerpop.gremlin.LoadGraphWith; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyTranslator; import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionComputerTest; import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
