package com.orientechnologies.orient.graph.sql.functions; import com.orientechnologies.orient.core.command.OBasicCommandContext; import com.orientechnologies.orient.core.id.ORID; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.impls.orient.OrientGraph; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; public class OSQLFunctionShortestPathTest { private OrientGraph graph; private Map<Integer, Vertex> vertices = new HashMap<Integer, Vertex>(); private OSQLFunctionShortestPath function; @Before public void setUp() throws Exception { setUpDatabase(); function = new OSQLFunctionShortestPath(); } @After public void tearDown() throws Exception { graph.shutdown(); } private void setUpDatabase() { graph = new OrientGraph("memory:OSQLFunctionShortestPath"); vertices.put(1, graph.addVertex(null)); vertices.put(2, graph.addVertex(null)); vertices.put(3, graph.addVertex(null)); vertices.put(4, graph.addVertex(null)); vertices.get(1).setProperty("node_id", "A"); vertices.get(2).setProperty("node_id", "B"); vertices.get(3).setProperty("node_id", "C"); vertices.get(4).setProperty("node_id", "D"); graph.addEdge(null, vertices.get(1), vertices.get(2), "Edge1"); graph.addEdge(null, vertices.get(2), vertices.get(3), "Edge1"); graph.addEdge(null, vertices.get(3), vertices.get(1), "Edge2"); graph.addEdge(null, vertices.get(3), vertices.get(4), "Edge1"); for (int i = 5; i <= 20; i++) { vertices.put(i, graph.addVertex(null)); vertices.get(i).setProperty("node_id", "V" + i); graph.addEdge(null, vertices.get(i - 1), vertices.get(i), "Edge1"); if (i % 2 == 0) { graph.addEdge(null, vertices.get(i - 2), vertices.get(i), "Edge1"); } } graph.commit(); } @Test public void testExecute() throws Exception { final List<ORID> result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4) }, new OBasicCommandContext()); assertEquals(3, result.size()); assertEquals(vertices.get(1).getId(), result.get(0)); assertEquals(vertices.get(3).getId(), result.get(1)); assertEquals(vertices.get(4).getId(), result.get(2)); } @Test public void testExecuteOut() throws Exception { final List<ORID> result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), "out", null }, new OBasicCommandContext()); assertEquals(4, result.size()); assertEquals(vertices.get(1).getId(), result.get(0)); assertEquals(vertices.get(2).getId(), result.get(1)); assertEquals(vertices.get(3).getId(), result.get(2)); assertEquals(vertices.get(4).getId(), result.get(3)); } @Test public void testExecuteOnlyEdge1() throws Exception { final List<ORID> result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), null, "Edge1" }, new OBasicCommandContext()); assertEquals(4, result.size()); assertEquals(vertices.get(1).getId(), result.get(0)); assertEquals(vertices.get(2).getId(), result.get(1)); assertEquals(vertices.get(3).getId(), result.get(2)); assertEquals(vertices.get(4).getId(), result.get(3)); } @Test public void testLong() throws Exception { final List<ORID> result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20) }, new OBasicCommandContext()); assertEquals(11, result.size()); assertEquals(vertices.get(1).getId(), result.get(0)); assertEquals(vertices.get(3).getId(), result.get(1)); int next = 2; for (int i = 4; i <= 20; i += 2) { assertEquals(vertices.get(i).getId(), result.get(next++)); } } @Test public void testMaxDepth1() throws Exception { Map<String, Object> additionalParams = new HashMap<String, Object>(); additionalParams.put(OSQLFunctionShortestPath.PARAM_MAX_DEPTH, 11); final List<ORID> result = function .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new OBasicCommandContext()); assertEquals(11, result.size()); } @Test public void testMaxDepth2() throws Exception { Map<String, Object> additionalParams = new HashMap<String, Object>(); additionalParams.put(OSQLFunctionShortestPath.PARAM_MAX_DEPTH, 12); final List<ORID> result = function .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new OBasicCommandContext()); assertEquals(11, result.size()); } @Test public void testMaxDepth3() throws Exception { Map<String, Object> additionalParams = new HashMap<String, Object>(); additionalParams.put(OSQLFunctionShortestPath.PARAM_MAX_DEPTH, 10); final List<ORID> result = function .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new OBasicCommandContext()); assertEquals(0, result.size()); } @Test public void testMaxDepth4() throws Exception { Map<String, Object> additionalParams = new HashMap<String, Object>(); additionalParams.put(OSQLFunctionShortestPath.PARAM_MAX_DEPTH, 3); final List<ORID> result = function .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new OBasicCommandContext()); assertEquals(0, result.size()); } }