diff --git a/goblin/properties.py b/goblin/properties.py index 2b372396641a244ee0f93b04c26cc99a93e1c794..bc49bdf942a57c4508c8630595d6262167ea9245 100644 --- a/goblin/properties.py +++ b/goblin/properties.py @@ -21,7 +21,7 @@ import logging from goblin import abc, exception -from gremlin_python.structure.io.graphson import long +from gremlin_python.statics import long logger = logging.getLogger(__name__) diff --git a/goblin/session.py b/goblin/session.py index 4c0a880692c26257d6840761618b2e9124266a75..b2aa5ee7931ef6adb510f5b08548771a8d4655c7 100644 --- a/goblin/session.py +++ b/goblin/session.py @@ -27,7 +27,8 @@ from goblin.driver import connection, graph from goblin.element import GenericVertex from gremlin_python.driver.remote_connection import RemoteStrategy -from gremlin_python.process.traversal import Cardinality, Traverser +from gremlin_python.process.graph_traversal import __ +from gremlin_python.process.traversal import Cardinality, Traverser, Binding @@ -268,7 +269,7 @@ class Session(connection.AbstractConnection): :param goblin.element.Vertex vertex: Vertex to be removed """ - traversal = self._g.V(vertex.id).drop() + traversal = self._g.V(Binding('vid', vertex.id)).drop() result = await self._simple_traversal(traversal, vertex) hashable_id = self._get_hashable_id(vertex.id) vertex = self.current.pop(hashable_id) @@ -281,7 +282,7 @@ class Session(connection.AbstractConnection): :param goblin.element.Edge edge: Element to be removed """ - traversal = self._g.E(edge.id).drop() + traversal = self._g.E(Binding('eid', edge.id)).drop() result = await self._simple_traversal(traversal, edge) hashable_id = self._get_hashable_id(edge.id) edge = self.current.pop(hashable_id) @@ -348,7 +349,7 @@ class Session(connection.AbstractConnection): :returns: :py:class:`Vertex<goblin.element.Vertex>` | None """ - return await self.g.V(vertex.id).oneOrNone() + return await self.g.V(Binding('vid', vertex.id)).oneOrNone() async def get_edge(self, edge): """ @@ -358,7 +359,9 @@ class Session(connection.AbstractConnection): :returns: :py:class:`Edge<goblin.element.Edge>` | None """ - return await self.g.E(edge.id).oneOrNone() + result = await self.g.E(Binding('eid', edge.id)).oneOrNone() + + return result async def update_vertex(self, vertex): """ @@ -369,8 +372,7 @@ class Session(connection.AbstractConnection): :returns: :py:class:`Vertex<goblin.element.Vertex>` object """ props = mapper.map_props_to_db(vertex, vertex.__mapping__) - # vert_props = mapper.map_vert_props_to_db - traversal = self._g.V(vertex.id) + traversal = self._g.V(Binding('vid', vertex.id)) return await self._update_vertex_properties(vertex, traversal, props) async def update_edge(self, edge): @@ -382,7 +384,7 @@ class Session(connection.AbstractConnection): :returns: :py:class:`Edge<goblin.element.Edge>` object """ props = mapper.map_props_to_db(edge, edge.__mapping__) - traversal = self._g.E(edge.id) + traversal = self._g.E(Binding('eid', edge.id)) return await self._update_edge_properties(edge, traversal, props) # Transaction support @@ -430,49 +432,49 @@ class Session(connection.AbstractConnection): result = await self._simple_traversal(traversal, vertex) if metaprops: await self._add_metaprops(result, metaprops) - traversal = self._g.V(vertex.id) + traversal = self._g.V(Binding('vid', vertex.id)) result = await self._simple_traversal(traversal, vertex) return result async def _add_edge(self, edge): """Convenience function for generating crud traversals.""" props = mapper.map_props_to_db(edge, edge.__mapping__) - traversal = self._g.V(edge.source.id) + traversal = self._g.V(Binding('sid', edge.source.id)) traversal = traversal.addE(edge.__mapping__._label) - traversal = traversal.to( - self._g.V(edge.target.id)) + traversal = traversal.to(__.V(Binding('tid', edge.target.id))) traversal, _, _ = self._add_properties( traversal, props) - return await self._simple_traversal(traversal, edge) + result = await self._simple_traversal(traversal, edge) + return result async def _check_vertex(self, vertex): """Used to check for existence, does not update session vertex""" - msg = await self._g.V(vertex.id).oneOrNone() + msg = await self._g.V(Binding('vid', vertex.id)).oneOrNone() return msg async def _check_edge(self, edge): """Used to check for existence, does not update session edge""" - msg = await self._g.E(edge.id).oneOrNone() + msg = await self._g.E(Binding('eid', edge.id)).oneOrNone() return msg async def _update_vertex_properties(self, vertex, traversal, props): traversal, removals, metaprops = self._add_properties(traversal, props) for k in removals: - await self._g.V(vertex.id).properties(k).drop().oneOrNone() + await self._g.V(Binding('vid', vertex.id)).properties(k).drop().oneOrNone() result = await self._simple_traversal(traversal, vertex) if metaprops: removals = await self._add_metaprops(result, metaprops) for db_name, key, value in removals: - await self._g.V(vertex.id).properties( + await self._g.V(Binding('vid', vertex.id)).properties( db_name).has(key, value).drop().oneOrNone() - traversal = self._g.V(vertex.id) + traversal = self._g.V(Binding('vid', vertex.id)) result = await self._simple_traversal(traversal, vertex) return result async def _update_edge_properties(self, edge, traversal, props): traversal, removals, _ = self._add_properties(traversal, props) for k in removals: - await self._g.E(edge.id).properties(k).drop().oneOrNone() + await self._g.E(Binding('eid', edge.id)).properties(k).drop().oneOrNone() return await self._simple_traversal(traversal, edge) async def _add_metaprops(self, result, metaprops): @@ -481,7 +483,7 @@ class Session(connection.AbstractConnection): db_name, (binding, value), metaprops = metaprop for key, val in metaprops.items(): if val: - traversal = self._g.V(result.id).properties( + traversal = self._g.V(Binding('vid', result.id)).properties( db_name).hasValue(value).property(key, val) await traversal.oneOrNone() else: diff --git a/gremlin_python/process/translator.py b/gremlin_python/process/translator.py index 024373b3e5eb6a5deaa066cd82520208fdd55920..d8a5e6ebc563c4a25939e41ac8363a20c6c42a90 100644 --- a/gremlin_python/process/translator.py +++ b/gremlin_python/process/translator.py @@ -22,8 +22,8 @@ under the License. from abc import abstractmethod from aenum import Enum +from gremlin_python.statics import long from gremlin_python.process.traversal import P, Bytecode, Binding -from gremlin_python.structure.io.graphson import long class RawExpression(object): diff --git a/gremlin_python/process/traversal.py b/gremlin_python/process/traversal.py index 233a66ba5a8c3381acec03be87d999077c92a5fe..9a94c1c9c0047cdac62295c0c432cff4268c19a3 100644 --- a/gremlin_python/process/traversal.py +++ b/gremlin_python/process/traversal.py @@ -308,6 +308,9 @@ class Bytecode(object): if isinstance(arg, Traversal): self.bindings.update(arg.bytecode.bindings) return arg.bytecode + elif isinstance(arg, Binding): + self.bindings[arg.key] = arg.value + return arg elif isinstance(arg, tuple) and 2 == len(arg) and isinstance(arg[0], str): self.bindings[arg[0]] = arg[1] return Binding(arg[0],arg[1]) diff --git a/gremlin_python/statics.py b/gremlin_python/statics.py index 293ff93a6200ac7084fea76ffae509d45bc4d6d1..5cb14c74043a87ac655988855f2461f9faf67026 100644 --- a/gremlin_python/statics.py +++ b/gremlin_python/statics.py @@ -23,6 +23,9 @@ staticEnums = {} default_lambda_language = "gremlin-python" +class long(int): pass + + def add_static(key, value): if isinstance(value, Enum): staticEnums[key] = value diff --git a/gremlin_python/structure/io/graphson.py b/gremlin_python/structure/io/graphson.py index bc3ebfc237ef08f651ba8caea1aa737a9f580103..1dabe49e22921792fc7ba2dd6b1eb59b21d01a50 100644 --- a/gremlin_python/structure/io/graphson.py +++ b/gremlin_python/structure/io/graphson.py @@ -39,11 +39,9 @@ from gremlin_python.structure.graph import Property from gremlin_python.structure.graph import Vertex from gremlin_python.structure.graph import VertexProperty - -class long(int): pass FloatType = float IntType = int -LongType = long +LongType = statics.long @@ -188,7 +186,7 @@ class NumberSerializer(GraphSONSerializer): def _dictify(self, number): if isinstance(number, bool): # python thinks that 0/1 integers are booleans return number - elif isinstance(number, long): + elif isinstance(number, statics.long): return _SymbolHelper.objectify("Int64", number) elif isinstance(number, int): return _SymbolHelper.objectify("Int32", number) @@ -222,7 +220,7 @@ class NumberDeserializer(GraphSONDeserializer): if type == "g:Int32": return int(value) elif type == "g:Int64": - return long(value) + return statics.long(value) else: return float(value)