Coverage Summary for Class: TestShardingGremlin (org.umlg.sqlg.test.sharding)

Class Method, % Branch, % Line, %
TestShardingGremlin 0% (0/6) 0% (0/2) 0% (0/162)
TestShardingGremlin$1 0% (0/1) 0% (0/5)
TestShardingGremlin$2 0% (0/1) 0% (0/5)
TestShardingGremlin$3 0% (0/1) 0% (0/3)
TestShardingGremlin$4 0% (0/1) 0% (0/5)
TestShardingGremlin$5 0% (0/1) 0% (0/3)
TestShardingGremlin$6 0% (0/1) 0% (0/5)
TestShardingGremlin$7 0% (0/1) 0% (0/5)
TestShardingGremlin$8 0% (0/1) 0% (0/3)
Total 0% (0/14) 0% (0/2) 0% (0/196)


 package org.umlg.sqlg.test.sharding;
 
 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.time.StopWatch;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.*;
 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.PropertyColumn;
 import org.umlg.sqlg.structure.topology.VertexLabel;
 import org.umlg.sqlg.test.BaseTest;
 
 import java.net.URL;
 import java.util.*;
 
 /**
  * @author <a href="https://github.com/pietermartin">Pieter Martin</a>
  * Date: 2018/04/11
  */
 public class TestShardingGremlin extends BaseTest {
 
     @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().supportsSharding());
     }
 
     @Test
     public void testSinglePath() throws InterruptedException {
         @SuppressWarnings("Duplicates")
         VertexLabel person = this.sqlgGraph.getTopology().ensureVertexLabelExist(
                 "Person",
                 new HashMap<>(){{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("surname", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         PropertyColumn country = person.getProperty("country").orElseThrow(IllegalStateException::new);
         person.ensureDistributed(4, country);
 
         VertexLabel address = this.sqlgGraph.getTopology().ensureVertexLabelExist(
                 "Address",
                 new HashMap<>(){{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("street", PropertyDefinition.of(PropertyType.STRING));
                     put("suburb", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         country = address.getProperty("country").orElseThrow(IllegalStateException::new);
         address.ensureDistributed(4, country, person);
 
         @SuppressWarnings("unused")
         EdgeLabel livesAt = person.ensureEdgeLabelExist(
                 "livesAt",
                 address,
                 new HashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         country = livesAt.getProperty("country").orElseThrow(IllegalStateException::new);
         livesAt.ensureDistributed(4, country);
         this.sqlgGraph.tx().commit();
 
         Vertex person1 = this.sqlgGraph.addVertex(T.label, "Person", "uid", UUID.randomUUID().toString(), "name", "John", "surname", "Smith", "country", "SA");
         Vertex address1 = this.sqlgGraph.addVertex(T.label, "Address", "uid", UUID.randomUUID().toString(), "street", "X", "suburb", "Y", "country", "SA");
         Edge livesAt1 = person1.addEdge("livesAt", address1, "uid", UUID.randomUUID().toString(), "country", "SA");
         this.sqlgGraph.tx().commit();
 
         List<Edge> livesAtEdges = this.sqlgGraph.traversal().V().hasLabel("Person").outE().toList();
         Assert.assertEquals(1, livesAtEdges.size());
         Assert.assertEquals(livesAt1, livesAtEdges.get(0));
 
         List<Vertex> livesAts = this.sqlgGraph.traversal().V().hasLabel("Person").out().toList();
         Assert.assertEquals(1, livesAts.size());
         Assert.assertEquals(address1, livesAts.get(0));
         Assert.assertEquals("X", livesAts.get(0).value("street"));
         Assert.assertEquals("Y", livesAts.get(0).value("suburb"));
 
         List<Map<String, Object>> result = this.sqlgGraph.traversal()
                 .V().hasLabel("Person").as("a")
                 .outE().as("b")
                 .otherV().as("c")
                 .select("a", "b", "c")
                 .toList();
         Assert.assertEquals(1, result.size());
         Assert.assertEquals(3, result.get(0).size());
         Assert.assertEquals(person1, result.get(0).get("a"));
         Assert.assertEquals(livesAt1, result.get(0).get("b"));
         Assert.assertEquals(address1, result.get(0).get("c"));
 
         livesAtEdges = this.sqlgGraph.traversal().V().hasLabel("Address").inE().toList();
         Assert.assertEquals(1, livesAtEdges.size());
         Assert.assertEquals(livesAt1, livesAtEdges.get(0));
 
         List<Vertex> persons = this.sqlgGraph.traversal().V().hasLabel("Address").in().toList();
         Assert.assertEquals(1, persons.size());
         Assert.assertEquals(person1, persons.get(0));
         Assert.assertEquals("John", persons.get(0).value("name"));
         Assert.assertEquals("Smith", persons.get(0).value("surname"));
 
         result = this.sqlgGraph.traversal()
                 .V().hasLabel("Address").as("a")
                 .inE().as("b")
                 .otherV().as("c")
                 .select("a", "b", "c")
                 .toList();
         Assert.assertEquals(1, result.size());
         Assert.assertEquals(3, result.get(0).size());
         Assert.assertEquals(address1, result.get(0).get("a"));
         Assert.assertEquals(livesAt1, result.get(0).get("b"));
         Assert.assertEquals(person1, result.get(0).get("c"));
 
         Thread.sleep(1000);
 
         result = this.sqlgGraph1.traversal()
                 .V().hasLabel("Address").as("a")
                 .inE().as("b")
                 .otherV().as("c")
                 .select("a", "b", "c")
                 .toList();
         Assert.assertEquals(1, result.size());
         Assert.assertEquals(3, result.get(0).size());
         Assert.assertEquals(address1, result.get(0).get("a"));
         Assert.assertEquals(livesAt1, result.get(0).get("b"));
         Assert.assertEquals(person1, result.get(0).get("c"));
     }
 
     @Test
     public void testDuplicatePath() throws InterruptedException {
         @SuppressWarnings("Duplicates")
         VertexLabel person = this.sqlgGraph.getTopology().ensureVertexLabelExist(
                 "Person",
                 new HashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("surname", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         person.ensureDistributed(32, person.getProperty("country").orElseThrow(IllegalStateException::new));
         @SuppressWarnings("unused")
         EdgeLabel livesAt = person.ensureEdgeLabelExist(
                 "loves",
                 person,
                 new HashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         livesAt.ensureDistributed(32, livesAt.getProperty("country").orElseThrow(IllegalStateException::new));
         this.sqlgGraph.tx().commit();
 
         Vertex person1 = this.sqlgGraph.addVertex(T.label, "Person", "uid", UUID.randomUUID().toString(), "name", "John", "surname", "Smith", "country", "SA");
         Vertex person2 = this.sqlgGraph.addVertex(T.label, "Person", "uid", UUID.randomUUID().toString(), "name", "Suzi", "surname", "Lovenot", "country", "SA");
         person1.addEdge("loves", person2, "uid", UUID.randomUUID().toString(), "country", "SA");
         person2.addEdge("loves", person1, "uid", UUID.randomUUID().toString(), "country", "SA");
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("Person").out().toList();
         Assert.assertEquals(2, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("Person").in().toList();
         Assert.assertEquals(2, vertices.size());
 
         vertices = this.sqlgGraph.traversal().V().hasLabel("Person").outE().inV().toList();
         Assert.assertEquals(2, vertices.size());
 
         vertices = this.sqlgGraph.traversal().V().hasLabel("Person").outE().outV().toList();
         Assert.assertEquals(2, vertices.size());
 
         Thread.sleep(1000);
 
         vertices = this.sqlgGraph1.traversal().V().hasLabel("Person").out().toList();
         Assert.assertEquals(2, vertices.size());
         vertices = this.sqlgGraph1.traversal().V().hasLabel("Person").in().toList();
         Assert.assertEquals(2, vertices.size());
 
         vertices = this.sqlgGraph1.traversal().V().hasLabel("Person").outE().inV().toList();
         Assert.assertEquals(2, vertices.size());
 
         vertices = this.sqlgGraph1.traversal().V().hasLabel("Person").outE().outV().toList();
         Assert.assertEquals(2, vertices.size());
     }
 
     @Test
     public void testDuplicatePath2() throws InterruptedException {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist(
                 "A",
                 new HashMap<>(){{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("name2", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         aVertexLabel.ensureDistributed(4, aVertexLabel.getProperty("country").orElseThrow(IllegalStateException::new));
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist(
                 "B",
                 new HashMap<>(){{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("name2", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         bVertexLabel.ensureDistributed(4, bVertexLabel.getProperty("country").orElseThrow(IllegalStateException::new), aVertexLabel);
         @SuppressWarnings("unused")
         EdgeLabel livesAt = aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new HashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.STRING));
                     put("country", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid", "country"))
         );
         livesAt.ensureDistributed(4, livesAt.getProperty("country").orElseThrow(IllegalStateException::new));
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a1", "name2", "a11", "country", "SA");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid", UUID.randomUUID().toString(), "name", "b1", "name2", "b11", "country", "SA");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a2", "name2", "a22", "country", "SA");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid", UUID.randomUUID().toString(), "name", "b2", "name2", "b22", "country", "SA");
         a1.addEdge("ab", b1, "uid", UUID.randomUUID().toString(), "country", "SA");
         a2.addEdge("ab", b2, "uid", UUID.randomUUID().toString(), "country", "SA");
         this.sqlgGraph.tx().commit();
 
 //        Connection connection = this.sqlgGraph.tx().getConnection();
 //        try (Statement statement = connection.createStatement()) {
 //            statement.execute("SET citus.enable_repartition_joins = true;");
 //        } catch (SQLException e) {
 //            Assert.fail(e.getMessage());
 //        }
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
         List<Vertex> vertices = this.sqlgGraph.traversal()
                 .V().hasLabel("A").has("country", "SA")
                 .out()
                 .in()
                 .toList();
         stopWatch.stop();
         System.out.println(stopWatch.toString());
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.contains(a1));
         Assert.assertTrue(vertices.contains(a2));
 
         vertices = this.sqlgGraph.traversal()
                 .V().hasLabel("B").has("country", "SA")
                 .in()
                 .out()
                 .toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.contains(b1));
         Assert.assertTrue(vertices.contains(b2));
 
         Thread.sleep(1000);
 
         vertices = this.sqlgGraph1.traversal()
                 .V().hasLabel("A").has("country", "SA")
                 .out()
                 .in()
                 .toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.contains(a1));
         Assert.assertTrue(vertices.contains(a2));
 
         vertices = this.sqlgGraph1.traversal()
                 .V().hasLabel("B").has("country", "SA")
                 .in()
                 .out()
                 .toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.contains(b1));
         Assert.assertTrue(vertices.contains(b2));
     }
 }