Coverage Summary for Class: TestIndexOnPartition (org.umlg.sqlg.test.index)
Class |
Method, %
|
Branch, %
|
Line, %
|
TestIndexOnPartition |
100%
(11/11)
|
44%
(22/50)
|
97.7%
(347/355)
|
TestIndexOnPartition$1 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$10 |
100%
(1/1)
|
100%
(6/6)
|
TestIndexOnPartition$11 |
100%
(1/1)
|
100%
(6/6)
|
TestIndexOnPartition$2 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$3 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$4 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$5 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$6 |
100%
(1/1)
|
100%
(2/2)
|
TestIndexOnPartition$7 |
100%
(1/1)
|
100%
(5/5)
|
TestIndexOnPartition$8 |
100%
(1/1)
|
100%
(5/5)
|
TestIndexOnPartition$9 |
100%
(1/1)
|
100%
(6/6)
|
Total |
100%
(22/22)
|
44%
(22/50)
|
98%
(387/395)
|
package org.umlg.sqlg.test.index;
import org.apache.commons.collections4.set.ListOrderedSet;
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.Before;
import org.junit.Test;
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.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
/**
* @author <a href="https://github.com/pietermartin">Pieter Martin</a>
* Date: 2018/01/28
*/
@SuppressWarnings({"DuplicatedCode", "unused"})
public class TestIndexOnPartition extends BaseTest {
@Before
public void before() throws Exception {
super.before();
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsPartitioning());
}
@Test
public void testCreateIndexOnPartitionedVertexLabelBeforeCreatingPartitions() {
Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
VertexLabel vertexLabel = schema.ensurePartitionedVertexLabelExist(
"A",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
PropertyColumn propertyColumn = vertexLabel.getProperty("int1").get();
Index index = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumn));
vertexLabel.ensureRangePartitionExists("int1", "1", "5");
schema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
vertexLabel = schema.ensurePartitionedVertexLabelExist(
"B",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
propertyColumn = vertexLabel.getProperty("int1").get();
index = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumn));
vertexLabel.ensureRangePartitionExists("int1", "0", "100");
vertexLabel.ensureRangePartitionExists("int2", "100", "200");
vertexLabel.ensureRangePartitionExists("int3", "200", "300");
vertexLabel.ensureRangePartitionExists("int4", "300", "400");
vertexLabel.ensureRangePartitionExists("int5", "400", "500");
vertexLabel.ensureRangePartitionExists("int6", "500", "600");
vertexLabel.ensureRangePartitionExists("int7", "600", "700");
vertexLabel.ensureRangePartitionExists("int8", "700", "800");
vertexLabel.ensureRangePartitionExists("int9", "800", "900");
vertexLabel.ensureRangePartitionExists("int10", "900", "1000");
this.sqlgGraph.tx().commit();
for (int i = 0; i < 1000; i++) {
this.sqlgGraph.addVertex(T.label, "B.B", "int1", i);
}
this.sqlgGraph.tx().commit();
Map<String, Index> indexMap = this.sqlgGraph.getTopology().getSchema("B").get().getVertexLabel("B").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
indexMap = sqlgGraph1.getTopology().getSchema("B").get().getVertexLabel("B").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testCreateIndexOnPartitionedVertexLabelAfterCreatingPartitions() {
Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
VertexLabel vertexLabel = schema.ensurePartitionedVertexLabelExist(
"A",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
vertexLabel.ensureRangePartitionExists("int1", "1", "5");
schema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
vertexLabel = schema.ensurePartitionedVertexLabelExist(
"B",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
vertexLabel.ensureRangePartitionExists("int1", "0", "100");
vertexLabel.ensureRangePartitionExists("int2", "100", "200");
vertexLabel.ensureRangePartitionExists("int3", "200", "300");
vertexLabel.ensureRangePartitionExists("int4", "300", "400");
vertexLabel.ensureRangePartitionExists("int5", "400", "500");
vertexLabel.ensureRangePartitionExists("int6", "500", "600");
vertexLabel.ensureRangePartitionExists("int7", "600", "700");
vertexLabel.ensureRangePartitionExists("int8", "700", "800");
vertexLabel.ensureRangePartitionExists("int9", "800", "900");
vertexLabel.ensureRangePartitionExists("int10", "900", "1000");
this.sqlgGraph.tx().commit();
for (int i = 0; i < 1000; i++) {
this.sqlgGraph.addVertex(T.label, "B.B", "int1", i);
}
this.sqlgGraph.tx().commit();
PropertyColumn propertyColumn = vertexLabel.getProperty("int1").get();
Index index = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumn));
this.sqlgGraph.tx().commit();
Map<String, Index> indexMap = this.sqlgGraph.getTopology().getSchema("B").get().getVertexLabel("B").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
indexMap = sqlgGraph1.getTopology().getSchema("B").get().getVertexLabel("B").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testCreateIndexOnPartitionedEdgeLabelBeforeCreatingPartitions() {
Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
Schema bSchema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
VertexLabel aVertexLabel = aSchema.ensureVertexLabelExist("A");
VertexLabel bVertexLabel = bSchema.ensureVertexLabelExist("B");
EdgeLabel abEdgeLabel = aVertexLabel.ensurePartitionedEdgeLabelExist(
"ab",
bVertexLabel,
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
PropertyColumn propertyColumn = abEdgeLabel.getProperty("int1").get();
Index index = abEdgeLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumn));
abEdgeLabel.ensureRangePartitionExists("int1", "0", "100");
abEdgeLabel.ensureRangePartitionExists("int2", "100", "200");
abEdgeLabel.ensureRangePartitionExists("int3", "200", "300");
abEdgeLabel.ensureRangePartitionExists("int4", "300", "400");
abEdgeLabel.ensureRangePartitionExists("int5", "400", "500");
abEdgeLabel.ensureRangePartitionExists("int6", "500", "600");
abEdgeLabel.ensureRangePartitionExists("int7", "600", "700");
abEdgeLabel.ensureRangePartitionExists("int8", "700", "800");
abEdgeLabel.ensureRangePartitionExists("int9", "800", "900");
abEdgeLabel.ensureRangePartitionExists("int10", "900", "1000");
this.sqlgGraph.tx().commit();
for (int i = 0; i < 1000; i++) {
Vertex a = this.sqlgGraph.addVertex(T.label, "A.A");
Vertex b = this.sqlgGraph.addVertex(T.label, "B.B");
a.addEdge("ab", b, "int1", i);
}
this.sqlgGraph.tx().commit();
Map<String, Index> indexMap = this.sqlgGraph.getTopology().getSchema("A").get().getEdgeLabel("ab").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
indexMap = sqlgGraph1.getTopology().getSchema("A").get().getEdgeLabel("ab").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("A.A").outE("ab").has("int1", 100).otherV().count().next(), 0);
}
@Test
public void testCreateIndexOnPartitionedEdgeLabelAfterCreatingPartitions() {
Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
Schema bSchema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
VertexLabel aVertexLabel = aSchema.ensureVertexLabelExist("A");
VertexLabel bVertexLabel = bSchema.ensureVertexLabelExist("B");
EdgeLabel abEdgeLabel = aVertexLabel.ensurePartitionedEdgeLabelExist(
"ab",
bVertexLabel,
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("int1")),
PartitionType.RANGE,
"int1");
PropertyColumn propertyColumn = abEdgeLabel.getProperty("int1").get();
abEdgeLabel.ensureRangePartitionExists("int1", "0", "100");
abEdgeLabel.ensureRangePartitionExists("int2", "100", "200");
abEdgeLabel.ensureRangePartitionExists("int3", "200", "300");
abEdgeLabel.ensureRangePartitionExists("int4", "300", "400");
abEdgeLabel.ensureRangePartitionExists("int5", "400", "500");
abEdgeLabel.ensureRangePartitionExists("int6", "500", "600");
abEdgeLabel.ensureRangePartitionExists("int7", "600", "700");
abEdgeLabel.ensureRangePartitionExists("int8", "700", "800");
abEdgeLabel.ensureRangePartitionExists("int9", "800", "900");
abEdgeLabel.ensureRangePartitionExists("int10", "900", "1000");
this.sqlgGraph.tx().commit();
Index index = abEdgeLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumn));
this.sqlgGraph.tx().commit();
for (int i = 0; i < 1000; i++) {
Vertex a = this.sqlgGraph.addVertex(T.label, "A.A");
Vertex b = this.sqlgGraph.addVertex(T.label, "B.B");
a.addEdge("ab", b, "int1", i);
}
this.sqlgGraph.tx().commit();
Map<String, Index> indexMap = this.sqlgGraph.getTopology().getSchema("A").get().getEdgeLabel("ab").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
indexMap = sqlgGraph1.getTopology().getSchema("A").get().getEdgeLabel("ab").get().getIndexes();
Assert.assertEquals(1, indexMap.size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("A.A").outE("ab").has("int1", 100).otherV().count().next(), 0);
}
@Test
public void testCreateIndexOnSubPartitionedVertexLabelBeforeCreatingPartitions() {
Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
VertexLabel vertexLabel = schema.ensurePartitionedVertexLabelExist("A",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
put("int2", PropertyDefinition.of(PropertyType.INTEGER));
put("int3", PropertyDefinition.of(PropertyType.INTEGER));
put("int4", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Arrays.asList("int1", "int2", "int3")),
PartitionType.RANGE,
"int1");
PropertyColumn propertyColumnInt1 = vertexLabel.getProperty("int1").orElseThrow();
Index index1 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt1));
PropertyColumn propertyColumnInt2 = vertexLabel.getProperty("int2").orElseThrow();
Index index2 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt2));
PropertyColumn propertyColumnInt3 = vertexLabel.getProperty("int3").orElseThrow();
Index index3 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt3));
PropertyColumn propertyColumnInt4 = vertexLabel.getProperty("int4").orElseThrow();
Index index4 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt4));
Partition int1_1_5 = vertexLabel.ensureRangePartitionWithSubPartitionExists("int1_1_5", "1", "5", PartitionType.RANGE, "int2");
Partition int1_5_10 = vertexLabel.ensureRangePartitionWithSubPartitionExists("int1_5_10", "5", "10", PartitionType.RANGE, "int2");
Partition int1_int2_1_5 = int1_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_1_5", "1", "5", PartitionType.RANGE, "int2");
Partition int1_int2_5_10 = int1_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_5_10", "5", "10", PartitionType.RANGE, "int2");
Partition int1_int2_int3_1_5 = int1_int2_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_int3_1_5", "1", "5", PartitionType.RANGE, "int3");
Partition int1_int2_int3_5_10 = int1_int2_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_int3_5_10", "5", "10", PartitionType.RANGE, "int3");
int1_int2_int3_1_5.ensureRangePartitionExists("int1_int2_int3_int4_1_5", "1", "5");
int1_int2_int3_1_5.ensureRangePartitionExists("int1_int2_int3_int4_5_10", "5", "10");
this.sqlgGraph.tx().commit();
Assert.assertEquals(4, this.sqlgGraph.getTopology().getVertexLabel("A", "A").get().getIndexes().size());
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Map<String, Partition> partitions = sqlgGraph1.getTopology().getSchema("A").get().getVertexLabel("A").get().getPartitions();
Assert.assertEquals(2, partitions.size());
Assert.assertTrue(partitions.containsKey("int1_1_5"));
Assert.assertTrue(partitions.containsKey("int1_5_10"));
Partition p = partitions.get("int1_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_5_10"));
p = p.getPartitions().get("int1_int2_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_5_10"));
p = p.getPartitions().get("int1_int2_int3_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_int4_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_int4_5_10"));
Assert.assertEquals(4, sqlgGraph1.getTopology().getSchema("A").get().getVertexLabel("A").get().getIndexes().size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testCreateIndexOnSubPartitionedVertexLabelAfterCreatingPartitions() {
Schema schema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
VertexLabel vertexLabel = schema.ensurePartitionedVertexLabelExist("A",
new HashMap<>() {{
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
put("int2", PropertyDefinition.of(PropertyType.INTEGER));
put("int3", PropertyDefinition.of(PropertyType.INTEGER));
put("int4", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Arrays.asList("int1", "int2", "int3")),
PartitionType.RANGE,
"int1");
Partition int1_1_5 = vertexLabel.ensureRangePartitionWithSubPartitionExists("int1_1_5", "1", "5", PartitionType.RANGE, "int2");
Partition int1_5_10 = vertexLabel.ensureRangePartitionWithSubPartitionExists("int1_5_10", "5", "10", PartitionType.RANGE, "int2");
Partition int1_int2_1_5 = int1_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_1_5", "1", "5", PartitionType.RANGE, "int2");
Partition int1_int2_5_10 = int1_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_5_10", "5", "10", PartitionType.RANGE, "int2");
Partition int1_int2_int3_1_5 = int1_int2_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_int3_1_5", "1", "5", PartitionType.RANGE, "int3");
Partition int1_int2_int3_5_10 = int1_int2_1_5.ensureRangePartitionWithSubPartitionExists("int1_int2_int3_5_10", "5", "10", PartitionType.RANGE, "int3");
int1_int2_int3_1_5.ensureRangePartitionExists("int1_int2_int3_int4_1_5", "1", "5");
int1_int2_int3_1_5.ensureRangePartitionExists("int1_int2_int3_int4_5_10", "5", "10");
this.sqlgGraph.tx().commit();
PropertyColumn propertyColumnInt1 = vertexLabel.getProperty("int1").get();
Index index1 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt1));
PropertyColumn propertyColumnInt2 = vertexLabel.getProperty("int2").get();
Index index2 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt2));
PropertyColumn propertyColumnInt3 = vertexLabel.getProperty("int3").get();
Index index3 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt3));
PropertyColumn propertyColumnInt4 = vertexLabel.getProperty("int4").get();
Index index4 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(propertyColumnInt4));
Assert.assertEquals(4, this.sqlgGraph.getTopology().getVertexLabel("A", "A").get().getIndexes().size());
this.sqlgGraph.tx().commit();
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Map<String, Partition> partitions = sqlgGraph1.getTopology().getSchema("A").get().getVertexLabel("A").get().getPartitions();
Assert.assertEquals(2, partitions.size());
Assert.assertTrue(partitions.containsKey("int1_1_5"));
Assert.assertTrue(partitions.containsKey("int1_5_10"));
Partition p = partitions.get("int1_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_5_10"));
p = p.getPartitions().get("int1_int2_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_5_10"));
p = p.getPartitions().get("int1_int2_int3_1_5");
Assert.assertEquals(2, p.getPartitions().size());
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_int4_1_5"));
Assert.assertTrue(p.getPartitions().containsKey("int1_int2_int3_int4_5_10"));
Assert.assertEquals(4, sqlgGraph1.getTopology().getSchema("A").get().getVertexLabel("A").get().getIndexes().size());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testCreateIndexOnSubPartitionedVertexLabelAndEdgeBeforeCreatingPartitions() {
Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
Schema bSchema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
VertexLabel a = aSchema.ensurePartitionedVertexLabelExist(
"A",
new HashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
put("int2", PropertyDefinition.of(PropertyType.INTEGER));
put("int3", PropertyDefinition.of(PropertyType.INTEGER));
put("int4", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("uid")),
PartitionType.LIST,
"int1", false);
VertexLabel b = bSchema.ensurePartitionedVertexLabelExist(
"B",
new HashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
put("int2", PropertyDefinition.of(PropertyType.INTEGER));
put("int3", PropertyDefinition.of(PropertyType.INTEGER));
put("int4", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(Collections.singletonList("uid")),
PartitionType.LIST,
"int1", false);
EdgeLabel ab = a.ensurePartitionedEdgeLabelExist(
"ab",
b,
new HashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
put("int1", PropertyDefinition.of(PropertyType.INTEGER));
put("int2", PropertyDefinition.of(PropertyType.INTEGER));
put("int3", PropertyDefinition.of(PropertyType.INTEGER));
put("int4", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(List.of("uid", "int1", "int2", "int3", "int4")),
PartitionType.LIST,
"int1");
a.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(a.getProperty("int1").orElseThrow()));
a.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(a.getProperty("int2").orElseThrow()));
a.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(a.getProperty("int3").orElseThrow()));
a.ensureIndexExists(IndexType.NON_UNIQUE, Collections.singletonList(a.getProperty("int4").orElseThrow()));
Partition aInt1_1 = a.ensureListPartitionWithSubPartitionExists("aInt1_1", "1", PartitionType.LIST, "int2");
Partition aInt1_2 = a.ensureListPartitionWithSubPartitionExists("aInt1_2", "2", PartitionType.LIST, "int2");
Partition bInt1_1 = b.ensureListPartitionWithSubPartitionExists("bInt1_1", "1", PartitionType.LIST, "int2");
Partition bInt1_2 = b.ensureListPartitionWithSubPartitionExists("bInt1_2", "2", PartitionType.LIST, "int2");
Partition aInt1_1_int2_1 = aInt1_1.ensureListPartitionWithSubPartitionExists("aInt_1_int2_1", "1", PartitionType.LIST, "int3");
Partition aInt1_1_int2_2 = aInt1_1.ensureListPartitionWithSubPartitionExists("aInt_1_int2_2", "2", PartitionType.LIST, "int3");
Partition aInt1__1_int2_int3_1 = aInt1_1_int2_1.ensureListPartitionWithSubPartitionExists("aInt1_1_int2_1_int3_1", "1", PartitionType.LIST, "int4");
Partition aInt1__1_int2_int3_2 = aInt1_1_int2_1.ensureListPartitionWithSubPartitionExists("aInt1_1_int2_1_int3_2", "2", PartitionType.LIST, "int4");
aInt1__1_int2_int3_1.ensureListPartitionExists("aInt1_1_int2_1_int3_1_int4_1", "1");
aInt1__1_int2_int3_1.ensureListPartitionExists("aInt1_1_int2_1_int3_1_int4_2", "2");
Partition bInt1_int2_1 = bInt1_1.ensureListPartitionWithSubPartitionExists("bInt1_int2_1", "1", PartitionType.LIST, "int3");
Partition bInt1_int2_2 = bInt1_1.ensureListPartitionWithSubPartitionExists("bInt1_int2_2", "2", PartitionType.LIST, "int3");
Partition bInt1_int2_int3_1 = bInt1_int2_1.ensureListPartitionWithSubPartitionExists("bInt1_int2_int3_1", "1", PartitionType.LIST, "int4");
Partition bInt1_int2_int3_2 = bInt1_int2_1.ensureListPartitionWithSubPartitionExists("bInt1_int2_int3_2", "2", PartitionType.LIST, "int4");
bInt1_int2_int3_1.ensureListPartitionExists("bInt1_int2_int3_int4_1", "1");
bInt1_int2_int3_1.ensureListPartitionExists("bInt1_int2_int3_int4_2", "2");
Partition abInt1_1 = ab.ensureListPartitionWithSubPartitionExists("abInt1_1", "1", PartitionType.LIST, "int2");
Partition abInt1_2 = ab.ensureListPartitionWithSubPartitionExists("abInt1_2", "2", PartitionType.LIST, "int2");
Partition abInt1_int2_1 = abInt1_1.ensureListPartitionWithSubPartitionExists("abInt1_int2_1", "1", PartitionType.LIST, "int3");
Partition abInt1_int2_2 = abInt1_1.ensureListPartitionWithSubPartitionExists("abInt1_int2_2", "2", PartitionType.LIST, "int3");
Partition abInt1_int2_int3_1 = abInt1_int2_1.ensureListPartitionWithSubPartitionExists("abInt1_int2_int3_1", "1", PartitionType.LIST, "int4");
Partition abInt1_int2_int3_2 = abInt1_int2_1.ensureListPartitionWithSubPartitionExists("abInt1_int2_int3_2", "2", PartitionType.LIST, "int4");
abInt1_int2_int3_1.ensureListPartitionExists("abInt1_int2_int3_int4_1", "1");
abInt1_int2_int3_1.ensureListPartitionExists("abInt1_int2_int3_int4_2", "2");
this.sqlgGraph.tx().commit();
for (int i = 0; i < 1_000; i++) {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A.A", "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 1);
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B.B", "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 1);
a1.addEdge("ab", b1, "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 1);
a1.addEdge("ab", b1, "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 2);
}
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A.A", "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 2);
Vertex b2 = this.sqlgGraph.addVertex(T.label, "B.B", "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 2);
a2.addEdge("ab", b2, "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 1);
a2.addEdge("ab", b2, "uid", UUID.randomUUID().toString(), "int1", 1, "int2", 1, "int3", 1, "int4", 2);
this.sqlgGraph.tx().commit();
List<Vertex> vertices = this.sqlgGraph.traversal()
.V().hasLabel("A.A").has("int1", 1)
.outE("ab").has("int1", 1)
.inV().has("int4", 2).toList();
Assert.assertEquals(2, vertices.size());
}
@Test
public void testListPartitiongetsIndex() {
String VIRTUAL_GROUP_PARENT_NAME = "virtualGroupParentName";
String VIRTUAL_GROUP_NAME = "virtualGroupName";
String VIRTUAL_GROUP_ID = "virtualGroupId";
String vendorTechnology = "vendorTechnology";
String etlElementName = "etlElementName";
String cmUid = "cmUid";
String internal_cm_name = "internal_cm_name";
String IS_CALCULATED = "isCalculated";
String IS_DELETED = "isDeleted";
String VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL = "VGReal";
LinkedHashMap<String, PropertyDefinition> attributeMap = new LinkedHashMap<>();
attributeMap.put(VIRTUAL_GROUP_PARENT_NAME, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(VIRTUAL_GROUP_NAME, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(VIRTUAL_GROUP_ID, PropertyDefinition.of(PropertyType.LONG));
attributeMap.put(vendorTechnology, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(etlElementName, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(cmUid, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(internal_cm_name, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(IS_CALCULATED, PropertyDefinition.of(PropertyType.BOOLEAN));
attributeMap.put(IS_DELETED, PropertyDefinition.of(PropertyType.BOOLEAN));
VertexLabel virtualGroupRootRealWorkspaceElementVertexLabel = sqlgGraph.getTopology().getPublicSchema().ensurePartitionedVertexLabelExist(
VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL,
attributeMap,
ListOrderedSet.listOrderedSet(List.of(cmUid, VIRTUAL_GROUP_ID)),
PartitionType.LIST,
"\"" + VIRTUAL_GROUP_ID + "\""
);
//Unique index, element can only appear once per virtual group parent
PropertyColumn cmUidPropertyColumn = virtualGroupRootRealWorkspaceElementVertexLabel.getProperty(cmUid).orElseThrow();
virtualGroupRootRealWorkspaceElementVertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(cmUidPropertyColumn));
this.sqlgGraph.tx().commit();
int virtualGroupId = 1;
VertexLabel realVertexLabel = sqlgGraph.getTopology().getPublicSchema().getVertexLabel(VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL).orElseThrow();
Partition partition = realVertexLabel.ensureListPartitionExists(
"VirtualGroupRootReal_" + virtualGroupId,
"'" + virtualGroupId + "'"
);
this.sqlgGraph.tx().commit();
realVertexLabel = sqlgGraph.getTopology().getPublicSchema().getVertexLabel(VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL).orElseThrow();
Optional<Partition> partitionOptional = realVertexLabel.getPartition(partition.getName());
Assert.assertTrue(partitionOptional.isPresent());
Map<String, Index> indexMap = realVertexLabel.getIndexes();
Assert.assertEquals(1, indexMap.size());
//Check if the index is being used
Connection conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
if (this.sqlgGraph.getSqlDialect().getClass().getSimpleName().contains("Postgres")) {
ResultSet rs = statement.executeQuery("explain analyze SELECT * FROM \"public\".\"V_" + VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL + "\" a WHERE a.\"" + cmUid + "\" = 'john'");
Assert.assertTrue(rs.next());
String result = rs.getString(1);
System.out.println(result);
Assert.assertTrue(result.contains("Index Scan") || result.contains("Bitmap Heap Scan"));
}
} catch (SQLException e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testRangePartitiongetsIndex() {
String VIRTUAL_GROUP_PARENT_NAME = "virtualGroupParentName";
String VIRTUAL_GROUP_NAME = "virtualGroupName";
String VIRTUAL_GROUP_ID = "virtualGroupId";
String vendorTechnology = "vendorTechnology";
String etlElementName = "etlElementName";
String cmUid = "cmUid";
String internal_cm_name = "internal_cm_name";
String IS_CALCULATED = "isCalculated";
String IS_DELETED = "isDeleted";
String VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL = "VGReal";
LinkedHashMap<String, PropertyDefinition> attributeMap = new LinkedHashMap<>();
attributeMap.put(VIRTUAL_GROUP_PARENT_NAME, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(VIRTUAL_GROUP_NAME, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(VIRTUAL_GROUP_ID, PropertyDefinition.of(PropertyType.LONG));
attributeMap.put(vendorTechnology, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(etlElementName, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(cmUid, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(internal_cm_name, PropertyDefinition.of(PropertyType.STRING));
attributeMap.put(IS_CALCULATED, PropertyDefinition.of(PropertyType.BOOLEAN));
attributeMap.put(IS_DELETED, PropertyDefinition.of(PropertyType.BOOLEAN));
VertexLabel virtualGroupRootRealWorkspaceElementVertexLabel = sqlgGraph.getTopology().getPublicSchema().ensurePartitionedVertexLabelExist(
VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL,
attributeMap,
ListOrderedSet.listOrderedSet(List.of(cmUid, VIRTUAL_GROUP_ID)),
PartitionType.RANGE,
"\"" + VIRTUAL_GROUP_ID + "\""
);
//Unique index, element can only appear once per virtual group parent
PropertyColumn cmUidPropertyColumn = virtualGroupRootRealWorkspaceElementVertexLabel.getProperty(cmUid).orElseThrow();
virtualGroupRootRealWorkspaceElementVertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(cmUidPropertyColumn));
this.sqlgGraph.tx().commit();
int virtualGroupId = 1;
int virtualGroupIdTo = 2;
VertexLabel realVertexLabel = sqlgGraph.getTopology().getPublicSchema().getVertexLabel(VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL).orElseThrow();
Partition partition = realVertexLabel.ensureRangePartitionExists(
"VirtualGroupRootReal_" + virtualGroupId,
"'" + virtualGroupId + "'",
"'" + virtualGroupIdTo + "'"
);
this.sqlgGraph.tx().commit();
realVertexLabel = sqlgGraph.getTopology().getPublicSchema().getVertexLabel(VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL).orElseThrow();
Optional<Partition> partitionOptional = realVertexLabel.getPartition(partition.getName());
Assert.assertTrue(partitionOptional.isPresent());
Map<String, Index> indexMap = realVertexLabel.getIndexes();
Assert.assertEquals(1, indexMap.size());
//Check if the index is being used
Connection conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
if (this.sqlgGraph.getSqlDialect().getClass().getSimpleName().contains("Postgres")) {
ResultSet rs = statement.executeQuery("explain analyze SELECT * FROM \"public\".\"V_" + VIRTUAL_GROUP_ROOT_REAL_WORKSPACE_ELEMENT_LABEL + "\" a WHERE a.\"" + cmUid + "\" = 'john'");
Assert.assertTrue(rs.next());
String result = rs.getString(1);
System.out.println(result);
Assert.assertTrue(result.contains("Index Scan") || result.contains("Bitmap Heap Scan"));
}
} catch (SQLException e) {
Assert.fail(e.getMessage());
}
}
}