From 62a5007de438c41af154db3f53ea4eed3660a266 Mon Sep 17 00:00:00 2001
From: Patrick Beuks <code@beuks.net>
Date: Sun, 5 May 2019 15:09:35 +0200
Subject: [PATCH] Added keyValues for addFramedVertex with class type

###--------------------------------------------------------###
feat(internal): Added keyValues for addFramedVertex with class type

Added the function `<T> T addFramedVertex(final Class<T> kind, final Object... keyValues)`
 as a way to add key values to vertex elements. This includes tests for this new function.
###--------------------------------------------------------###
---
 .../syncleus/ferma/DelegatingFramedGraph.java |  5 ++
 .../java/com/syncleus/ferma/FramedGraph.java  | 12 +++++
 .../com/syncleus/ferma/FramedGraphTest.java   | 47 +++++++++++++++++++
 3 files changed, 64 insertions(+)

diff --git a/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java b/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
index 9fee13f7..b9fa73d9 100644
--- a/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
+++ b/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
@@ -324,6 +324,11 @@ public class DelegatingFramedGraph<G extends Graph> implements WrappedFramedGrap
         }
     }
     
+    @Override
+    public <T> T addFramedVertex(final Class<T> kind, final Object... keyValues) {
+        return this.addFramedVertex(new DefaultClassInitializer<>(kind), keyValues);
+    }
+    
     @Override
     public <T> T addFramedVertex(final Class<T> kind) {
         return this.addFramedVertex(new DefaultClassInitializer<>(kind));
diff --git a/src/main/java/com/syncleus/ferma/FramedGraph.java b/src/main/java/com/syncleus/ferma/FramedGraph.java
index aecb1bf9..d25bba7c 100644
--- a/src/main/java/com/syncleus/ferma/FramedGraph.java
+++ b/src/main/java/com/syncleus/ferma/FramedGraph.java
@@ -51,6 +51,18 @@ public interface FramedGraph extends AutoCloseable {
      * @return The framed vertex.
      */
     <T> T addFramedVertex(ClassInitializer<T> initializer, Object... keyValues);
+
+    /**
+     * Add a vertex to the graph
+     *
+     * @param <T> The type used to frame the element.
+     * @param kind
+     *            The kind of the frame.
+     * @param keyValues
+     *            the recommended object identifier
+     * @return The framed vertex.
+     */
+    <T> T addFramedVertex(Class<T> kind, Object... keyValues);
     
     /**
      * Add a vertex to the graph
diff --git a/src/test/java/com/syncleus/ferma/FramedGraphTest.java b/src/test/java/com/syncleus/ferma/FramedGraphTest.java
index c2b18d9c..4c7f751b 100644
--- a/src/test/java/com/syncleus/ferma/FramedGraphTest.java
+++ b/src/test/java/com/syncleus/ferma/FramedGraphTest.java
@@ -28,6 +28,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
 import com.syncleus.ferma.typeresolvers.PolymorphicTypeResolver;
+import org.apache.tinkerpop.gremlin.structure.T;
 
 
 public class FramedGraphTest {
@@ -214,6 +215,52 @@ public class FramedGraphTest {
         Assert.assertNotNull(julia.getElement().property(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY).value());
     }
 
+    @Test
+    public void testKeyValues() {
+        final Graph g = TinkerGraph.open();
+        final FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+
+        final Person p1 = fg.addFramedVertex(Programmer.DEFAULT_INITIALIZER, "key", "value");
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER, T.label, "label");
+        p2.setName("Julia");
+
+        final Person bryn = fg.traverse(
+            input -> input.V().has("key", "value")).next(Person.class);
+        final Person julia = fg.traverse(
+            input -> input.V().hasLabel("label")).next(Person.class);
+
+        Assert.assertEquals(Programmer.class, bryn.getClass());
+        Assert.assertEquals(Person.class, julia.getClass());
+
+        Assert.assertNotNull(bryn.getElement().property(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY).value());
+        Assert.assertNotNull(julia.getElement().property(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY).value());
+    }
+
+    @Test
+    public void testKeyValuesByClass() {
+        final Graph g = TinkerGraph.open();
+        final FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+
+        final Person p1 = fg.addFramedVertex(Programmer.class, "key", "value");
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertex(Person.class, T.label, "label");
+        p2.setName("Julia");
+
+        final Person bryn = fg.traverse(
+            input -> input.V().has("key", "value")).next(Person.class);
+        final Person julia = fg.traverse(
+            input -> input.V().hasLabel("label")).next(Person.class);
+
+        Assert.assertEquals(Programmer.class, bryn.getClass());
+        Assert.assertEquals(Person.class, julia.getClass());
+        
+        Assert.assertNotNull(bryn.getElement().property(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY).value());
+        Assert.assertNotNull(julia.getElement().property(PolymorphicTypeResolver.TYPE_RESOLUTION_KEY).value());
+    }
+
     @Test
     public void testJavaTypingAddExplicit() {
         final Graph g = TinkerGraph.open();
-- 
GitLab