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/16 17:13:52 UTC

tinkerpop git commit: created PythonBypassTranslator which is used only for testing which will use Jython to compile the traverasl to Groovy and then use the GroovyTranslator to execute it. This is because we don't have gremlin-jython as a real ScriptEng

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 f5925e79b -> 65a1ed9d8


created PythonBypassTranslator which is used only for testing which will use Jython to compile the traverasl to Groovy and then use the GroovyTranslator to execute it. This is because we don't have gremlin-jython as a real ScriptEngine with loaded Gremlin classes/etc.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/65a1ed9d
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/65a1ed9d
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/65a1ed9d

Branch: refs/heads/TINKERPOP-1278
Commit: 65a1ed9d8f6af697bd2bb84ca8172b0d6d7cf2e7
Parents: f5925e7
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 16 11:13:32 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 16 11:13:47 2016 -0600

----------------------------------------------------------------------
 .../gremlin/python/PythonTranslator.java        | 51 ++++---------
 .../gremlin/python/PythonBypassTranslator.java  | 78 ++++++++++++++++++++
 .../gremlin/python/PythonProvider.java          | 25 +++----
 3 files changed, 105 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65a1ed9d/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
index 5ef9398..b220d80 100644
--- 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
@@ -22,6 +22,7 @@ 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.P;
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
 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.strategy.creation.TranslationStrategy;
@@ -34,15 +35,9 @@ 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.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;
@@ -55,10 +50,8 @@ import java.util.stream.Stream;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class PythonTranslator implements Translator {
+public class PythonTranslator implements Translator {
 
-    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())
@@ -66,24 +59,22 @@ public final class PythonTranslator implements Translator {
             .map(arg -> ((Enum) arg).name())
             .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
 
-    private StringBuilder traversalScript;
-    private String alias;
-    private final String scriptEngine;
-    private final boolean importStatics;
+    protected StringBuilder traversalScript;
+    protected String alias;
+    protected final boolean importStatics;
 
-    private PythonTranslator(final String scriptEngine, final String alias, final boolean importStatics) {
-        this.scriptEngine = scriptEngine;
+    PythonTranslator(final String alias, final boolean importStatics) {
         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 alias) {
+        return new PythonTranslator(alias, false);
     }
 
-    public static PythonTranslator of(final String scriptEngine, final String alias, final boolean importStatics) {
-        return new PythonTranslator(scriptEngine, alias, importStatics);
+    public static PythonTranslator of(final String alias, final boolean importStatics) {
+        return new PythonTranslator(alias, importStatics);
     }
 
     @Override
@@ -93,12 +84,12 @@ public final class PythonTranslator implements Translator {
 
     @Override
     public String getScriptEngine() {
-        return this.scriptEngine;
+        return "jython";
     }
 
     @Override
     public Translator getAnonymousTraversalTranslator() {
-        return new PythonTranslator(this.scriptEngine, "__", this.importStatics);
+        return new PythonTranslator("__", this.importStatics);
     }
 
     @Override
@@ -106,19 +97,7 @@ public final class PythonTranslator implements Translator {
         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(GroovyTranslator(\"" + this.alias + "\"))"));
-                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;
+        return traversal;
     }
 
     @Override
@@ -148,8 +127,6 @@ public final class PythonTranslator implements Translator {
                 && !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
@@ -180,6 +157,8 @@ public final class PythonTranslator implements Translator {
             return ((Class) object).getCanonicalName();
         else if (object instanceof VertexProperty.Cardinality)
             return "Cardinality." + object.toString();
+        else if (object instanceof SackFunctions.Barrier)
+            return "Barrier." + object.toString();
         else if (object instanceof Enum)
             return convertStatic(((Enum) object).getDeclaringClass().getSimpleName() + ".") + convertStepName(object.toString());
         else if (object instanceof P)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65a1ed9d/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
new file mode 100644
index 0000000..d8c0d7f
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
@@ -0,0 +1,78 @@
+/*
+ *  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.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+class PythonBypassTranslator extends PythonTranslator {
+
+    private PythonBypassTranslator(final String alias, final boolean importStatics) {
+        super(alias, importStatics);
+    }
+
+    public static PythonBypassTranslator of(final String alias, final boolean importStatics) {
+        return new PythonBypassTranslator(alias, importStatics);
+    }
+
+    @Override
+    public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments) {
+        super.addStep(traversal, stepName, arguments);
+        if (!this.importStatics)
+            assert this.traversalScript.toString().startsWith(this.alias + ".");
+    }
+
+    @Override
+    public Translator getAnonymousTraversalTranslator() {
+        return new PythonBypassTranslator("__", this.importStatics);
+    }
+
+    @Override
+    public String getScriptEngine() {
+        return "gremlin-groovy";
+    }
+
+    @Override
+    public String getTraversalScript() {
+        final String traversal = super.getTraversalScript();
+        if (!this.alias.equals("__")) {
+            try {
+                final ScriptEngine jythonEngine = ScriptEngineCache.get("jython");
+                final Bindings jythonBindings = new SimpleBindings();
+                jythonBindings.put(this.alias, jythonEngine.eval("PythonGraphTraversalSource(GroovyTranslator(\"" + this.alias + "\"))"));
+                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;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65a1ed9d/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
index cfbb3d1..91a4d54 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
@@ -34,7 +34,7 @@ import java.util.Random;
  */
 public class PythonProvider extends VariantGraphProvider {
 
-    private static final Random RANDOM = new Random();
+    private static final boolean IMPORT_STATICS = new Random().nextBoolean();
 
     static {
         try {
@@ -63,21 +63,20 @@ public class PythonProvider extends VariantGraphProvider {
 
     @Override
     public GraphTraversalSource traversal(final Graph graph) {
-        final boolean importStatics = RANDOM.nextBoolean();
-        try {
-            if (importStatics)
-                ScriptEngineCache.get("jython").eval("for k in statics:\n  globals()[k] = statics[k]");
-            else
-                ScriptEngineCache.get("jython").eval("for k in statics:\n  if k in globals():\n    del globals()[k]");
-        } catch (final ScriptException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-        //
         if ((Boolean) graph.configuration().getProperty("skipTest"))
             return graph.traversal();
             //throw new VerificationException("This test current does not work with Gremlin-Python", EmptyTraversal.instance());
-        else
-            return graph.traversal().withTranslator(PythonTranslator.of("gremlin-groovy", "g", importStatics));
+        else {
+            try {
+                if (IMPORT_STATICS)
+                    ScriptEngineCache.get("jython").eval("for k in statics:\n  globals()[k] = statics[k]");
+                else
+                    ScriptEngineCache.get("jython").eval("for k in statics:\n  if k in globals():\n    del globals()[k]");
+            } catch (final ScriptException e) {
+                throw new IllegalStateException(e.getMessage(), e);
+            }
+            return graph.traversal().withTranslator(PythonBypassTranslator.of("g", IMPORT_STATICS)); // the bypass translator will ensure that gremlin-groovy is ultimately used
+        }
     }
 
 }