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/02 15:24:19 UTC

incubator-tinkerpop git commit: Wrote a complex P.and().or(not(lt())) test for HasTest. Realized the GremlinPython crapped out on it. Fixed GremlinPython. Also, added PythonProcessComputerTest to verify that the computer tests work with Gremlin-Python. F

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 99834114d -> 4b355c15d


Wrote a complex P.and().or(not(lt())) test for HasTest. Realized the GremlinPython crapped out on it. Fixed GremlinPython. Also, added PythonProcessComputerTest to verify that the computer tests work with Gremlin-Python. Found an issue related to properties having the same name as steps and fixed that in the PythonVariantConverter. All in all, more good stuff.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 4b355c15dac69b11918a0ac8a82ad4cafe385acc
Parents: 9983411
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 2 09:24:10 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 2 09:24:10 2016 -0600

----------------------------------------------------------------------
 .../gremlin/process/traversal/util/AndP.java    |  4 +--
 .../gremlin/process/traversal/util/OrP.java     |  3 +-
 .../gremlin/structure/util/StringFactory.java   |  5 +++
 .../traversal/step/filter/GroovyHasTest.groovy  |  5 +++
 .../process/traversal/step/filter/HasTest.java  | 15 ++++++++
 .../python/GremlinPythonGenerator.groovy        |  6 ++--
 .../process/variant/VariantGraphProvider.java   |  6 ++++
 .../variant/python/PythonComputerProvider.java  | 36 ++++++++++++++++++++
 .../python/PythonProcessComputerTest.java       | 34 ++++++++++++++++++
 .../python/PythonProcessStandardTest.java       |  8 -----
 .../variant/python/PythonVariantConverter.java  | 26 ++++++++++++--
 .../python/gremlin-python-3.2.1-SNAPSHOT.py     | 23 +++++++------
 12 files changed, 142 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/AndP.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/AndP.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/AndP.java
index db75641..8a7784f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/AndP.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/AndP.java
@@ -19,9 +19,9 @@
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
 import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.BiPredicate;
