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/01 19:14:05 UTC

incubator-tinkerpop git commit: tests passing. got T, Pop, Order, Column, Direction, and Scope as Python objects now too.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 54b28dcc8 -> e13684623


tests passing. got T, Pop, Order, Column, Direction, and Scope as Python objects now too.


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

Branch: refs/heads/TINKERPOP-1278
Commit: e136846237c8e9b53b46234a2d7bb0d463d94246
Parents: 54b28dc
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 1 13:13:59 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 1 13:13:59 2016 -0600

----------------------------------------------------------------------
 .../python/GremlinPythonGenerator.groovy        | 47 ++++++++++++++++--
 .../process/variant/VariantGraphTraversal.java  |  4 ++
 .../variant/python/PythonVariantConverter.java  | 51 +++++++++++---------
 .../process/variant/python/PythonProvider.java  |  1 +
 .../src/test/resources/log4j-silent.properties  | 23 +++++++++
 .../src/test/resources/log4j-test.properties    | 23 +++++++++
 6 files changed, 123 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/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 0c92a4f..1f60858 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
@@ -40,9 +40,9 @@ class Helper(object):
        not(arg.startswith("P.")) and
        not(arg.startswith("Order.")) and
        not(arg.startswith("Scope.")) and
-       not(arg.startswith("T.")) and
        not(arg.startswith("Pop.")) and
        not(arg.startswith("Column.")) and
+       not(arg.startswith("T.")) and
        not(arg.startswith("Operator.")) and
        not(arg.startswith("SackFunctions.Barrier.")) and
        not(arg.startswith("Direction."))):
