Coverage Summary for Class: TestTopologyUpgrade (org.umlg.sqlg.test.topology)
Class |
Method, %
|
Branch, %
|
Line, %
|
TestTopologyUpgrade |
100%
(25/25)
|
28.5%
(37/130)
|
100%
(625/625)
|
TestTopologyUpgrade$1 |
100%
(1/1)
|
100%
(2/2)
|
TestTopologyUpgrade$2 |
100%
(1/1)
|
100%
(2/2)
|
TestTopologyUpgrade$3 |
100%
(1/1)
|
100%
(3/3)
|
TestTopologyUpgrade$4 |
100%
(1/1)
|
100%
(2/2)
|
TestTopologyUpgrade$5 |
100%
(1/1)
|
100%
(2/2)
|
Total |
100%
(30/30)
|
28.5%
(37/130)
|
100%
(636/636)
|
package org.umlg.sqlg.test.topology;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.umlg.sqlg.strategy.TopologyStrategy;
import org.umlg.sqlg.structure.PropertyDefinition;
import org.umlg.sqlg.structure.PropertyType;
import org.umlg.sqlg.structure.SqlgGraph;
import org.umlg.sqlg.structure.topology.*;
import org.umlg.sqlg.test.BaseTest;
import java.sql.Connection;
import java.sql.Statement;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.*;
import static org.junit.Assert.*;
/**
* Date: 2016/02/06
* Time: 6:17 PM
*/
public class TestTopologyUpgrade extends BaseTest {
@Test
public void testTopologyUpgradeForeignKey() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
a1.addEdge("ab", b1);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
System.out.println("asd");
}
}
//The asdasd index is for a property that foes not exist, it will be ignored when loading the topology.
@Test
public void testCustomIndexIgnored() throws Exception {
//TODO one day for HSQLDB and the rest
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().isPostgresql());
Map<String, PropertyDefinition> properties = new HashMap<>() {{
put("name", PropertyDefinition.of(PropertyType.STRING));
}};
Schema hour = this.sqlgGraph.getTopology().ensureSchemaExist("A");
VertexLabel vertexLabel = hour.ensureVertexLabelExist("A", properties);
PropertyColumn propertyColumn = vertexLabel.getProperty("name").get();
vertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(propertyColumn));
this.sqlgGraph.tx().commit();
this.sqlgGraph.addVertex(T.label, "A.A", "name", "aaaa");
Connection conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
statement.execute("CREATE INDEX \"asdasd\" ON \"A\".\"V_A\" USING btree (left('name', 1)) ");
}
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(1, sqlgGraph1.traversal().V().count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.getTopology().getSchema("A").get().getVertexLabel("A").get().getIndexes().size());
}
}
@Test
public void testUpgradeEdgeWithMultipleInOutLabelsAndAIndex() {
VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("A");
VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("B");
VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("C");
Map<String, PropertyDefinition> properties = new HashMap<>() {{
put("name", PropertyDefinition.of(PropertyType.STRING));
}};
@SuppressWarnings("UnusedAssignment")
EdgeLabel edgeLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureEdgeLabelExist("edge", bVertexLabel, aVertexLabel, properties);
edgeLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureEdgeLabelExist("edge", cVertexLabel, aVertexLabel, properties);
edgeLabel.ensureIndexExists(IndexType.UNIQUE, new ArrayList<>(edgeLabel.getProperties().values()));
this.sqlgGraph.tx().commit();
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C");
b1.addEdge("edge", a1, "name", "b");
c1.addEdge("edge", a1, "name", "c");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(3, sqlgGraph1.traversal().V().count().next().intValue());
Assert.assertEquals(2, sqlgGraph1.traversal().E().count().next().intValue());
}
}
@Test
public void testUpgrade() {
//with topology
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "john");
Object idA1 = a1.id();
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "joe");
Object idB1 = b1.id();
a1.addEdge("knows", b1, "name", "hithere");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(2, sqlgGraph1.traversal().V().count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().E().count().next().intValue());
assertTrue(sqlgGraph1.traversal().V().hasLabel("A").hasNext());
assertTrue(sqlgGraph1.traversal().V().hasLabel("B").hasNext());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("A").count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("B").count().next().intValue());
Vertex a = sqlgGraph1.traversal().V().hasLabel("A").next();
Assert.assertEquals(idA1, a.id());
Vertex b = sqlgGraph1.traversal().V().hasLabel("B").next();
Assert.assertEquals(idB1, b.id());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).out("knows").count().next().intValue());
Assert.assertEquals(b, sqlgGraph1.traversal().V(a).out("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(b).in("knows").count().next().intValue());
Assert.assertEquals(a, sqlgGraph1.traversal().V(b).in("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).properties("name").count().next().intValue());
Assert.assertNotNull(sqlgGraph1.traversal().V(a).properties("name").next().value());
Assert.assertEquals("john", sqlgGraph1.traversal().V(a).properties("name").next().value());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).outE("knows").properties("name").count().next().intValue());
assertTrue(sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value() != null);
Assert.assertEquals("hithere", sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value());
}
//from topology
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(2, sqlgGraph1.traversal().V().count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().E().count().next().intValue());
assertTrue(sqlgGraph1.traversal().V().hasLabel("A").hasNext());
assertTrue(sqlgGraph1.traversal().V().hasLabel("B").hasNext());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("A").count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("B").count().next().intValue());
Vertex a = sqlgGraph1.traversal().V().hasLabel("A").next();
Assert.assertEquals(idA1, a.id());
Vertex b = sqlgGraph1.traversal().V().hasLabel("B").next();
Assert.assertEquals(idB1, b.id());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).out("knows").count().next().intValue());
Assert.assertEquals(b, sqlgGraph1.traversal().V(a).out("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(b).in("knows").count().next().intValue());
Assert.assertEquals(a, sqlgGraph1.traversal().V(b).in("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).properties("name").count().next().intValue());
assertNotNull(sqlgGraph1.traversal().V(a).properties("name").next().value());
Assert.assertEquals("john", sqlgGraph1.traversal().V(a).properties("name").next().value());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).outE("knows").properties("name").count().next().intValue());
assertNotNull(sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value());
Assert.assertEquals("hithere", sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value());
}
}
@Test
public void testUpgradeMultipleInOutEdges() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
Object a1Id = a1.id();
Object b1Id = b1.id();
a1.addEdge("ab", b1, "weight", 5);
a1.addEdge("ab", c1, "weight", 6);
b1.addEdge("ba", a1, "wtf", "wtf1");
b1.addEdge("ba", c1, "wtf", "wtf1");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(2, sqlgGraph1.traversal().V(a1Id).out().count().next().intValue());
Assert.assertEquals(2, sqlgGraph1.traversal().V(b1Id).out().count().next().intValue());
}
}
@Test
public void testUpgradeMultipleInOutEdges2() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "R_EG.B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "P_EG.C", "name", "c1");
Object a1Id = a1.id();
Object b1Id = b1.id();
a1.addEdge("ab", b1, "weight", 5);
a1.addEdge("ab", c1, "weight", 6);
b1.addEdge("ba", a1, "wtf", "wtf1");
b1.addEdge("ba", c1, "wtf", "wtf1");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(2, sqlgGraph1.traversal().V(a1Id).out().count().next().intValue());
Assert.assertEquals(2, sqlgGraph1.traversal().V(b1Id).out().count().next().intValue());
}
}
@Test
public void multipleSchemas() {
Vertex aPublic = this.sqlgGraph.addVertex(T.label, "APUBLIC", "name", "aPublic");
Vertex aReal = this.sqlgGraph.addVertex(T.label, "REAL.AREAL", "name", "aReal");
aPublic.addEdge("a", aReal, "name", "asd");
aReal.addEdge("a", aPublic, "name", "dsa");
Vertex bPublic = this.sqlgGraph.addVertex(T.label, "BPUBLIC", "name", "bPublic");
Vertex bReal = this.sqlgGraph.addVertex(T.label, "REAL.BREAL", "name", "bReal");
bPublic.addEdge("a", bReal, "name", "asd");
bReal.addEdge("a", bPublic, "name", "dsa");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(1, sqlgGraph1.traversal().V(aPublic.id()).in().count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().V(aPublic.id()).out().count().next().intValue());
}
}
@Test
public void testGratefulDeadDBUpgrade() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsBatchMode());
loadGratefulDead(this.sqlgGraph);
Traversal<Vertex, Long> traversal = get_g_V_both_both_count(this.sqlgGraph.traversal());
Assert.assertEquals(Long.valueOf(1406914), traversal.next());
Assert.assertFalse(traversal.hasNext());
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.close();
for (int i = 0; i < 2; i++) {
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
traversal = get_g_V_both_both_count(sqlgGraph1.traversal());
Assert.assertEquals(Long.valueOf(1406914), traversal.next());
Assert.assertFalse(traversal.hasNext());
}
}
}
@Test
public void testModernGraph() {
loadModern();
Traversal<Vertex, Long> traversal = this.sqlgGraph.traversal().V().both().both().count();
Assert.assertEquals(Long.valueOf(30), traversal.next());
Assert.assertFalse(traversal.hasNext());
this.sqlgGraph.traversal().V().forEachRemaining(Element::remove);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
loadModern(sqlgGraph1);
traversal = sqlgGraph1.traversal().V().both().both().count();
Assert.assertEquals(Long.valueOf(30), traversal.next());
Assert.assertFalse(traversal.hasNext());
}
}
@Test
public void testTopologyFilter() {
Vertex god = this.sqlgGraph.addVertex(T.label, "God", "name", "god1");
Vertex universe = this.sqlgGraph.addVertex(T.label, "Universe", "name", "universe1");
god.addEdge("universe", universe);
this.sqlgGraph.tx().commit();
GraphTraversalSource traversalSource = this.sqlgGraph.traversal().withStrategies(
TopologyStrategy.build().sqlgSchema().create()
);
List<Vertex> schemas = traversalSource.V()
.hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_SCHEMA)
.toList();
//public
Assert.assertEquals(1, schemas.size());
Long count = this.sqlgGraph.topology().V().count().next();
Assert.assertEquals(7, count, 0);
}
@Test
public void testUpgradePropertiesAcrossSchema() {
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1", "name1", "a11");
this.sqlgGraph.addVertex(T.label, "B.A", "name", "b1", "name2", "b22");
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property").toList();
Assert.assertEquals(2, propertyVertices.size());
propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "B")
.out("schema_vertex").has("name", "A")
.out("vertex_property").toList();
Assert.assertEquals(2, propertyVertices.size());
}
}
@Test
public void testUpgradeTypesWithMoreThanOneColumn() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
zonedDateTime = zonedDateTime.truncatedTo(ChronoUnit.MILLIS);
Duration duration = Duration.ofDays(1);
Period period = Period.of(1, 1, 1);
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1", "zonedDateTime", zonedDateTime);
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a2", "duration", duration);
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a3", "period", period);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTime
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "zonedDateTime").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.ZONEDDATETIME, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Vertex> vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a1").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertEquals(zonedDateTime, vertices.get(0).value("zonedDateTime"));
//assert duration
propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "duration").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.DURATION, PropertyType.valueOf(propertyVertices.get(0).value("type")));
vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a2").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertEquals(duration, vertices.get(0).value("duration"));
//assert period
propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "period").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.PERIOD, PropertyType.valueOf(propertyVertices.get(0).value("type")));
vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a3").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertEquals(period, vertices.get(0).value("period"));
}
}
@Test
public void testUpgradeTypesWithMoreThanOneColumnOnEdge() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
zonedDateTime = zonedDateTime.truncatedTo(ChronoUnit.MILLIS);
Duration duration = Duration.ofDays(1);
Period period = Period.of(1, 1, 1);
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a2");
a1.addEdge("ab", a2, "zonedDateTime", zonedDateTime, "duration", duration, "period", period);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTime
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out(Topology.SQLG_SCHEMA_SCHEMA_VERTEX_EDGE)
.has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
.out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE)
.out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "zonedDateTime").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.ZONEDDATETIME, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Edge> edges = sqlgGraph1.traversal().E().hasLabel("ab").toList();
Assert.assertEquals(1, edges.size());
Assert.assertEquals(zonedDateTime, edges.get(0).value("zonedDateTime"));
Assert.assertEquals(duration, edges.get(0).value("duration"));
Assert.assertEquals(period, edges.get(0).value("period"));
}
}
@Test
public void testUpgradeArrayTypesWithMoreThanOneColumn() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsZonedDateTimeArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsDurationArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsPeriodArrayValues());
ZonedDateTime[] zonedDateTimes = new ZonedDateTime[]{
ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusMonths(1).truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusMonths(2).truncatedTo(ChronoUnit.SECONDS)
};
Duration[] durations = new Duration[]{Duration.ofDays(1), Duration.ofDays(2), Duration.ofDays(3)};
Period[] periods = new Period[]{Period.of(1, 1, 1), Period.of(2, 2, 2), Period.of(3, 3, 3)};
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1", "zonedDateTimes", zonedDateTimes);
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a2", "durations", durations);
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a3", "periods", periods);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTimes
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "zonedDateTimes").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.ZONEDDATETIME_ARRAY, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Vertex> vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a1").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertArrayEquals(zonedDateTimes, vertices.get(0).value("zonedDateTimes"));
//assert durations
propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "durations").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.DURATION_ARRAY, PropertyType.valueOf(propertyVertices.get(0).value("type")));
vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a2").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertArrayEquals(durations, vertices.get(0).value("durations"));
//assert periods
propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "periods").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.PERIOD_ARRAY, PropertyType.valueOf(propertyVertices.get(0).value("type")));
vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a3").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertArrayEquals(periods, vertices.get(0).value("periods"));
}
}
@Test
public void testUpgradeTypesWithMoreThanOneColumnOnEdgeArrays() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsDurationArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsPeriodArrayValues());
ZonedDateTime[] zonedDateTimes = new ZonedDateTime[]{
ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusMonths(1).truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusMonths(2).truncatedTo(ChronoUnit.SECONDS)
};
Duration[] durations = new Duration[]{Duration.ofDays(1), Duration.ofDays(2), Duration.ofDays(3)};
Period[] periods = new Period[]{Period.of(1, 1, 1), Period.of(2, 2, 2), Period.of(3, 3, 3)};
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a2");
a1.addEdge("ab", a2, "zonedDateTimes", zonedDateTimes, "durations", durations, "periods", periods);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTime
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out(Topology.SQLG_SCHEMA_SCHEMA_VERTEX_EDGE)
.has(Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
.out(Topology.SQLG_SCHEMA_OUT_EDGES_EDGE)
.out(Topology.SQLG_SCHEMA_EDGE_PROPERTIES_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "zonedDateTimes").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.ZONEDDATETIME_ARRAY, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Edge> edges = sqlgGraph1.traversal().E().hasLabel("ab").toList();
Assert.assertEquals(1, edges.size());
Assert.assertArrayEquals(zonedDateTimes, edges.get(0).value("zonedDateTimes"));
Assert.assertArrayEquals(durations, edges.get(0).value("durations"));
Assert.assertArrayEquals(periods, edges.get(0).value("periods"));
}
}
@Test
public void testUpgradeJson() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsJsonType());
ObjectNode json = new ObjectMapper().createObjectNode();
json.put("halo", "asdasd");
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1", "json", json);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTimes
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "json").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.JSON, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Vertex> vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a1").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertEquals(json, vertices.get(0).value("json"));
}
}
@Test
public void testUpgradeJsonArrays() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().isPostgresql());
//HSQLDB can not upgrade JSON ARRAY as its indistinguishable from STRING ARRAY.
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsJsonArrayValues());
ObjectNode json1 = new ObjectMapper().createObjectNode();
json1.put("halo", "asdasd");
ObjectNode json2 = new ObjectMapper().createObjectNode();
json2.put("halo", "asdasd");
ObjectNode[] jsons = new ObjectNode[]{json1, json2};
this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1", "jsons", jsons);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
List<Vertex> schemaVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A").toList();
Assert.assertEquals(1, schemaVertices.size());
//assert zonedDateTimes
List<Vertex> propertyVertices = sqlgGraph1.topology().V().hasLabel("sqlg_schema.schema").has("name", "A")
.out("schema_vertex")
.has("name", "A")
.out("vertex_property")
.has("name", "jsons").toList();
Assert.assertEquals(1, propertyVertices.size());
Assert.assertEquals(PropertyType.JSON_ARRAY, PropertyType.valueOf(propertyVertices.get(0).value("type")));
List<Vertex> vertices = sqlgGraph1.traversal().V().hasLabel("A.A").has("name", "a1").toList();
Assert.assertEquals(1, vertices.size());
Assert.assertArrayEquals(jsons, vertices.get(0).value("jsons"));
}
}
@Test
public void testUpdateLocalDateTimeAndZonedDateTime() {
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime = localDateTime.truncatedTo(ChronoUnit.MILLIS);
ZonedDateTime zonedDateTime = ZonedDateTime.now();
zonedDateTime = zonedDateTime.truncatedTo(ChronoUnit.MILLIS);
this.sqlgGraph.addVertex(T.label, "A", "localDateTime", localDateTime, "zonedDateTime", zonedDateTime);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(localDateTime, sqlgGraph1.traversal().V().hasLabel("A").next().value("localDateTime"));
Assert.assertEquals(zonedDateTime, sqlgGraph1.traversal().V().hasLabel("A").next().value("zonedDateTime"));
}
}
@Test
public void testUpgradeArrays() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsShortArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsIntegerArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsDoubleArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsLocalDateArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsLocalDateTimeArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsLocalTimeArrayValues());
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsZonedDateTimeArrayValues());
Byte[] bytes = new Byte[]{1, 2, 3};
byte[] bytes2 = new byte[]{1, 2, 3};
Short[] shorts = new Short[]{1, 2, 3};
short[] shorts2 = new short[]{1, 2, 3};
Integer[] integers = new Integer[]{1, 2, 3};
int[] integers2 = new int[]{1, 2, 3};
Long[] longs = new Long[]{1L, 2L, 3L};
long[] longs2 = new long[]{1L, 2L, 3L};
Double[] doubles = new Double[]{1D, 2D, 3D};
double[] doubles2 = new double[]{1D, 2D, 3D};
String[] strings = new String[]{"a", "b", "c"};
LocalDate[] localDates = new LocalDate[]{LocalDate.now(), LocalDate.now().minusMonths(2), LocalDate.now().minusMonths(3)};
LocalDateTime[] localDateTimes = new LocalDateTime[]{
LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS),
LocalDateTime.now().minusMonths(2).truncatedTo(ChronoUnit.SECONDS),
LocalDateTime.now().minusMonths(3).truncatedTo(ChronoUnit.SECONDS)
};
LocalTime[] localTimes = new LocalTime[]{LocalTime.now(), LocalTime.now().minusHours(2), LocalTime.now().minusHours(3)};
ZonedDateTime[] zonedDateTimes = new ZonedDateTime[]{
ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusHours(2).truncatedTo(ChronoUnit.SECONDS),
ZonedDateTime.now().minusHours(3).truncatedTo(ChronoUnit.SECONDS)
};
this.sqlgGraph.addVertex(T.label, "A",
"bytes", bytes, "bytes2", bytes2,
"shorts", shorts, "shorts2", shorts2,
"integers", integers, "integers2", integers2,
"longs", longs, "longs2", longs2,
"doubles", doubles, "doubles2", doubles2,
"strings", strings,
"localDates", localDates,
"localDateTimes", localDateTimes,
"localTimes", localTimes,
"zonedDateTimes", zonedDateTimes
);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertArrayEquals(bytes, sqlgGraph1.traversal().V().hasLabel("A").next().value("bytes"));
Assert.assertArrayEquals(bytes, sqlgGraph1.traversal().V().hasLabel("A").next().value("bytes2"));
Assert.assertArrayEquals(shorts, sqlgGraph1.traversal().V().hasLabel("A").next().value("shorts"));
Assert.assertArrayEquals(shorts, sqlgGraph1.traversal().V().hasLabel("A").next().value("shorts2"));
Assert.assertArrayEquals(integers, sqlgGraph1.traversal().V().hasLabel("A").next().value("integers"));
Assert.assertArrayEquals(integers, sqlgGraph1.traversal().V().hasLabel("A").next().value("integers2"));
Assert.assertArrayEquals(longs, sqlgGraph1.traversal().V().hasLabel("A").next().value("longs"));
Assert.assertArrayEquals(longs, sqlgGraph1.traversal().V().hasLabel("A").next().value("longs2"));
Assert.assertArrayEquals(doubles, sqlgGraph1.traversal().V().hasLabel("A").next().value("doubles"));
Assert.assertArrayEquals(doubles, sqlgGraph1.traversal().V().hasLabel("A").next().value("doubles2"));
Assert.assertArrayEquals(strings, sqlgGraph1.traversal().V().hasLabel("A").next().value("strings"));
Assert.assertArrayEquals(localDates, sqlgGraph1.traversal().V().hasLabel("A").next().value("localDates"));
Assert.assertArrayEquals(localDateTimes, sqlgGraph1.traversal().V().hasLabel("A").next().value("localDateTimes"));
LocalTime[] value = sqlgGraph1.traversal().V().hasLabel("A").next().value("localTimes");
List<LocalTime> localTimes1 = new ArrayList<>();
for (LocalTime localTime : value) {
localTimes1.add(localTime.minusNanos(localTime.getNano()));
}
Assert.assertArrayEquals(localTimes1.toArray(), value);
Assert.assertArrayEquals(zonedDateTimes, sqlgGraph1.traversal().V().hasLabel("A").next().value("zonedDateTimes"));
}
}
@Test
public void testUpgradeFloatArrays() {
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsFloatValues());
Float[] floats = new Float[]{1F, 2F, 3F};
float[] floats2 = new float[]{1F, 2F, 3F};
this.sqlgGraph.addVertex(T.label, "A",
"floats", floats, "floats2", floats2
);
this.sqlgGraph.tx().commit();
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertArrayEquals(floats, sqlgGraph1.traversal().V().hasLabel("A").next().value("floats"));
Assert.assertArrayEquals(floats, sqlgGraph1.traversal().V().hasLabel("A").next().value("floats2"));
}
}
private Traversal<Vertex, Long> get_g_V_both_both_count(GraphTraversalSource g) {
return g.V().both().both().count();
}
@SuppressWarnings("serial")
@Test
public void testUpgradeIndex() {
//with topology
VertexLabel personVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist(
"Person",
new HashMap<>() {{
put("firstName", PropertyDefinition.of(PropertyType.STRING));
put("lastName", PropertyDefinition.of(PropertyType.STRING));
}}
);
personVertexLabel.ensureIndexExists(IndexType.UNIQUE, new ArrayList<>(personVertexLabel.getProperties().values()));
Map<String, PropertyDefinition> properties = new HashMap<>() {{
put("name", PropertyDefinition.of(PropertyType.STRING));
}};
VertexLabel dogVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("Dog", properties);
dogVertexLabel.ensureIndexExists(IndexType.NON_UNIQUE, new ArrayList<>(dogVertexLabel.getProperties().values()));
Map<String, PropertyDefinition> eproperties = new HashMap<>() {{
put("since", PropertyDefinition.of(PropertyType.LOCALDATE));
}};
EdgeLabel eLabel = this.sqlgGraph.getTopology().ensureEdgeLabelExist("Owns",
personVertexLabel,
dogVertexLabel,
eproperties);
eLabel.ensureIndexExists(IndexType.UNIQUE, new ArrayList<>(eLabel.getProperties().values()));
// test performance
/*for (int a=0;a<1000;a++){
VertexLabel testVertex = this.sqlgGraph.getTopology().ensureVertexLabelExist("Person"+a, new HashMap<>() {{
put("firstName", PropertyType.STRING);
put("lastName", PropertyType.STRING);
}});
testVertex.ensureIndexExists(IndexType.UNIQUE, new ArrayList<>(testVertex.getProperties().values()));
}*/
// not supported yet
/*this.sqlgGraph.getTopology().ensureGlobalUniqueIndexExist(new HashSet<PropertyColumn>() {{
add(personVertexLabel.getProperty("firstName").get());
add(dogVertexLabel.getProperty("name").get());
}});*/
this.sqlgGraph.tx().commit();
// sanity
topologyCheck(this.sqlgGraph);
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
topologyCheck(sqlgGraph1);
}
//from topology
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
topologyCheck(sqlgGraph1);
}
}
@Test
public void testNonEdgeNonVerticeTablesIgnored() throws Exception {
//Drop these tables in case they are hanging around, Sqlg only drops V_ and E_ tables.
Connection conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
statement.execute("DROP TABLE IF EXISTS " + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("EVENT"));
}
try (Statement statement = conn.createStatement()) {
statement.execute("DROP TABLE IF EXISTS " + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("VIKINGS"));
}
sqlgGraph.tx().commit();
//with topology
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "john");
Object idA1 = a1.id();
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "joe");
Object idB1 = b1.id();
a1.addEdge("knows", b1, "name", "hithere");
this.sqlgGraph.tx().commit();
// Create some user tables that should be ignored by sqlg
conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
statement.execute(this.sqlgGraph.getSqlDialect().createTableStatement() + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("EVENT") + "(ID INT)");
}
try (Statement statement = conn.createStatement()) {
statement.execute(this.sqlgGraph.getSqlDialect().createTableStatement() + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("VIKINGS") + "(ID INT)");
}
//Delete the topology
dropSqlgSchema(this.sqlgGraph);
this.sqlgGraph.tx().commit();
this.sqlgGraph.close();
//topology will be recreated
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Assert.assertEquals(2, sqlgGraph1.traversal().V().count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().E().count().next().intValue());
assertTrue(sqlgGraph1.traversal().V().hasLabel("A").hasNext());
assertTrue(sqlgGraph1.traversal().V().hasLabel("B").hasNext());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("A").count().next().intValue());
Assert.assertEquals(1, sqlgGraph1.traversal().V().hasLabel("B").count().next().intValue());
Vertex a = sqlgGraph1.traversal().V().hasLabel("A").next();
Assert.assertEquals(idA1, a.id());
Vertex b = sqlgGraph1.traversal().V().hasLabel("B").next();
Assert.assertEquals(idB1, b.id());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).out("knows").count().next().intValue());
Assert.assertEquals(b, sqlgGraph1.traversal().V(a).out("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(b).in("knows").count().next().intValue());
Assert.assertEquals(a, sqlgGraph1.traversal().V(b).in("knows").next());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).properties("name").count().next().intValue());
assertEquals(true, sqlgGraph1.traversal().V(a).properties("name").next().value() != null);
Assert.assertEquals("john", sqlgGraph1.traversal().V(a).properties("name").next().value());
Assert.assertEquals(1, sqlgGraph1.traversal().V(a).outE("knows").properties("name").count().next().intValue());
assertEquals(true, sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value() != null);
Assert.assertEquals("hithere", sqlgGraph1.traversal().V(a).outE("knows").properties("name").next().value());
Assert.assertEquals(2, sqlgGraph1.getTopology().getPublicSchema().getVertexLabels().size());
conn = sqlgGraph1.tx().getConnection();
try (Statement statement = conn.createStatement()) {
statement.execute("DROP TABLE " + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("EVENT"));
}
try (Statement statement = conn.createStatement()) {
statement.execute("DROP TABLE " + this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.sqlgGraph.getSqlDialect().getPublicSchema()) + "." +
this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("VIKINGS"));
}
sqlgGraph1.tx().commit();
}
}
private static void topologyCheck(SqlgGraph sqlgGraph) {
Assert.assertEquals(1, sqlgGraph.topology().V().has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Person").count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V().has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Dog").count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Person")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.count().next().longValue());
Assert.assertEquals(2, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Person")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Person")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "firstName")
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Person")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "lastName")
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Dog")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Dog")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_VERTEX_LABEL, Topology.SQLG_SCHEMA_VERTEX_LABEL_NAME, "Dog")
.out(Topology.SQLG_SCHEMA_VERTEX_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "name")
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_EDGE_LABEL, Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "Owns").count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_EDGE_LABEL, Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "Owns")
.out(Topology.SQLG_SCHEMA_EDGE_INDEX_EDGE)
.count().next().longValue());
Assert.assertEquals(1, sqlgGraph.topology().V()
.has(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_EDGE_LABEL, Topology.SQLG_SCHEMA_EDGE_LABEL_NAME, "Owns")
.out(Topology.SQLG_SCHEMA_EDGE_INDEX_EDGE)
.out(Topology.SQLG_SCHEMA_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME, "since")
.count().next().longValue());
// not supported yet
/*assertEquals(1,sqlgGraph.topology().V()
.hasLabel(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX).count().next().longValue());
Assert.assertEquals(2,sqlgGraph.topology().V()
.hasLabel(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX)
.out(Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX_PROPERTY_EDGE)
.count().next().longValue());
Assert.assertEquals(2,sqlgGraph.topology().V()
.hasLabel(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX)
.out(Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX_PROPERTY_EDGE)
.count().next().longValue());
Assert.assertEquals(1,sqlgGraph.topology().V()
.hasLabel(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX)
.out(Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME,"firstName")
.count().next().longValue());
Assert.assertEquals(1,sqlgGraph.topology().V()
.hasLabel(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX)
.out(Topology.SQLG_SCHEMA_GLOBAL_UNIQUE_INDEX_PROPERTY_EDGE)
.has(Topology.SQLG_SCHEMA_PROPERTY_NAME,"name")
.count().next().longValue());*/
}
}