diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/adapters/graphInput/TimestampedEdgeListInputAdapter.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/adapters/graphInput/TimestampedEdgeListInputAdapter.java index 39e9a80e..b57994e7 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/adapters/graphInput/TimestampedEdgeListInputAdapter.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/adapters/graphInput/TimestampedEdgeListInputAdapter.java @@ -80,7 +80,7 @@ public DynamicGraph readGraph() throws AdapterException { String edgeDate = line.get(0); String edgeAction = "+"; Edge edge = graph.addEdge(UUID.randomUUID().toString(), sourceNode, targetNode); - graph.addDynamicInteraction(new DynamicInteraction(edge, edgeDate, edgeAction)); + graph.addDynamicInteraction(edge, edgeDate, edgeAction); line = Adapters.readLine(reader); } } else if (line.size() == 4) { @@ -107,15 +107,15 @@ public DynamicGraph readGraph() throws AdapterException { String edgeAction = line.get(1); if (edgeAction.equals("+")) { Edge edge = graph.addEdge(UUID.randomUUID().toString(), sourceNode, targetNode); - graph.addDynamicInteraction(new DynamicInteraction(edge,edgeDate,edgeAction)); + graph.addDynamicInteraction(edge, edgeDate, edgeAction); }else if(edgeAction.equals("-")) { try { Edge edge = graph.removeEdge(sourceNode,targetNode); - graph.addDynamicInteraction(new DynamicInteraction(edge,edgeDate,edgeAction)); + graph.addDynamicInteraction(edge, edgeDate, edgeAction); } catch (ElementNotFoundException e1) { try { Edge edge = graph.removeEdge(targetNode, sourceNode); - graph.addDynamicInteraction(new DynamicInteraction(edge,edgeDate,edgeAction)); + graph.addDynamicInteraction(edge, edgeDate, edgeAction); } catch (ElementNotFoundException e2) { System.out.println(e1 + " and/or " + e2); } diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/CustomEdge.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/CustomEdge.java index d8678d96..b9ee4b94 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/CustomEdge.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/CustomEdge.java @@ -107,7 +107,14 @@ protected CustomEdge(CustomEdge customEdge) { public int getId() { return id; } - + public CustomGraph getGraph() { + return this.graph; + } + + public void setGraph(CustomGraph graph) { + this.graph = graph; + } + /** * Getter for the key. * @return The key. diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicGraph.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicGraph.java index 6cbf77d4..4ec5717a 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicGraph.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicGraph.java @@ -1,5 +1,11 @@ package i5.las2peer.services.ocd.graphs; +import com.arangodb.ArangoCollection; +import com.arangodb.ArangoDatabase; +import com.arangodb.entity.BaseDocument; +import com.arangodb.model.DocumentCreateOptions; +import com.arangodb.model.DocumentUpdateOptions; +import i5.las2peer.services.ocd.metrics.OcdMetricLog; import org.graphstream.graph.Edge; import org.graphstream.graph.Node; import org.graphstream.graph.implementations.AbstractGraph; @@ -12,6 +18,8 @@ public class DynamicGraph extends CustomGraph{ * Dynamic graph extension * Extends CustomGraph's by a list of interactions */ + + public static final String dynInKeysColumnName = "DYNAMICINTERACTION_KEYS"; private List dynamicInteractions = new ArrayList<>(); public DynamicGraph() { @@ -58,77 +66,32 @@ public boolean isDynamic() { return isOfType(GraphType.DYNAMIC); } - public void addDynamicInteraction(DynamicInteraction dynamicInteraction) { + public void addDynamicInteraction(Edge edge, String date, String action) { + CustomNode source = this.getCustomNode(edge.getSourceNode()); + CustomNode target = this.getCustomNode(edge.getTargetNode()); + DynamicInteraction dynamicInteraction = new DynamicInteraction(source, target, date, action); this.dynamicInteractions.add(dynamicInteraction); } - /*@Override - protected void copyMappings(Map customNodes, Map customEdges, Map nodeIds, Map edgeIds) { - copyDynamicMappings(customNodes, customEdges, nodeIds, edgeIds); - }*/ - - /*@Override - protected void addCustomEdge(Edge edge) { - DynamicInteraction dynamicInteraction = new DynamicInteraction(); - this.addDynamicInteraction(edge, dynamicInteraction); - }*/ - - /** - * Getter for the edge date of a certain edge. - * - * @param edge - * The edge. - * @return The edge date. - *//* - public String getEdgeDate(Edge edge) { - if(getCustomEdge(edge) instanceof DynamicInteraction) { - DynamicInteraction result = (DynamicInteraction) getCustomEdge(edge); - return result.getDate(); + @Override + public void persist(ArangoDatabase db, String transId) throws InterruptedException { + super.persist(db, transId); + for(DynamicInteraction dynIn: dynamicInteractions) { + dynIn.update(this); } - return "no date"; - } - - *//** - * Setter for the edge date of a certain edge. - * - * @param edge - * The edge. - * @param date - * The edge date. - *//* - public void setEdgeDate(Edge edge, String date) { - if(getCustomEdge(edge) instanceof DynamicInteraction) { - DynamicInteraction result = (DynamicInteraction) getCustomEdge(edge); - result.setDate(date); + ArangoCollection collection = db.collection(collectionName); + BaseDocument bd = new BaseDocument(); + DocumentUpdateOptions updateOptions = new DocumentUpdateOptions().streamTransactionId(transId); + DocumentCreateOptions createOptions = new DocumentCreateOptions().streamTransactionId(transId); + + List dynInteractionKeyList = new ArrayList(); + for(DynamicInteraction di : this.dynamicInteractions) { + di.persist(db, createOptions); + dynInteractionKeyList.add(di.getKey()); } - } - *//** - * Getter for the edge action of a certain edge. - * - * @param edge - * The edge. - * @return The edge action. - *//* - public String getEdgeAction(Edge edge) { - if(getCustomEdge(edge) instanceof DynamicInteraction) { - DynamicInteraction result = (DynamicInteraction) getCustomEdge(edge); - return result.getAction(); - } - return "no action"; - } + bd.addAttribute(dynInKeysColumnName, dynInteractionKeyList); - *//** - * Setter for the edge action of a certain edge. - * - * @param edge - * The edge. - * @param action - * The edge action. - *//* - public void setEdgeAction(Edge edge, String action) { - if(getCustomEdge(edge) instanceof DynamicInteraction) { - ((DynamicInteraction) getCustomEdge(edge)).setAction(action); - } - }*/ + collection.updateDocument(this.getKey(), bd, updateOptions); + } } diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicInteraction.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicInteraction.java index b30d4f50..c4965bf0 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicInteraction.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/DynamicInteraction.java @@ -1,4 +1,9 @@ package i5.las2peer.services.ocd.graphs; +import com.arangodb.ArangoCollection; +import com.arangodb.ArangoDatabase; +import com.arangodb.entity.BaseEdgeDocument; +import com.arangodb.model.DocumentCreateOptions; +import com.arangodb.model.DocumentReadOptions; import org.graphstream.graph.Node; import org.graphstream.graph.Edge; @@ -7,9 +12,12 @@ * * @author fsaintpreux */ -public class DynamicInteraction { - private Node source; - private Node target; +public class DynamicInteraction extends CustomEdge{ + + private static final String dateColumnName = "DATE"; + private static final String actionColumnName = "ACTION"; + + public static final String collectionName = "dynamicinteraction"; /** * The edge date as a string @@ -24,36 +32,13 @@ public class DynamicInteraction { public DynamicInteraction() { } - - public DynamicInteraction(DynamicInteraction dynamicInteraction) { - this.source = dynamicInteraction.source; - this.target = dynamicInteraction.target; - this.action = dynamicInteraction.action; - this.date = dynamicInteraction.date; - } - - public DynamicInteraction(Edge edge, String date, String action) { - this.source = edge.getSourceNode(); - this.target = edge.getTargetNode(); + public DynamicInteraction(CustomNode source, CustomNode target, String date, String action) { + this.setSource(source); + this.setTarget(target); this.date = date; this.action = action; } - public Node getSource() { - return source; - } - - public void setSource(Node source) { - this.source = source; - } - - public Node getTarget() { - return target; - } - - public void setTarget(Node target) { - this.target = target; - } /** * Getter for the date. @@ -87,11 +72,50 @@ public void setAction(String action) { this.action = action; } + public void update(DynamicGraph graph) { + this.setGraph(graph); + } + @Override + public void persist(ArangoDatabase db, DocumentCreateOptions opt) { + ArangoCollection collection = db.collection(collectionName); + BaseEdgeDocument bed = new BaseEdgeDocument(); + bed.addAttribute(graphKeyColumnName, this.getGraph().getKey()); + bed.addAttribute(dateColumnName, this.date); + bed.addAttribute(actionColumnName, this.action); + bed.setFrom(CustomNode.collectionName + "/" + this.getSource().getKey()); + bed.setTo(CustomNode.collectionName + "/" + this.getTarget().getKey()); + + collection.insertDocument(bed, opt); + this.key = bed.getKey(); + } + + public static DynamicInteraction load(BaseEdgeDocument bed, CustomNode source, CustomNode target, DynamicGraph graph, ArangoDatabase db) { + DynamicInteraction dynamicInteraction = new DynamicInteraction(); + + if (bed != null) { + dynamicInteraction.key = bed.getKey(); + dynamicInteraction.setGraph(graph); + if(bed.getAttribute(dateColumnName)!=null) { + dynamicInteraction.date = bed.getAttribute(dateColumnName).toString(); + } + if(bed.getAttribute(actionColumnName) != null) { + dynamicInteraction.action = bed.getAttribute(actionColumnName).toString(); + } + dynamicInteraction.setSource(source); + dynamicInteraction.setTarget(target); + } + else { + System.out.println("Empty Document"); + } + return dynamicInteraction; + + } + @Override public String toString() { return "DynamicInteraction{" + - "source=" + source + - ", target=" + target + + "source=" + this.getSource() + + ", target=" + this.getTarget() + ", date='" + date + '\'' + ", action='" + action + '\'' + '}'; diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/GraphProcessor.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/GraphProcessor.java index 4676b8e7..e0bb9650 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/GraphProcessor.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/graphs/GraphProcessor.java @@ -54,6 +54,11 @@ public void determineGraphTypes(CustomGraph graph) { } } + + if (graph instanceof DynamicGraph) { + graph.addType(GraphType.DYNAMIC); + } + if (graph.getPath() != "" && graph.getPath() != null) { if (graph.getEdgeCount() == 0) { graph.addType(GraphType.CONTENT_UNLINKED); diff --git a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/utils/Database.java b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/utils/Database.java index 705a2944..2600fc88 100644 --- a/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/utils/Database.java +++ b/rest_ocd_services/src/main/java/i5/las2peer/services/ocd/utils/Database.java @@ -182,6 +182,11 @@ public void createCollections() { if(!collection.exists()) { collection.create(); } + collectionNames.add(DynamicInteraction.collectionName); //13 + collection = db.collection(DynamicInteraction.collectionName); + if(!collection.exists()) { + collection.create(); + } } @@ -199,6 +204,9 @@ public void createCollections() { */ public String storeGraph(CustomGraph graph) { String transId = getTransactionId(CustomGraph.class, true); + if(graph instanceof DynamicGraph) { + transId = getTransactionId(DynamicGraph.class, true); + } try { graph.persist(db, transId); db.commitStreamTransaction(transId); @@ -1762,7 +1770,7 @@ else if(c == SimulationSeriesGroup.class){ collections = collectionNames.subList(11,13).toArray(new String[1]); } else { - collections = collectionNames.subList(0, 13).toArray(new String[10]); + collections = collectionNames.subList(0, 14).toArray(new String[10]); } StreamTransactionEntity tx; if(write) { diff --git a/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphDatabaseTest.java b/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphDatabaseTest.java index c0abc224..207278be 100644 --- a/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphDatabaseTest.java +++ b/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphDatabaseTest.java @@ -1,4 +1,59 @@ package i5.las2peer.services.ocd.graphs; +import i5.las2peer.services.ocd.utils.Database; +import org.graphstream.graph.Edge; +import org.graphstream.graph.Node; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; + public class DynamicGraphDatabaseTest { -} + + private static final String userName1 = "testUser1"; + private static final String graphName1 = "persistenceTestGraph1"; + private static final String invalidGraphName = "invalidGraphName"; + private static Database database; + + @BeforeClass + public static void clearDatabase() { + database = new Database(true); + } + + //@AfterClass + // public static void deleteDatabase() { + // database.deleteDatabase(); + // } + + @Test + public void testPersist() { + DynamicGraph graph = new DynamicGraph(); + graph.setUserName(userName1); + graph.setName(graphName1); + Node nodeA = graph.addNode("A"); + Node nodeB = graph.addNode("B"); + Node nodeC = graph.addNode("C"); + graph.setNodeName(nodeA, "A"); + graph.setNodeName(nodeB, "B"); + graph.setNodeName(nodeC, "C"); + Edge edgeAB = graph.addEdge(UUID.randomUUID().toString(), nodeA, nodeB); + graph.addDynamicInteraction(edgeAB,"0","+"); + graph.setEdgeWeight(edgeAB, 5); + Edge edgeBC = graph.addEdge(UUID.randomUUID().toString(), nodeB, nodeC); + graph.addDynamicInteraction(edgeBC, "1","-"); + graph.setEdgeWeight(edgeBC, 2.5); + graph.addType(GraphType.DYNAMIC); + + database.storeGraph(graph); + + + } + +} \ No newline at end of file diff --git a/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphTest.java b/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphTest.java index bed5084c..b8bff8b1 100644 --- a/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphTest.java +++ b/rest_ocd_services/src/test/java/i5/las2peer/services/ocd/graphs/DynamicGraphTest.java @@ -21,24 +21,24 @@ public void testSuperCopyConstructor() { Node node0 = graph.addNode("0"); Node node1 = graph.addNode("1"); Edge edge0 = graph.addEdge(UUID.randomUUID().toString(), node0, node1); - graph.addDynamicInteraction(new DynamicInteraction(edge0, "0", "+")); + graph.addDynamicInteraction(edge0, "0", "+"); Edge edge1 = graph.addEdge(UUID.randomUUID().toString(), node1, node0); - graph.addDynamicInteraction(new DynamicInteraction(edge1, "1", "+")); + graph.addDynamicInteraction(edge1, "1", "+"); Edge edge2 = graph.addEdge(UUID.randomUUID().toString(), node0, node0); - graph.addDynamicInteraction(new DynamicInteraction(edge2, "2", "+")); + graph.addDynamicInteraction(edge2, "2", "+"); Node node2 = graph.addNode("2"); Edge edge3 = graph.addEdge(UUID.randomUUID().toString(), node0, node2); - graph.addDynamicInteraction(new DynamicInteraction(edge3, "3", "+")); + graph.addDynamicInteraction(edge3, "3", "+"); Edge edge4 = graph.addEdge(UUID.randomUUID().toString(), node1, node2); - graph.addDynamicInteraction(new DynamicInteraction(edge4, "4", "+")); + graph.addDynamicInteraction(edge4, "4", "+"); Edge edge5 = graph.addEdge(UUID.randomUUID().toString(), node2, node1); - graph.addDynamicInteraction(new DynamicInteraction(edge5, "5", "+")); + graph.addDynamicInteraction(edge5, "5", "+"); graph.setEdgeWeight(edge5, 5); DynamicGraph copy = new DynamicGraph(graph); @@ -51,6 +51,8 @@ public void testSuperCopyConstructor() { assertEquals(5, copy.getEdgeWeight(copyEdge5), 0); copy.removeEdge(copyEdge5); assertEquals(graph.getEdgeCount() - 1, copy.getEdgeCount()); + assertEquals(graph.getDynamicInteractions().size(), graph.getEdgeCount()); + System.out.println(graph.getDynamicInteractions()); assertEquals(graph.getDynamicInteractions(), copy.getDynamicInteractions()); } @@ -59,16 +61,23 @@ public void testEdgeRemoval() { DynamicGraph graph = new DynamicGraph(); Node node0 = graph.addNode("0"); Node node1 = graph.addNode("1"); - graph.addEdge(UUID.randomUUID().toString(), node0, node1); - graph.addEdge(UUID.randomUUID().toString(), node1, node0); - graph.addEdge(UUID.randomUUID().toString(), node0, node0); + Edge edge0 = graph.addEdge(UUID.randomUUID().toString(), node0, node1); + graph.addDynamicInteraction(edge0,"0", "+"); + Edge edge1 =graph.addEdge(UUID.randomUUID().toString(), node1, node0); + graph.addDynamicInteraction(edge1,"0","+"); + Edge edge2 = graph.addEdge(UUID.randomUUID().toString(), node0, node0); + graph.addDynamicInteraction(edge2,"0","+"); Node node2 = graph.addNode("2"); - graph.addEdge(UUID.randomUUID().toString(), node0, node2); - graph.addEdge(UUID.randomUUID().toString(), node1, node2); + Edge edge3 = graph.addEdge(UUID.randomUUID().toString(), node0, node2); + graph.addDynamicInteraction(edge3,"0","+"); + Edge edge4 = graph.addEdge(UUID.randomUUID().toString(), node1, node2); + graph.addDynamicInteraction(edge4,"0","+"); Edge edge5 = graph.addEdge(UUID.randomUUID().toString(), node2, node1); + graph.addDynamicInteraction(edge5,"0","+"); graph.setEdgeWeight(edge5, 5); assertEquals(6, graph.getEdgeCount()); graph.removeEdge(edge5); + assertEquals(graph.getDynamicInteractions().size(),6); assertEquals(5, graph.getEdgeCount()); graph.getEdgeWeight(edge5); }