Coverage Summary for Class: TestSchemaEagerCreation (org.umlg.sqlg.test.schema)

Class Class, % Method, % Line, %
TestSchemaEagerCreation 100% (1/1) 100% (10/10) 100% (135/135)


 package org.umlg.sqlg.test.schema;
 
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 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.PropertyColumn;
 import org.umlg.sqlg.structure.topology.Schema;
 import org.umlg.sqlg.structure.topology.VertexLabel;
 import org.umlg.sqlg.test.BaseTest;
 
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
 import static org.junit.Assert.*;
 
 /**
  * Date: 2016/11/23
  * Time: 6:03 PM
  */
 @SuppressWarnings("DuplicatedCode")
 public class TestSchemaEagerCreation extends BaseTest {
 
  @Before
  public void beforeTest() {
  Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportsTransactionalSchema());
  }
 
  @SuppressWarnings("OptionalGetWithoutIsPresent")
  @Test
  public void testVertexEdgeHasSameName() {
  Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name1", "halo1");
  Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name2", "halo2");
  a1.addEdge("A", b2, "name3", "halo3");
  this.sqlgGraph.tx().commit();
 
  Map<String, PropertyColumn> properties = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A").get().getProperties();
  assertTrue(properties.containsKey("name1"));
 
  properties = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("B").get().getProperties();
  assertTrue(properties.containsKey("name2"));
 
  properties = this.sqlgGraph.getTopology().getPublicSchema().getEdgeLabel("A").get().getProperties();
  assertTrue(properties.containsKey("name3"));
  }
 
  @Test
  public void testModern() {
  createModernSchema();
  this.sqlgGraph.tx().rollback();
  //test nothing is created
  assertTrue(this.sqlgGraph.getTopology().getAllTables().isEmpty());
  createModernSchema();
  this.sqlgGraph.tx().commit();
  assertEquals(4, this.sqlgGraph.getTopology().getAllTables().size());
  assertEquals(2, this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_person").size());
  assertEquals(2, this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_software").size());
  assertEquals(PropertyDefinition.of(PropertyType.STRING), this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_person").get("name"));
  assertEquals(PropertyType.INTEGER, this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_person").get("age").propertyType());
  assertEquals(PropertyDefinition.of(PropertyType.STRING), this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_software").get("name"));
  assertEquals(PropertyDefinition.of(PropertyType.STRING), this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_software").get("lang"));
  //test this by turning sql logging on and watch for create statements.
  loadModern();
  }
 
  @Test
  public void testAddVertexProperties() {
  this.sqlgGraph.getTopology().ensureVertexLabelExist("A", Collections.emptyMap());
  this.sqlgGraph.tx().commit();
  assertEquals(1, this.sqlgGraph.getTopology().getAllTables().size());
  assertTrue(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").isEmpty());
 
  Map<String, PropertyDefinition> properties = new HashMap<>();
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("age", PropertyDefinition.of(PropertyType.INTEGER));
  assertTrue(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").isEmpty());
  this.sqlgGraph.getTopology().ensureVertexLabelPropertiesExist("A", properties);
  this.sqlgGraph.tx().rollback();
  assertTrue(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").isEmpty());
  this.sqlgGraph.getTopology().ensureVertexLabelExist("A", Collections.emptyMap());
  this.sqlgGraph.getTopology().ensureVertexLabelPropertiesExist("A", properties);
  this.sqlgGraph.tx().commit();
  assertEquals(1, this.sqlgGraph.getTopology().getAllTables().size());
  assertEquals(2, this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").size());
  assertEquals(PropertyDefinition.of(PropertyType.STRING), this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").get("name"));
  assertEquals(PropertyType.INTEGER, this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".V_A").get("age").propertyType());
  }
 
  @Test
  public void testAddEdgeProperties() {
  VertexLabel outVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("A");
  VertexLabel inVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("B");
  this.sqlgGraph.getTopology().ensureEdgeLabelExist("ab", outVertexLabel, inVertexLabel, Collections.emptyMap());
  this.sqlgGraph.tx().commit();
  Map<String, PropertyDefinition> properties = new HashMap<>();
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("age", PropertyDefinition.of(PropertyType.INTEGER));
  assertTrue(this.sqlgGraph.getTopology().getAllTables().entrySet().stream().allMatch((entry) -> entry.getValue().isEmpty()));
  assertTrue(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".E_ab").isEmpty());
  this.sqlgGraph.getTopology().ensureEdgePropertiesExist("ab", properties);
  this.sqlgGraph.tx().rollback();
  assertTrue(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".E_ab").isEmpty());
  this.sqlgGraph.getTopology().ensureEdgePropertiesExist("ab", properties);
  this.sqlgGraph.tx().commit();
  assertFalse(this.sqlgGraph.getTopology().getAllTables().get(this.sqlgGraph.getSqlDialect().getPublicSchema() + ".E_ab").isEmpty());
  }
 
  @Test
  public void testVertexLabelPropertiesViaVertexLabel() {
  Schema schema = this.sqlgGraph.getTopology().getPublicSchema();
  this.sqlgGraph.addVertex(T.label, "Person");
  Optional<VertexLabel> vertexLabel = schema.getVertexLabel("Person");
  assertTrue(vertexLabel.isPresent());
  this.sqlgGraph.tx().rollback();
  vertexLabel = schema.getVertexLabel("Person");
  assertFalse(vertexLabel.isPresent());
 
  this.sqlgGraph.addVertex(T.label, "Person");
  vertexLabel = schema.getVertexLabel("Person");
  assertTrue(vertexLabel.isPresent());
  this.sqlgGraph.tx().commit();
  vertexLabel = schema.getVertexLabel("Person");
  assertTrue(vertexLabel.isPresent());
 
  vertexLabel = schema.getVertexLabel("Person");
  assertTrue(vertexLabel.isPresent());
  Map<String, PropertyDefinition> properties = new HashMap<>();
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("age", PropertyDefinition.of(PropertyType.INTEGER));
  vertexLabel.get().ensurePropertiesExist(properties);
  assertEquals(2, vertexLabel.get().getProperties().size());
  this.sqlgGraph.tx().rollback();
  assertEquals(0, vertexLabel.get().getProperties().size());
 
  vertexLabel.get().ensurePropertiesExist(properties);
  this.sqlgGraph.tx().commit();
  assertEquals(2, vertexLabel.get().getProperties().size());
  PropertyColumn propertyColumnName = vertexLabel.get().getProperties().get("name");
  PropertyColumn propertyColumnAge = vertexLabel.get().getProperties().get("age");
  assertNotNull(propertyColumnName);
  assertNotNull(propertyColumnAge);
  assertEquals(PropertyDefinition.of(PropertyType.STRING), propertyColumnName.getPropertyDefinition());
  assertEquals(PropertyType.INTEGER, propertyColumnAge.getPropertyType());
  }
 
  @SuppressWarnings("OptionalGetWithoutIsPresent")
  @Test
  public void testEdgeLabelsProperties() {
  Vertex a = this.sqlgGraph.addVertex(T.label, "A");
  Vertex b = this.sqlgGraph.addVertex(T.label, "B");
  a.addEdge("ab", b);
  this.sqlgGraph.tx().commit();
 
  Optional<VertexLabel> vertexLabelAOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
  assertTrue(vertexLabelAOptional.isPresent());
  Optional<VertexLabel> vertexLabelBOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("B");
  assertTrue(vertexLabelBOptional.isPresent());
  Optional<EdgeLabel> edgeLabelOptional = vertexLabelAOptional.get().getOutEdgeLabel("ab");
  assertTrue(edgeLabelOptional.isPresent());
 
  Map<String, PropertyDefinition> properties = new HashMap<>();
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("age", PropertyDefinition.of(PropertyType.INTEGER));
  EdgeLabel edgeLabel = edgeLabelOptional.get();
  edgeLabel.ensurePropertiesExist(properties);
  this.sqlgGraph.tx().rollback();
 
  edgeLabel = vertexLabelAOptional.get().getOutEdgeLabel("ab").get();
  assertTrue(edgeLabel.getProperties().isEmpty());
 
  edgeLabel = vertexLabelAOptional.get().getOutEdgeLabel("ab").get();
  edgeLabel.ensurePropertiesExist(properties);
  this.sqlgGraph.tx().commit();
 
  edgeLabel = vertexLabelAOptional.get().getOutEdgeLabel("ab").get();
  assertEquals(2, edgeLabel.getProperties().size());
  }
 
  @SuppressWarnings("OptionalGetWithoutIsPresent")
  @Test
  public void testAddEdgeLabelViaOutVertexLabel() {
  VertexLabel a = this.sqlgGraph.getTopology()
  .ensureSchemaExist("A")
  .ensureVertexLabelExist("A");
  Optional<Schema> schemaOptional = this.sqlgGraph.getTopology().getSchema("A");
  assertTrue(schemaOptional.isPresent());
  VertexLabel b = schemaOptional.get().ensureVertexLabelExist("B");
  a.ensureEdgeLabelExist("ab", b);
  this.sqlgGraph.tx().commit();
 
  Optional<EdgeLabel> edgeLabel = this.sqlgGraph.getTopology().getSchema("A").get().getEdgeLabel("ab");
  assertTrue(edgeLabel.isPresent());
  assertEquals("ab", edgeLabel.get().getLabel());
  }
 
  private void createModernSchema() {
  Map<String, PropertyDefinition> properties = new HashMap<>();
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("age", PropertyDefinition.of(PropertyType.INTEGER));
  VertexLabel personVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("person", properties);
  properties.remove("age");
  properties.put("name", PropertyDefinition.of(PropertyType.STRING));
  properties.put("lang", PropertyDefinition.of(PropertyType.STRING));
  VertexLabel softwareVertexLabel = this.sqlgGraph.getTopology().ensureVertexLabelExist("software", properties);
  properties.clear();
  properties.put("weight", PropertyDefinition.of(PropertyType.DOUBLE));
  this.sqlgGraph.getTopology().ensureEdgeLabelExist("knows", personVertexLabel, personVertexLabel, properties);
  this.sqlgGraph.getTopology().ensureEdgeLabelExist("created", personVertexLabel, softwareVertexLabel, properties);
  }
 
 }