Coverage Summary for Class: TestJoinAcrossPartition (org.umlg.sqlg.test.partition)
Class |
Method, %
|
Branch, %
|
Line, %
|
TestJoinAcrossPartition |
100%
(3/3)
|
71.4%
(10/14)
|
98.1%
(53/54)
|
TestJoinAcrossPartition$1 |
100%
(1/1)
|
100%
(2/2)
|
TestJoinAcrossPartition$2 |
100%
(1/1)
|
100%
(3/3)
|
TestJoinAcrossPartition$3 |
100%
(1/1)
|
100%
(2/2)
|
Total |
100%
(6/6)
|
71.4%
(10/14)
|
98.4%
(60/61)
|
package org.umlg.sqlg.test.partition;
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.topology.EdgeLabel;
import org.umlg.sqlg.structure.topology.PartitionType;
import org.umlg.sqlg.structure.topology.Schema;
import org.umlg.sqlg.structure.topology.VertexLabel;
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.LinkedHashMap;
import java.util.List;
import java.util.UUID;
public class TestJoinAcrossPartition extends BaseTest {
@Before
public void before() throws Exception {
super.before();
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsPartitioning());
}
@Test
public void testJoinHitsPartitions() {
Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
VertexLabel animalTypeVertexLabel = publicSchema.ensureVertexLabelExist(
"AnimalType",
new LinkedHashMap<>() {{
put("type", PropertyDefinition.of(PropertyType.STRING));
}},
ListOrderedSet.listOrderedSet(List.of("type"))
);
VertexLabel animalVertexLabel = publicSchema.ensurePartitionedVertexLabelExist(
"Animal",
new LinkedHashMap<>() {{
put("type", PropertyDefinition.of(PropertyType.STRING));
put("name", PropertyDefinition.of(PropertyType.STRING));
}},
ListOrderedSet.listOrderedSet(List.of("type", "name")),
PartitionType.LIST,
"\"type\""
);
animalVertexLabel.ensureListPartitionExists("dog_type", "'dog'");
animalVertexLabel.ensureListPartitionExists("cat_type", "'cat'");
animalVertexLabel.ensureListPartitionExists("mouse_type", "'mouse'");
EdgeLabel hasEdgeLabel = publicSchema.ensurePartitionedEdgeLabelExistOnInOrOutVertexLabel(
"has",
animalTypeVertexLabel,
animalVertexLabel,
new LinkedHashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
}},
ListOrderedSet.listOrderedSet(List.of("uid")),
PartitionType.LIST,
animalTypeVertexLabel
);
hasEdgeLabel.ensureListPartitionExists("edge_dog_type", "'dog'");
hasEdgeLabel.ensureListPartitionExists("edge_cat_type", "'cat'");
hasEdgeLabel.ensureListPartitionExists("edge_mouse_type", "'mouse'");
this.sqlgGraph.tx().commit();
Vertex dogType = this.sqlgGraph.addVertex(T.label, "AnimalType", "type", "dog", "name", "dog1");
Vertex catType = this.sqlgGraph.addVertex(T.label, "AnimalType", "type", "cat", "name", "cat1");
Vertex mouseType = this.sqlgGraph.addVertex(T.label, "AnimalType", "type", "mouse", "name", "mouse1");
for (int i = 0; i < 10; i++) {
Vertex dog = this.sqlgGraph.addVertex(T.label, "Animal", "type", "dog", "name", "dog" + i);
dogType.addEdge("has", dog, "uid", UUID.randomUUID().toString());
Vertex cat = this.sqlgGraph.addVertex(T.label, "Animal", "type", "cat", "name", "cat" + i);
catType.addEdge("has", cat, "uid", UUID.randomUUID().toString());
Vertex mouse = this.sqlgGraph.addVertex(T.label, "Animal", "type", "mouse", "name", "mouse" + i);
mouseType.addEdge("has", mouse, "uid", UUID.randomUUID().toString());
}
this.sqlgGraph.tx().commit();
List<Vertex> vertices = this.sqlgGraph.traversal().V()
.hasLabel("AnimalType")
.out("has")
.toList();
Assert.assertEquals(30, vertices.size());
vertices = this.sqlgGraph.traversal().V()
.hasLabel("AnimalType").has("type", "dog")
.out("has")
.has("type", "dog")
.toList();
Assert.assertEquals(10, vertices.size());
//Check if the partitions are being used
Connection conn = this.sqlgGraph.tx().getConnection();
try (Statement statement = conn.createStatement()) {
boolean foundEdgeDogType = false;
boolean foundDogTypePK = false;
if (this.sqlgGraph.getSqlDialect().getClass().getSimpleName().contains("Postgres")) {
ResultSet rs = statement.executeQuery("explain SELECT\n" +
"\t\"public\".\"V_Animal\".\"type\" AS \"alias1\",\n" +
"\t\"public\".\"V_Animal\".\"name\" AS \"alias2\"\n" +
"FROM\n" +
"\t\"public\".\"V_AnimalType\" INNER JOIN\n" +
"\t\"public\".\"E_has\" ON \"public\".\"V_AnimalType\".\"type\" = \"public\".\"E_has\".\"public.AnimalType.type__O\" INNER JOIN\n" +
"\t\"public\".\"V_Animal\" ON \"public\".\"E_has\".\"public.Animal.type__I\" = \"public\".\"V_Animal\".\"type\" AND \"public\".\"E_has\".\"public.Animal.name__I\" = \"public\".\"V_Animal\".\"name\"\n" +
"WHERE\n" +
"\t( \"public\".\"V_AnimalType\".\"type\" = 'dog') AND ( \"public\".\"V_Animal\".\"type\" = 'dog')");
while (rs.next()) {
String result = rs.getString(1);
foundEdgeDogType = foundEdgeDogType || result.contains("Bitmap Heap Scan on edge_dog_type");
foundDogTypePK = foundDogTypePK || result.contains("Index Only Scan using dog_type_pkey");
}
}
Assert.assertTrue(foundEdgeDogType);
Assert.assertTrue(foundDogTypePK);
} catch (SQLException e) {
Assert.fail(e.getMessage());
}
this.sqlgGraph.tx().rollback();
}
}