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 15:35:59 UTC
tinkerpop git commit: All the Gremlin enums are now Python enums and
thus,
less 'string compary' and the GroovyTranslator is much simpler/smaller.
Drawback, for python2, you have to install the enum library.
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1278 e348a9532 -> 8ee29044d
All the Gremlin enums are now Python enums and thus, less 'string compary' and the GroovyTranslator is much simpler/smaller. Drawback, for python2, you have to install the enum library.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8ee29044
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8ee29044
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8ee29044
Branch: refs/heads/TINKERPOP-1278
Commit: 8ee29044d2c31b14bf6b43dc28115d0813e92ec0
Parents: e348a95
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 16 09:35:31 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 16 09:35:50 2016 -0600
----------------------------------------------------------------------
.../python/GremlinPythonGenerator.groovy | 93 +++-------------
.../src/main/jython/gremlin_python/__init__.py | 1 -
.../jython/gremlin_python/gremlin_python.py | 105 ++++++++-----------
.../jython/gremlin_python/groovy_translator.py | 50 +++++----
.../gremlin/python/PythonProvider.java | 1 +
5 files changed, 83 insertions(+), 167 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ee29044/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
index b5c3efb..81cfe6e 100644
--- 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
@@ -70,11 +70,14 @@ under the License.
.withDefault { it }
final Map<String, String> invertedMethodMap = [:].withDefault { it };
methodMap.entrySet().forEach { invertedMethodMap.put(it.value, it.key) }
+ final List<Class<? extends Enum>> enumList = [VertexProperty.Cardinality, Column, Direction, Operator, Order, Pop, SackFunctions.Barrier, Scope, T]
pythonClass.append("from collections import OrderedDict\n")
+ pythonClass.append("from aenum import Enum\n")
pythonClass.append("statics = OrderedDict()\n\n")
pythonClass.append("""
globalTranslator = None
+builtInRange = range
""").append("\n\n");
//////////////////////////
@@ -215,53 +218,18 @@ globalTranslator = None
///////////
// 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");
+ for (final Class<? extends Enum> enumClass : enumList) {
+ pythonClass.append("class ${enumClass.getSimpleName()}(Enum):\n ");
+ enumClass.getEnumConstants().each { value ->
+ pythonClass.append(" ${methodMap[value.name()]},");
+ }
+ pythonClass.deleteCharAt(pythonClass.length() - 1).append(" = builtInRange(${enumClass.getEnumConstants().length})\n\n")
+ enumClass.getEnumConstants().each { value ->
+ pythonClass.append("statics['${methodMap[value.name()]}'] = ${value.getDeclaringClass().getSimpleName()}.${methodMap[value.name()]}\n");
+ }
+ pythonClass.append("\n");
}
- pythonClass.append("\n");
//////////////
-
pythonClass.append("""class P(object):
def __init__(self, operator, value, other=None):
self.operator = operator
@@ -299,41 +267,6 @@ globalTranslator = None
}
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")
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ee29044/gremlin-variant/src/main/jython/gremlin_python/__init__.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_python/__init__.py b/gremlin-variant/src/main/jython/gremlin_python/__init__.py
index b3a8806..e9e2fa5 100644
--- a/gremlin-variant/src/main/jython/gremlin_python/__init__.py
+++ b/gremlin-variant/src/main/jython/gremlin_python/__init__.py
@@ -20,7 +20,6 @@ from gremlin_python import PythonGraphTraversal
from gremlin_python import PythonGraphTraversalSource
from gremlin_python import __
from gremlin_python import statics
-from gremlin_python import B
from gremlin_python import T
from gremlin_python import Order
from gremlin_python import Cardinality
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ee29044/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py b/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
index 37be00b..0665462 100644
--- a/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
+++ b/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
@@ -17,10 +17,12 @@ specific language governing permissions and limitations
under the License.
'''
from collections import OrderedDict
+from aenum import Enum
statics = OrderedDict()
globalTranslator = None
+builtInRange = range
class PythonGraphTraversalSource(object):
@@ -1369,39 +1371,28 @@ def where(*args):
statics['where'] = where
-class Cardinality(object):
- single = "VertexProperty.Cardinality.single"
- list = "VertexProperty.Cardinality.list"
- set = "VertexProperty.Cardinality.set"
+class Cardinality(Enum):
+ single, list, set = builtInRange(3)
-class Column(object):
- keys = "Column.keys"
- values = "Column.values"
+statics['single'] = Cardinality.single
+statics['list'] = Cardinality.list
+statics['set'] = Cardinality.set
+
+class Column(Enum):
+ keys, values = builtInRange(2)
statics['keys'] = Column.keys
statics['values'] = Column.values
-class Direction(object):
- OUT = "Direction.OUT"
- IN = "Direction.IN"
- BOTH = "Direction.BOTH"
+class Direction(Enum):
+ OUT, IN, BOTH = builtInRange(3)
statics['OUT'] = Direction.OUT
statics['IN'] = Direction.IN
statics['BOTH'] = Direction.BOTH
-class Operator(object):
- sum = "Operator.sum"
- minus = "Operator.minus"
- mult = "Operator.mult"
- div = "Operator.div"
- min = "Operator.min"
- max = "Operator.max"
- assign = "Operator.assign"
- _and = "Operator.and"
- _or = "Operator.or"
- addAll = "Operator.addAll"
- sumLong = "Operator.sumLong"
+class Operator(Enum):
+ sum, minus, mult, div, min, max, assign, _and, _or, addAll, sumLong = builtInRange(11)
statics['sum'] = Operator.sum
statics['minus'] = Operator.minus
@@ -1415,14 +1406,8 @@ statics['_or'] = Operator._or
statics['addAll'] = Operator.addAll
statics['sumLong'] = Operator.sumLong
-class Order(object):
- incr = "Order.incr"
- decr = "Order.decr"
- keyIncr = "Order.keyIncr"
- valueIncr = "Order.valueIncr"
- keyDecr = "Order.keyDecr"
- valueDecr = "Order.valueDecr"
- shuffle = "Order.shuffle"
+class Order(Enum):
+ incr, decr, keyIncr, valueIncr, keyDecr, valueDecr, shuffle = builtInRange(7)
statics['incr'] = Order.incr
statics['decr'] = Order.decr
@@ -1432,6 +1417,32 @@ statics['keyDecr'] = Order.keyDecr
statics['valueDecr'] = Order.valueDecr
statics['shuffle'] = Order.shuffle
+class Pop(Enum):
+ first, last, all = builtInRange(3)
+
+statics['first'] = Pop.first
+statics['last'] = Pop.last
+statics['all'] = Pop.all
+
+class Barrier(Enum):
+ normSack = builtInRange(1)
+
+statics['normSack'] = Barrier.normSack
+
+class Scope(Enum):
+ _global, local = builtInRange(2)
+
+statics['_global'] = Scope._global
+statics['local'] = Scope.local
+
+class T(Enum):
+ label, id, key, value = builtInRange(4)
+
+statics['label'] = T.label
+statics['id'] = T.id
+statics['key'] = T.key
+statics['value'] = T.value
+
class P(object):
def __init__(self, operator, value, other=None):
self.operator = operator
@@ -1549,36 +1560,4 @@ def without(*args):
statics['without'] = without
-class Pop(object):
- first = "Pop.first"
- last = "Pop.last"
- all = "Pop.all"
-
-statics['first'] = Pop.first
-statics['last'] = Pop.last
-statics['all'] = Pop.all
-
-class Barrier(object):
- normSack = "SackFunctions.Barrier.normSack"
-
-statics['normSack'] = Barrier.normSack
-
-class Scope(object):
- _global = "Scope.global"
- local = "Scope.local"
-
-statics['_global'] = Scope._global
-statics['local'] = Scope.local
-
-class T(object):
- label = "T.label"
- id = "T.id"
- key = "T.key"
- value = "T.value"
-
-statics['label'] = T.label
-statics['id'] = T.id
-statics['key'] = T.key
-statics['value'] = T.value
-
statics = OrderedDict(reversed(list(statics.items())))
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ee29044/gremlin-variant/src/main/jython/gremlin_python/groovy_translator.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_python/groovy_translator.py b/gremlin-variant/src/main/jython/gremlin_python/groovy_translator.py
index 0cb16e2..dc9ac34 100644
--- a/gremlin-variant/src/main/jython/gremlin_python/groovy_translator.py
+++ b/gremlin-variant/src/main/jython/gremlin_python/groovy_translator.py
@@ -18,6 +18,7 @@ under the License.
'''
import sys
+from aenum import Enum
from gremlin_python import P
from translator import Translator
@@ -30,6 +31,8 @@ __author__ = 'Marko A. Rodriguez (http://markorodriguez.com)'
methodMap = {"_global": "global", "_as": "as", "_in": "in", "_and": "and", "_or": "or", "_is": "is", "_not": "not",
"_from": "from"}
+enumMap = {"Cardinality": "VertexProperty.Cardinality", "Barrier": "SackFunctions.Barrier"}
+
class GroovyTranslator(Translator):
def __init__(self, alias, script_engine="gremlin-groovy"):
@@ -56,6 +59,8 @@ class GroovyTranslator(Translator):
def getAnonymousTraversalTranslator(self):
return GroovyTranslator("__", self.script_engine)
+ ### HELPER METHODS ###
+
@staticmethod
def mapMethod(method):
if (method in methodMap):
@@ -64,27 +69,26 @@ class GroovyTranslator(Translator):
return method
@staticmethod
+ def mapEnum(enum):
+ if (enum in enumMap):
+ return enumMap[enum]
+ else:
+ return enum
+
+ @staticmethod
def stringOrObject(arg):
if (isinstance(arg, str) and
- not (arg.startswith("SackFunctions.Barrier.")) and
- not (arg.startswith("VertexProperty.Cardinality.")) and
- not (arg.startswith("Column.")) and
not (arg.startswith("Computer.")) and
- not (arg.startswith("Direction.")) and
- not (arg.startswith("Operator.")) and
- not (arg.startswith("Order.")) and
- not (arg.startswith("Pop.")) and
- not (arg.startswith("ReadOnlyStrategy.")) and
- not (arg.startswith("Scope.")) and
- not (arg.startswith("T.")) and
- not (len(arg) == 0)):
+ not (arg.startswith("ReadOnlyStrategy."))):
return "\"" + arg + "\""
- elif callable(arg): # closures
- lambdaString = arg().strip()
- if lambdaString.startswith("{"):
- return lambdaString
- else:
- return "{" + lambdaString + "}"
+ elif isinstance(arg, bool):
+ return str(arg).lower()
+ elif isinstance(arg, long):
+ return str(arg) + "L"
+ elif isinstance(arg, float):
+ return str(arg) + "f"
+ elif isinstance(arg, Enum): # Column, Order, Direction, Scope, T, etc.
+ return GroovyTranslator.mapEnum(type(arg).__name__) + "." + GroovyTranslator.mapMethod(str(arg.name))
elif isinstance(arg, P):
if arg.other is None:
return "P." + GroovyTranslator.mapMethod(arg.operator) + "(" + GroovyTranslator.stringOrObject(
@@ -92,12 +96,12 @@ class GroovyTranslator(Translator):
else:
return GroovyTranslator.stringOrObject(arg.other) + "." + GroovyTranslator.mapMethod(
arg.operator) + "(" + GroovyTranslator.stringOrObject(arg.value) + ")"
- elif isinstance(arg, bool):
- return str(arg).lower()
- elif isinstance(arg, long):
- return str(arg) + "L"
- elif isinstance(arg, float):
- return str(arg) + "f"
+ elif callable(arg): # closures
+ lambdaString = arg().strip()
+ if lambdaString.startswith("{"):
+ return lambdaString
+ else:
+ return "{" + lambdaString + "}"
elif isinstance(arg, dict) and 1 == len(arg) and isinstance(arg.keys()[0], str): # bindings
return arg.keys()[0]
else:
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ee29044/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 6beaa74..f100c9c 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
@@ -47,6 +47,7 @@ public class PythonProvider extends VariantGraphProvider {
jythonEngine.eval("import sys");
jythonEngine.eval("sys.path.append('" + gremlinPythonPackageName + "')");
jythonEngine.eval("sys.path.append('" + gremlinDriverPackageName + "')");
+ jythonEngine.eval("sys.path.append('/Library/Python/2.7/site-packages')"); // TODO: require PYTHONPATH
jythonEngine.eval("from gremlin_python import *");
jythonEngine.eval("from gremlin_python import __");
jythonEngine.eval("from groovy_translator import GroovyTranslator");