diff --git a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java index 4f6145b2b07f5fad1e05c8a341d82af931b23900..f82bd1761bddd981fd1d2a03de40275d1783751b 100644 --- a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java +++ b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java @@ -123,8 +123,9 @@ public class TypedAdjacencyMethodHandler implements MethodHandler<TypedAdjacency ReflectionUtility.determineTypeValue(type); ReflectionUtility.determineTypeField(type); - final Vertex newVertex = framedGraph.addVertex(null); - final Object newNode = framedGraph.frame(newVertex, type); + final Object newNode = framedGraph.addVertex(null, type); + assert newNode instanceof VertexFrame; + final Vertex newVertex = ((VertexFrame)newNode).asVertex(); assert type.isInstance(newNode); switch(direction) { diff --git a/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java b/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java new file mode 100644 index 0000000000000000000000000000000000000000..d079d435306d3fd68cbc017175de38840b8af5dd --- /dev/null +++ b/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java @@ -0,0 +1,64 @@ +/****************************************************************************** + * * + * Copyright: (c) Syncleus, Inc. * + * * + * You may redistribute and modify this source code under the terms and * + * conditions of the Open Source Community License - Type C version 1.0 * + * or any later version as published by Syncleus, Inc. at www.syncleus.com. * + * There should be a copy of the license included with this file. If a copy * + * of the license is not included you are granted no right to distribute or * + * otherwise use this file except through a legal and valid license. You * + * should also contact Syncleus, Inc. at the information below if you cannot * + * find a license: * + * * + * Syncleus, Inc. * + * 2604 South 12th Street * + * Philadelphia, PA 19148 * + * * + ******************************************************************************/ +package com.syncleus.grail.graph; + +import com.tinkerpop.blueprints.Direction; +import com.tinkerpop.frames.modules.typedgraph.TypeValue; + +@TypeValue("SimpleSignalNode") +public interface SimpleSignalNode extends SignalNode { + @TypedAdjacency(label="parent", direction= Direction.IN) + <N extends SimpleSignalNode> Iterable<? extends N> getChildren(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.OUT) + <N extends SimpleSignalNode> Iterable<? extends N> getParents(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.BOTH) + <N extends SimpleSignalNode> Iterable<? extends N> getFamily(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.BOTH) + <N extends SimpleSignalNode> N addInbreed(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.IN) + <N extends SimpleSignalNode> N getChild(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.OUT) + <N extends SimpleSignalNode> N getParent(Class<? extends N> type); + + @TypedAdjacency(label="parent", direction= Direction.BOTH) + <N extends SimpleSignalNode> N getFamilyMember(Class<? extends N> type); + + @TypedIncidence(label="parent", direction= Direction.IN) + <E extends SignalMultiplyingEdge> Iterable<? extends E> getChildEdges(Class<? extends E> type); + + @TypedIncidence(label="parent", direction= Direction.OUT) + <E extends SignalMultiplyingEdge> Iterable<? extends E> getParentEdges(Class<? extends E> type); + + @TypedIncidence(label="parent", direction= Direction.BOTH) + <E extends SignalMultiplyingEdge> Iterable<? extends E> getFamilyEdges(Class<? extends E> type); + + @TypedIncidence(label="parent", direction= Direction.IN) + <E extends SignalMultiplyingEdge> E getChildEdge(Class<? extends E> type); + + @TypedIncidence(label="parent", direction= Direction.OUT) + <E extends SignalMultiplyingEdge> E getParentEdge(Class<? extends E> type); + + @TypedIncidence(label="parent", direction= Direction.BOTH) + <E extends SignalMultiplyingEdge> E getFamilyMemberEdge(Class<? extends E> type); +} diff --git a/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java b/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java index 68513b690524b4e92765544b114498718cd6672b..aa10010cc102c02a1a148d9179cb8c7d4c3b33a8 100644 --- a/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java +++ b/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java @@ -18,10 +18,17 @@ ******************************************************************************/ package com.syncleus.grail.graph; -import com.tinkerpop.blueprints.Element; +import com.syncleus.grail.graph.action.*; +import com.tinkerpop.blueprints.*; import com.tinkerpop.frames.*; +import com.tinkerpop.frames.modules.Module; +import junit.framework.*; +import org.junit.*; +import org.junit.Assert; import org.junit.Test; + import java.lang.reflect.Method; +import java.util.*; public class TypedAdjacencyMethodHandlerTest { private static final TypedAdjacencyMethodHandler HANDLER = new TypedAdjacencyMethodHandler(null); @@ -30,6 +37,9 @@ public class TypedAdjacencyMethodHandlerTest { private static final Object MOCK_FRAME = new Object(); private static final Element MOCK_ELEMENT = new MockElement(); private static final Element MOCK_VERTEX = new MockVertex(); + private static final FramedGraphFactory FACTORY = new GrailGraphFactory(Collections.<Module>emptyList(), + new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{ + SimpleSignalNode.class}))); static { try { @@ -69,4 +79,61 @@ public class TypedAdjacencyMethodHandlerTest { HANDLER.processElement(MOCK_FRAME, GET_SON_METHOD, null, TYPED_ANNOTATION, framedGraph, MOCK_VERTEX); } + + @Test + public void testGetBothNodes() { + final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph()); + + // construct graph + final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class); + final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class); + + Assert.assertEquals(getIteratorSize(child.getParents(SimpleSignalNode.class).iterator()), 1); + Assert.assertEquals(getIteratorSize(child.getFamily(SimpleSignalNode.class).iterator()), 2); + } + + @Test + public void testGetBothNode() { + final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph()); + + // construct graph + final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class); + final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class); + + Assert.assertNotNull(child.getParent(SimpleSignalNode.class)); + Assert.assertTrue(child.getParent(SimpleSignalNode.class) instanceof SimpleSignalNode); + Assert.assertNotNull(child.getFamilyMember(SimpleSignalNode.class)); + Assert.assertTrue(child.getFamilyMember(SimpleSignalNode.class) instanceof SimpleSignalNode); + } + + @Test + public void testAddBothNode() { + final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph()); + + // construct graph + SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(Integer.valueOf(1), SimpleSignalNode.class); + final SimpleSignalNode inbreedChild = child.addInbreed(SimpleSignalNode.class); + + Assert.assertEquals(2, getIteratorSize(inbreedChild.getFamily(SimpleSignalNode.class).iterator())); + Assert.assertEquals(1, getIteratorSize(inbreedChild.getParents(SimpleSignalNode.class).iterator())); + Assert.assertEquals(1, getIteratorSize(inbreedChild.getChildren(SimpleSignalNode.class).iterator())); + Assert.assertEquals(2, getIteratorSize(graph.getVertices().iterator())); + Assert.assertEquals(2, getIteratorSize(child.getFamily(SimpleSignalNode.class).iterator())); + Assert.assertEquals(1, getIteratorSize(child.getParents(SimpleSignalNode.class).iterator())); + } + + private static int getIteratorSize(Iterator<?> iterator) { + int count = 0; + while(iterator.hasNext()) { + iterator.next(); + count++; + } + return count; + } } diff --git a/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java b/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java index a77ea1b8b6c9635e5cc8019d774823621d4e7603..9d94e683b2e1c93f0eddb00d395bb723e86bfbd7 100644 --- a/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java +++ b/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java @@ -19,10 +19,12 @@ package com.syncleus.grail.graph; import com.tinkerpop.blueprints.Element; -import com.tinkerpop.frames.FramedGraph; -import org.junit.Test; +import com.tinkerpop.frames.*; +import com.tinkerpop.frames.modules.Module; +import org.junit.*; import java.lang.reflect.Method; +import java.util.*; public class TypedIncidenceMethodHandlerTest { private static final TypedIncidenceMethodHandler HANDLER = new TypedIncidenceMethodHandler(null); @@ -32,6 +34,9 @@ public class TypedIncidenceMethodHandlerTest { private static final Object MOCK_FRAME = new Object(); private static final Element MOCK_ELEMENT = new MockElement(); private static final Element MOCK_VERTEX = new MockVertex(); + private static final FramedGraphFactory FACTORY = new GrailGraphFactory(Collections.<Module>emptyList(), + new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{ + SimpleSignalNode.class}))); static { try { @@ -85,4 +90,45 @@ public class TypedIncidenceMethodHandlerTest { HANDLER.processElement(MOCK_FRAME, GET_SON_EDGE_METHOD, null, TYPED_ANNOTATION, framedGraph, MOCK_VERTEX); } + + @Test + public void testGetBothEdges() { + final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph()); + + // construct graph + final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class); + final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class); + + Assert.assertEquals(getIteratorSize(child.getParentEdges(SignalMultiplyingEdge.class).iterator()), 1); + Assert.assertEquals(getIteratorSize(child.getFamilyEdges(SignalMultiplyingEdge.class).iterator()), 2); + } + + @Test + public void testGetBothEdge() { + final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph()); + + // construct graph + final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class); + final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class); + final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class); + + Assert.assertNotNull(child.getParentEdge(SignalMultiplyingEdge.class)); + Assert.assertTrue(child.getParentEdge(SignalMultiplyingEdge.class) instanceof SignalMultiplyingEdge); + Assert.assertNotNull(child.getFamilyMemberEdge(SignalMultiplyingEdge.class)); + Assert.assertTrue(child.getFamilyMemberEdge(SignalMultiplyingEdge.class) instanceof SignalMultiplyingEdge); + } + + private static int getIteratorSize(Iterator<?> iterator) { + int count = 0; + while(iterator.hasNext()) { + iterator.next(); + count++; + } + return count; + } }