Coverage Summary for Class: TestPartitionMultipleGraphs (org.umlg.sqlg.test.topology)
Class |
Method, %
|
Branch, %
|
Line, %
|
TestPartitionMultipleGraphs |
100%
(6/6)
|
30%
(3/10)
|
95.9%
(116/121)
|
TestPartitionMultipleGraphs$1 |
100%
(1/1)
|
100%
(4/4)
|
TestPartitionMultipleGraphs$2 |
100%
(1/1)
|
100%
(3/3)
|
TestPartitionMultipleGraphs$3 |
100%
(1/1)
|
100%
(6/6)
|
Total |
100%
(9/9)
|
30%
(3/10)
|
96.3%
(129/134)
|
package org.umlg.sqlg.test.topology;
import org.apache.commons.collections4.set.ListOrderedSet;
import org.apache.commons.configuration2.builder.fluent.Configurations;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.lang3.tuple.Triple;
import org.junit.*;
import org.umlg.sqlg.structure.*;
import org.umlg.sqlg.structure.topology.*;
import org.umlg.sqlg.test.BaseTest;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
/**
* @author <a href="https://github.com/pietermartin">Pieter Martin</a>
* Date: 2018/01/21
*/
@SuppressWarnings("unused")
public class TestPartitionMultipleGraphs extends BaseTest {
private final List<Triple<TopologyInf, TopologyInf, TopologyChangeAction>> topologyListenerTriple = new ArrayList<>();
@SuppressWarnings("Duplicates")
@BeforeClass
public static void beforeClass() {
URL sqlProperties = Thread.currentThread().getContextClassLoader().getResource("sqlg.properties");
try {
Configurations configs = new Configurations();
configuration = configs.properties(sqlProperties);
Assume.assumeTrue(isPostgres());
configuration.addProperty("distributed", true);
if (!configuration.containsKey("jdbc.url"))
throw new IllegalArgumentException(String.format("SqlGraph configuration requires that the %s be set", "jdbc.url"));
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
}
@Before
public void before() throws Exception {
super.before();
Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsPartitioning());
this.topologyListenerTriple.clear();
}
@Test
public void testNotifyPartitionedVertexLabel() {
TestTopologyChangeListener.TopologyListenerTest tlt = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
this.sqlgGraph.getTopology().registerListener(tlt);
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
VertexLabel measurement = publicSchema.ensurePartitionedVertexLabelExist(
"Measurement",
new HashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
put("date", PropertyDefinition.of(PropertyType.LOCALDATE));
put("temp", PropertyDefinition.of(PropertyType.INTEGER));
}},
ListOrderedSet.listOrderedSet(List.of("uid", "date")),
PartitionType.RANGE,
"date");
Partition p1 = measurement.ensureRangePartitionExists("m1", "'2016-07-01'", "'2016-08-01'");
Partition p2 = measurement.ensureRangePartitionExists("m2", "'2016-08-01'", "'2016-09-01'");
Assert.assertTrue(tlt.receivedEvent(measurement, TopologyChangeAction.CREATE));
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.CREATE));
this.sqlgGraph.tx().commit();
Thread.sleep(2000);
Optional<VertexLabel> measurementAgain = sqlgGraph1.getTopology().getPublicSchema().getVertexLabel("Measurement");
Assert.assertTrue(measurementAgain.isPresent());
Assert.assertEquals(PartitionType.RANGE, measurementAgain.get().getPartitionType());
Assert.assertEquals("date", measurementAgain.get().getPartitionExpression());
Optional<Partition> m1 = measurementAgain.get().getPartition("m1");
Assert.assertTrue(m1.isPresent());
Assert.assertEquals("'2016-07-01'", m1.get().getFrom());
Assert.assertEquals("'2016-08-01'", m1.get().getTo());
Optional<Partition> m2 = measurementAgain.get().getPartition("m2");
Assert.assertTrue(m2.isPresent());
Assert.assertEquals("'2016-08-01'", m2.get().getFrom());
Assert.assertEquals("'2016-09-01'", m2.get().getTo());
//Drop a partition, check that the drop is propagated.
p1.remove(false);
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
this.sqlgGraph.tx().commit();
Assert.assertEquals(1, measurement.getPartitions().size(), 0);
Thread.sleep(2000);
Assert.assertEquals(1, sqlgGraph1.getTopology().getPublicSchema().getVertexLabel("Measurement").orElseThrow().getPartitions().size(), 0);
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testNotifyPartitionedEdgeLabel() {
TestTopologyChangeListener.TopologyListenerTest tlt = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
this.sqlgGraph.getTopology().registerListener(tlt);
try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
VertexLabel person = publicSchema.ensureVertexLabelExist("Person");
VertexLabel address = publicSchema.ensureVertexLabelExist("Address");
EdgeLabel livesAt = person.ensurePartitionedEdgeLabelExist(
"livesAt",
address,
new HashMap<>() {{
put("uid", PropertyDefinition.of(PropertyType.STRING));
put("date", PropertyDefinition.of(PropertyType.LOCALDATE));
}},
ListOrderedSet.listOrderedSet(List.of("uid", "date")),
PartitionType.RANGE,
"date");
Partition p1 = livesAt.ensureRangePartitionExists("m1", "'2016-07-01'", "'2016-08-01'");
Partition p2 = livesAt.ensureRangePartitionExists("m2", "'2016-08-01'", "'2016-09-01'");
Assert.assertTrue(tlt.receivedEvent(livesAt, TopologyChangeAction.CREATE));
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.CREATE));
Assert.assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.CREATE));
this.sqlgGraph.tx().commit();
Thread.sleep(2000);
publicSchema = sqlgGraph1.getTopology().getPublicSchema();
Optional<EdgeLabel> livesAtOther = publicSchema.getEdgeLabel("livesAt");
Assert.assertTrue(livesAtOther.isPresent());
Assert.assertEquals(PartitionType.RANGE, livesAtOther.get().getPartitionType());
Assert.assertEquals("date", livesAtOther.get().getPartitionExpression());
Optional<Partition> m1 = livesAtOther.get().getPartition("m1");
Assert.assertTrue(m1.isPresent());
Assert.assertEquals("'2016-07-01'", m1.get().getFrom());
Assert.assertEquals("'2016-08-01'", m1.get().getTo());
Optional<Partition> m2 = livesAtOther.get().getPartition("m2");
Assert.assertTrue(m2.isPresent());
Assert.assertEquals("'2016-08-01'", m2.get().getFrom());
Assert.assertEquals("'2016-09-01'", m2.get().getTo());
p1.remove(false);
this.sqlgGraph.tx().commit();
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
Thread.sleep(2000);
publicSchema = sqlgGraph1.getTopology().getPublicSchema();
Assert.assertEquals(1, publicSchema.getEdgeLabel("livesAt").orElseThrow().getPartitions().size(), 0);
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testNotificationSubSubPartitions() throws InterruptedException {
TestTopologyChangeListener.TopologyListenerTest tlt = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
this.sqlgGraph.getTopology().registerListener(tlt);
Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
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(List.of("uid", "int1", "int2", "int3", "int4")),
PartitionType.LIST,
"int1"
);
Partition p1 = a.ensureListPartitionWithSubPartitionExists("int1", "1,2,3,4,5", PartitionType.LIST, "int2");
Partition p2 = p1.ensureListPartitionWithSubPartitionExists("int2", "1,2,3,4,5", PartitionType.LIST, "int3");
Partition p3 = p2.ensureListPartitionWithSubPartitionExists("int3", "1,2,3,4,5", PartitionType.LIST, "int4");
p3.ensureListPartitionExists("int4", "1,2,3,4,5");
this.sqlgGraph.tx().commit();
Thread.sleep(1000);
a = this.sqlgGraph1.getTopology().getSchema("A").orElseThrow().getVertexLabel("A").orElseThrow();
Optional<Partition> p = a.getPartition("int4");
Assert.assertTrue(p.isPresent());
Assert.assertNull(p.get().getFrom());
Assert.assertNull(p.get().getTo());
Assert.assertEquals("1,2,3,4,5", p.get().getIn());
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.CREATE));
Assert.assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.CREATE));
Assert.assertTrue(tlt.receivedEvent(p3, TopologyChangeAction.CREATE));
p3.remove();
this.sqlgGraph.tx().commit();
Assert.assertTrue(tlt.receivedEvent(p3, TopologyChangeAction.DELETE));
p2.remove();
this.sqlgGraph.tx().commit();
Assert.assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.DELETE));
p1.remove();
this.sqlgGraph.tx().commit();
Assert.assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
Thread.sleep(1000);
a = this.sqlgGraph1.getTopology().getSchema("A").orElseThrow().getVertexLabel("A").orElseThrow();
p = a.getPartition("int4");
Assert.assertFalse(p.isPresent());
p = a.getPartition("int3");
Assert.assertFalse(p.isPresent());
p = a.getPartition("int2");
Assert.assertFalse(p.isPresent());
p = a.getPartition("int1");
Assert.assertFalse(p.isPresent());
}
}