@@ -61,7 +61,7 @@ public final class AndP<V> extends ConnectiveP<V> {
 
     @Override
     public String toString() {
-        return "and(" + this.predicates + ")";
+        return "and(" + StringFactory.removeEndBrackets(this.predicates) + ")";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/OrP.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/OrP.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/OrP.java
index e1ce7a2..8bc4387 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/OrP.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/OrP.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
 import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -61,7 +62,7 @@ public final class OrP<V> extends ConnectiveP<V> {
 
     @Override
     public String toString() {
-        return "or(" + this.predicates + ")";
+        return "or(" + StringFactory.removeEndBrackets(this.predicates) + ")";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index b803d6e..9c4b583 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -240,4 +240,9 @@ public final class StringFactory {
         return STORAGE + L_BRACKET + internalString + R_BRACKET;
     }
 
+    public static String removeEndBrackets(final Collection collection) {
+        final String string = collection.toString();
+        return string.substring(1,string.length()-1);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
index b9ccfd0..8f452d3 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
@@ -154,5 +154,10 @@ public abstract class GroovyHasTest {
         public Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id) {
             new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasId(v1Id, v2Id)", "v1Id", v1Id, "v2Id", v2Id)
         }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXltX10XX_andXltX29X_orXeqX35XXXX_name() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').has('age', not(lt(10)).and(lt(29).or(eq(35)))).name")
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
index 96ca39f..2682a71 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
@@ -107,6 +107,8 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id);
 
+    public abstract Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXltX10XX_andXltX29X_orXeqX35XXXX_name();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_outXcreatedX_hasXname__mapXlengthX_isXgtX3XXX_name() {
@@ -404,6 +406,14 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
         }
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasLabelXpersonX_hasXage_notXltX10XX_andXltX29X_orXeqX35XXXX_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_hasLabelXpersonX_hasXage_notXltX10XX_andXltX29X_orXeqX35XXXX_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("peter", "vadas"), traversal);
+    }
+
     private void assert_g_EX11X(final Object edgeId, final Traversal<Edge, Edge> traversal) {
         printTraversalForm(traversal);
         assertTrue(traversal.hasNext());
@@ -537,5 +547,10 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id) {
             return g.V().hasId(v1Id, v2Id);
         }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXltX10XX_andXltX29X_orXeqX35XXXX_name() {
+            return g.V().hasLabel("person").has("age", P.not(P.lt(10)).and(P.lt(29).or(P.eq(35)))).values("name");
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/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
index df3af56..fac5ec3 100644
--- 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
@@ -147,22 +147,20 @@ class Helper(object):
 """)
         P.getMethods()
                 .findAll { P.class.isAssignableFrom(it.returnType) }
-                .findAll { !it.name.equals("or") && !it.name.equals("and") && !it.name.equals("not") }
+                .findAll { !it.name.equals("or") && !it.name.equals("and") }
                 .collect { methodMap[it.name] }
                 .toSet()
                 .each { method ->
             pythonClass.append(
                     """   @staticmethod
    def ${method}(*args):
-      return P("P.${method}(" + Helper.stringify(*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) + ")")
-   def _not(self, arg):
-      return P(self.pString + ".not(" + Helper.stringify(arg) + ")")
 """)
         pythonClass.append("\n\n")
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphProvider.java
index 376cbc4..dc999cd 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphProvider.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphProvider.java
@@ -23,7 +23,9 @@ 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;
@@ -57,9 +59,13 @@ public abstract class VariantGraphProvider extends AbstractGraphProvider {
             "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(),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonComputerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonComputerProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonComputerProvider.java
new file mode 100644
index 0000000..a9e9a2d
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonComputerProvider.java
@@ -0,0 +1,36 @@
+/*
+ * 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.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 PythonComputerProvider extends PythonProvider {
+
+    public GraphTraversalSource traversal(final Graph graph) {
+        return super.traversal(graph).withComputer();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessComputerTest.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessComputerTest.java
new file mode 100644
index 0000000..1d3bef8
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessComputerTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.GraphProviderClass;
+import org.apache.tinkerpop.gremlin.process.ProcessComputerSuite;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.junit.runner.RunWith;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@RunWith(ProcessComputerSuite.class)
+@GraphProviderClass(provider = PythonComputerProvider.class, graph = TinkerGraph.class)
+public class PythonProcessComputerTest {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessStandardTest.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessStandardTest.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessStandardTest.java
index 787409b..b6cce22 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessStandardTest.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProcessStandardTest.java
@@ -31,12 +31,4 @@ import org.junit.runner.RunWith;
 @GraphProviderClass(provider = PythonProvider.class, graph = TinkerGraph.class)
 public class PythonProcessStandardTest {
 
-    /*@org.junit.Test
-    public void test() throws Exception {
-        GremlinPythonGenerator.create("/tmp");
-        ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython");
-        System.out.println(engine.eval("execfile(\"/tmp/gremlin-python-3.2.1-SNAPSHOT.py\")"));
-        System.out.println(engine.eval("g = PythonGraphTraversalSource(\"ws://localhost:8182/\", \"g\")"));
-        System.out.println(engine.eval("g.V()[1]"));
-    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
index b5810ac..ca40919 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
@@ -25,8 +25,12 @@ 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.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.variant.VariantConverter;
 import org.apache.tinkerpop.gremlin.process.variant.VariantGraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Column;
@@ -45,11 +49,13 @@ 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.Set;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
@@ -69,11 +75,12 @@ public class PythonVariantConverter implements VariantConverter {
         }
     }
 
+    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"));
 
     @Override
     public String generateGremlinGroovy(final StringBuilder currentTraversal) throws ScriptException {
-        if (currentTraversal.toString().contains("$") || currentTraversal.toString().contains("@"))
+        if (currentTraversal.toString().contains("$"))
             throw new VerificationException("Lambdas are currently not supported: " + currentTraversal.toString(), EmptyTraversal.instance());
 
         final Bindings jythonBindings = new SimpleBindings();
@@ -97,7 +104,7 @@ public class PythonVariantConverter implements VariantConverter {
             currentTraversal.append("[").append(objects[0]).append(":").append(objects[1]).append("]");
         else if (stepName.equals("limit") && 1 == objects.length)
             currentTraversal.append("[0:").append(objects[0]).append("]");
-        else if (stepName.equals("values") && 1 == objects.length && !currentTraversal.toString().equals("__"))
+        else if (stepName.equals("values") && 1 == objects.length && !currentTraversal.toString().equals("__") && !STEP_NAMES.contains(objects[0].toString()))
             currentTraversal.append(".").append(objects[0]);
         else {
             String temp = "." + convertStepName(stepName) + "(";
@@ -134,7 +141,7 @@ public class PythonVariantConverter implements VariantConverter {
         else if (object instanceof Column)
             return "Column." + object.toString();
         else if (object instanceof P)
-            return "P." + ((P) object).getBiPredicate() + "(" + (((P) object).getValue() instanceof String ? "'" + ((P) object).getValue() + "'" : convertToString(((P) object).getValue())) + ")";
+            return convertPToString((P) object, new StringBuilder()).toString();
         else if (object instanceof T)
             return "T." + object.toString();
         else if (object instanceof Order)
@@ -158,4 +165,17 @@ public class PythonVariantConverter implements VariantConverter {
             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("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+        return current;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4b355c15/gremlin-variant/variants/python/gremlin-python-3.2.1-SNAPSHOT.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/variants/python/gremlin-python-3.2.1-SNAPSHOT.py b/gremlin-variant/variants/python/gremlin-python-3.2.1-SNAPSHOT.py
index fcad0fe..2d33788 100644
--- a/gremlin-variant/variants/python/gremlin-python-3.2.1-SNAPSHOT.py
+++ b/gremlin-variant/variants/python/gremlin-python-3.2.1-SNAPSHOT.py
@@ -122,15 +122,18 @@ class P(object):
    def without(*args):
       return P("P.without(" + Helper.stringify(*args) + ")")
    @staticmethod
-   def negate(*args):
-      return P("P.negate(" + Helper.stringify(*args) + ")")
-   @staticmethod
    def outside(*args):
       return P("P.outside(" + Helper.stringify(*args) + ")")
    @staticmethod
+   def negate(*args):
+      return P("P.negate(" + Helper.stringify(*args) + ")")
+   @staticmethod
    def clone(*args):
       return P("P.clone(" + Helper.stringify(*args) + ")")
    @staticmethod
+   def _not(*args):
+      return P("P.not(" + Helper.stringify(*args) + ")")
+   @staticmethod
    def gte(*args):
       return P("P.gte(" + Helper.stringify(*args) + ")")
    @staticmethod
@@ -146,8 +149,6 @@ class P(object):
       return P(self.pString + ".and(" + Helper.stringify(arg) + ")")
    def _or(self, arg):
       return P(self.pString + ".or(" + Helper.stringify(arg) + ")")
-   def _not(self, arg):
-      return P(self.pString + ".not(" + Helper.stringify(arg) + ")")
 
 
 class Pop(object):
@@ -250,12 +251,12 @@ class PythonGraphTraversal(object):
   def coalesce(self, *args):
     self.traversalString = self.traversalString + ".coalesce(" + Helper.stringify(*args) + ")"
     return self
-  def optional(self, *args):
-    self.traversalString = self.traversalString + ".optional(" + Helper.stringify(*args) + ")"
-    return self
   def hasLabel(self, *args):
     self.traversalString = self.traversalString + ".hasLabel(" + Helper.stringify(*args) + ")"
     return self
+  def optional(self, *args):
+    self.traversalString = self.traversalString + ".optional(" + Helper.stringify(*args) + ")"
+    return self
   def hasValue(self, *args):
     self.traversalString = self.traversalString + ".hasValue(" + Helper.stringify(*args) + ")"
     return self
@@ -545,12 +546,12 @@ class __(object):
   def coalesce(*args):
     return PythonGraphTraversal("__").coalesce(*args)
   @staticmethod
-  def optional(*args):
-    return PythonGraphTraversal("__").optional(*args)
-  @staticmethod
   def hasLabel(*args):
     return PythonGraphTraversal("__").hasLabel(*args)
   @staticmethod
+  def optional(*args):
+    return PythonGraphTraversal("__").optional(*args)
+  @staticmethod
   def hasValue(*args):
     return PythonGraphTraversal("__").hasValue(*args)
   @staticmethod