You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/06/09 15:26:05 UTC
[2/2] incubator-tinkerpop git commit: Have GroovyTranslator
implemented and connected with ProcessStandard and ProcessComputer suites.
Moved packages around -- now its tinkerpop.gremlin.python --
tinkerpop.gremlin.groovy. Things are looking good.
Have GroovyTranslator implemented and connected with ProcessStandard and ProcessComputer suites. Moved packages around -- now its tinkerpop.gremlin.python -- tinkerpop.gremlin.groovy. Things are looking good.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/97b12a40
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/97b12a40
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/97b12a40
Branch: refs/heads/TINKERPOP-1278
Commit: 97b12a405465ae0730007bd69c187c7a5749ac3d
Parents: 47e7122
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 9 09:26:04 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 9 09:26:04 2016 -0600
----------------------------------------------------------------------
.../gremlin/process/traversal/dsl/graph/__.java | 15 +-
.../traversal/util/TranslatorHelper.java | 48 +++
.../AbstractImportCustomizerProvider.java | 1 -
.../gremlin/groovy/GroovyTranslator.java | 156 ++++++++
.../traversal/dsl/graph/GroovyTranslator.java | 153 --------
.../python/GremlinPythonGenerator.groovy | 377 -------------------
.../python/GremlinPythonGenerator.groovy | 377 +++++++++++++++++++
.../variant/python/PythonTranslator.java | 258 -------------
.../gremlin/python/PythonTranslator.java | 222 +++++++++++
.../tinkerpop/gremlin/VariantGraphProvider.java | 137 +++++++
.../gremlin/groovy/GroovyComputerProvider.java | 37 ++
.../groovy/GroovyProcessComputerTest.java | 33 ++
.../groovy/GroovyProcessStandardTest.java | 33 ++
.../gremlin/groovy/GroovyProvider.java | 39 ++
.../process/variant/VariantGraphProvider.java | 137 -------
.../variant/python/PythonComputerProvider.java | 36 --
.../python/PythonProcessComputerTest.java | 34 --
.../python/PythonProcessStandardTest.java | 34 --
.../process/variant/python/PythonProvider.java | 40 --
.../gremlin/python/PythonComputerProvider.java | 37 ++
.../python/PythonProcessComputerTest.java | 34 ++
.../python/PythonProcessStandardTest.java | 34 ++
.../gremlin/python/PythonProvider.java | 75 ++++
23 files changed, 1274 insertions(+), 1073 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index c4f83da..b3c6241 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -51,7 +51,7 @@ import java.util.function.Supplier;
*/
public class __ {
- private static Supplier<GraphTraversal> ANONYMOUS_GRAPH_TRAVERSAL = null;
+ private static ThreadLocal<Supplier<GraphTraversal>> ANONYMOUS_GRAPH_TRAVERSAL = null;
protected __() {
}
@@ -59,11 +59,20 @@ public class __ {
//////////////////////////////////////////////////////////////////////
public static void setAnonymousGraphTraversalSupplier(final Supplier<GraphTraversal> anonymousGraphTraversalSupplier) {
- ANONYMOUS_GRAPH_TRAVERSAL = anonymousGraphTraversalSupplier;
+ if (null == ANONYMOUS_GRAPH_TRAVERSAL) {
+ if (null == anonymousGraphTraversalSupplier)
+ return;
+ else
+ ANONYMOUS_GRAPH_TRAVERSAL = ThreadLocal.withInitial(() -> DefaultGraphTraversal::new);
+ }
+ if (null == anonymousGraphTraversalSupplier)
+ ANONYMOUS_GRAPH_TRAVERSAL.remove();
+ else
+ ANONYMOUS_GRAPH_TRAVERSAL.set(anonymousGraphTraversalSupplier);
}
public static <A> GraphTraversal<A, A> start() {
- return null == ANONYMOUS_GRAPH_TRAVERSAL ? new DefaultGraphTraversal<>() : ANONYMOUS_GRAPH_TRAVERSAL.get();
+ return null == ANONYMOUS_GRAPH_TRAVERSAL ? new DefaultGraphTraversal<>() : ANONYMOUS_GRAPH_TRAVERSAL.get().get();
}
public static <A> GraphTraversal<A, A> __(final A... starts) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
new file mode 100644
index 0000000..4a58dcd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TranslatorHelper.java
@@ -0,0 +1,48 @@
+/*
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TranslatorHelper {
+
+ private TranslatorHelper() {
+ // static methods only so don't allow construction
+ }
+
+ public static List<Object> flattenArguments(final Object... arguments) {
+ if (arguments.length == 0)
+ return Collections.emptyList();
+ final List<Object> flatArguments = new ArrayList<>();
+ for (final Object object : arguments) {
+ if (object instanceof Object[]) {
+ Collections.addAll(flatArguments, (Object[]) object);
+ } else
+ flatArguments.add(object);
+ }
+ return flatArguments;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/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 11400ba..61884b1 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,6 @@ 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.groovy.process.traversal.dsl.graph.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/incubator-tinkerpop/blob/97b12a40/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
new file mode 100644
index 0000000..379c361
--- /dev/null
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
@@ -0,0 +1,156 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+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.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GroovyTranslator implements Translator<GraphTraversal> {
+
+ private StringBuilder traversalScript;
+ private final String alias;
+
+ public GroovyTranslator(final String alias) {
+ this.alias = alias;
+ this.traversalScript = new StringBuilder(this.alias);
+
+ }
+
+ @Override
+ public String getScriptEngine() {
+ return "gremlin-groovy";
+ }
+
+ @Override
+ public String getAlias() {
+ return this.alias;
+ }
+
+ @Override
+ public void addStep(final String stepName, final Object... arguments) {
+ final List<Object> objects = TranslatorHelper.flattenArguments(arguments);
+ if (objects.isEmpty())
+ this.traversalScript.append(".").append(stepName).append("()");
+ else {
+ this.traversalScript.append(".");
+ String temp = stepName + "(";
+ for (final Object object : objects) {
+ temp = temp + convertToString(object) + ",";
+ }
+ this.traversalScript.append(temp.substring(0, temp.length() - 1) + ")");
+ }
+ }
+
+ @Override
+ public GraphTraversal __() {
+ return new ScriptGraphTraversal(EmptyGraph.instance(), new GroovyTranslator("__"));
+ }
+
+ @Override
+ public String getTraversalScript() {
+ final String traversal = this.traversalScript.toString();
+ if (traversal.contains("$"))
+ throw new VerificationException("Lambdas are currently not supported: " + traversal, EmptyTraversal.instance());
+ return traversal;
+ }
+
+ @Override
+ public GroovyTranslator clone() {
+ try {
+ final GroovyTranslator clone = (GroovyTranslator) super.clone();
+ clone.traversalScript = new StringBuilder(this.traversalScript);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ public static final GroovyTranslator of(final String alias) {
+ return new GroovyTranslator(alias);
+ }
+
+ ///////
+
+ private static 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 ScriptGraphTraversal)
+ return ((ScriptGraphTraversal) object).getTraversalScript();
+ else
+ return null == object ? "null" : object.toString();
+ }
+
+ private static 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/incubator-tinkerpop/blob/97b12a40/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
deleted file mode 100644
index 639fa04..0000000
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
+++ /dev/null
@@ -1,153 +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.groovy.process.traversal.dsl.graph;
-
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GroovyTranslator implements Translator<GraphTraversal> {
-
- private StringBuilder traversalScript;
- private final String alias;
-
- public GroovyTranslator(final String alias) {
- this.alias = alias;
- this.traversalScript = new StringBuilder(this.alias);
-
- }
-
- @Override
- public String getScriptEngine() {
- return "gremlin-groovy";
- }
-
- @Override
- public String getAlias() {
- return this.alias;
- }
-
- @Override
- public void addStep(final String stepName, final Object... arguments) {
- // flatten the arguments into a single array
- final Object[] objects = Stream.of(arguments)
- .flatMap(arg ->
- IteratorUtils.stream(arg instanceof Object[] ?
- new ArrayIterator<>((Object[]) arg) :
- IteratorUtils.of(arg)))
- .toArray();
- if (objects.length == 0)
- this.traversalScript.append(".").append(stepName).append("()");
- else {
- this.traversalScript.append(".");
- String temp = stepName + "(";
- for (final Object object : objects) {
- temp = temp + convertToString(object) + ",";
- }
- this.traversalScript.append(temp.substring(0, temp.length() - 1) + ")");
- }
- }
-
- @Override
- public GraphTraversal __() {
- return new ScriptGraphTraversal(EmptyGraph.instance(), new GroovyTranslator("__"));
- }
-
- @Override
- public String getTraversalScript() {
- return this.traversalScript.toString();
- }
-
- @Override
- public GroovyTranslator clone() {
- try {
- final GroovyTranslator clone = (GroovyTranslator) super.clone();
- clone.traversalScript = new StringBuilder(this.traversalScript);
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- public static final GroovyTranslator of(final String alias) {
- return new GroovyTranslator(alias);
- }
-
- ///////
-
- private static String convertToString(final Object object) {
- if (object instanceof String)
- return "\"" + object + "\"";
- else if (object instanceof List) {
- final List list = new ArrayList<>(((List) object).size());
- for (final Object item : (List) object) {
- list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
- }
- 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 Enum)
- return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
- else if (object instanceof Element)
- return convertToString(((Element) object).id()); // hack
- else if (object instanceof ScriptGraphTraversal)
- return ((ScriptGraphTraversal) object).getTraversalScript();
- else
- return null == object ? "null" : object.toString();
- }
-
- private static 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/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
deleted file mode 100644
index 882c6fc..0000000
--- a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
+++ /dev/null
@@ -1,377 +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.process.variant.python
-
-import org.apache.tinkerpop.gremlin.process.computer.Computer
-import org.apache.tinkerpop.gremlin.process.traversal.Operator
-import org.apache.tinkerpop.gremlin.process.traversal.Order
-import org.apache.tinkerpop.gremlin.process.traversal.P
-import org.apache.tinkerpop.gremlin.process.traversal.Pop
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions
-import org.apache.tinkerpop.gremlin.process.traversal.Scope
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy
-import org.apache.tinkerpop.gremlin.structure.Column
-import org.apache.tinkerpop.gremlin.structure.Direction
-import org.apache.tinkerpop.gremlin.structure.T
-import org.apache.tinkerpop.gremlin.structure.VertexProperty
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-class GremlinPythonGenerator {
-
- public static void create(final String gremlinPythonFile) {
-
- final StringBuilder pythonClass = new StringBuilder()
-
- pythonClass.append("""'''
-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.
-'''
-""")
-
- final Map<String, String> methodMap = [global: "_global", as: "_as", in: "_in", and: "_and", or: "_or", is: "_is", not: "_not", from: "_from"]
- .withDefault { it }
- final Map<String, String> invertedMethodMap = [:].withDefault { it };
- methodMap.entrySet().forEach { invertedMethodMap.put(it.value, it.key) }
-
- final List<String> NO_QUOTE = [VertexProperty.Cardinality, Column, Direction, Operator, Order, P, Pop, Scope, SackFunctions.Barrier, T,
- ReadOnlyStrategy, Computer]
- .collect { it.getSimpleName() }.unique().sort { a, b -> a <=> b };
- final Map<String, String> enumMap = [Cardinality: "VertexProperty.Cardinality", Barrier: "SackFunctions.Barrier"]
- .withDefault { it }
-
- pythonClass.append("from collections import OrderedDict\n")
- pythonClass.append("import inspect\n\n")
- pythonClass.append("statics = OrderedDict()\n\n")
- pythonClass.append("""
-class B(object):
- def __init__(self, symbol, value="~empty"):
- self.symbol = symbol
- if value == "~empty":
- self.value = inspect.currentframe().f_back.f_locals[symbol]
- else:
- self.value = value
- def __repr__(self):
- return self.symbol
-
-class Helper(object):
- @staticmethod
- def stringOrObject(arg):
- if (type(arg) is str and
-""")
- NO_QUOTE.forEach { pythonClass.append(" not(arg.startswith(\"${enumMap[it]}.\")) and\n") }
- pythonClass.append(" not(len(arg)==0)):\n")
- pythonClass.append(""" return "\\"" + arg + "\\""
- elif type(arg) is bool:
- return str(arg).lower()
- elif type(arg) is long:
- return str(arg) + "L"
- elif type(arg) is float:
- return str(arg) + "f"
- else:
- return str(arg)
- @staticmethod
- def stringify(*args):
- if len(args) == 0:
- return ""
- elif len(args) == 1:
- return Helper.stringOrObject(args[0])
- else:
- return ", ".join(Helper.stringOrObject(i) for i in args)
-""").append("\n\n");
-
-//////////////////////////
-// GraphTraversalSource //
-//////////////////////////
- pythonClass.append(
- """class PythonGraphTraversalSource(object):
- def __init__(self, traversal_source_string, remote_connection=None):
- self.traversal_source_string = traversal_source_string
- self.remote_connection = remote_connection
- def __repr__(self):
- if self.remote_connection is None:
- return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
- else:
- return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
-""")
- GraphTraversalSource.getMethods()
- .collect { it.name }
- .unique()
- .sort { a, b -> a <=> b }
- .each { method ->
- final Class<?> returnType = (GraphTraversalSource.getMethods() as Set).findAll {
- it.name.equals(method)
- }.collect {
- it.returnType
- }[0]
- if (null != returnType) {
- if (Traversal.isAssignableFrom(returnType)) {
- pythonClass.append(
- """ def ${method}(self, *args):
- return PythonGraphTraversal(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
-""")
- } else if (TraversalSource.isAssignableFrom(returnType)) {
- pythonClass.append(
- """ def ${method}(self, *args):
- return PythonGraphTraversalSource(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
-""")
- }
- }
- }
- pythonClass.append("\n\n")
-
-////////////////////
-// GraphTraversal //
-////////////////////
- pythonClass.append(
- """class PythonGraphTraversal(object):
- def __init__(self, traversal_string, remote_connection=None):
- self.traversal_string = traversal_string
- self.remote_connection = remote_connection
- self.results = None
- self.last_traverser = None
- self.bindings = {}
- def __repr__(self):
- return self.traversal_string
- def __getitem__(self,index):
- if type(index) is int:
- return self.range(index,index+1)
- elif type(index) is slice:
- return self.range(index.start,index.stop)
- else:
- raise TypeError("Index must be int or slice")
- def __getattr__(self,key):
- return self.values(key)
- def __iter__(self):
- return self
- def toList(self):
- return list(iter(self))
- def next(self):
- if self.results is None:
- self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
- if self.last_traverser is None:
- self.last_traverser = self.results.next()
- object = self.last_traverser.object
- self.last_traverser.bulk = self.last_traverser.bulk - 1
- if self.last_traverser.bulk <= 0:
- self.last_traverser = None
- return object
-""")
- GraphTraversal.getMethods()
- .collect { methodMap[it.name] }
- .unique()
- .sort { a, b -> a <=> b }
- .each { method ->
- final Class<?> returnType = (GraphTraversal.getMethods() as Set).findAll {
- it.name.equals(invertedMethodMap[method])
- }.collect { it.returnType }[0]
- if (null != returnType && Traversal.isAssignableFrom(returnType)) {
- pythonClass.append(
- """ def ${method}(self, *args):
- self.traversal_string = self.traversal_string + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
- for arg in args:
- if type(arg) is B:
- self.bindings[arg.symbol] = arg.value
- return self
-""")
- }
- };
- pythonClass.append("\n\n")
-
-////////////////////////
-// AnonymousTraversal //
-////////////////////////
- pythonClass.append("class __(object):\n");
- __.getMethods()
- .findAll { Traversal.isAssignableFrom(it.returnType) }
- .collect { methodMap[it.name] }
- .unique()
- .sort { a, b -> a <=> b }
- .each { method ->
- pythonClass.append(
- """ @staticmethod
- def ${method}(*args):
- return PythonGraphTraversal("__").${method}(*args)
-""")
- };
- pythonClass.append("\n\n")
-
- __.class.getMethods()
- .findAll { Traversal.class.isAssignableFrom(it.getReturnType()) }
- .findAll { !it.name.equals("__") }
- .collect { methodMap[it.name] }
- .unique()
- .sort { a, b -> a <=> b }
- .forEach {
- pythonClass.append("def ${it}(*args):\n").append(" return __.${it}(*args)\n\n")
- pythonClass.append("statics['${it}'] = ${it}\n")
- }
- pythonClass.append("\n\n")
-
-///////////
-// Enums //
-///////////
- pythonClass.append("class Cardinality(object):\n");
- VertexProperty.Cardinality.values().each { value ->
- pythonClass.append(" ${value} = \"VertexProperty.Cardinality.${value}\"\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("class Column(object):\n");
- Column.values().each { value ->
- pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Column.values().each { value ->
- pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("class Direction(object):\n");
- Direction.values().each { value ->
- pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Direction.values().each { value ->
- pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("class Operator(object):\n");
- Operator.values().each { value ->
- pythonClass.append(" ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Operator.values().each { value ->
- pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("class Order(object):\n");
- Order.values().each { value ->
- pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Order.values().each { value ->
- pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
- }
- pythonClass.append("\n");
- //////////////
-
- pythonClass.append("""class P(object):
- def __init__(self, pString):
- self.pString = pString
- def __repr__(self):
- return self.pString
-""")
- P.getMethods()
- .findAll { P.class.isAssignableFrom(it.returnType) }
- .findAll { !it.name.equals("or") && !it.name.equals("and") }
- .collect { methodMap[it.name] }
- .unique()
- .sort { a, b -> a <=> b }
- .each { method ->
- pythonClass.append(
- """ @staticmethod
- def ${method}(*args):
- return P("P.${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")")
-""")
- };
- pythonClass.append(""" def _and(self, arg):
- return P(self.pString + ".and(" + Helper.stringify(arg) + ")")
- def _or(self, arg):
- return P(self.pString + ".or(" + Helper.stringify(arg) + ")")
-""")
- pythonClass.append("\n")
- P.class.getMethods()
- .findAll { P.class.isAssignableFrom(it.getReturnType()) }
- .collect { methodMap[it.name] }
- .unique()
- .sort { a, b -> a <=> b }
- .forEach {
- pythonClass.append("def ${it}(*args):\n").append(" return P.${it}(*args)\n\n")
- pythonClass.append("statics['${it}'] = ${it}\n")
- }
- pythonClass.append("\n")
- //////////////
- pythonClass.append("class Pop(object):\n");
- Pop.values().each { value ->
- pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Pop.values().each { value ->
- pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value.name()}\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("""class Barrier(object):
- normSack = "SackFunctions.Barrier.normSack"
-""");
- pythonClass.append("\n")
- pythonClass.append("statics['normSack'] = Barrier.normSack\n\n")
- //////////////
- pythonClass.append("class Scope(object):\n");
- Scope.values().each { value ->
- pythonClass.append(" ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- Scope.values().each { value ->
- pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
- }
- pythonClass.append("\n");
- //////////////
- pythonClass.append("class T(object):\n");
- T.values().each { value ->
- pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
- }
- pythonClass.append("\n");
- T.values().each { value ->
- pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
- }
- pythonClass.append("\n");
-
- pythonClass.append("statics = OrderedDict(reversed(list(statics.items())))\n")
-
-// save to a python file
- final File file = new File(gremlinPythonFile);
- file.delete()
- pythonClass.eachLine { file.append(it + "\n") }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
new file mode 100644
index 0000000..f35c888
--- /dev/null
+++ b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
@@ -0,0 +1,377 @@
+/*
+ * 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.python
+
+import org.apache.tinkerpop.gremlin.process.computer.Computer
+import org.apache.tinkerpop.gremlin.process.traversal.Operator
+import org.apache.tinkerpop.gremlin.process.traversal.Order
+import org.apache.tinkerpop.gremlin.process.traversal.P
+import org.apache.tinkerpop.gremlin.process.traversal.Pop
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy
+import org.apache.tinkerpop.gremlin.structure.Column
+import org.apache.tinkerpop.gremlin.structure.Direction
+import org.apache.tinkerpop.gremlin.structure.T
+import org.apache.tinkerpop.gremlin.structure.VertexProperty
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+class GremlinPythonGenerator {
+
+ public static void create(final String gremlinPythonFile) {
+
+ final StringBuilder pythonClass = new StringBuilder()
+
+ pythonClass.append("""'''
+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.
+'''
+""")
+
+ final Map<String, String> methodMap = [global: "_global", as: "_as", in: "_in", and: "_and", or: "_or", is: "_is", not: "_not", from: "_from"]
+ .withDefault { it }
+ final Map<String, String> invertedMethodMap = [:].withDefault { it };
+ methodMap.entrySet().forEach { invertedMethodMap.put(it.value, it.key) }
+
+ final List<String> NO_QUOTE = [VertexProperty.Cardinality, Column, Direction, Operator, Order, P, Pop, Scope, SackFunctions.Barrier, T,
+ ReadOnlyStrategy, Computer]
+ .collect { it.getSimpleName() }.unique().sort { a, b -> a <=> b };
+ final Map<String, String> enumMap = [Cardinality: "VertexProperty.Cardinality", Barrier: "SackFunctions.Barrier"]
+ .withDefault { it }
+
+ pythonClass.append("from collections import OrderedDict\n")
+ pythonClass.append("import inspect\n\n")
+ pythonClass.append("statics = OrderedDict()\n\n")
+ pythonClass.append("""
+class B(object):
+ def __init__(self, symbol, value="~empty"):
+ self.symbol = symbol
+ if value == "~empty":
+ self.value = inspect.currentframe().f_back.f_locals[symbol]
+ else:
+ self.value = value
+ def __repr__(self):
+ return self.symbol
+
+class Helper(object):
+ @staticmethod
+ def stringOrObject(arg):
+ if (type(arg) is str and
+""")
+ NO_QUOTE.forEach { pythonClass.append(" not(arg.startswith(\"${enumMap[it]}.\")) and\n") }
+ pythonClass.append(" not(len(arg)==0)):\n")
+ pythonClass.append(""" return "\\"" + arg + "\\""
+ elif type(arg) is bool:
+ return str(arg).lower()
+ elif type(arg) is long:
+ return str(arg) + "L"
+ elif type(arg) is float:
+ return str(arg) + "f"
+ else:
+ return str(arg)
+ @staticmethod
+ def stringify(*args):
+ if len(args) == 0:
+ return ""
+ elif len(args) == 1:
+ return Helper.stringOrObject(args[0])
+ else:
+ return ", ".join(Helper.stringOrObject(i) for i in args)
+""").append("\n\n");
+
+//////////////////////////
+// GraphTraversalSource //
+//////////////////////////
+ pythonClass.append(
+ """class PythonGraphTraversalSource(object):
+ def __init__(self, traversal_source_string, remote_connection=None):
+ self.traversal_source_string = traversal_source_string
+ self.remote_connection = remote_connection
+ def __repr__(self):
+ if self.remote_connection is None:
+ return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
+ else:
+ return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
+""")
+ GraphTraversalSource.getMethods()
+ .collect { it.name }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .each { method ->
+ final Class<?> returnType = (GraphTraversalSource.getMethods() as Set).findAll {
+ it.name.equals(method)
+ }.collect {
+ it.returnType
+ }[0]
+ if (null != returnType) {
+ if (Traversal.isAssignableFrom(returnType)) {
+ pythonClass.append(
+ """ def ${method}(self, *args):
+ return PythonGraphTraversal(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
+""")
+ } else if (TraversalSource.isAssignableFrom(returnType)) {
+ pythonClass.append(
+ """ def ${method}(self, *args):
+ return PythonGraphTraversalSource(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
+""")
+ }
+ }
+ }
+ pythonClass.append("\n\n")
+
+////////////////////
+// GraphTraversal //
+////////////////////
+ pythonClass.append(
+ """class PythonGraphTraversal(object):
+ def __init__(self, traversal_string, remote_connection=None):
+ self.traversal_string = traversal_string
+ self.remote_connection = remote_connection
+ self.results = None
+ self.last_traverser = None
+ self.bindings = {}
+ def __repr__(self):
+ return self.traversal_string
+ def __getitem__(self,index):
+ if type(index) is int:
+ return self.range(index,index+1)
+ elif type(index) is slice:
+ return self.range(index.start,index.stop)
+ else:
+ raise TypeError("Index must be int or slice")
+ def __getattr__(self,key):
+ return self.values(key)
+ def __iter__(self):
+ return self
+ def toList(self):
+ return list(iter(self))
+ def next(self):
+ if self.results is None:
+ self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
+ if self.last_traverser is None:
+ self.last_traverser = self.results.next()
+ object = self.last_traverser.object
+ self.last_traverser.bulk = self.last_traverser.bulk - 1
+ if self.last_traverser.bulk <= 0:
+ self.last_traverser = None
+ return object
+""")
+ GraphTraversal.getMethods()
+ .collect { methodMap[it.name] }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .each { method ->
+ final Class<?> returnType = (GraphTraversal.getMethods() as Set).findAll {
+ it.name.equals(invertedMethodMap[method])
+ }.collect { it.returnType }[0]
+ if (null != returnType && Traversal.isAssignableFrom(returnType)) {
+ pythonClass.append(
+ """ def ${method}(self, *args):
+ self.traversal_string = self.traversal_string + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
+ for arg in args:
+ if type(arg) is B:
+ self.bindings[arg.symbol] = arg.value
+ return self
+""")
+ }
+ };
+ pythonClass.append("\n\n")
+
+////////////////////////
+// AnonymousTraversal //
+////////////////////////
+ pythonClass.append("class __(object):\n");
+ __.getMethods()
+ .findAll { Traversal.isAssignableFrom(it.returnType) }
+ .collect { methodMap[it.name] }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .each { method ->
+ pythonClass.append(
+ """ @staticmethod
+ def ${method}(*args):
+ return PythonGraphTraversal("__").${method}(*args)
+""")
+ };
+ pythonClass.append("\n\n")
+
+ __.class.getMethods()
+ .findAll { Traversal.class.isAssignableFrom(it.getReturnType()) }
+ .findAll { !it.name.equals("__") }
+ .collect { methodMap[it.name] }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .forEach {
+ pythonClass.append("def ${it}(*args):\n").append(" return __.${it}(*args)\n\n")
+ pythonClass.append("statics['${it}'] = ${it}\n")
+ }
+ pythonClass.append("\n\n")
+
+///////////
+// Enums //
+///////////
+ pythonClass.append("class Cardinality(object):\n");
+ VertexProperty.Cardinality.values().each { value ->
+ pythonClass.append(" ${value} = \"VertexProperty.Cardinality.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("class Column(object):\n");
+ Column.values().each { value ->
+ pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Column.values().each { value ->
+ pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("class Direction(object):\n");
+ Direction.values().each { value ->
+ pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Direction.values().each { value ->
+ pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("class Operator(object):\n");
+ Operator.values().each { value ->
+ pythonClass.append(" ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Operator.values().each { value ->
+ pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("class Order(object):\n");
+ Order.values().each { value ->
+ pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Order.values().each { value ->
+ pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+
+ pythonClass.append("""class P(object):
+ def __init__(self, pString):
+ self.pString = pString
+ def __repr__(self):
+ return self.pString
+""")
+ P.getMethods()
+ .findAll { P.class.isAssignableFrom(it.returnType) }
+ .findAll { !it.name.equals("or") && !it.name.equals("and") }
+ .collect { methodMap[it.name] }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .each { method ->
+ pythonClass.append(
+ """ @staticmethod
+ def ${method}(*args):
+ return P("P.${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")")
+""")
+ };
+ pythonClass.append(""" def _and(self, arg):
+ return P(self.pString + ".and(" + Helper.stringify(arg) + ")")
+ def _or(self, arg):
+ return P(self.pString + ".or(" + Helper.stringify(arg) + ")")
+""")
+ pythonClass.append("\n")
+ P.class.getMethods()
+ .findAll { P.class.isAssignableFrom(it.getReturnType()) }
+ .collect { methodMap[it.name] }
+ .unique()
+ .sort { a, b -> a <=> b }
+ .forEach {
+ pythonClass.append("def ${it}(*args):\n").append(" return P.${it}(*args)\n\n")
+ pythonClass.append("statics['${it}'] = ${it}\n")
+ }
+ pythonClass.append("\n")
+ //////////////
+ pythonClass.append("class Pop(object):\n");
+ Pop.values().each { value ->
+ pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Pop.values().each { value ->
+ pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value.name()}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("""class Barrier(object):
+ normSack = "SackFunctions.Barrier.normSack"
+""");
+ pythonClass.append("\n")
+ pythonClass.append("statics['normSack'] = Barrier.normSack\n\n")
+ //////////////
+ pythonClass.append("class Scope(object):\n");
+ Scope.values().each { value ->
+ pythonClass.append(" ${methodMap[value.name()]} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ Scope.values().each { value ->
+ pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
+ }
+ pythonClass.append("\n");
+ //////////////
+ pythonClass.append("class T(object):\n");
+ T.values().each { value ->
+ pythonClass.append(" ${value} = \"${value.getDeclaringClass().getSimpleName()}.${value}\"\n");
+ }
+ pythonClass.append("\n");
+ T.values().each { value ->
+ pythonClass.append("statics['${value}'] = ${value.getDeclaringClass().getSimpleName()}.${value}\n");
+ }
+ pythonClass.append("\n");
+
+ pythonClass.append("statics = OrderedDict(reversed(list(statics.items())))\n")
+
+// save to a python file
+ final File file = new File(gremlinPythonFile);
+ file.delete()
+ pythonClass.eachLine { file.append(it + "\n") }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
deleted file mode 100644
index 3a0dbee..0000000
--- a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
+++ /dev/null
@@ -1,258 +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.process.variant.python;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
-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.process.traversal.util.Translator;
-import org.apache.tinkerpop.gremlin.structure.Column;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import javax.script.Bindings;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PythonTranslator implements Translator<GraphTraversal> {
-
- private static boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
- private static ScriptEngine JYTHON_ENGINE;
- private static boolean IMPORT_STATICS = false;
- ////
- private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
- private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
- private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
- .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
- .map(arg -> ((Enum) arg).name())
- .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
-
- static {
- if (isTesting) {
- IMPORT_STATICS = new Random().nextBoolean();
- try {
- final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
- final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
- final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
- final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
- GremlinPythonGenerator.create(gremlinPythonModuleName);
- JYTHON_ENGINE = ScriptEngineCache.get("jython");
- JYTHON_ENGINE.eval("import sys");
- JYTHON_ENGINE.eval("sys.path.append('" + gremlinPythonPackageName + "')");
- JYTHON_ENGINE.eval("sys.path.append('" + gremlinDriverPackageName + "')");
- JYTHON_ENGINE.eval("from gremlin_python import *");
- JYTHON_ENGINE.eval("from gremlin_python import __");
- if (IMPORT_STATICS)
- JYTHON_ENGINE.eval("for k in statics:\n globals()[k] = statics[k]");
- } catch (final ScriptException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
- }
-
- private StringBuilder traversalScript;
- private final String alias;
- private final String scriptEngine;
-
- public PythonTranslator(final String scriptEngine, final String alias) {
- this.scriptEngine = scriptEngine;
- this.alias = alias;
- this.traversalScript = new StringBuilder(this.alias);
- }
-
- @Override
- public String getAlias() {
- return this.alias;
- }
-
- @Override
- public String getScriptEngine() {
- return this.scriptEngine;
- }
-
- @Override
- public GraphTraversal __() {
- return new ScriptGraphTraversal(EmptyGraph.instance(), new PythonTranslator(this.scriptEngine, "__"));
- }
-
- @Override
- public String getTraversalScript() {
- if (isTesting && !this.alias.equals("__")) {
- try {
- if (traversalScript.toString().contains("$"))
- throw new VerificationException("Lambdas are currently not supported: " + this.traversalScript.toString(), EmptyTraversal.instance());
-
- final Bindings jythonBindings = new SimpleBindings();
- jythonBindings.put(this.alias, JYTHON_ENGINE.eval("PythonGraphTraversalSource(\"" + this.alias + "\", None)"));
- JYTHON_ENGINE.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
- return JYTHON_ENGINE.eval(this.traversalScript.toString()).toString();
- } catch (final ScriptException e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- } else {
- return this.traversalScript.toString();
- }
- }
-
- @Override
- public void addStep(final String stepName, final Object... arguments) {
- // flatten the arguments into a single array
- final Object[] objects = Stream.of(arguments)
- .flatMap(arg ->
- IteratorUtils.stream(arg instanceof Object[] ?
- new ArrayIterator<>((Object[]) arg) :
- IteratorUtils.of(arg)))
- .toArray();
- if (objects.length == 0)
- this.traversalScript.append(".").append(convertStepName(stepName)).append("()");
- else if (stepName.equals("range") && 2 == objects.length)
- this.traversalScript.append("[").append(objects[0]).append(":").append(objects[1]).append("]");
- else if (stepName.equals("limit") && 1 == objects.length)
- this.traversalScript.append("[0:").append(objects[0]).append("]");
- else if (stepName.equals("values") && 1 == objects.length && !traversalScript.toString().equals("__") && !STEP_NAMES.contains(objects[0].toString()))
- this.traversalScript.append(".").append(objects[0]);
- else {
- this.traversalScript.append(".");
- String temp = convertStepName(stepName) + "(";
- for (final Object object : objects) {
- temp = temp + convertToString(object) + ",";
- }
- this.traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
- }
- if (IMPORT_STATICS && this.traversalScript.toString().startsWith("__.")
- && !NO_STATIC.stream().filter(name -> this.traversalScript.toString().contains(name)).findAny().isPresent())
- traversalScript.delete(0, 3);
- if (isTesting && !IMPORT_STATICS)
- assert this.traversalScript.toString().startsWith(this.alias + ".");
- }
-
- @Override
- public PythonTranslator clone() {
- try {
- final PythonTranslator clone = (PythonTranslator) super.clone();
- clone.traversalScript = new StringBuilder(this.traversalScript);
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- ///////
-
- private static String convertToString(final Object object) {
- if (object instanceof String)
- return "\"" + object + "\"";
- else if (object instanceof List) {
- final List list = new ArrayList<>(((List) object).size());
- for (final Object item : (List) object) {
- list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
- }
- return list.toString();
- } else if (object instanceof Long)
- return object + "L";
- else if (object instanceof Class)
- return ((Class) object).getCanonicalName();
- else if (object instanceof SackFunctions.Barrier)
- return convertStatic("Barrier.") + object.toString();
- else if (object instanceof VertexProperty.Cardinality)
- return "Cardinality." + object.toString();
- else if (object instanceof Direction)
- return convertStatic("Direction.") + object.toString();
- else if (object instanceof Operator)
- return convertStatic("Operator.") + convertStepName(object.toString()); // to catch and/or
- else if (object instanceof Pop)
- return convertStatic("Pop.") + object.toString();
- else if (object instanceof Column)
- return convertStatic("Column.") + object.toString();
- else if (object instanceof P)
- return convertPToString((P) object, new StringBuilder()).toString();
- else if (object instanceof T)
- return convertStatic("T.") + object.toString();
- else if (object instanceof Order)
- return convertStatic("Order.") + object.toString();
- else if (object instanceof Scope)
- return convertStatic("Scope.") + convertStepName(object.toString()); // to catch global
- else if (object instanceof Element)
- return convertToString(((Element) object).id()); // hack
- else if (object instanceof ScriptGraphTraversal)
- return ((ScriptGraphTraversal) object).getTraversalScript().toString();
- else if (object instanceof Boolean)
- return object.equals(Boolean.TRUE) ? "True" : "False";
- else
- return null == object ? "" : object.toString();
- }
-
- private static String convertStatic(final String name) {
- return IMPORT_STATICS ? "" : name;
- }
-
- private static String convertStepName(final String stepName) {
- if (PREFIX_NAMES.contains(stepName))
- return "_" + stepName;
- else
- return stepName;
- }
-
- private static 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(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
- return current;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
new file mode 100644
index 0000000..9344ecc
--- /dev/null
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
@@ -0,0 +1,222 @@
+/*
+ * 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.python;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+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.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PythonTranslator implements Translator<GraphTraversal> {
+
+ private static boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
+ ////
+ private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
+ private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
+ private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
+ .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
+ .map(arg -> ((Enum) arg).name())
+ .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
+
+ private StringBuilder traversalScript;
+ private final String alias;
+ private final String scriptEngine;
+ private final boolean importStatics;
+
+ public PythonTranslator(final String scriptEngine, final String alias, final boolean importStatics) {
+ this.scriptEngine = scriptEngine;
+ this.alias = alias;
+ this.traversalScript = new StringBuilder(this.alias);
+ this.importStatics = importStatics;
+ }
+
+ public static PythonTranslator of(final String scriptEngine, final String alias) {
+ return new PythonTranslator(scriptEngine, alias, false);
+ }
+
+ public static PythonTranslator of(final String scriptEngine, final String alias, final boolean importStatics) {
+ return new PythonTranslator(scriptEngine, alias, importStatics);
+ }
+
+ @Override
+ public String getAlias() {
+ return this.alias;
+ }
+
+ @Override
+ public String getScriptEngine() {
+ return this.scriptEngine;
+ }
+
+ @Override
+ public GraphTraversal __() {
+ return new ScriptGraphTraversal(EmptyGraph.instance(), new PythonTranslator(this.scriptEngine, "__", this.importStatics));
+ }
+
+ @Override
+ public String getTraversalScript() {
+ final String traversal = this.traversalScript.toString();
+ if (traversal.contains("$"))
+ throw new VerificationException("Lambdas are currently not supported: " + traversal, EmptyTraversal.instance());
+
+ if (isTesting && !this.alias.equals("__")) {
+ try {
+ final ScriptEngine jythonEngine = ScriptEngineCache.get("jython");
+ final Bindings jythonBindings = new SimpleBindings();
+ jythonBindings.put(this.alias, jythonEngine.eval("PythonGraphTraversalSource(\"" + this.alias + "\", None)"));
+ jythonEngine.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
+ return jythonEngine.eval(traversal).toString();
+ } catch (final ScriptException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ } else
+ return traversal;
+ }
+
+ @Override
+ public void addStep(final String stepName, final Object... arguments) {
+ // flatten the arguments into a single array
+ final List<Object> objects = TranslatorHelper.flattenArguments(arguments);
+ final int size = objects.size();
+ if (0 == size)
+ this.traversalScript.append(".").append(convertStepName(stepName)).append("()");
+ else if (stepName.equals("range") && 2 == size)
+ this.traversalScript.append("[").append(objects.get(0)).append(":").append(objects.get(1)).append("]");
+ else if (stepName.equals("limit") && 1 == size)
+ this.traversalScript.append("[0:").append(objects.get(0)).append("]");
+ else if (stepName.equals("values") && 1 == size && traversalScript.length() > 3 && !STEP_NAMES.contains(objects.get(0).toString()))
+ this.traversalScript.append(".").append(objects.get(0));
+ else {
+ this.traversalScript.append(".");
+ String temp = convertStepName(stepName) + "(";
+ for (final Object object : objects) {
+ temp = temp + convertToString(object) + ",";
+ }
+ this.traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
+ }
+
+ // clip off __.
+ if (this.importStatics && this.traversalScript.substring(0, 3).startsWith("__.")
+ && !NO_STATIC.stream().filter(name -> this.traversalScript.substring(3).startsWith(convertStepName(name))).findAny().isPresent()) {
+ this.traversalScript.delete(0, 3);
+ }
+ if (isTesting && !this.importStatics)
+ assert this.traversalScript.toString().startsWith(this.alias + ".");
+ }
+
+ @Override
+ public PythonTranslator clone() {
+ try {
+ final PythonTranslator clone = (PythonTranslator) super.clone();
+ clone.traversalScript = new StringBuilder(this.traversalScript);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ ///////
+
+ 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 Class)
+ return ((Class) object).getCanonicalName();
+ else if (object instanceof VertexProperty.Cardinality)
+ return "Cardinality." + object.toString();
+ else if (object instanceof Enum)
+ return convertStatic(((Enum) object).getDeclaringClass().getSimpleName() + ".") + convertStepName(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 ScriptGraphTraversal)
+ return ((ScriptGraphTraversal) object).getTraversalScript().toString();
+ else if (object instanceof Boolean)
+ return object.equals(Boolean.TRUE) ? "True" : "False";
+ else
+ return null == object ? "" : object.toString();
+ }
+
+ private String convertStatic(final String name) {
+ return this.importStatics ? "" : name;
+ }
+
+ private String convertStepName(final String stepName) {
+ if (PREFIX_NAMES.contains(stepName))
+ return "_" + stepName;
+ else
+ return stepName;
+ }
+
+ 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(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+ return current;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
new file mode 100644
index 0000000..1774d1a
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/VariantGraphProvider.java
@@ -0,0 +1,137 @@
+/*
+ * 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;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.AbstractGraphProvider;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionComputerTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProgramTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerElement;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraphVariables;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerProperty;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertexProperty;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class VariantGraphProvider extends AbstractGraphProvider {
+
+ private static Set<String> SKIP_TESTS = new HashSet<>(Arrays.asList(
+ "testProfileStrategyCallback",
+ "testProfileStrategyCallbackSideEffect",
+ "g_withSideEffectXa_g_VX2XX_VX1X_out_whereXneqXaXX",
+ "g_withSackXBigInteger_TEN_powX1000X_assignX_V_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack",
+ "g_withSideEffectXa_setX_V_both_name_storeXaX_capXaX",
+ "shouldSupportJobChaining",
+ InjectTest.Traversals.class.getCanonicalName(),
+ ProgramTest.Traversals.class.getCanonicalName(),
+ CoreTraversalTest.class.getCanonicalName(),
+ TraversalInterruptionTest.class.getCanonicalName(),
+ TraversalInterruptionComputerTest.class.getCanonicalName(),
+ ElementIdStrategyProcessTest.class.getCanonicalName(),
+ EventStrategyProcessTest.class.getCanonicalName(),
+ ReadOnlyStrategyProcessTest.class.getCanonicalName(),
+ PartitionStrategyProcessTest.class.getCanonicalName(),
+ SubgraphStrategyProcessTest.class.getCanonicalName()));
+
+ private static final Set<Class> IMPLEMENTATION = new HashSet<Class>() {{
+ add(TinkerEdge.class);
+ add(TinkerElement.class);
+ add(TinkerGraph.class);
+ add(TinkerGraphVariables.class);
+ add(TinkerProperty.class);
+ add(TinkerVertex.class);
+ add(TinkerVertexProperty.class);
+ }};
+
+ @Override
+ public Map<String, Object> getBaseConfiguration(final String graphName, final Class<?> test, final String testMethodName,
+ final LoadGraphWith.GraphData loadGraphWith) {
+
+ final TinkerGraph.DefaultIdManager idManager = selectIdMakerFromGraphData(loadGraphWith);
+ final String idMaker = (idManager.equals(TinkerGraph.DefaultIdManager.ANY) ? selectIdMakerFromGraphData(loadGraphWith) : idManager).name();
+ return new HashMap<String, Object>() {{
+ put(Graph.GRAPH, TinkerGraph.class.getName());
+ put(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, idMaker);
+ put(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, idMaker);
+ put(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, idMaker);
+ put("skipTest", SKIP_TESTS.contains(testMethodName) || SKIP_TESTS.contains(test.getCanonicalName()));
+ if (loadGraphWith == LoadGraphWith.GraphData.CREW)
+ put(TinkerGraph.GREMLIN_TINKERGRAPH_DEFAULT_VERTEX_PROPERTY_CARDINALITY, VertexProperty.Cardinality.list.name());
+ }};
+ }
+
+ @Override
+ public void clear(final Graph graph, final Configuration configuration) throws Exception {
+ if (graph != null)
+ graph.close();
+
+ // in the even the graph is persisted we need to clean up
+ final String graphLocation = configuration.getString(TinkerGraph.GREMLIN_TINKERGRAPH_GRAPH_LOCATION, null);
+ if (graphLocation != null) {
+ final File f = new File(graphLocation);
+ f.delete();
+ }
+ }
+
+ @Override
+ public Set<Class> getImplementations() {
+ return IMPLEMENTATION;
+ }
+
+ /**
+ * Test that load with specific graph data can be configured with a specific id manager as the data type to
+ * be used in the test for that graph is known.
+ */
+ protected TinkerGraph.DefaultIdManager selectIdMakerFromGraphData(final LoadGraphWith.GraphData loadGraphWith) {
+ if (null == loadGraphWith) return TinkerGraph.DefaultIdManager.ANY;
+ if (loadGraphWith.equals(LoadGraphWith.GraphData.CLASSIC))
+ return TinkerGraph.DefaultIdManager.INTEGER;
+ else if (loadGraphWith.equals(LoadGraphWith.GraphData.MODERN))
+ return TinkerGraph.DefaultIdManager.INTEGER;
+ else if (loadGraphWith.equals(LoadGraphWith.GraphData.CREW))
+ return TinkerGraph.DefaultIdManager.INTEGER;
+ else if (loadGraphWith.equals(LoadGraphWith.GraphData.GRATEFUL))
+ return TinkerGraph.DefaultIdManager.INTEGER;
+ else
+ throw new IllegalStateException(String.format("Need to define a new %s for %s", TinkerGraph.IdManager.class.getName(), loadGraphWith.name()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/97b12a40/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
new file mode 100644
index 0000000..e8e58d5
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/groovy/GroovyComputerProvider.java
@@ -0,0 +1,37 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.GraphProvider;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@GraphProvider.Descriptor(computer = TinkerGraphComputer.class)
+public class GroovyComputerProvider extends GroovyProvider {
+
+ @Override
+ public GraphTraversalSource traversal(final Graph graph) {
+ return super.traversal(graph).withComputer();
+ }
+}