Coverage Summary for Class: TestTopologyPropertyColumnUpdateDistributed (org.umlg.sqlg.test.topology)

Class Method, % Branch, % Line, %
TestTopologyPropertyColumnUpdateDistributed 100% (4/4) 33.3% (2/6) 90.5% (67/74)
TestTopologyPropertyColumnUpdateDistributed$1 100% (1/1) 100% (2/2)
Total 100% (5/5) 33.3% (2/6) 90.8% (69/76)


 package org.umlg.sqlg.test.topology;
 
 import com.google.common.base.Preconditions;
 import org.apache.commons.configuration2.builder.fluent.Configurations;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.junit.*;
 import org.umlg.sqlg.structure.*;
 import org.umlg.sqlg.structure.topology.PropertyColumn;
 import org.umlg.sqlg.structure.topology.Topology;
 import org.umlg.sqlg.structure.topology.VertexLabel;
 import org.umlg.sqlg.test.BaseTest;
 
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Optional;
 
 public class TestTopologyPropertyColumnUpdateDistributed extends BaseTest {
 
     private final List<Triple<TopologyInf, TopologyInf, TopologyChangeAction>> topologyListenerTriple = new ArrayList<>();
 
     @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 {
         Assume.assumeTrue(!isMariaDb());
         super.before();
         this.topologyListenerTriple.clear();
     }
 
     @Test
     public void testPropertyUpdateMultiplicityFrom1to0() throws InterruptedException {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
             sqlgGraph1.getTopology().registerListener(topologyListenerTest);
             sqlgGraph1.getTopology().getPublicSchema()
                     .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
                         put("column1", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                     }});
             sqlgGraph1.tx().commit();
             try {
                 sqlgGraph1.addVertex(T.label, "A");
                 Assert.fail("NOT NULL should have prevented this");
             } catch (Exception e) {
                 sqlgGraph1.tx().rollback();
             }
 
             Thread.sleep(1_000);
             Assert.assertEquals(sqlgGraph1.getTopology(), this.sqlgGraph.getTopology());
             Assert.assertTrue(this.sqlgGraph.getTopology().getPublicSchema()
                     .getVertexLabel("A").orElseThrow()
                     .getProperty("column1").orElseThrow()
                     .getPropertyDefinition().multiplicity().isRequired());
 
             Optional<VertexLabel> aVertexLabelOptional = sqlgGraph1.getTopology().getPublicSchema().getVertexLabel("A");
             Preconditions.checkState(aVertexLabelOptional.isPresent());
             VertexLabel aVertexLabel = aVertexLabelOptional.get();
             Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("column1");
             Preconditions.checkState(column1Optional.isPresent());
             PropertyColumn column1 = column1Optional.get();
             //Change the property from required to optional
             column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(0, 1)));
             sqlgGraph1.tx().commit();
             try {
                 sqlgGraph1.addVertex(T.label, "A");
             } catch (Exception e) {
                 Assert.fail("NOT NULL should have been dropped");
                 sqlgGraph1.tx().rollback();
             }
             sqlgGraph1.tx().rollback();
 
             Thread.sleep(1_000);
             Assert.assertEquals(sqlgGraph1.getTopology(), this.sqlgGraph.getTopology());
             Assert.assertFalse(this.sqlgGraph.getTopology().getPublicSchema()
                     .getVertexLabel("A").orElseThrow()
                     .getProperty("column1").orElseThrow()
                     .getPropertyDefinition().multiplicity().isRequired());
 
             Assert.assertEquals(2, this.topologyListenerTriple.size());
             Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
             Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
             Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
             column1Optional = aVertexLabel.getProperty("column1");
             Preconditions.checkState(column1Optional.isPresent());
             column1 = column1Optional.get();
             Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
             Assert.assertEquals(0, column1.getPropertyDefinition().multiplicity().lower());
             Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 
             column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
             List<Long> lowers = sqlgGraph1.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<Long>values(Topology.SQLG_SCHEMA_PROPERTY_MULTIPLICITY_LOWER).toList();
             Assert.assertEquals(1, lowers.size());
             Assert.assertEquals(1L, lowers.get(0).longValue());
             sqlgGraph1.tx().rollback();
             
             Thread.sleep(1_000);
             Assert.assertEquals(sqlgGraph1.getTopology(), this.sqlgGraph.getTopology());
             Assert.assertFalse(this.sqlgGraph.getTopology().getPublicSchema()
                     .getVertexLabel("A").orElseThrow()
                     .getProperty("column1").orElseThrow()
                     .getPropertyDefinition().multiplicity().isRequired());
 
             lowers = sqlgGraph1.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<Long>values(Topology.SQLG_SCHEMA_PROPERTY_MULTIPLICITY_LOWER).toList();
             Assert.assertEquals(1, lowers.size());
             Assert.assertEquals(0L, lowers.get(0).longValue());
         }
 
     }
 
 //    @Test
 //    public void testPropertyUpdateMultiplicityFrom0to1() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("column1", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1)));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A");
 //        this.sqlgGraph.tx().rollback();
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("column1");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //Change the property from required to optional
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1)));
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A");
 //            Assert.fail("NOT NULL should have been dropped");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //        this.sqlgGraph.tx().rollback();
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("column1");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1)));
 //        List<Long> lowers = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<Long>values(Topology.SQLG_SCHEMA_PROPERTY_MULTIPLICITY_LOWER).toList();
 //        Assert.assertEquals(1, lowers.size());
 //        Assert.assertEquals(0L, lowers.get(0).longValue());
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            lowers = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<Long>values(Topology.SQLG_SCHEMA_PROPERTY_MULTIPLICITY_LOWER).toList();
 //            Assert.assertEquals(1, lowers.size());
 //            Assert.assertEquals(1L, lowers.get(0).longValue());
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateDropCheckConstraint() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')"));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //            Assert.fail("check constraint should have prevented this");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //drop the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1)));
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //        this.sqlgGraph.tx().commit();
 //        v.remove();
 //        this.sqlgGraph.tx().commit();
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(0, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')"));
 //        List<String> checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //        Assert.assertEquals(1, checkConstraints.size());
 //        Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')", checkConstraints.get(0));
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //            Assert.assertEquals(0, checkConstraints.size());
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateAddCheckConstraint() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1)));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')"));
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //            Assert.fail("check constraint should have prevented this!!!");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().commit();
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(0, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1)));
 //        List<String> checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //        Assert.assertEquals(0, checkConstraints.size());
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //            Assert.assertEquals(1, checkConstraints.size());
 //            Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')", checkConstraints.get(0));
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateChangeCheckConstraint() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')"));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //            Assert.fail("check constraint should have prevented this.");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(0, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'b')"));
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //        this.sqlgGraph.tx().commit();
 //        v.remove();
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", "b");
 //            Assert.fail("check constraint should have prevented this!!!");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().commit();
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(0, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')"));
 //
 //        List<String> checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //        Assert.assertEquals(1, checkConstraints.size());
 //        Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'a')", checkConstraints.get(0));
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //            Assert.assertEquals(1, checkConstraints.size());
 //            Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " <> 'b')", checkConstraints.get(0));
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateArrayMultiplicityAndCheckConstraintH2() {
 //        Assume.assumeTrue(isH2());
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null,
 //                            "(ARRAY_CONTAINS (" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + ", 'a1'))")
 //                    );
 //                }});
 //        this.sqlgGraph.tx().commit();
 //
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //            Assert.fail("check constraint should have prevented this.");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null,
 //                "(ARRAY_CONTAINS (" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + ", 'b1'))")
 //        );
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //        this.sqlgGraph.tx().commit();
 //        v.remove();
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"a1"});
 //            Assert.fail("check constraint should have prevented this!!!");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().commit();
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(2, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(4, column1.getPropertyDefinition().multiplicity().upper());
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateArrayMultiplicityAndCheckConstraintHsqldb() {
 //        Assume.assumeTrue(isHsqldb());
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null,
 //                            "(POSITION_ARRAY ('{a1}' IN " + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + ") = -1)")
 //                    );
 //                }});
 //        this.sqlgGraph.tx().commit();
 //
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //            Assert.fail("check constraint should have prevented this.");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null,
 //                "(POSITION_ARRAY ('{b1}' IN " + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + ") != -1)")
 //        );
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //        this.sqlgGraph.tx().commit();
 //        v.remove();
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"a1"});
 //            Assert.fail("check constraint should have prevented this!!!");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().commit();
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(2, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(4, column1.getPropertyDefinition().multiplicity().upper());
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateArrayMultiplicityAndCheckConstraint() {
 //        Assume.assumeTrue(isPostgres());
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " @> '{a1}')"));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //            Assert.fail("check constraint should have prevented this.");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //        }
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " @> '{b2}')"));
 //        this.sqlgGraph.tx().commit();
 //        Vertex v = this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"b1", "b2"});
 //        this.sqlgGraph.tx().commit();
 //        v.remove();
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A", "name", new String[]{"a1"});
 //            Assert.fail("check constraint should have prevented this!!!");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().commit();
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(2, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(4, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.STRING_ARRAY, Multiplicity.of(2, 4), null, "(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " @> '{a1}')"));
 //        List<String> checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //        Assert.assertEquals(1, checkConstraints.size());
 //        Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " @> '{a1}')", checkConstraints.get(0));
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            checkConstraints = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_CHECK_CONSTRAINT).toList();
 //            Assert.assertEquals(1, checkConstraints.size());
 //            Assert.assertEquals("(" + sqlgGraph.getSqlDialect().maybeWrapInQoutes("name") + " @> '{b2}')", checkConstraints.get(0));
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyUpdateDefaultLiteral() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'a'"));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.addVertex(T.label, "A");
 //        this.sqlgGraph.tx().commit();
 //        String name = this.sqlgGraph.traversal().V().hasLabel("A").tryNext().orElseThrow().value("name");
 //        Assert.assertEquals("a", name);
 //        this.sqlgGraph.traversal().V().drop().iterate();
 //        this.sqlgGraph.tx().commit();
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'b'"));
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.addVertex(T.label, "A");
 //        this.sqlgGraph.tx().commit();
 //        name = this.sqlgGraph.traversal().V().hasLabel("A").tryNext().orElseThrow().value("name");
 //        Assert.assertEquals("b", name);
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'a'"));
 //        List<String> defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //        Assert.assertEquals(1, defaultLiterals.size());
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //            Assert.assertEquals(1, defaultLiterals.size());
 //            Assert.assertEquals("'b'", defaultLiterals.get(0));
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyRemoveDefaultLiteral() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'a'"));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.addVertex(T.label, "A");
 //        this.sqlgGraph.tx().commit();
 //        String name = this.sqlgGraph.traversal().V().hasLabel("A").tryNext().orElseThrow().value("name");
 //        Assert.assertEquals("a", name);
 //        this.sqlgGraph.traversal().V().drop().iterate();
 //        this.sqlgGraph.tx().commit();
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1)));
 //        this.sqlgGraph.tx().commit();
 //        try {
 //            this.sqlgGraph.addVertex(T.label, "A");
 //            Assert.fail("required column should have prevented this.");
 //        } catch (Exception e) {
 //            this.sqlgGraph.tx().rollback();
 //
 //        }
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'a'"));
 //        List<String> defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //        Assert.assertEquals(1, defaultLiterals.size());
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //            Assert.assertEquals(0, defaultLiterals.size());
 //        }
 //    }
 //
 //    @Test
 //    public void testPropertyAddDefaultLiteral() {
 //        TestTopologyChangeListener.TopologyListenerTest topologyListenerTest = new TestTopologyChangeListener.TopologyListenerTest(topologyListenerTriple);
 //        this.sqlgGraph.getTopology().registerListener(topologyListenerTest);
 //        this.sqlgGraph.getTopology().getPublicSchema()
 //                .ensureVertexLabelExist("A", new LinkedHashMap<>() {{
 //                    put("name", PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1)));
 //                }});
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.addVertex(T.label, "A", "name", "a");
 //        this.sqlgGraph.tx().commit();
 //
 //        Optional<VertexLabel> aVertexLabelOptional = this.sqlgGraph.getTopology().getPublicSchema().getVertexLabel("A");
 //        Preconditions.checkState(aVertexLabelOptional.isPresent());
 //        VertexLabel aVertexLabel = aVertexLabelOptional.get();
 //        Optional<PropertyColumn> column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        PropertyColumn column1 = column1Optional.get();
 //        //add the check constraint
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1), "'b'"));
 //        this.sqlgGraph.tx().commit();
 //        this.sqlgGraph.addVertex(T.label, "A");
 //        this.sqlgGraph.tx().commit();
 //
 //        List<Vertex> b = this.sqlgGraph.traversal().V().hasLabel("A").has("name", "b").toList();
 //        Assert.assertEquals(1, b.size());
 //
 //        Assert.assertEquals(2, this.topologyListenerTriple.size());
 //        Assert.assertNotEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getMiddle());
 //        Assert.assertEquals(TopologyChangeAction.UPDATE, this.topologyListenerTriple.get(1).getRight());
 //        column1Optional = aVertexLabel.getProperty("name");
 //        Preconditions.checkState(column1Optional.isPresent());
 //        column1 = column1Optional.get();
 //        Assert.assertEquals(column1, this.topologyListenerTriple.get(1).getLeft());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().lower());
 //        Assert.assertEquals(1, column1.getPropertyDefinition().multiplicity().upper());
 //
 //        column1.updatePropertyDefinition(PropertyDefinition.of(PropertyType.varChar(10), Multiplicity.of(1, 1)));
 //        List<String> defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //        Assert.assertEquals(0, defaultLiterals.size());
 //        this.sqlgGraph.tx().rollback();
 //
 //        if (this.sqlgGraph.getSqlDialect().supportsTransactionalSchema()) {
 //            defaultLiterals = this.sqlgGraph.topology().V().hasLabel(Topology.SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_PROPERTY).<String>values(Topology.SQLG_SCHEMA_PROPERTY_DEFAULT_LITERAL).toList();
 //            Assert.assertEquals(1, defaultLiterals.size());
 //            Assert.assertEquals("'b'", defaultLiterals.get(0));
 //        }
 //    }
 
 }