From afe61fc047a536750a8abbb1a60326d310b5ee96 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Date: Sun, 27 Mar 2022 21:29:05 +0300
Subject: [PATCH] Added support for JanusGraph.

---
 CHANGELOG.md       |  2 ++
 goblin/provider.py | 19 +++++++++++++++++++
 goblin/session.py  |  8 ++++----
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 136d1ea..047ea2e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,8 @@
 
 ## v2.2.4
 
+* Added support for JanusGraph backend.
+
 ## v2.2.3
 
 * Fixed bug when mapping an edge's properties introduced as a regression in newer gremlinpython versions.
diff --git a/goblin/provider.py b/goblin/provider.py
index 47cd958..ff1c415 100644
--- a/goblin/provider.py
+++ b/goblin/provider.py
@@ -15,3 +15,22 @@ class TinkerGraph(Provider):  # TODO
     @staticmethod
     def get_hashable_id(val):
         return val
+
+class JanusGraph(Provider):  # TODO
+    """Default provider"""
+
+    @staticmethod
+    def get_hashable_id(val):
+        if not isinstance(val, dict):
+            return val
+        type_prop = val.get("@type", None)
+        if not type_prop == "janusgraph:RelationIdentifier":
+            return val
+        val_prop = val.get("@value", None)
+        if not isinstance(val_prop, dict):
+            return val
+        rel_prop = val_prop.get("relationId", None)
+        if not rel_prop:
+            return val
+        return rel_prop
+
diff --git a/goblin/session.py b/goblin/session.py
index 8df2083..7e5cd64 100644
--- a/goblin/session.py
+++ b/goblin/session.py
@@ -401,7 +401,6 @@ class Session:
         if id: await self._g.E().has('dirty',id).aggregate('x').fold().V().has('dirty',id).aggregate('x').select('x').unfold().properties('dirty').drop().iterate()
 
     async def __rollback_transaction(self, id):
-        print("id of: %s" % id)
         if id: await self._g.E().has('dirty',id).aggregate('x').fold().V().has('dirty',id).aggregate('x').select('x').unfold().drop().iterate()
 
     async def _update_vertex(self, vertex):
@@ -438,10 +437,11 @@ class Session:
         if elem:
             if element.__type__ == 'vertex':
                 # Look into this
-                label = await self._g.V(elem.id).label().next()
-                props = await self._get_vertex_properties(elem.id, label)
+                label = await self._g.V(self._get_hashable_id(elem.id)).label().next()
+                props = await self._get_vertex_properties(self._get_hashable_id(elem.id), label)
             elif element.__type__ == 'edge':
-                props = await self._g.E(elem.id).valueMap(True).next()
+                props = await self._g.E(self._get_hashable_id(elem.id)).valueMap(True).next()
+
             elem = element.__mapping__.mapper_func(elem, props, element)
         return elem
 
-- 
GitLab