diff --git a/.gitignore b/.gitignore index 3724ac2..52c9831 100644 --- a/.gitignore +++ b/.gitignore @@ -129,6 +129,9 @@ docs/node_modules # might be created by tests that write files app/carnival-core/data +# created by CarnivalNeo4jSpec +app/carnival-core/carnival-home + # scratch code *.groovy_ diff --git a/app/carnival-core/src/main/groovy/carnival/core/graph/Carnival.groovy b/app/carnival-core/src/main/groovy/carnival/core/graph/Carnival.groovy index 738f002..3713c4f 100644 --- a/app/carnival-core/src/main/groovy/carnival/core/graph/Carnival.groovy +++ b/app/carnival-core/src/main/groovy/carnival/core/graph/Carnival.groovy @@ -34,7 +34,12 @@ import carnival.graph.VertexBuilder /** - * The core graph. See the documentation for model details. + * The Carnival object. + * + * A Carnival is comprosed of three main components: + * - a Gremlin graph + * - a graph schema + * - a graph validator * */ @Slf4j @@ -226,7 +231,11 @@ abstract class Carnival implements GremlinTrait { } - /** */ + /** + * Create the singleton vertex for a vertex constraint for a vertex definition if + * it represents a class and has no required properties. + * + */ public void createClassVertex(Graph graph, GraphTraversalSource g, VertexConstraint vld) { log.trace "createClassVertex vld: ${vld.label} $vld" diff --git a/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4j.groovy b/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4j.groovy index ea3bc96..d2d84ea 100644 --- a/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4j.groovy +++ b/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4j.groovy @@ -2,6 +2,9 @@ package carnival.core.graph +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.Files import groovy.util.AntBuilder import groovy.transform.ToString import groovy.transform.InheritConstructors @@ -40,96 +43,157 @@ class CarnivalNeo4j extends Carnival { // STATIC /////////////////////////////////////////////////////////////////////////// - /** File path to the graph directory */ - static String GRAPH_PATH = "${Defaults.dataGraphDirectory}" - - + /** */ + public static CarnivalNeo4j create(Map args = [:]) { + CarnivalNeo4jConfiguration defaultConfig = CarnivalNeo4jConfiguration.defaultConfiguration() + create(defaultConfig, args) + } - /////////////////////////////////////////////////////////////////////////// - // FACTORY - /////////////////////////////////////////////////////////////////////////// /** */ - public static CarnivalNeo4j create(Map args = [:]) { - def graph = openGremlinGraph() + public static CarnivalNeo4j create(CarnivalNeo4jConfiguration config, Map args = [:]) { + // initialize the directory structure + initializeFiles(config) + // open the neo4j gremlin graph + def graph = openGremlinGraph(config) + + // create a graph schema object def graphSchema if (args.vertexBuilders) graphSchema = new DefaultGraphSchema(args.vertexBuilders) else graphSchema = new DefaultGraphSchema() + // create a graph validator object def graphValidator = new DefaultGraphValidator() - def coreGraph = new CarnivalNeo4j(graph, graphSchema, graphValidator) + + // create the carnival object + def carnival = new CarnivalNeo4j(graph, graphSchema, graphValidator) + carnival.config = config + // initialize the graph def g = graph.traversal() - try { - coreGraph.initializeGremlinGraph(graph, g) - coreGraph.initNeo4j(graph, g) + carnival.initializeGremlinGraph(graph, g) + carnival.neo4jConstraints(graph, g) } finally { if (g) g.close() } - assert coreGraph - return coreGraph + assert carnival + return carnival } - - - - /////////////////////////////////////////////////////////////////////////// - // INITIALIZATION - /////////////////////////////////////////////////////////////////////////// - /** */ - public static PropertiesConfiguration neo4jConfig() { - def config = new PropertiesConfiguration() - config.setProperty('gremlin.neo4j.directory', Defaults.dataGraphDirectoryPath) - - [ - "carnival.gremlin.neo4j.conf.dbms.security.auth_enabled", - "carnival.gremlin.neo4j.conf.dbms.directories.plugins", - "carnival.gremlin.neo4j.conf.dbms.security.procedures.unrestricted", - "carnival.gremlin.neo4j.conf.dbms.security.procedures.whitelist", - "carnival.gremlin.neo4j.conf.dbms.unmanaged_extension_classes" - ].each { p -> - def k = p.split('\\.').drop(1).join('.') - def v = Defaults.getConfigValue(p) - config.setProperty(k, v) - } - - return config + public static PropertiesConfiguration neo4jConfig(CarnivalNeo4jConfiguration config) { + def nconf = new PropertiesConfiguration() + nconf.setProperty('gremlin.neo4j.directory', config.gremlin.neo4j.directory) + + nconf.setProperty( + 'gremlin.neo4j.conf.dbms.security.auth_enabled', + config.gremlin.neo4j.conf.dbms.security.auth_enabled + ) + nconf.setProperty( + 'gremlin.neo4j.conf.dbms.directories.plugins', + config.gremlin.neo4j.conf.dbms.directories.plugins + ) + nconf.setProperty( + 'gremlin.neo4j.conf.dbms.security.procedures.unrestricted', + config.gremlin.neo4j.conf.dbms.security.procedures.unrestricted + ) + nconf.setProperty( + 'gremlin.neo4j.conf.dbms.security.procedures.whitelist', + config.gremlin.neo4j.conf.dbms.security.procedures.whitelist + ) + nconf.setProperty( + 'gremlin.neo4j.conf.dbms.unmanaged_extension_classes', + config.gremlin.neo4j.conf.dbms.unmanaged_extension_classes + ) + + return nconf } /** */ - public static Graph openGremlinGraph(Map args = [:]) { - log.trace "openGremlinGraph() creating or loading graph in ${GRAPH_PATH}" + public static Graph openGremlinGraph(CarnivalNeo4jConfiguration config) { + log.trace "openGremlinGraph() creating or loading graph in ${config}" // configure log4j System.setProperty('log4j.configuration', 'log4j.properties') // get the neo4j config - def config = neo4jConfig() - - // adjust neo4j config per params - if (args.graphDirectory) config.setProperty('gremlin.neo4j.directory', args.graphDirectory) + def nconf = neo4jConfig(config) // create gremlin Neo4jGraph - log.info "opening Neo4j graph config:${config} ..." - Graph graph = Neo4jGraph.open(config) + log.info "opening Neo4j graph nconf:${nconf} ..." + Graph graph = Neo4jGraph.open(nconf) assert graph return graph } + /** + * Initialize directory structure. + * + */ + public static void initializeFiles(CarnivalNeo4jConfiguration config) { + Path graphPath = Paths.get(config.gremlin.neo4j.directory) + if (graphPath == null) throw new RuntimeException("graphPath is null") + + //String currentRelativePathString = currentRelativePath.toAbsolutePath().toString() + //Path graphPath = currentRelativePath.resolve(CARNIVAL_HOME_NAME) + //String graphPathString = graphPath.toAbsolutePath().toString() + + def assertDirectoryAttributes = { Path dirPath -> + String dirPathString = dirPath.toAbsolutePath().toString() + if (!Files.exists(dirPath)) { + throw new RuntimeException("${dirPathString} does not exist") + } + if (!Files.isDirectory(dirPath)) { + throw new RuntimeException("${dirPathString} is not a directory") + } + if (!Files.isWritable(dirPath)) { + throw new RuntimeException("${dirPathString} is not writable") + } + if (!Files.isReadable(dirPath)) { + throw new RuntimeException("${dirPathString} is not readable") + } + } + + if (!Files.exists(graphPath)) { + log.trace "Files.createDirectories ${graphPath}" + Files.createDirectories(graphPath) + } + assertDirectoryAttributes(graphPath) + } + + + + /////////////////////////////////////////////////////////////////////////// + // FIELDS + /////////////////////////////////////////////////////////////////////////// + + CarnivalNeo4jConfiguration config + + + + /////////////////////////////////////////////////////////////////////////// + // NEO4J + /////////////////////////////////////////////////////////////////////////// + + /** */ + public void initializeFiles() { + assert this.config + initializeFiles(this.config) + } + /** * Set property uniqueness constraints. * */ - public initNeo4j(Graph graph, GraphTraversalSource g) { - log.trace "CarnivalNeo4j initNeo4j" + public void neo4jConstraints(Graph graph, GraphTraversalSource g) { + log.trace "CarnivalNeo4j neo4jConstraints" // create uniqueness constraints withTransaction(graph) { @@ -141,6 +205,16 @@ class CarnivalNeo4j extends Carnival { } } } + } + + + + /** + * Set indexes. + * + */ + public void createIndexes(Graph graph, GraphTraversalSource g) { + log.trace "CarnivalNeo4j createIndexes" // create indexes withTransaction(graph) { @@ -154,6 +228,22 @@ class CarnivalNeo4j extends Carnival { } + /** */ + public String graphPath() { + assert this.config + Paths.get(config.gremlin.neo4j.directory) + } + + + /** */ + public String graphPathString() { + Path dirPath = graphPath() + String dirPathString = dirPath.toAbsolutePath().toString() + return dirPathString + } + + + /////////////////////////////////////////////////////////////////////////// // LIFE-CYCLE /////////////////////////////////////////////////////////////////////////// @@ -169,18 +259,19 @@ class CarnivalNeo4j extends Carnival { /////////////////////////////////////////////////////////////////////////// /** */ - public static File graphDir() { - File graphDir = new File(GRAPH_PATH) - assert graphDir.exists() - assert graphDir.isDirectory() + public static File graphDir(CarnivalNeo4jConfiguration config) { + def graphPath = Paths.get(config.gremlin.neo4j.directory) + File graphDir = graphPath.toFile() graphDir } /** */ - public static File sisterDir(String dirName) { + public static File sisterDir(CarnivalNeo4jConfiguration config, String dirName) { assert dirName - File graphDir = graphDir() + File graphDir = graphDir(config) + assert graphDir.exists() + assert graphDir.isDirectory() File parentDir = graphDir.getParentFile() assert parentDir.exists() assert parentDir.isDirectory() @@ -190,43 +281,44 @@ class CarnivalNeo4j extends Carnival { /** */ - public static clearGraph() { + public static clearGraph(CarnivalNeo4jConfiguration config) { log.info "clearGraph" def ant = new AntBuilder() - def graphDir = graphDir() + def graphDir = graphDir(config) if (graphDir.exists()) ant.delete(dir:graphDir) } /** */ - public static resetGraphFrom(String sourceDirName) { + public static resetGraphFrom(CarnivalNeo4jConfiguration config, String sourceDirName) { log.info "resetGraphFrom sourceDirName:${sourceDirName}" - File sourceDir = sisterDir(sourceDirName) + File sourceDir = sisterDir(config, sourceDirName) assert sourceDir.exists() - resetGraphFrom(sourceDir) + resetGraphFrom(config, sourceDir) } /** */ - public static resetGraphFromIfExists(String sourceDirName) { + public resetGraphFromIfExists(CarnivalNeo4jConfiguration config, String sourceDirName) { log.info "resetGraphFromIfExists sourceDirName:${sourceDirName}" - File sourceDir = sisterDir(sourceDirName) - if (sourceDir.exists()) resetGraphFrom(sourceDir) + File sourceDir = sisterDir(config, sourceDirName) + if (sourceDir.exists()) resetGraphFrom(config, sourceDir) } /** */ - public static resetGraphFrom(File sourceDir) { + public resetGraphFrom(CarnivalNeo4jConfiguration config, File sourceDir) { log.info "resetGraphFrom sourceDir:${sourceDir}" assert sourceDir assert sourceDir.exists() + assert sourceDir.isDirectory() def ant = new AntBuilder() - File graphDir = graphDir() + File graphDir = graphDir(config) if (graphDir.exists()) ant.delete(dir:graphDir) ant.mkdir(dir:graphDir) ant.sequential { @@ -240,21 +332,23 @@ class CarnivalNeo4j extends Carnival { /** */ - public copyGraph(String dirName) { + public copyGraph(CarnivalNeo4jConfiguration config, String dirName) { log.info "copyGraph dirName: $dirName" assert dirName - File publishDir = sisterDir(dirName) - copyGraph(publishDir) + File publishDir = sisterDir(config, dirName) + copyGraph(config, publishDir) } /** */ - public copyGraph(File publishDir) { + public copyGraph(CarnivalNeo4jConfiguration config, File publishDir) { log.info "copyGraph $publishDir" assert publishDir - File graphDir = graphDir() + File graphDir = graphDir(config) + assert graphDir.exists() + assert graphDir.isDirectory() // set up publish directory def ant = new AntBuilder() diff --git a/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4jConfiguration.groovy b/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4jConfiguration.groovy index 731faa0..1c9b0a2 100644 --- a/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4jConfiguration.groovy +++ b/app/carnival-core/src/main/groovy/carnival/core/graph/CarnivalNeo4jConfiguration.groovy @@ -2,6 +2,9 @@ package carnival.core.graph +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.Files import groovy.util.logging.Slf4j import groovy.transform.ToString @@ -15,13 +18,27 @@ import carnival.graph.VertexBuilder @ToString(includeNames=true) class CarnivalNeo4jConfiguration { - Graph graph - GraphSchema graphSchema - GraphValidator graphValidator + /////////////////////////////////////////////////////////////////////////// + // STATIC + /////////////////////////////////////////////////////////////////////////// - Set vertexBuilders + final static String GRAPH_PATH_DEFAULT = "carnival-home/neo4j/graph" + static public CarnivalNeo4jConfiguration defaultConfiguration() { + Path currentRelativePath = Paths.get(""); + Path carnivalHomePath = currentRelativePath.resolve(GRAPH_PATH_DEFAULT) + String carnivalHomePathString = carnivalHomePath.toAbsolutePath().toString() + CarnivalNeo4jConfiguration config = new CarnivalNeo4jConfiguration() + config.gremlin.neo4j.directory = carnivalHomePathString + + return config + } + + + /////////////////////////////////////////////////////////////////////////// + // CONFIG FIELDS + /////////////////////////////////////////////////////////////////////////// @ToString(includeNames=true) static class Gremlin { @@ -70,4 +87,7 @@ class CarnivalNeo4jConfiguration { + + + } diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jConfigurationSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jConfigurationSpec.groovy index 7171f93..ffd0df8 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jConfigurationSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jConfigurationSpec.groovy @@ -16,22 +16,20 @@ import carnival.graph.VertexBuilder */ class CarnivalNeo4jConfigurationSpec extends Specification { + def "default config"() { + when: + def conf = CarnivalNeo4jConfiguration.defaultConfiguration() + println "conf: ${conf}" + + then: + conf != null + } - def "set all values"() { - given: - def graph = TinkerGraph.open() - def graphSchema = new DefaultGraphSchema() - def graphValidator = new DefaultGraphValidator() - def vertexBuilders = new HashSet() + def "set all values"() { when: def conf = new CarnivalNeo4jConfiguration() - conf.graph = graph - conf.graphSchema = graphSchema - conf.graphValidator = graphValidator - conf.vertexBuilders = vertexBuilders - conf.gremlin.neo4j.directory = 'cgnd' conf.gremlin.neo4j.conf.dbms.unmanaged_extension_classes = 'cgncdu' conf.gremlin.neo4j.conf.dbms.directories.plugins = 'plugins' @@ -40,20 +38,12 @@ class CarnivalNeo4jConfigurationSpec extends Specification { conf.gremlin.neo4j.conf.dbms.security.procedures.whitelist = 'somethingElse*' then: - conf.graph == graph - conf.graphSchema == graphSchema - conf.graphValidator == graphValidator - conf.vertexBuilders == vertexBuilders - conf.gremlin.neo4j.directory == 'cgnd' conf.gremlin.neo4j.conf.dbms.unmanaged_extension_classes == 'cgncdu' conf.gremlin.neo4j.conf.dbms.directories.plugins == 'plugins' conf.gremlin.neo4j.conf.dbms.security.auth_enabled == 'true' conf.gremlin.neo4j.conf.dbms.security.procedures.unrestricted == 'something*' conf.gremlin.neo4j.conf.dbms.security.procedures.whitelist == 'somethingElse*' - - cleanup: - if (conf.graph) conf.graph.close() } diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jSpec.groovy index fda73b2..db50bc2 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalNeo4jSpec.groovy @@ -18,7 +18,6 @@ import org.neo4j.configuration.connectors.BoltConnector import org.neo4j.configuration.helpers.SocketAddress*/ import carnival.graph.* -import carnival.core.config.Defaults @@ -54,8 +53,9 @@ class CarnivalNeo4jSpec extends Specification { def setupSpec() { - CarnivalNeo4j.clearGraph() - carnival = CarnivalNeo4j.create(vertexBuilders:vertexBuilders) + CarnivalNeo4jConfiguration cnConf = CarnivalNeo4jConfiguration.defaultConfiguration() + CarnivalNeo4j.clearGraph(cnConf) + carnival = CarnivalNeo4j.create(cnConf, [vertexBuilders:vertexBuilders]) } def setup() { } @@ -78,7 +78,7 @@ class CarnivalNeo4jSpec extends Specification { /*def "test expose Bolt port"() { when: // expose Bolt port - DatabaseManagementService managementService = new DatabaseManagementServiceBuilder( Defaults.getDataGraphDirectoryPath() ) + DatabaseManagementService managementService = new DatabaseManagementServiceBuilder( carnival.graphPath() ) .setConfig( BoltConnector.enabled, true ) .setConfig( BoltConnector.listen_address, new SocketAddress( "localhost", 7687 ) ) .build(); @@ -89,7 +89,7 @@ class CarnivalNeo4jSpec extends Specification { - @IgnoreIf({ !Defaults.getConfigValue('carnival.gremlin.conf.dbms.directories.plugins') }) + @IgnoreIf({ !CarnivalNeo4jConfiguration.defaultConfiguration().gremlin.neo4j.conf.dbms.directories.plugins }) def "test apoc"() { when: def graph = carnival.graph @@ -99,7 +99,7 @@ class CarnivalNeo4jSpec extends Specification { println "apocVersion: $apocVersion" } catch (org.neo4j.graphdb.QueryExecutionException e) { e.printStackTrace() - def pluginDir = Defaults.getConfigValue('carnival.gremlin.conf.dbms.directories.plugins') + def pluginDir = CarnivalNeo4jConfiguration.defaultConfiguration().gremlin.neo4j.conf.dbms.directories.plugins println "in order to run APOC, the APOC library must be present on the file system and configured in the application configuration." println "has carnival.home been set? or a configuration otherwise provided?" println "is the following plugin directory valid? ${pluginDir}" diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalSpec.groovy index d94f40a..42090cc 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/CarnivalSpec.groovy @@ -33,7 +33,7 @@ class CarnivalSpec extends Specification { // FIELDS /////////////////////////////////////////////////////////////////////////// - @Shared coreGraph + @Shared carnival @Shared vertexBuilders = [ Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "1"), @@ -47,7 +47,12 @@ class CarnivalSpec extends Specification { def setup() { - coreGraph = CarnivalTinker.create(vertexBuilders:vertexBuilders) + carnival = CarnivalTinker.create(vertexBuilders:vertexBuilders) + /*carnival.withTraversal { graph, g -> + ["1", "2"].each { + Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, it).create(graph) + } + }*/ } def setupSpec() { } @@ -57,7 +62,7 @@ class CarnivalSpec extends Specification { def cleanup() { - if (coreGraph) coreGraph.close() + if (carnival) carnival.close() } @@ -71,7 +76,7 @@ class CarnivalSpec extends Specification { */ def "test graph creation"() { when: - def graph = coreGraph.graph + def graph = carnival.graph println "====================" println "initial graph" @@ -85,7 +90,7 @@ class CarnivalSpec extends Specification { def "test initializeGraph for VertexBuilder creation"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() def vs = [] //println "graph: $graph" @@ -94,7 +99,7 @@ class CarnivalSpec extends Specification { //expect: - //coreGraph.graphSchema.vertexBuilders?.size() == vertexBuilders?.size() + //carnival.graphSchema.vertexBuilders?.size() == vertexBuilders?.size() when: vs = g.V().hasLabel('Identifier').toList() @@ -127,12 +132,12 @@ class CarnivalSpec extends Specification { def "test checkConstraints for exactly one singleton vertex"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() def vs expect: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: g.V().hasLabel('Identifier').has("value", "1").next().remove() @@ -140,8 +145,8 @@ class CarnivalSpec extends Specification { then: vs.size() == 0 - coreGraph.checkConstraints().size() == 1 - //println coreGraph.checkConstraints() + carnival.checkConstraints().size() == 1 + //println carnival.checkConstraints() when: Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "1").vertex(graph, g) @@ -150,7 +155,7 @@ class CarnivalSpec extends Specification { then: vs.size() == 1 - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: graph.addVertex( @@ -162,18 +167,18 @@ class CarnivalSpec extends Specification { then: vs.size() == 2 - coreGraph.checkConstraints().size() == 1 + carnival.checkConstraints().size() == 1 } def "test checkConstraints for property existence constraints"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() def vert expect: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: vert = graph.addVertex( @@ -182,13 +187,13 @@ class CarnivalSpec extends Specification { ) then: - coreGraph.checkConstraints().size() == 3 + carnival.checkConstraints().size() == 3 } def "test checkConstraints for relationship domain constraints"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() def identifierFacility @@ -197,7 +202,7 @@ class CarnivalSpec extends Specification { def suitcase expect: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: identifierFacility = Core.VX.IDENTIFIER_FACILITY.instance().withProperty(Core.PX.NAME, "f1").vertex(graph, g) @@ -219,7 +224,7 @@ class CarnivalSpec extends Specification { suitcase = VX.CGS_SUITCASE.instance().vertex(graph, g) then: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: Base.EX.IS_INSTANCE_OF.relate(g, identifier, identifierClass) @@ -228,7 +233,7 @@ class CarnivalSpec extends Specification { //identifier.addEdge("was_created_by", identifierFacility) then: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: suitcase.addEdge(Core.EX.WAS_CREATED_BY.label, identifierFacility, Base.PX.NAME_SPACE.label, Core.EX.WAS_CREATED_BY.nameSpace) @@ -236,13 +241,13 @@ class CarnivalSpec extends Specification { //suitcase.addEdge("was_created_by", identifierFacility) then: - coreGraph.checkConstraints().size() == 1 + carnival.checkConstraints().size() == 1 } def "test checkConstraints for relationship range constraints"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() def identifierFacility @@ -251,7 +256,7 @@ class CarnivalSpec extends Specification { def suitcase expect: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: identifierFacility = Core.VX.IDENTIFIER_FACILITY.instance().withProperty(Core.PX.NAME, "f1").vertex(graph, g) @@ -264,7 +269,7 @@ class CarnivalSpec extends Specification { suitcase = VX.CGS_SUITCASE.instance().vertex(graph, g) then: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: Base.EX.IS_INSTANCE_OF.relate(g, identifier, identifierClass) @@ -273,7 +278,7 @@ class CarnivalSpec extends Specification { //identifier.addEdge("was_created_by", identifierFacility) then: - coreGraph.checkConstraints().size() == 0 + carnival.checkConstraints().size() == 0 when: //Core.EX.WAS_CREATED_BY.relate(g, identifier, suitcase) @@ -281,18 +286,18 @@ class CarnivalSpec extends Specification { //identifier.addEdge("was_created_by", suitcase) then: - coreGraph.checkConstraints().size() == 1 + carnival.checkConstraints().size() == 1 } def "test checkModel for unmodeled vertex and edge labels"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def suitcase, salesman, id, idClass def g = graph.traversal() expect: - !coreGraph.checkModel() + !carnival.checkModel() when: id = Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, '123').vertex(graph, g) @@ -305,22 +310,22 @@ class CarnivalSpec extends Specification { then: CarnivalUtils.printGraph(g) - coreGraph.checkModel().size() == 0 + carnival.checkModel().size() == 0 when: suitcase = graph.addVertex(T.label, "Suitcase") salesman = graph.addVertex(T.label, "Salesman") then: - coreGraph.checkModel().size() == 1 - println coreGraph.checkModel() + carnival.checkModel().size() == 1 + println carnival.checkModel() when: suitcase.addEdge("belongs_to", salesman) then: - coreGraph.checkModel().size() == 2 - println coreGraph.checkModel() + carnival.checkModel().size() == 2 + println carnival.checkModel() } /* @@ -331,25 +336,25 @@ class CarnivalSpec extends Specification { /* def "test checkModel for unmodeled vertex properties"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def patient expect: - !coreGraph.checkModel() + !carnival.checkModel() when: patient = graph.addVertex(T.label, "Patient", "customProp", "abc123") then: - coreGraph.checkModel().size() == 1 - println coreGraph.checkModel() + carnival.checkModel().size() == 1 + println carnival.checkModel() }*/ def "test Identifier vertex class"() { given: - def graph = coreGraph.graph + def graph = carnival.graph def g = graph.traversal() Exception t @@ -414,8 +419,8 @@ class CarnivalSpec extends Specification { def idNode expect: - coreGraph.checkModel().size() == 0 - coreGraph.checkConstraints().size() == 0 + carnival.checkModel().size() == 0 + carnival.checkConstraints().size() == 0 /* where: diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/DataSetDescriptorGraphSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/DataSetDescriptorGraphSpec.groovy index cc74528..f70c208 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/DataSetDescriptorGraphSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/DataSetDescriptorGraphSpec.groovy @@ -48,11 +48,6 @@ class DataSetDescriptorGraphSpec extends Specification { @Shared graph @Shared g - @Shared vertexBuilders = [ - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "1"), - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "2"), - ] - /////////////////////////////////////////////////////////////////////////// // SET UP @@ -63,7 +58,7 @@ class DataSetDescriptorGraphSpec extends Specification { } def setup() { - carnival = CarnivalTinker.create(vertexBuilders:vertexBuilders) + carnival = CarnivalTinker.create() graph = carnival.graph g = graph.traversal() } diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/GraphModelExtensionSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/GraphModelExtensionSpec.groovy index 12ae1d4..33c387f 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/GraphModelExtensionSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/GraphModelExtensionSpec.groovy @@ -27,11 +27,6 @@ class GraphModelExtensionSpec extends Specification { @Shared carnival - @Shared vertexBuilders = [ - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "1"), - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "2"), - ] - /////////////////////////////////////////////////////////////////////////// // SET UP @@ -41,7 +36,7 @@ class GraphModelExtensionSpec extends Specification { def setupSpec() { } def setup() { - carnival = CarnivalTinker.create(vertexBuilders:vertexBuilders) + carnival = CarnivalTinker.create() } def cleanup() { diff --git a/app/carnival-core/src/test/groovy/carnival/core/graph/LegacyGraphSpec.groovy b/app/carnival-core/src/test/groovy/carnival/core/graph/LegacyGraphSpec.groovy index 5b016b0..0ed5afc 100644 --- a/app/carnival-core/src/test/groovy/carnival/core/graph/LegacyGraphSpec.groovy +++ b/app/carnival-core/src/test/groovy/carnival/core/graph/LegacyGraphSpec.groovy @@ -35,11 +35,6 @@ class LegacyGraphSpec extends Specification { @Shared carnival - @Shared vertexBuilders = [ - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "1"), - Core.VX.IDENTIFIER.instance().withProperty(Core.PX.VALUE, "2"), - ] - /////////////////////////////////////////////////////////////////////////// // SET UP @@ -49,7 +44,7 @@ class LegacyGraphSpec extends Specification { def setupSpec() { } def setup() { - carnival = CarnivalTinker.create(vertexBuilders:vertexBuilders) + carnival = CarnivalTinker.create() carnival.graphValidator = new LegacyValidator() } diff --git a/app/carnival-graph/src/main/groovy/carnival/graph/VertexDefinition.groovy b/app/carnival-graph/src/main/groovy/carnival/graph/VertexDefinition.groovy index 8e57232..4b32aca 100644 --- a/app/carnival-graph/src/main/groovy/carnival/graph/VertexDefinition.groovy +++ b/app/carnival-graph/src/main/groovy/carnival/graph/VertexDefinition.groovy @@ -56,18 +56,18 @@ trait VertexDefinition extends ElementDefinition { /** * optional, defines what the superclass of this class is. - * */ + */ VertexDefinition superClass /** * optional, defines what class these verticies are instances of. - * */ + */ VertexDefinition instanceOf /** * Explicitly designate this definition as a class. A singleton vertex will * automatically be created in the graph. - * */ + */ Boolean isClass = null