Coverage Summary for Class: TestTopologyDeleteSpecific (org.umlg.sqlg.test.topology)
Class |
Class, %
|
Method, %
|
Line, %
|
TestTopologyDeleteSpecific |
100%
(1/1)
|
100%
(5/5)
|
100%
(74/74)
|
package org.umlg.sqlg.test.topology;
import org.apache.commons.configuration2.Configuration;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Assume;
import org.junit.Test;
import org.umlg.sqlg.structure.SqlgGraph;
import org.umlg.sqlg.structure.topology.EdgeLabel;
import org.umlg.sqlg.structure.topology.Schema;
import org.umlg.sqlg.structure.topology.VertexLabel;
import org.umlg.sqlg.test.BaseTest;
import java.util.Optional;
import static org.junit.Assert.*;
/**
* test deletion behavior in a specific scenarios
*
* @author JP Moresmau
*/
public class TestTopologyDeleteSpecific extends BaseTest {
/**
* @see <a href="https://github.com/pietermartin/sqlg/issues/306">https://github.com/pietermartin/sqlg/issues/306</a>
*/
@Test
public void testDeleteSchemaWithEdgeRoleAcrossMultipleSchemas() {
//Schema deletion does not work on all databases.
Assume.assumeTrue(isPostgres());
SqlgGraph g = this.sqlgGraph;
Vertex a1 = g.addVertex(T.label, "A.A");
Vertex b1 = g.addVertex(T.label, "B.B");
a1.addEdge("ab", b1);
g.tx().commit();
Vertex c1 = g.addVertex(T.label, "A.C");
c1.addEdge("ab", a1);
g.tx().commit();
g.getTopology().getSchema("A").ifPresent((Schema s) -> s.remove(false));
g.tx().commit();
assertFalse(g.getTopology().getSchema("A").isPresent());
assertEquals(1, g.traversal().V().count().next().intValue());
assertEquals(0, g.traversal().E().count().next().intValue());
}
/**
* this failed with a NPE because we lost the table definition we're working on
*/
@Test
public void testSchemaDelete() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsDistribution());
String schema = "willDelete";
sqlgGraph.addVertex(T.label, schema + ".t1", "name", "n1", "hello", "world");
sqlgGraph.tx().commit();
Configuration c = getConfigurationClone();
c.setProperty(SqlgGraph.DISTRIBUTED, true);
sqlgGraph = SqlgGraph.open(c);
sqlgGraph.getTopology().getSchema(schema).ifPresent((Schema s) -> s.remove(false));
sqlgGraph.tx().commit();
Vertex v1 = sqlgGraph.addVertex(T.label, schema + ".t1", "name", "n1");
Vertex v2 = sqlgGraph.addVertex(T.label, schema + ".t2", "name", "n2");
Edge e1 = v1.addEdge("e1", v2);
sqlgGraph.tx().commit();
sqlgGraph.tx().normalBatchModeOn();
v1.property("hello", "world");
// this line was failing
e1.property("hello", "world");
sqlgGraph.tx().commit();
assertEquals("world", e1.value("hello"));
}
/**
* @see <a href="https://github.com/pietermartin/sqlg/issues/212">https://github.com/pietermartin/sqlg/issues/212</a>
*/
@Test
public void testRemoveAndAddInSameTransaction() {
//remove it, it does not exist but duplicating work logic.
Optional<EdgeLabel> aaEdgeLabelOpt = this.sqlgGraph.getTopology().getEdgeLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "aa");
aaEdgeLabelOpt.ifPresent(edgeLabel -> edgeLabel.remove(false));
Optional<VertexLabel> aVertexLabelOpt = this.sqlgGraph.getTopology().getVertexLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "A");
aVertexLabelOpt.ifPresent(vertexLabel -> vertexLabel.remove(false));
VertexLabel aVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("A");
aVertexLabel.ensureEdgeLabelExist("aa", aVertexLabel);
this.sqlgGraph.tx().commit();
aaEdgeLabelOpt = this.sqlgGraph.getTopology().getEdgeLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "aa");
aaEdgeLabelOpt.ifPresent(edgeLabel -> edgeLabel.remove(false));
aVertexLabelOpt = this.sqlgGraph.getTopology().getVertexLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "A");
aVertexLabelOpt.ifPresent(vertexLabel -> vertexLabel.remove(false));
aVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("A");
aVertexLabel.ensureEdgeLabelExist("aa", aVertexLabel);
this.sqlgGraph.tx().commit();
aaEdgeLabelOpt = this.sqlgGraph.getTopology().getEdgeLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "aa");
assertTrue(aaEdgeLabelOpt.isPresent());
aVertexLabelOpt = this.sqlgGraph.getTopology().getVertexLabel(this.sqlgGraph.getSqlDialect().getPublicSchema(), "A");
assertTrue(aVertexLabelOpt.isPresent());
}
@Test
public void testRemoveSchemaWithCrossEdges() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsDistribution());
Configuration c = getConfigurationClone();
c.setProperty(SqlgGraph.DISTRIBUTED, true);
sqlgGraph = SqlgGraph.open(c);
String schema1 = "willDelete1";
Vertex v1 = sqlgGraph.addVertex(T.label, schema1 + ".t1", "name", "n1", "hello", "world");
String schema2 = "willDelete2";
Vertex v2 = sqlgGraph.addVertex(T.label, schema2 + ".t2", "name", "n2", "hello", "world");
Vertex v3 = sqlgGraph.addVertex(T.label, schema2 + ".t3", "name", "n3", "hello", "world");
Vertex v4 = sqlgGraph.addVertex(T.label, schema2 + ".t4", "name", "n4", "hello", "world");
v1.addEdge("e1", v3, "me","again");
v2.addEdge("e1", v3, "me","again");
v1.addEdge("e1", v4, "me","again");
v2.addEdge("e1", v4, "me","again");
sqlgGraph.tx().commit();
assertTrue(sqlgGraph.getTopology().getSchema(schema1).isPresent());
assertTrue(sqlgGraph.getTopology().getSchema(schema2).isPresent());
sqlgGraph.getTopology().getSchema(schema1).ifPresent((Schema s) -> s.remove(false));
sqlgGraph.tx().commit();
assertFalse(sqlgGraph.getTopology().getSchema(schema1).isPresent());
// this used to fail
sqlgGraph.getTopology().getSchema(schema2).ifPresent((Schema s) -> s.remove(false));
sqlgGraph.tx().commit();
assertFalse(sqlgGraph.getTopology().getSchema(schema2).isPresent());
}
}