@@ -65,6 +65,49 @@ class Helper(object):
       return ", ".join(Helper.stringOrObject(i) for i in args)
 """);
 
+///////////
+// Enums //
+///////////
+
+        pythonClass.append("""class Column(object):
+  keys = "Column.keys"
+  values = "Column.values"
+""").append("\n\n");
+
+        pythonClass.append("""class Direction(object):
+  IN = "Direction.IN"
+  OUT = "Direction.OUT"
+  BOTH = "Direction.BOTH"
+""").append("\n\n");
+
+        pythonClass.append("""class Order(object):
+  incr = "Order.incr"
+  decr = "Order.decr"
+  shuffle = "Order.shuffle"
+  keyIncr = "Order.keyIncr"
+  keyDecr = "Order.keyDecr"
+  valueIncr = "Order.valueIncr"
+  valueDecr = "Order.valueDecr"
+""").append("\n\n");
+
+        pythonClass.append("""class Pop(object):
+  first = "Pop.first"
+  last = "Pop.last"
+  all = "Pop.all"
+""").append("\n\n");
+
+        pythonClass.append("""class Scope(object):
+  _local = "Scope.local"
+  _global = "Scope.global"
+""").append("\n\n");
+
+        pythonClass.append("""class T(object):
+  label = "T.label"
+  id = "T.id"
+  key = "T.key"
+  value = "T.value"
+""").append("\n\n");
+
 //////////////////////////
 // GraphTraversalSource //
 //////////////////////////
@@ -122,8 +165,6 @@ class Helper(object):
       raise TypeError("index must be int or slice")
   def __getattr__(self,key):
     return self.values(key)
-  def toList(self):
-    return self.traversalString
 """)
         methods.each { method ->
             final Class<?> returnType = (GraphTraversal.getMethods() as Set).findAll {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
index 44270ce..0245d5a 100644
--- a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
@@ -81,6 +81,10 @@ public class VariantGraphTraversal<S, E> extends DefaultGraphTraversal<S, E> {
         return this.variantString;
     }
 
+    public String toString() {
+       return this.steps.isEmpty() ? this.variantString.toString() : super.toString();
+    }
+
     @Override
     public void applyStrategies() {
         if (!(this.getParent() instanceof EmptyStep)) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
index e929cf9..3b99d62 100644
--- a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
@@ -34,6 +34,8 @@ 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.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;
@@ -45,6 +47,7 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Stream;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -67,35 +70,37 @@ public class PythonVariantConverter implements VariantConverter {
     @Override
     public String generateGremlinGroovy(final StringBuilder currentTraversal) throws ScriptException {
         if (currentTraversal.toString().contains("$") || currentTraversal.toString().contains("@"))
-            throw new VerificationException("Lambda: " + currentTraversal.toString(), EmptyTraversal.instance());
+            throw new VerificationException("Lambdas are currently not supported: " + currentTraversal.toString(), EmptyTraversal.instance());
 
         final Bindings jythonBindings = new SimpleBindings();
         jythonBindings.put("g", JYTHON_ENGINE.eval("PythonGraphTraversalSource(\"g\")"));
         JYTHON_ENGINE.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
-        System.out.println(currentTraversal.toString());
         return JYTHON_ENGINE.eval(currentTraversal.toString()).toString();
     }
 
     @Override
     public void addStep(final StringBuilder currentTraversal, final String stepName, final Object... arguments) {
-        if (arguments.length == 0)
+        // 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)
             currentTraversal.append(".").append(convertStepName(stepName)).append("()");
-        else if (stepName.equals("range") && 2 == arguments.length)
-            currentTraversal.append("[").append(arguments[0]).append(":").append(arguments[1]).append("]");
-        else if (stepName.equals("limit") && 1 == arguments.length)
-            currentTraversal.append("[0:").append(arguments[0]).append("]");
-        else if (stepName.equals("values") && 1 == arguments.length && !currentTraversal.toString().equals("__"))
-            currentTraversal.append(".").append(arguments[0]);
+        else if (stepName.equals("range") && 2 == objects.length)
+            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("__"))
+            currentTraversal.append(".").append(objects[0]);
         else {
             String temp = "." + convertStepName(stepName) + "(";
-            for (final Object object : arguments) {
-                if (object instanceof Object[]) {
-                    for (final Object object2 : (Object[]) object) {
-                        temp = temp + convertToString(object2) + ",";
-                    }
-                } else {
-                    temp = temp + convertToString(object) + ",";
-                }
+            for (final Object object : objects) {
+
+                temp = temp + convertToString(object) + ",";
+
             }
             currentTraversal.append(temp.substring(0, temp.length() - 1) + ")");
         }
@@ -115,21 +120,21 @@ public class PythonVariantConverter implements VariantConverter {
         else if (object instanceof SackFunctions.Barrier)
             return "\"SackFunctions.Barrier." + object.toString() + "\"";
         else if (object instanceof Direction)
-            return "\"Direction." + object.toString() + "\"";
+            return "Direction." + object.toString();
         else if (object instanceof Operator)
             return "\"Operator." + object.toString() + "\"";
         else if (object instanceof Pop)
-            return "\"Pop." + object.toString() + "\"";
+            return "Pop." + object.toString();
         else if (object instanceof Column)
-            return "\"Column." + object.toString() + "\"";
+            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())) + ")" + "\"";
         else if (object instanceof T)
-            return "\"T." + object.toString() + "\"";
+            return "T." + object.toString();
         else if (object instanceof Order)
-            return "\"Order." + object.toString() + "\"";
+            return "Order." + object.toString();
         else if (object instanceof Scope)
-            return "\"Scope." + object.toString() + "\"";
+            return "Scope._" + object.toString();
         else if (object instanceof Element)
             return convertToString(((Element) object).id()); // hack
         else if (object instanceof VariantGraphTraversal)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
index 9a95f9b..067f3c8 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
@@ -32,6 +32,7 @@ public class PythonProvider extends VariantGraphProvider {
     public GraphTraversalSource traversal(final Graph graph) {
         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 new VariantGraphTraversalSource(new PythonVariantConverter(), graph, graph.traversal().getStrategies());
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/gremlin-variant/src/test/resources/log4j-silent.properties
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/resources/log4j-silent.properties b/gremlin-variant/src/test/resources/log4j-silent.properties
new file mode 100644
index 0000000..1825bb0
--- /dev/null
+++ b/gremlin-variant/src/test/resources/log4j-silent.properties
@@ -0,0 +1,23 @@
+# 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.
+
+# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
+# required or else some logs throw error and use other log4j.properties files on the path.
+log4j.rootLogger=OFF, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e1368462/gremlin-variant/src/test/resources/log4j-test.properties
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/resources/log4j-test.properties b/gremlin-variant/src/test/resources/log4j-test.properties
new file mode 100644
index 0000000..f9035ba
--- /dev/null
+++ b/gremlin-variant/src/test/resources/log4j-test.properties
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+log4j.rootLogger=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file