diff --git a/.gitignore b/.gitignore index 378eac2..f797319 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ build +.idea/ +.gradle/ \ No newline at end of file diff --git a/.gradle/buildOutputCleanup/cache.properties.lock b/.gradle/buildOutputCleanup/cache.properties.lock new file mode 100644 index 0000000..40fdece --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties.lock @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/README.md b/README.md index a97e3d8..208f7b2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Spring data gremlin makes it easier to implement Graph based repositories. This ## Features - All the great features of [Spring Data](http://projects.spring.io/spring-data) -- Support for [OrientDB](http://orientdb.com) and [TitanDB](http://s3.thinkaurelius.com/docs/titan/current) out of the box +- Support for [OrientDB](http://orientdb.com) and [JanusGraph](http://janusgraph.org) out of the box - Schema creation in supported databases - Support to build repositories based on Spring using our [custom set of annotations](https://github.com/gjrwebber/org/springframework/data/gremlin/annotation), [spring-data-neo4j](http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#reference_programming-model_annotations) or JPA annotations. - Vertex and Edge repository support @@ -98,7 +98,7 @@ Once you have your build configuration setup you need to add the correct depende #### Database dependency **OrientDB** - com.github.gjrwebber:spring-data-gremlin-orientdb:0.1.0-SNAPSHOT -**TitanDB** - com.github.gjrwebber:spring-data-gremlin-titan:0.1.0-SNAPSHOT +**JanusGraph** - com.github.gjrwebber:spring-data-gremlin-janus:0.1.0-SNAPSHOT #### Schema generator dependency **Default** - No further dependency @@ -124,10 +124,10 @@ Using OrientDB database with Neo4j schema generator: #### Gradle example -Using TitanDB with default schema generator: +Using JanusGraph with default schema generator: ``` -compile("com.github.gjrwebber:spring-data-gremlin-titan:0.1.0-SNAPSHOT") +compile("com.github.gjrwebber:spring-data-gremlin-janus:0.1.0-SNAPSHOT") ``` ### Create you domain model diff --git a/build.gradle b/build.gradle index 887e28b..be29c3b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,12 @@ buildscript { } } +ext { + springVersion = "4.3.7.RELEASE" + gremlinVersion = "3.3.0-SNAPSHOT" + jacksonVersion = "2.8.8" +} + allprojects { apply plugin: 'java' @@ -21,31 +27,54 @@ allprojects { apply plugin: 'propdeps-eclipse' sourceCompatibility = 1.7 - version = '0.1.0-SNAPSHOT' + version = '0.2.0-SNAPSHOT' group = 'com.github.gjrwebber' repositories { mavenLocal() maven { url 'https://repo.spring.io/libs-release' } maven { url 'https://repo.spring.io/libs-snapshot' } + maven { url 'http://repository.apache.org/snapshots' } + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } + maven { url 'https://oss.sonatype.org/service/local/staging/deploy/maven2' } + maven { url 'https://maven.oracle.com'} + maven { url "https://jitpack.io" } mavenCentral() } dependencies { - compile('org.springframework:spring-core:4.1.6.RELEASE') - compile('org.springframework:spring-context:4.1.6.RELEASE') - compile('org.springframework:spring-tx:4.1.6.RELEASE') - compile('org.springframework.data:spring-data-commons:1.10.0.RELEASE') - compile('com.tinkerpop.blueprints:blueprints-core:2.6.0') - compile('com.tinkerpop.gremlin:gremlin-java:2.6.0') - compile('com.tinkerpop.gremlin:gremlin-groovy:2.6.0') + compile("org.springframework:spring-core:${springVersion}") + compile("org.springframework:spring-context:${springVersion}") + compile("org.springframework:spring-tx:${springVersion}") + compile('org.springframework.data:spring-data-commons:1.13.1.RELEASE') + compile("org.apache.tinkerpop:gremlin-core:${gremlinVersion}") { + exclude group: 'com.carrotsearch' + } + compile('com.carrotsearch:hppc:0.6.0') + compile("org.apache.tinkerpop:gremlin-driver:${gremlinVersion}") { + exclude group: 'com.carrotsearch' + } + compile("org.apache.tinkerpop:gremlin-groovy:${gremlinVersion}") { + exclude group: 'com.carrotsearch' + } + compile("org.apache.tinkerpop:tinkergraph-gremlin:${gremlinVersion}") { + exclude group: 'com.carrotsearch' + } + compile('org.apache.commons:commons-collections4:4.0') compile('org.apache.commons:commons-lang3:3.4') - compile('org.reflections:reflections:0.9.9-RC1') + compile('org.reflections:reflections:0.9.9-RC1') { + exclude group: 'com.google.guava' + } + compile('com.google.guava:guava:19.0') + compile("com.fasterxml.jackson.core:jackson-core:${jacksonVersion}") + compile("com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}") + compile("com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}") + compile('org.slf4j:slf4j-simple:1.7.7') testCompile('junit:junit:4.12') - testCompile('org.mockito:mockito-core:1.10.8') - testCompile('org.springframework:spring-test:4.1.6.RELEASE') - testCompile('org.slf4j:slf4j-simple:1.7.7') + testCompile('org.mockito:mockito-core:1.10.19') + testCompile("org.springframework:spring-test:${springVersion}") + } task javadocJar(type: Jar) { @@ -73,15 +102,15 @@ allprojects { uploadArchives { repositories { mavenDeployer { - beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } + //beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } +// repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } +// +// snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } pom.project { name 'Spring Data Gremlin' @@ -122,6 +151,11 @@ allprojects { name 'Graham Webber' email 'gjrwebber@gmail.com' } + developer { + id 'zifnab87' + name 'Michail Michailidis' + email 'mmichaelid@gmail.com' + } } } } @@ -131,4 +165,3 @@ allprojects { } - diff --git a/out/test/spring-data-gremlin-core/application.properties b/out/test/spring-data-gremlin-core/application.properties new file mode 100644 index 0000000..372281c --- /dev/null +++ b/out/test/spring-data-gremlin-core/application.properties @@ -0,0 +1,3 @@ + +logging.level.org.springframework.data.gremlin=DEBUG +#logging.level.org.springframework=DEBUG \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 4410f6d..f1c171a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,3 @@ -include 'spring-data-gremlin-core', 'spring-data-gremlin-test', 'spring-data-gremlin-schemagen-jpa', 'spring-data-gremlin-schemagen-neo4j', 'spring-data-gremlin-orientdb', 'spring-data-gremlin-tinker', 'spring-data-gremlin-titan' +include 'spring-data-gremlin-core', 'spring-data-gremlin-test', 'spring-data-gremlin-schemagen-jpa', 'spring-data-gremlin-schemagen-neo4j', 'spring-data-gremlin-orientdb', 'spring-data-gremlin-tinker', 'spring-data-gremlin-janus' rootProject.name = 'spring-data-gremlin' diff --git a/spring-data-gremlin-core/application.properties b/spring-data-gremlin-core/application.properties new file mode 100644 index 0000000..bc572a3 --- /dev/null +++ b/spring-data-gremlin-core/application.properties @@ -0,0 +1 @@ +logging.level.org.springframework.data.gremlin=DEBUG \ No newline at end of file diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/Link.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/Link.java index fdb01d6..2ee3453 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/Link.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/Link.java @@ -1,6 +1,7 @@ package org.springframework.data.gremlin.annotation; -import com.tinkerpop.blueprints.Direction; + +import org.apache.tinkerpop.gremlin.structure.Direction; import java.lang.annotation.*; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/LinkVia.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/LinkVia.java index f5488db..d887995 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/LinkVia.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/annotation/LinkVia.java @@ -1,6 +1,7 @@ package org.springframework.data.gremlin.annotation; -import com.tinkerpop.blueprints.Direction; + +import org.apache.tinkerpop.gremlin.structure.Direction; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractGremlinQuery.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractGremlinQuery.java index 1b4a968..0703a11 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractGremlinQuery.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractGremlinQuery.java @@ -134,4 +134,6 @@ private boolean isMapQuery() { private boolean isCompositeQuery() { return method.getReturnedObjectType() == CompositeResult.class; } + + } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractNativeGremlinQuery.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractNativeGremlinQuery.java index 3582368..aa9030e 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractNativeGremlinQuery.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/AbstractNativeGremlinQuery.java @@ -3,6 +3,8 @@ import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.tx.GremlinGraphFactory; +import java.util.Collection; + /** * Native query abstraction for {@link AbstractGremlinQuery}s. * @@ -18,6 +20,8 @@ public abstract class AbstractNativeGremlinQuery extends AbstractGremlinQuery { private boolean countQuery; private boolean modifyingQuery; + private boolean collectionQuery; + public AbstractNativeGremlinQuery(GremlinGraphFactory dbf, GremlinQueryMethod method, GremlinSchemaFactory schemaFactory, String query) { super(schemaFactory, method); @@ -27,6 +31,7 @@ public AbstractNativeGremlinQuery(GremlinGraphFactory dbf, GremlinQueryMethod me this.query = query; this.countQuery = method.hasAnnotatedQuery() && method.getQueryAnnotation().count(); this.modifyingQuery = method.hasAnnotatedQuery() && method.getQueryAnnotation().modify(); + this.collectionQuery = Collection.class.isAssignableFrom(method.getMethod().getReturnType()); } public GremlinGraphFactory getDbf() { @@ -54,4 +59,5 @@ protected boolean isCountQuery() { protected boolean isModifyingQuery() { return modifyingQuery; } + } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryCreator.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryCreator.java index c77966c..27265a4 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryCreator.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryCreator.java @@ -1,12 +1,11 @@ package org.springframework.data.gremlin.query; -import com.tinkerpop.blueprints.Compare; -import com.tinkerpop.blueprints.Contains; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Predicate; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.Pipe; -import com.tinkerpop.pipes.filter.AndFilterPipe; +import org.apache.tinkerpop.gremlin.process.traversal.Compare; +import org.apache.tinkerpop.gremlin.process.traversal.Contains; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Pageable; @@ -25,6 +24,7 @@ import java.util.Iterator; import java.util.Spliterator; +import java.util.function.BiPredicate; import java.util.function.Consumer; /** @@ -32,7 +32,7 @@ * * @author Gman */ -public class GremlinQueryCreator extends AbstractQueryCreator { +public class GremlinQueryCreator extends AbstractQueryCreator { private static final Logger logger = LoggerFactory.getLogger(GremlinQueryCreator.class); @@ -57,24 +57,26 @@ public GremlinQueryCreator(GremlinGraphFactory factory, GremlinSchemaFactory map } @Override - protected GremlinPipeline create(Part part, Iterator iterator) { - return toCondition(part, iterator); + protected GraphTraversal create(Part part, Iterator iterator) { + GraphTraversal base = new DefaultGraphTraversal(); + toCondition(base, part, iterator); + return base; } @Override - protected GremlinPipeline and(Part part, GremlinPipeline base, Iterator iterator) { - Pipe lastPipe = (Pipe) base.getPipes().get(base.getPipes().size() - 1); - if (lastPipe instanceof AndFilterPipe) { - return base.add(toCondition(part, iterator)); - } - GremlinPipeline andPipeline = new GremlinPipeline(); - andPipeline.and(base, toCondition(part, iterator)); - return andPipeline; + protected GraphTraversal and(Part part, GraphTraversal base, Iterator iterator) { + // Pipe lastPipe = (Pipe) base.getPipes().get(base.getPipes().size() - 1); + // if (lastPipe instanceof AndFilterPipe) { + // return base.add(toCondition(part, iterator)); + // } + // GraphTraversalSource andPipeline = new GraphTraversalSource(); + toCondition(base, part, iterator); + return base; } @Override - protected GremlinPipeline or(GremlinPipeline base, GremlinPipeline criteria) { - return new GremlinPipeline().or(base, criteria); + protected GraphTraversal or(GraphTraversal base, GraphTraversal criteria) { + return __.or(base, criteria); } public boolean isCountQuery() { @@ -82,155 +84,81 @@ public boolean isCountQuery() { } @Override - protected GremlinPipeline complete(GremlinPipeline criteria, Sort sort) { - Pageable pageable = accessor.getPageable(); - GremlinPipeline pipeline = new GremlinPipeline(factory.graph()); - if (schema.isEdgeSchema()) { - pipeline = pipeline.V().add(criteria); - } else if (schema.isVertexSchema()) { - pipeline = pipeline.V().and(criteria); - } -// pipeline = pipeline.and(criteria); -// pipeline = pipeline.add(criteria); - return pipeline; + protected GraphTraversal complete(GraphTraversal criteria, Sort sort) { + GraphTraversalSource source = factory.graph().traversal(); + return source.V().and(criteria); } - protected GremlinPipeline toCondition(Part part, Iterator iterator) { - - GremlinPipeline pipeline = new GremlinPipeline(); - PropertyPath path = part.getProperty(); - PropertyPath leafProperty = path.getLeafProperty(); - String leafSegment = leafProperty.getSegment(); -// Class type = leafProperty.getOwningType().getType(); -// -// GremlinSchema schema = schemaFactory.getSchema(type); -// if (schema.isVertexSchema()) { -// pipeline = pipeline.V(); -// } else if (schema.isEdgeSchema()) { -// pipeline = pipeline.E(); -// } - + protected void toCondition(final GraphTraversal pipeline, Part part, Iterator iterator) { - if(schema.isEdgeSchema()) { - includeCondition(part.getType(), leafSegment, pipeline, iterator); - } - while (path != null && path.hasNext()) { - - String segment = path.getSegment(); - Class type = path.getOwningType().getType(); - schema = schemaFactory.getSchema(type); - GremlinProperty gremlinProperty = schema.getPropertyForFieldname(segment); + String property = part.getProperty().getLeafProperty().getSegment(); - if (schema.isVertexSchema()) { - if (gremlinProperty instanceof GremlinRelatedProperty) { - - GremlinRelatedProperty adjacentProperty = (GremlinRelatedProperty) gremlinProperty; - Direction direction = adjacentProperty.getDirection(); - if (direction == Direction.IN) { - pipeline.inE(gremlinProperty.getName()).outV(); - } else { - pipeline.outE(gremlinProperty.getName()).inV(); - } - } + Spliterator it = part.getProperty().spliterator(); + it.forEachRemaining(new Consumer() { + @Override + public void accept(PropertyPath propertyPath) { - } else if (schema.isEdgeSchema()) { - if (gremlinProperty instanceof GremlinAdjacentProperty) { - GremlinAdjacentProperty adjacentProperty = (GremlinAdjacentProperty)gremlinProperty; - Direction direction = adjacentProperty.getDirection(); - if (direction == Direction.IN) { - pipeline.inE(schema.getClassName()); - } else { - pipeline.outE(schema.getClassName()); - } + if (propertyPath.hasNext()) { + String segment = propertyPath.getSegment(); + Class type = propertyPath.getOwningType().getType(); + GremlinProperty gremlinProperty = schemaFactory.getSchema(type).getPropertyForFieldname(segment); + String projectedName = gremlinProperty.getName(); + pipeline.outE(projectedName).inV(); } } + }); - path = path.next(); - - } - - if(schema.isVertexSchema()) { - includeCondition(part.getType(), leafSegment, pipeline, iterator); - } - - return pipeline; - -// if (schema.isVertexSchema()) { -// Spliterator it = path.spliterator(); -// it.forEachRemaining(new Consumer() { -// @Override -// public void accept(PropertyPath propertyPath) { -// -// if (propertyPath.hasNext()) { -// String segment = propertyPath.getSegment(); -// Class type = propertyPath.getOwningType().getType(); -// GremlinSchema schema = schemaFactory.getSchema(type); -// if (schema.isVertexSchema()) { -// GremlinProperty gremlinProperty = schema.getPropertyForFieldname(segment); -// String projectedName = gremlinProperty.getName(); -// // pipeline.outE(projectedName).inV(); -// } else { -// // pipeline.outE(schema.getClassName()); -// } -// } -// } -// }); -// } - - } - - private GremlinPipeline includeCondition(Part.Type type, String property, GremlinPipeline pipeline, Iterator iterator) { - switch (type) { + switch (part.getType()) { case AFTER: case GREATER_THAN: - pipeline.has(property, Compare.GREATER_THAN, iterator.next()); + pipeline.has(property, Compare.gt).is(iterator.next()); break; case GREATER_THAN_EQUAL: - pipeline.has(property, Compare.GREATER_THAN_EQUAL, iterator.next()); + pipeline.has(property, Compare.gte).is(iterator.next()); break; case BEFORE: case LESS_THAN: - pipeline.has(property, Compare.LESS_THAN, iterator.next()); + pipeline.has(property, Compare.lt).is(iterator.next()); break; case LESS_THAN_EQUAL: - pipeline.has(property, Compare.LESS_THAN_EQUAL, iterator.next()); + pipeline.has(property, Compare.lte).is(iterator.next()); break; case BETWEEN: Object val = iterator.next(); - pipeline.has(property, Compare.LESS_THAN, val).has(property, Compare.GREATER_THAN, val); + pipeline.has(property, Compare.lt).is(val).has(property, Compare.gt).is(val); break; case IS_NULL: - pipeline.has(property, null); + pipeline.has(property); break; case IS_NOT_NULL: pipeline.has(property); break; case IN: - pipeline.has(property, Contains.IN, iterator.next()); + pipeline.has(property, Contains.within).is(iterator.next()); break; case NOT_IN: - pipeline.has(property, Contains.NOT_IN, iterator.next()); + pipeline.has(property, Contains.without).is(iterator.next()); break; case LIKE: - pipeline.has(property, Like.IS, iterator.next()); + pipeline.has(property, Like.IS).is(iterator.next()); break; case NOT_LIKE: - pipeline.has(property, Like.NOT, iterator.next()); + pipeline.has(property, Like.NOT).is(iterator.next()); break; case STARTING_WITH: - pipeline.has(property, StartsWith.DOES, iterator.next()); + pipeline.has(property, StartsWith.DOES).is(iterator.next()); break; case ENDING_WITH: - pipeline.has(property, EndsWith.DOES, iterator.next()); + pipeline.has(property, EndsWith.DOES).is(iterator.next()); break; case CONTAINING: - pipeline.has(property, Like.IS, iterator.next()); + pipeline.has(property, Like.IS).is(iterator.next()); break; case SIMPLE_PROPERTY: pipeline.has(property, iterator.next()); break; case NEGATING_SIMPLE_PROPERTY: - pipeline.hasNot(property, iterator.next()); + pipeline.has(property, Compare.neq).is(iterator.next()); break; case TRUE: pipeline.has(property, true); @@ -242,46 +170,53 @@ private GremlinPipeline includeCondition(Part.Type type, String property, Gremli throw new IllegalArgumentException("Unsupported keyword!"); } -// return new GremlinPipeline().and(pipeline); - return pipeline; } - private enum StartsWith implements Predicate { - DOES, - NOT; - - public boolean evaluate(final Object first, final Object second) { - if (first instanceof String && second instanceof String) { - return this == DOES && ((String) second).startsWith((String) first); + private enum StartsWith implements BiPredicate { + DOES { + @Override + public boolean test(String o, String o2) { + return o2.startsWith(o); } - return false; - } + }, + NOT { + @Override + public boolean test(String o, String o2) { + return !DOES.test(o, o2); + } + }; } - private enum EndsWith implements Predicate { - DOES, - NOT; - - public boolean evaluate(final Object first, final Object second) { - - if (first instanceof String && second instanceof String) { - return this == DOES && ((String) second).endsWith((String) first); + private enum EndsWith implements BiPredicate { + DOES { + @Override + public boolean test(String o, String o2) { + return o2.endsWith(o); } - return false; - } + }, + NOT { + @Override + public boolean test(String o, String o2) { + return !DOES.test(o, o2); + } + }; } - private enum Like implements Predicate { - - IS, - NOT; + private enum Like implements BiPredicate { - public boolean evaluate(final Object first, final Object second) { - if (first instanceof String && second instanceof String) { - return this == IS && first.toString().toLowerCase().contains(second.toString().toLowerCase()); + IS { + @Override + public boolean test(String s, String s2) { + return s.toLowerCase().contains(s2.toLowerCase()); } - return false; - } + }, + NOT { + @Override + public boolean test(String s, String s2) { + return !IS.test(s, s2); + } + }; + } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryLookupStrategy.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryLookupStrategy.java index 6ee8620..3712491 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryLookupStrategy.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryLookupStrategy.java @@ -4,6 +4,7 @@ import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.tx.GremlinGraphFactory; +import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.repository.core.NamedQueries; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.query.QueryLookupStrategy; @@ -11,6 +12,7 @@ import org.springframework.data.repository.query.RepositoryQuery; import java.lang.reflect.Constructor; +import java.lang.reflect.Method; /** * Implementation of {@link QueryLookupStrategy} for Gremlin. @@ -36,10 +38,6 @@ private AbstractQueryLookupStrategy(GremlinGraphFactory dbf, GremlinSchemaFactor this.dbf = dbf; } - public final RepositoryQuery resolveQuery(java.lang.reflect.Method method, RepositoryMetadata metadata, NamedQueries namedQueries) { - return resolveQuery(new GremlinQueryMethod(method, metadata), namedQueries); - } - protected abstract RepositoryQuery resolveQuery(GremlinQueryMethod method, NamedQueries namedQueries); } @@ -55,6 +53,11 @@ protected RepositoryQuery resolveQuery(GremlinQueryMethod method, NamedQueries n throw new IllegalArgumentException(String.format("Could not create query metamodel for method %s!", method.toString()), e); } } + + @Override + public RepositoryQuery resolveQuery(Method method, RepositoryMetadata repositoryMetadata, ProjectionFactory projectionFactory, NamedQueries namedQueries) { + return resolveQuery(new GremlinQueryMethod(method, repositoryMetadata, projectionFactory), namedQueries); + } } private static class DeclaredQueryLookupStrategy extends AbstractQueryLookupStrategy { @@ -88,8 +91,13 @@ protected RepositoryQuery resolveQuery(GremlinQueryMethod method, NamedQueries n } return repoQuery; } - } + @Override + public RepositoryQuery resolveQuery(Method method, RepositoryMetadata repositoryMetadata, ProjectionFactory projectionFactory, NamedQueries namedQueries) { + return resolveQuery(new GremlinQueryMethod(method, repositoryMetadata, projectionFactory), namedQueries); + } + + } private static class CreateIfNotFoundQueryLookupStrategy extends AbstractQueryLookupStrategy { /** The declared query strategy. */ @@ -123,6 +131,11 @@ protected RepositoryQuery resolveQuery(GremlinQueryMethod method, NamedQueries n } return repoQuery; } + + @Override + public RepositoryQuery resolveQuery(Method method, RepositoryMetadata repositoryMetadata, ProjectionFactory projectionFactory, NamedQueries namedQueries) { + return resolveQuery(new GremlinQueryMethod(method, repositoryMetadata, projectionFactory), namedQueries); + } } public static QueryLookupStrategy create(GremlinGraphFactory dbf, GremlinSchemaFactory schemaFactory, Class nativeQueryType, Key key) { diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryMethod.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryMethod.java index 6a4fbd2..d903785 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryMethod.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/GremlinQueryMethod.java @@ -2,6 +2,7 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.data.gremlin.annotation.Query; +import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.query.QueryMethod; import org.springframework.util.StringUtils; @@ -24,8 +25,8 @@ public final class GremlinQueryMethod extends QueryMethod { * @param method the method * @param metadata the metadata */ - public GremlinQueryMethod(Method method, RepositoryMetadata metadata) { - super(method, metadata); + public GremlinQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory projectionFactory) { + super(method, metadata, projectionFactory); this.method = method; } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/PartTreeGremlinQuery.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/PartTreeGremlinQuery.java index d824ac0..19656c5 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/PartTreeGremlinQuery.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/PartTreeGremlinQuery.java @@ -1,8 +1,7 @@ package org.springframework.data.gremlin.query; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.filter.RangeFilterPipe; -import com.tinkerpop.pipes.util.Pipeline; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.springframework.data.domain.Pageable; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.tx.GremlinGraphFactory; @@ -10,6 +9,9 @@ import org.springframework.data.repository.query.ParametersParameterAccessor; import org.springframework.data.repository.query.parser.PartTree; +import java.util.ArrayList; +import java.util.Collection; + /** * A concrete {@link AbstractGremlinQuery} implementation based on a {@link PartTree}. * @@ -46,16 +48,15 @@ public PartTreeGremlinQuery(GremlinGraphFactory dbf, GremlinSchemaFactory schema */ @Override @SuppressWarnings("rawtypes") - protected Pipeline doRunQuery(DefaultParameters parameters, Object[] values, boolean ignorePaging) { + protected Object doRunQuery(DefaultParameters parameters, Object[] values, boolean ignorePaging) { ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, values); GremlinQueryCreator creator = new GremlinQueryCreator(dbf, schemaFactory, domainClass, tree, accessor); - GremlinPipeline pipeline = creator.createQuery(); - + GraphTraversal pipeline = creator.createQuery(); Pageable pageable = accessor.getPageable(); if (pageable != null && !ignorePaging) { - pipeline.add(new RangeFilterPipe(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize() - 1)); + return pipeline.range(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize()); } return pipeline; } @@ -72,4 +73,6 @@ protected boolean isCountQuery() { protected boolean isModifyingQuery() { return tree.isDelete(); } + + } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/StringBasedGremlinQuery.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/StringBasedGremlinQuery.java index 05db07c..93ad7b3 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/StringBasedGremlinQuery.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/StringBasedGremlinQuery.java @@ -1,8 +1,7 @@ package org.springframework.data.gremlin.query; -import com.tinkerpop.blueprints.Graph; -import com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; -import com.tinkerpop.pipes.util.Pipeline; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.springframework.data.domain.Pageable; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.tx.GremlinGraphFactory; @@ -16,7 +15,7 @@ /** - * A concrete {@link AbstractGremlinQuery} which handles String based gremlin queries defined using the {@link org.springframework.data.gremlin.query.annotation.Query} annotation. + * A concrete {@link AbstractGremlinQuery} which handles String based gremlin queries defined using the {@link org.springframework.data.gremlin.annotation.Query} annotation. * * @author Gman */ @@ -40,14 +39,14 @@ public StringBasedGremlinQuery(GremlinGraphFactory dbf, GremlinSchemaFactory sch @Override @SuppressWarnings("rawtypes") - protected Pipeline doRunQuery(DefaultParameters parameters, Object[] values, boolean ignorePaging) { + protected Object doRunQuery(DefaultParameters parameters, Object[] values, boolean ignorePaging) { ScriptEngine engine = new GremlinGroovyScriptEngine(); Bindings bindings = engine.createBindings(); Graph graph = dbf.graph(); - bindings.put("g", graph); - bindings.put("graph", graph); - bindings.put("G", graph); + bindings.put("g", graph.traversal()); + bindings.put("graph", graph.traversal()); + bindings.put("G", graph.traversal()); String queryString = this.queryString; @@ -68,11 +67,11 @@ protected Pipeline doRunQuery(DefaultParameters parameters, Object[] values, boo ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, values); Pageable pageable = accessor.getPageable(); if (pageable != null && !ignorePaging) { - queryString = String.format("%s[%d..%d]", queryString, pageable.getOffset(), pageable.getOffset() + pageable.getPageSize() - 1); + queryString = String.format("%s.range(%d, %d)", queryString, pageable.getOffset(), pageable.getOffset() + pageable.getPageSize() ); } try { - return (Pipeline) engine.eval(queryString, bindings); + return engine.eval(queryString, bindings); } catch (ScriptException e) { throw new IllegalArgumentException(String.format("Could not evaluate Gremlin query String %s. Error: %s ", queryString, e.getMessage()), e); } @@ -88,4 +87,5 @@ protected boolean isModifyingQuery() { return this.modifyingQuery; } + } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/AbstractGremlinExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/AbstractGremlinExecution.java index a548e61..b556b8a 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/AbstractGremlinExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/AbstractGremlinExecution.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Element; +import org.apache.tinkerpop.gremlin.structure.Element; import org.springframework.data.gremlin.query.AbstractGremlinQuery; import org.springframework.data.gremlin.query.CompositeResult; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -54,8 +54,8 @@ public Object execute(AbstractGremlinQuery query, Object[] values) { protected Map elementToMap(Element element) { Map map = new HashMap(); - for (String key : element.getPropertyKeys()) { - map.put(key, element.getProperty(key)); + for (String key : element.keys()) { + map.put(key, element.value(key)); } return map; } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CollectionExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CollectionExecution.java index a3f116d..3551a76 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CollectionExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CollectionExecution.java @@ -1,6 +1,7 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Element; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.structure.Element; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.gremlin.query.AbstractGremlinQuery; @@ -37,7 +38,7 @@ public CollectionExecution(GremlinSchemaFactory schemaFactory, DefaultParameters protected Object doExecute(AbstractGremlinQuery query, Object[] values) { Class mappedType = query.getQueryMethod().getReturnedObjectType(); - Iterable elements = (Iterable) query.runQuery(parameters, values); + Iterable elements = ((GraphTraversal) query.runQuery(parameters, values)).toList(); List objects = new ArrayList(); if (mappedType.isAssignableFrom(Map.class)) { diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CompositeExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CompositeExecution.java index 6ef3dae..c9c441c 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CompositeExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CompositeExecution.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.query.AbstractGremlinQuery; import org.springframework.data.gremlin.query.CompositeResult; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -38,10 +38,7 @@ protected Object doExecute(AbstractGremlinQuery query, Object[] values) { throw new IllegalArgumentException("The query resulted in multiple Vertices. Expected only one result for this Execution."); } - Map map = new HashMap(); - for (String key : vertex.getPropertyKeys()) { - map.put(key, vertex.getProperty(key)); - } + Map map = elementToMap(vertex); Class mappedType = query.getQueryMethod().getReturnedObjectType(); GremlinSchema mapper = schemaFactory.getSchema(mappedType); diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CountExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CountExecution.java index 29fc80b..9764746 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CountExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/CountExecution.java @@ -1,6 +1,7 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.query.AbstractGremlinQuery; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.repository.query.DefaultParameters; @@ -28,16 +29,6 @@ public CountExecution(GremlinSchemaFactory schemaFactory, DefaultParameters para */ @Override protected Object doExecute(AbstractGremlinQuery query, Object[] values) { - Iterator result = ((Iterable) query.runQuery(parameters, values, true)).iterator(); - long counter = 0L; - - try { - while (true) { - result.next(); - ++counter; - } - } catch (NoSuchElementException var4) { - return counter; - } + return ((GraphTraversal) query.runQuery(parameters, values, true)).count().next(); } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/MapExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/MapExecution.java index 1ccafb8..adcd996 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/MapExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/MapExecution.java @@ -1,12 +1,14 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.query.AbstractGremlinQuery; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.repository.query.DefaultParameters; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; /** @@ -27,19 +29,21 @@ public MapExecution(GremlinSchemaFactory schemaFactory, DefaultParameters parame @Override protected Object doExecute(AbstractGremlinQuery query, Object[] values) { - Iterator result = ((Iterable) query.runQuery(parameters, values)).iterator(); - Vertex vertex = result.next(); - if (vertex == null) { - return null; - } - if (result.hasNext()) { + List result = ((GraphTraversal) query.runQuery(parameters, values)).toList(); + if (result.size() > 1) { throw new IllegalArgumentException("The query resulted in multiple Vertices. Expected only one result for this Execution."); } - - Map map = new HashMap(); - for (String key : vertex.getPropertyKeys()) { - map.put(key, vertex.getProperty(key)); + else if (result.size() == 1) { + Vertex vertex = result.get(0); + if (vertex == null) { + return null; + } + Map map = elementToMap(vertex); + return map; + } + else { + return null; } - return map; } + } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/SingleEntityExecution.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/SingleEntityExecution.java index e47aba3..3826c0e 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/SingleEntityExecution.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/query/execution/SingleEntityExecution.java @@ -1,15 +1,13 @@ package org.springframework.data.gremlin.query.execution; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.query.AbstractGremlinQuery; import org.springframework.data.gremlin.schema.GremlinSchema; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.repository.query.DefaultParameters; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; +import java.util.*; /** * Executes the query to return a single entity. @@ -30,30 +28,21 @@ public SingleEntityExecution(GremlinSchemaFactory schemaFactory, DefaultParamete protected Object doExecute(AbstractGremlinQuery query, Object[] values) { Class mappedType = query.getQueryMethod().getReturnedObjectType(); - Iterator result = ((Iterable) query.runQuery(parameters, values)).iterator(); - if (!result.hasNext()) { - return null; - } + List vertices = ((GraphTraversal)query.runQuery(parameters, values)).toList(); Vertex vertex; - try { - vertex = result.next(); - } catch (NoSuchElementException e) { - return null; + if (vertices.size() > 1) { + throw new IllegalArgumentException("The query resulted in multiple Vertices. Expected only one result for this Execution."); } - - if (vertex == null) { - return null; + else if(vertices.size() == 1) { + vertex = vertices.get(0); } - if (result.hasNext()) { - throw new IllegalArgumentException("The query resulted in multiple Vertices. Expected only one result for this Execution."); + else { + return null; } if (mappedType.isAssignableFrom(Map.class)) { - Map map = new HashMap(); - for (String key : vertex.getPropertyKeys()) { - map.put(key, vertex.getProperty(key)); - } + Map map = elementToMap(vertex); return map; } else { GremlinSchema mapper = schemaFactory.getSchema(mappedType); diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/GremlinGraphAdapter.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/GremlinGraphAdapter.java index 320739c..17440ed 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/GremlinGraphAdapter.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/GremlinGraphAdapter.java @@ -1,9 +1,9 @@ package org.springframework.data.gremlin.repository; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Graph; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -11,6 +11,8 @@ import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.transaction.annotation.Transactional; +import java.util.Iterator; + /** * Base class for creating verticies and edges on the Graph. This class can be * subclassed for concrete implementations if need be. @@ -31,7 +33,7 @@ public Vertex createVertex(String className) { @Transactional(readOnly = false) public Vertex createVertex(G graph, String className) { LOGGER.info("CREATING VERTEX: " + className); - Vertex vertex = graph.addVertex(null); + Vertex vertex = graph.addVertex(className); return vertex; } @@ -50,34 +52,56 @@ public Vertex findVertexById(String id) { return null; } G graph = graphFactory.graph(); - Vertex vertex = graph.getVertex(decodeId(id)); - if (vertex == null) { - vertex = graph.getVertex(id); + Vertex playerVertex = null; + Iterator it = graph.vertices(decodeId(id)); + if (it == null || !it.hasNext()) { + it = graph.vertices(id); } - return vertex; + + if (it != null && it.hasNext()) { + playerVertex = it.next(); + } + return playerVertex; } @Transactional(readOnly = true) public Edge findEdgeById(String id) { G graph = graphFactory.graph(); - Edge edge = graph.getEdge(decodeId(id)); - if (edge == null) { - edge = graph.getEdge(id); + Edge edge = null; + Iterator it = graph.edges(decodeId(id)); + if (it == null || !it.hasNext()) { + it = graph.edges(id); + } + if (it != null && it.hasNext()) { + edge = it.next(); } return edge; } + /** + * Assumes the Vertex exists + * @param id + * @return + */ @Transactional(readOnly = true) public Vertex getVertex(String id) { if (id == null) { return null; - } - return graphFactory.graph().getVertex(id); + } + return graphFactory.graph().vertices(id).next(); } + /** + * Assumes the Edge exists + * @param id + * @return + */ @Transactional(readOnly = true) public Edge getEdge(String id) { - return graphFactory.graph().getEdge(id); + if (id == null) { + return null; + } + return graphFactory.graph().edges(id).next(); } @Transactional(readOnly = false) @@ -93,12 +117,12 @@ public Edge addEdge(Object o, Vertex outVertex, Vertex inVertex, String name) { @Transactional(readOnly = false) public void removeEdge(Edge edge) { - graphFactory.graph().removeEdge(edge); + edge.remove(); } @Transactional(readOnly = false) public void removeVertex(Vertex vertexToDelete) { - graphFactory.graph().removeVertex(vertexToDelete); + vertexToDelete.remove(); } public String encodeId(String id) { diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/SimpleGremlinRepository.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/SimpleGremlinRepository.java index f59a0d8..f9c237d 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/SimpleGremlinRepository.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/repository/SimpleGremlinRepository.java @@ -1,9 +1,9 @@ package org.springframework.data.gremlin.repository; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Graph; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.commons.lang.NotImplementedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -116,9 +116,9 @@ public T save(Graph graph, T object) { } else { Element element; if (schema.isVertexSchema()) { - element = graph.getVertex(schema.decodeId(id)); - } else if (schema.isVertexSchema()) { - element = graph.getEdge(schema.decodeId(id)); + element = graphAdapter.getVertex(schema.decodeId(id)); + } else if (schema.isEdgeSchema()) { + element = graphAdapter.getEdge(schema.decodeId(id)); } else { throw new IllegalStateException("Schema is neither EDGE nor VERTEX!"); } @@ -203,10 +203,10 @@ public long count() { public void delete(String id) { if (schema.isVertexSchema()) { Vertex v = graphAdapter.findVertexById(id); - dbf.graph().removeVertex(v); + v.remove();; } else if (schema.isEdgeSchema()) { Edge v = graphAdapter.findEdgeById(id); - dbf.graph().removeEdge(v); + v.remove(); } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinEdgeSchema.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinEdgeSchema.java index 2225e0f..1b3dd2b 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinEdgeSchema.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinEdgeSchema.java @@ -1,23 +1,11 @@ package org.springframework.data.gremlin.schema; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Element; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.gremlin.repository.GremlinGraphAdapter; -import org.springframework.data.gremlin.repository.GremlinRepository; import org.springframework.data.gremlin.schema.property.GremlinAdjacentProperty; import org.springframework.data.gremlin.schema.property.GremlinProperty; import org.springframework.data.gremlin.schema.property.accessor.GremlinFieldPropertyAccessor; -import org.springframework.data.gremlin.schema.property.accessor.GremlinIdFieldPropertyAccessor; -import org.springframework.data.gremlin.schema.property.accessor.GremlinPropertyAccessor; -import org.springframework.data.gremlin.schema.property.encoder.GremlinPropertyEncoder; -import org.springframework.data.gremlin.schema.property.mapper.GremlinPropertyMapper; -import org.springframework.data.gremlin.tx.GremlinGraphFactory; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinSchema.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinSchema.java index 681c42b..4b1b1d4 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinSchema.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinSchema.java @@ -2,8 +2,9 @@ import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Element; +import org.apache.tinkerpop.gremlin.structure.*; +import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyProperty; +import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyVertexProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; @@ -214,22 +215,37 @@ public V loadFromGraph(Element element) { public V cascadeLoadFromGraph(Element element, Map noCascadingMap) { - V obj = (V) noCascadingMap.get(element.getId()); + V obj = (V) noCascadingMap.get(element.id()); if (obj == null) { try { obj = getClassType().newInstance(); GremlinPropertyAccessor idAccessor = getIdAccessor(); - idAccessor.set(obj, encodeId(element.getId().toString())); - noCascadingMap.put(element.getId(), obj); + idAccessor.set(obj, encodeId(element.id().toString())); + noCascadingMap.put(element.id(), obj); } catch (Exception e) { throw new IllegalStateException("Could not instantiate new " + getClassType(), e); } for (GremlinProperty property : getProperties()) { - Object val = property.loadFromVertex(element, noCascadingMap); - GremlinPropertyAccessor accessor = property.getAccessor(); + if (val instanceof EmptyVertexProperty || val instanceof EmptyProperty) { + continue; + } + + if (val instanceof Property) { + Property prop = ((Property)val); + if (prop.isPresent()) { + val = ((Property) val).value(); + } + } + + if (val instanceof Edge || val instanceof Vertex) { + continue; + } + + + try { accessor.set(obj, val); } catch (Exception e) { @@ -245,7 +261,7 @@ public String getGraphId(Object obj) { } public void setObjectId(V obj, Element element) { - getIdAccessor().set(obj, encodeId(element.getId().toString())); + getIdAccessor().set(obj, encodeId(element.id().toString())); } public String getObjectId(V obj) { diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinVertexSchema.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinVertexSchema.java index 36566dc..baf7ab7 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinVertexSchema.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/GremlinVertexSchema.java @@ -1,10 +1,7 @@ package org.springframework.data.gremlin.schema; -import com.tinkerpop.blueprints.Direction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.gremlin.schema.property.GremlinAdjacentProperty; -import org.springframework.data.gremlin.schema.property.GremlinProperty; import org.springframework.data.gremlin.schema.property.accessor.GremlinFieldPropertyAccessor; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/BasicSchemaGenerator.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/BasicSchemaGenerator.java index 7e41cef..18dcbf4 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/BasicSchemaGenerator.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/BasicSchemaGenerator.java @@ -1,7 +1,7 @@ package org.springframework.data.gremlin.schema.generator; -import com.tinkerpop.blueprints.Direction; import org.apache.commons.lang3.ClassUtils; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/DefaultSchemaGenerator.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/DefaultSchemaGenerator.java index 25d1744..d9c73cf 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/DefaultSchemaGenerator.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/generator/DefaultSchemaGenerator.java @@ -1,6 +1,7 @@ package org.springframework.data.gremlin.schema.generator; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.commons.lang3.ClassUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinAdjacentProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinAdjacentProperty.java index bd5b730..da28636 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinAdjacentProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinAdjacentProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.property.mapper.GremlinAdjacentPropertyMapper; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionProperty.java index 5dc8ab0..047d2c0 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.property.mapper.GremlinCollectionPropertyMapper; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionViaProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionViaProperty.java index f85169e..5fa9f9a 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionViaProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinCollectionViaProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.property.mapper.GremlinCollectionViaPropertyMapper; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkProperty.java index 62b1554..ab5b8dd 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.property.mapper.GremlinLinkPropertyMapper; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkViaProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkViaProperty.java index f6ba195..dcdf9a5 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkViaProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinLinkViaProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.property.mapper.GremlinLinkViaPropertyMapper; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinProperty.java index 222acf1..9ee8e61 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Element; +import org.apache.tinkerpop.gremlin.structure.Element; import org.springframework.data.gremlin.annotation.Index.IndexType; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.GremlinSchema; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinPropertyFactory.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinPropertyFactory.java index 1c28e9c..09aeaa9 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinPropertyFactory.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinPropertyFactory.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.annotation.Index; /** diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinRelatedProperty.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinRelatedProperty.java index 7102743..819cb81 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinRelatedProperty.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/GremlinRelatedProperty.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.property; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.springframework.data.gremlin.schema.GremlinBeanPostProcessor; import org.springframework.data.gremlin.schema.GremlinSchema; import org.springframework.data.gremlin.schema.property.mapper.GremlinPropertyMapper; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/accessor/GremlinFieldPropertyAccessor.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/accessor/GremlinFieldPropertyAccessor.java index 12f9169..4caf642 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/accessor/GremlinFieldPropertyAccessor.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/accessor/GremlinFieldPropertyAccessor.java @@ -1,5 +1,6 @@ package org.springframework.data.gremlin.schema.property.accessor; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +57,8 @@ public void set(Object object, V val) { } object = embeddedObj; } + + field.set(object, val); } catch (IllegalAccessException e) { throw new IllegalStateException(e.getMessage(), e); diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinAdjacentPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinAdjacentPropertyMapper.java index 9dd3c33..5faf3a5 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinAdjacentPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinAdjacentPropertyMapper.java @@ -1,12 +1,13 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinAdjacentProperty; import org.springframework.data.gremlin.schema.property.GremlinLinkProperty; import java.util.Map; +import java.util.function.Consumer; /** * A {@link GremlinPropertyMapper} for mapping {@link GremlinAdjacentProperty}s. @@ -16,28 +17,25 @@ public class GremlinAdjacentPropertyMapper implements GremlinPropertyMapper { @Override - public void copyToVertex(GremlinAdjacentProperty property, GremlinGraphAdapter graphAdapter, Edge edge, Object val, Map cascadingSchemas) { - - Vertex linkedVertex = edge.getVertex(property.getDirection()); - - if (linkedVertex == null) { - linkedVertex = (Vertex) cascadingSchemas.get(val); - } - - if (linkedVertex != null) { - // Updates or saves the val into the linkedVertex - property.getRelatedSchema().cascadeCopyToGraph(graphAdapter, linkedVertex, val, cascadingSchemas); - } - + public void copyToVertex(final GremlinAdjacentProperty property, final GremlinGraphAdapter graphAdapter, final Edge edge, final Object val, final Map cascadingSchemas) { + + edge.vertices(property.getDirection()).forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + property.getRelatedSchema().cascadeCopyToGraph(graphAdapter, vertex, val, cascadingSchemas); + } + }); } @Override - public Object loadFromVertex(GremlinAdjacentProperty property, Edge edge, Map cascadingSchemas) { - Object val = null; - Vertex linkedVertex = edge.getVertex(property.getDirection()); - if (linkedVertex != null) { - val = property.getRelatedSchema().cascadeLoadFromGraph(linkedVertex, cascadingSchemas); - } - return val; + public Object loadFromVertex(final GremlinAdjacentProperty property, final Edge edge, final Map cascadingSchemas) { + final Object[] val = { null }; + edge.vertices(property.getDirection()).forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + val[0] = property.getRelatedSchema().cascadeLoadFromGraph(vertex, cascadingSchemas); + } + }); + return val[0]; } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionPropertyMapper.java index d401554..f0cb1c6 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionPropertyMapper.java @@ -1,8 +1,8 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.commons.collections4.CollectionUtils; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -12,6 +12,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; /** * A concrete {@link GremlinPropertyMapper} mapping a vertices property to a Collection. @@ -21,15 +22,18 @@ public class GremlinCollectionPropertyMapper implements GremlinPropertyMapper { @Override - public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter graphAdapter, Vertex vertex, Object val, Map cascadingSchemas) { + public void copyToVertex(final GremlinRelatedProperty property, final GremlinGraphAdapter graphAdapter, final Vertex vertex, final Object val, final Map cascadingSchemas) { // Get the Set of existing linked vertices for this property - Set existingLinkedVertices = new HashSet(); - Set actualLinkedVertices = new HashSet(); - for (Edge currentEdge : vertex.getEdges(property.getDirection(), property.getName())) { - existingLinkedVertices.add(currentEdge.getVertex(property.getDirection().opposite())); - } + final Set existingLinkedVertices = new HashSet(); + final Set actualLinkedVertices = new HashSet(); + vertex.edges(Direction.IN, property.getName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge currentEdge) { + existingLinkedVertices.add(currentEdge.outVertex()); + } + }); // Now go through the collection of linked Objects for (Object linkedObj : (Collection) val) { @@ -68,9 +72,12 @@ public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter gr // For each disjointed vertex, remove it and the Edge associated with this property for (Vertex vertexToDelete : CollectionUtils.disjunction(existingLinkedVertices, actualLinkedVertices)) { - for (Edge edge : vertexToDelete.getEdges(property.getDirection().opposite(), property.getName())) { - graphAdapter.removeEdge(edge); - } + vertexToDelete.edges(Direction.OUT, property.getName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge edge) { + graphAdapter.removeEdge(edge); + } + }); graphAdapter.removeVertex(vertexToDelete); } } @@ -80,13 +87,16 @@ public Object loadFromVertex(GremlinRelatedProperty property, Vertex vertex, return loadCollection(property.getRelatedSchema(), property, vertex, cascadingSchemas); } - private Set loadCollection(GremlinSchema schema, GremlinRelatedProperty property, Vertex vertex, Map cascadingSchemas) { - Set collection = new HashSet(); - for (Edge outEdge : vertex.getEdges(property.getDirection(), property.getName())) { - Vertex inVertex = outEdge.getVertex(property.getDirection().opposite()); - V linkedObject = schema.cascadeLoadFromGraph(inVertex, cascadingSchemas); - collection.add(linkedObject); - } + private Set loadCollection(final GremlinSchema schema, final GremlinRelatedProperty property, final Vertex vertex, final Map cascadingSchemas) { + final Set collection = new HashSet(); + vertex.edges(Direction.IN, property.getName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge outEdge) { + Vertex inVertex = outEdge.outVertex(); + V linkedObject = schema.cascadeLoadFromGraph(inVertex, cascadingSchemas); + collection.add(linkedObject); + } + }); return collection; } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionViaPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionViaPropertyMapper.java index 9bd1870..ac0080e 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionViaPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinCollectionViaPropertyMapper.java @@ -1,8 +1,8 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.commons.collections4.CollectionUtils; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -11,6 +11,7 @@ import org.springframework.data.gremlin.schema.property.GremlinRelatedProperty; import java.util.*; +import java.util.function.Consumer; /** * A {@link GremlinPropertyMapper} for mapping {@link GremlinLinkProperty}s. There are 2 configurable properties for this property mapper: @@ -24,14 +25,17 @@ public class GremlinCollectionViaPropertyMapper extends GremlinLinkPropertyMapper { @Override - public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter graphAdapter, Vertex vertex, Object val, Map cascadingSchemas) { + public void copyToVertex(final GremlinRelatedProperty property, final GremlinGraphAdapter graphAdapter, final Vertex vertex, final Object val, final Map cascadingSchemas) { // Get the Set of existing linked vertices for this property - Set existingLinkedEdges = new HashSet<>(); - Set actualLinkedEdges = new HashSet<>(); - for (Edge currentEdge : vertex.getEdges(property.getDirection(), property.getRelatedSchema().getClassName())) { - existingLinkedEdges.add(currentEdge); - } + final Set existingLinkedEdges = new HashSet<>(); + final Set actualLinkedEdges = new HashSet<>(); + vertex.edges(property.getDirection(), property.getRelatedSchema().getClassName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge currentEdge) { + existingLinkedEdges.add(currentEdge); + } + }); GremlinAdjacentProperty adjacentProperty = property.getAdjacentProperty(); @@ -52,13 +56,16 @@ public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter gr Edge linkedEdge = null; // get the current edge for this property - Iterator edges = vertex.getEdges(property.getDirection(), property.getRelatedSchema().getClassName()).iterator(); + Iterator edges = vertex.edges(property.getDirection(), property.getRelatedSchema().getClassName()); while (edges.hasNext()) { Edge edge = edges.next(); - if (edge.getVertex(property.getDirection().opposite()).equals(adjacentVertex)) { - existingLinkedEdges.add(edge); - linkedEdge = edge; - break; + Iterator it = edge.vertices(property.getDirection().opposite()); + while(it.hasNext()) { + if (it.next().equals(adjacentVertex)){ + existingLinkedEdges.add(edge); + linkedEdge = edge; + break; + } } } @@ -92,12 +99,15 @@ public Object loadFromVertex(GremlinRelatedProperty property, Vertex vertex, return loadCollection(property.getRelatedSchema(), property, vertex, cascadingSchemas); } - private Set loadCollection(GremlinSchema schema, GremlinRelatedProperty property, Vertex vertex, Map cascadingSchemas) { - Set collection = new HashSet(); - for (Edge linkedEdge : vertex.getEdges(property.getDirection(), property.getRelatedSchema().getClassName())) { - V linkedObject = schema.cascadeLoadFromGraph(linkedEdge, cascadingSchemas); - collection.add(linkedObject); - } + private Set loadCollection(final GremlinSchema schema, final GremlinRelatedProperty property, final Vertex vertex, final Map cascadingSchemas) { + final Set collection = new HashSet(); + vertex.edges(property.getDirection(), property.getRelatedSchema().getClassName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge linkedEdge) { + V linkedObject = schema.cascadeLoadFromGraph(linkedEdge, cascadingSchemas); + collection.add(linkedObject); + } + }); return collection; } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinEncodedPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinEncodedPropertyMapper.java index 0889320..4f57264 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinEncodedPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinEncodedPropertyMapper.java @@ -1,6 +1,8 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Element; + +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.Element; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinProperty; import org.springframework.data.gremlin.schema.property.encoder.GremlinPropertyEncoder; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkPropertyMapper.java index 3919527..a10fd73 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkPropertyMapper.java @@ -1,13 +1,16 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinLinkProperty; import org.springframework.data.gremlin.schema.property.GremlinRelatedProperty; +import java.util.Iterator; import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; /** * A {@link GremlinPropertyMapper} for mapping {@link GremlinLinkProperty}s. There are 2 configurable properties for this property mapper: @@ -21,15 +24,15 @@ public class GremlinLinkPropertyMapper implements GremlinPropertyMapper { @Override - public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter graphAdapter, Vertex vertex, Object val, Map cascadingSchemas) { + public void copyToVertex(final GremlinRelatedProperty property, final GremlinGraphAdapter graphAdapter, final Vertex vertex, final Object val, final Map cascadingSchemas) { Vertex linkedVertex = null; // get the current edge for this property - Iterable edges = vertex.getEdges(property.getDirection(), property.getName()); - if (edges.iterator().hasNext()) { - Edge linkedEdge = edges.iterator().next(); - linkedVertex = linkedEdge.getVertex(property.getDirection().opposite()); + Iterator edges = vertex.edges(property.getDirection(), property.getName()); + if (edges.hasNext()) { + Edge edge = edges.next(); + linkedVertex = edge.vertices(property.getDirection().opposite()).next(); } else { // No current edge, get it linkedVertex = (Vertex) cascadingSchemas.get(val); @@ -56,17 +59,16 @@ public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter gr } @Override - public Object loadFromVertex(GremlinRelatedProperty property, Vertex vertex, Map cascadingSchemas) { + public Object loadFromVertex(final GremlinRelatedProperty property, final Vertex vertex, final Map cascadingSchemas) { - Object val = null; - for (Edge outEdge : vertex.getEdges(property.getDirection(), property.getName())) { - - Vertex cascadingVertex = outEdge.getVertex(property.getDirection().opposite()); - val = property.getRelatedSchema().cascadeLoadFromGraph(cascadingVertex, cascadingSchemas); - // val = property.getRelatedSchema().loadFromGraph(cascadingVertex); - break; - } - - return val; + final Object[] val = { null }; + vertex.edges(property.getDirection(), property.getName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge outEdge) { + Vertex inVertex = outEdge.inVertex(); + val[0] = property.getRelatedSchema().cascadeLoadFromGraph(inVertex, cascadingSchemas); + } + }); + return val[0]; } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkViaPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkViaPropertyMapper.java index f2b2807..fca9b92 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkViaPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkViaPropertyMapper.java @@ -1,8 +1,8 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinAdjacentProperty; import org.springframework.data.gremlin.schema.property.GremlinLinkProperty; @@ -23,7 +23,7 @@ public class GremlinLinkViaPropertyMapper extends GremlinLinkPropertyMapper { @Override - public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter graphAdapter, Vertex vertex, Object val, Map cascadingSchemas) { + public void copyToVertex(final GremlinRelatedProperty property, final GremlinGraphAdapter graphAdapter, final Vertex vertex, final Object val, final Map cascadingSchemas) { GremlinAdjacentProperty adjacentProperty = property.getAdjacentProperty(); @@ -41,10 +41,10 @@ public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter gr Edge linkedEdge = null; // get the current edge for this property - Iterator edges = vertex.getEdges(property.getDirection(), property.getRelatedSchema().getClassName()).iterator(); + Iterator edges = vertex.edges(property.getDirection(), property.getRelatedSchema().getClassName()); while (edges.hasNext()) { Edge edge = edges.next(); - if (edge.getVertex(property.getDirection().opposite()).equals(adjacentVertex)) { + if (edge.vertices(property.getDirection().opposite()).equals(adjacentVertex)) { linkedEdge = edge; break; } @@ -67,12 +67,14 @@ public void copyToVertex(GremlinRelatedProperty property, GremlinGraphAdapter gr } @Override - public Object loadFromVertex(GremlinRelatedProperty property, Vertex vertex, Map cascadingSchemas) { + public Object loadFromVertex(final GremlinRelatedProperty property, final Vertex vertex, final Map cascadingSchemas) { // GremlinRelatedProperty adjacentProperty = getAdjacentProperty(property); Object val = null; - for (Edge linkedEdge : vertex.getEdges(property.getDirection(), property.getRelatedSchema().getClassName())) { + Iterator it = vertex.edges(property.getDirection(), property.getRelatedSchema().getClassName()); + while (it.hasNext()) { + Edge linkedEdge = it.next(); val = property.getRelatedSchema().cascadeLoadFromGraph(linkedEdge, cascadingSchemas); } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinPropertyMapper.java index 483c85f..95422b5 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinPropertyMapper.java @@ -1,7 +1,7 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.Element; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinProperty; diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinStandardPropertyMapper.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinStandardPropertyMapper.java index 766ffeb..f51a009 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinStandardPropertyMapper.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/property/mapper/GremlinStandardPropertyMapper.java @@ -1,9 +1,10 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinProperty; +import org.springframework.data.gremlin.schema.property.accessor.*; import java.util.Map; @@ -16,11 +17,21 @@ public class GremlinStandardPropertyMapper implements GremlinPropertyMapper cascadingSchemas) { - element.setProperty(property.getName(), val); + element.property(property.getName(), val); } @Override public Object loadFromVertex(GremlinProperty property, Element element, Map cascadingSchemas) { - return element.getProperty(property.getName()); + if (property.getAccessor() instanceof GremlinFieldPropertyAccessor) { + if (element.property(property.getName()).isPresent()) { + return element.value(property.getName()); + } + else { + return element; + } + } + else { + return element.property(property.getName()); + } } } diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/writer/AbstractSchemaWriter.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/writer/AbstractSchemaWriter.java index 3bcda9c..d340452 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/writer/AbstractSchemaWriter.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/schema/writer/AbstractSchemaWriter.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.schema.writer; -import com.tinkerpop.blueprints.Direction; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -27,15 +27,16 @@ public void writeSchema(GremlinGraphFactory tgf, GremlinSchema schema) throws if (LOGGER.isDebugEnabled()) { LOGGER.debug("CREATING CLASS: " + schema.getClassName()); } - Object element; + Object element = null; if (schema.isVertexSchema()) { element = createVertexClass(schema); + writeProperties(element, schema); } else if (schema.isEdgeSchema()) { - - Object outVertex = createVertexClass(schema.getOutProperty().getRelatedSchema()); - Object inVertex = createVertexClass(schema.getInProperty().getRelatedSchema()); - - element = createEdgeClass(schema.getClassName(), outVertex, inVertex, schema.getOutProperty().getCardinality()); +// +// Object outVertex = createVertexClass(schema.getOutProperty().getRelatedSchema()); +// Object inVertex = createVertexClass(schema.getInProperty().getRelatedSchema()); +// +// element = createEdgeClass(schema.getClassName(), outVertex, inVertex, schema.getOutProperty().getCardinality()); } else { throw new IllegalStateException("Unknown class type. Expected Vertex or Edge. "+schema); } @@ -45,7 +46,6 @@ public void writeSchema(GremlinGraphFactory tgf, GremlinSchema schema) throws } - writeProperties(element, schema); } catch (Exception e) { diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactory.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactory.java index b7d03f8..facbcfe 100755 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactory.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactory.java @@ -11,6 +11,7 @@ import org.springframework.data.gremlin.schema.writer.SchemaWriter; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.data.repository.core.EntityInformation; +import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.data.repository.query.EvaluationContextProvider; @@ -55,12 +56,13 @@ public EntityInformation getEntityInformatio return (EntityInformation) new GremlinMetamodelEntityInformation(domainClass, idAccessor); } + /* (non-Javadoc) * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getTargetRepository(org.springframework.data.repository.core.RepositoryMetadata) */ @Override @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object getTargetRepository(RepositoryMetadata metadata) { + protected Object getTargetRepository(RepositoryInformation metadata) { EntityInformation entityInformation = getEntityInformation(metadata.getDomainType()); Class javaType = entityInformation.getJavaType(); diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactoryBean.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactoryBean.java index fa2f227..f580ef9 100755 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactoryBean.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/support/GremlinRepositoryFactoryBean.java @@ -20,7 +20,8 @@ public class GremlinRepositoryFactoryBean, S> ext @Autowired private GremlinRepositoryContext context; - public GremlinRepositoryFactoryBean() { + protected GremlinRepositoryFactoryBean(Class repositoryInterface) { + super(repositoryInterface); } /* (non-Javadoc) diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/AbstractGremlinGraphFactory.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/AbstractGremlinGraphFactory.java index 6572aa8..0106d17 100755 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/AbstractGremlinGraphFactory.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/AbstractGremlinGraphFactory.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.tx; -import com.tinkerpop.blueprints.Graph; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -61,7 +61,11 @@ public void init() { @Override public void shutdown(T graph) { - graph.shutdown(); + try { + graph.close(); + } catch (Exception e) { + e.printStackTrace(); + } } @Override diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinGraphFactory.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinGraphFactory.java index 3555fcb..f5f59ee 100755 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinGraphFactory.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinGraphFactory.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.tx; -import com.tinkerpop.blueprints.Graph; +import org.apache.tinkerpop.gremlin.structure.Graph; /** * An interface defining a Gremlin {@link Graph} factory. diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransaction.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransaction.java index b25a430..4a8497c 100644 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransaction.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransaction.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.tx; -import com.tinkerpop.blueprints.Graph; +import org.apache.tinkerpop.gremlin.structure.Graph; /** * Created by gman on 4/05/15. diff --git a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransactionManager.java b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransactionManager.java index dc2da1e..727466b 100755 --- a/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransactionManager.java +++ b/spring-data-gremlin-core/src/main/java/org/springframework/data/gremlin/tx/GremlinTransactionManager.java @@ -1,6 +1,6 @@ package org.springframework.data.gremlin.tx; -import com.tinkerpop.blueprints.Graph; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.TransactionDefinition; @@ -142,7 +142,7 @@ protected void doResume(Object transaction, Object suspendedResources) throws Tr GremlinTransaction tx = (GremlinTransaction) transaction; if (!graphFactory.isClosed(tx.getGraph())) { - tx.getGraph().shutdown(); + graphFactory.shutdown(tx.getGraph()); } Graph oldGraph = (Graph) suspendedResources; diff --git a/spring-data-gremlin-core/src/test/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkToPropertyMapperTest.java b/spring-data-gremlin-core/src/test/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkToPropertyMapperTest.java index 83d80ad..341c771 100644 --- a/spring-data-gremlin-core/src/test/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkToPropertyMapperTest.java +++ b/spring-data-gremlin-core/src/test/java/org/springframework/data/gremlin/schema/property/mapper/GremlinLinkToPropertyMapperTest.java @@ -1,8 +1,8 @@ package org.springframework.data.gremlin.schema.property.mapper; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.mockito.Mockito; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.schema.property.GremlinLinkProperty; @@ -23,7 +23,7 @@ public void testCopyToVertex() throws Exception { GremlinGraphAdapter adapter = Mockito.mock(GremlinGraphAdapter.class); Vertex vertex = Mockito.mock(Vertex.class); - Mockito.when(vertex.getEdges(Direction.OUT, "test")).thenReturn(new HashSet()); + Mockito.when(vertex.edges(Direction.OUT, "test")).thenReturn(new HashSet().iterator()); GremlinLinkPropertyMapper mapper = new GremlinLinkPropertyMapper(); diff --git a/spring-data-gremlin-titan/build.gradle b/spring-data-gremlin-janus/build.gradle similarity index 66% rename from spring-data-gremlin-titan/build.gradle rename to spring-data-gremlin-janus/build.gradle index 6e19710..d1bd6df 100644 --- a/spring-data-gremlin-titan/build.gradle +++ b/spring-data-gremlin-janus/build.gradle @@ -1,7 +1,7 @@ + dependencies { compile project(':spring-data-gremlin-core') - compile('com.thinkaurelius.titan:titan-core:0.5.4') -// testCompile('com.thinkaurelius.titan:titan-berkeleyje:0.5.4') + compile('org.janusgraph:janusgraph-core:0.1.0-SNAPSHOT') testCompile project(':spring-data-gremlin-test') testCompile project(':spring-data-gremlin-schemagen-jpa') testCompile project(':spring-data-gremlin-schemagen-neo4j') diff --git a/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGraphAdapter.java b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGraphAdapter.java new file mode 100644 index 0000000..e06ffc3 --- /dev/null +++ b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGraphAdapter.java @@ -0,0 +1,24 @@ +package org.springframework.data.gremlin.repository.janus; + +import org.janusgraph.core.JanusGraph; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.gremlin.repository.GremlinGraphAdapter; +import org.springframework.transaction.annotation.Transactional; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +public class JanusGraphAdapter extends GremlinGraphAdapter { + + private static final Logger LOGGER = LoggerFactory.getLogger(JanusGraphAdapter.class); + + @Override + @Transactional(readOnly = false) + public Vertex createVertex(JanusGraph graph, String className) { + Vertex vertex = graph.addVertex(className); + return vertex; + } + +} \ No newline at end of file diff --git a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/repository/titan/TitanGremlinRepository.java b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGremlinRepository.java similarity index 73% rename from spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/repository/titan/TitanGremlinRepository.java rename to spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGremlinRepository.java index d3ec340..c837c53 100644 --- a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/repository/titan/TitanGremlinRepository.java +++ b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/repository/janus/JanusGremlinRepository.java @@ -1,10 +1,10 @@ -package org.springframework.data.gremlin.repository.titan; +package org.springframework.data.gremlin.repository.janus; -import com.thinkaurelius.titan.core.TitanGraph; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Graph; -import com.tinkerpop.blueprints.Vertex; +import org.janusgraph.core.JanusGraph; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -14,32 +14,34 @@ import org.springframework.data.gremlin.repository.SimpleGremlinRepository; import org.springframework.data.gremlin.schema.GremlinSchema; import org.springframework.data.gremlin.tx.GremlinGraphFactory; -import org.springframework.data.gremlin.tx.titan.TitanGremlinGraphFactory; +import org.springframework.data.gremlin.tx.janus.JanusGremlinGraphFactory; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** - * Titan specific extension of the {@link SimpleGremlinRepository} providing custom implementations of {@code count()}, {@code deleteAll()}, + * Janus specific extension of the {@link SimpleGremlinRepository} providing custom implementations of {@code count()}, {@code deleteAll()}, * {@code findAll(Pageable)} and {@code findAll()}. * - * @author Gman + * @author mmichail (zifnab87) + * + * credit to: gman's work for supplying initial code for TitanDB. */ -public class TitanGremlinRepository extends SimpleGremlinRepository { +public class JanusGremlinRepository extends SimpleGremlinRepository { - private static final Logger LOGGER = LoggerFactory.getLogger(TitanGremlinRepository.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JanusGremlinRepository.class); - TitanGremlinGraphFactory graphFactory; + JanusGremlinGraphFactory graphFactory; - public TitanGremlinRepository(GremlinGraphFactory dbf, GremlinGraphAdapter graphAdapter, GremlinSchema mapper) { + public JanusGremlinRepository(GremlinGraphFactory dbf, GremlinGraphAdapter graphAdapter, GremlinSchema mapper) { super(dbf, graphAdapter, mapper); - this.graphFactory = (TitanGremlinGraphFactory) dbf; + this.graphFactory = (JanusGremlinGraphFactory) dbf; } @Transactional(readOnly = false) protected Vertex createVertex(Graph graph) { - Vertex vertex = ((TitanGraph) graph).addVertexWithLabel(schema.getClassName()); + Vertex vertex = ((JanusGraph) graph).addVertex(schema.getClassName()); return vertex; } @@ -101,7 +103,7 @@ public Iterable findAllElementsForSchema() { public Iterable findALlVerticiesForSchema() { List result = new ArrayList<>(); - for (Vertex vertex : graphFactory.graph().getVertices("label", schema.getClassName())) { + for (Vertex vertex : graphFactory.graph().traversal().V(schema.getClassName()).toList()) { result.add(vertex); } return result; @@ -109,7 +111,7 @@ public Iterable findALlVerticiesForSchema() { public Iterable findAllEdgesForSchema() { List result = new ArrayList<>(); - for (Edge edge : graphFactory.graph().getEdges("label", schema.getClassName())) { + for (Edge edge : graphFactory.graph().traversal().E(schema.getClassName()).toList()) { result.add(edge); } return result; diff --git a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/schema/writer/titan/TitanSchemaWriter.java b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/schema/writer/janus/JanusSchemaWriter.java similarity index 76% rename from spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/schema/writer/titan/TitanSchemaWriter.java rename to spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/schema/writer/janus/JanusSchemaWriter.java index f9ea936..5337e73 100644 --- a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/schema/writer/titan/TitanSchemaWriter.java +++ b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/schema/writer/janus/JanusSchemaWriter.java @@ -1,8 +1,8 @@ -package org.springframework.data.gremlin.schema.writer.titan; +package org.springframework.data.gremlin.schema.writer.janus; -import com.thinkaurelius.titan.core.*; -import com.thinkaurelius.titan.core.schema.TitanManagement; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.janusgraph.core.*; +import org.janusgraph.core.schema.JanusGraphManagement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.schema.GremlinSchema; @@ -11,27 +11,27 @@ import org.springframework.data.gremlin.schema.writer.SchemaWriter; import org.springframework.data.gremlin.schema.writer.SchemaWriterException; import org.springframework.data.gremlin.tx.GremlinGraphFactory; -import org.springframework.data.gremlin.tx.titan.TitanGremlinGraphFactory; +import org.springframework.data.gremlin.tx.janus.JanusGremlinGraphFactory; import org.springframework.transaction.annotation.Transactional; import static org.springframework.data.gremlin.schema.property.GremlinRelatedProperty.CARDINALITY; /** - * A concrete {@link SchemaWriter} for an OrientDB database. + * A concrete {@link SchemaWriter} for JanusGraph database. * * @author Gman */ -public class TitanSchemaWriter extends AbstractSchemaWriter { +public class JanusSchemaWriter extends AbstractSchemaWriter { - private static final Logger LOGGER = LoggerFactory.getLogger(TitanSchemaWriter.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JanusSchemaWriter.class); - private TitanManagement mgmt; + private JanusGraphManagement mgmt; public void initialise(GremlinGraphFactory tgf, GremlinSchema schema) throws SchemaWriterException { try { - TitanGraph graph = ((TitanGremlinGraphFactory) tgf).graph(); - mgmt = graph.getManagementSystem(); + JanusGraph graph = ((JanusGremlinGraphFactory) tgf).graph(); + mgmt = graph.openManagement(); } catch (RuntimeException e) { String msg = String.format("Could not create schema %s. ERROR: %s", schema, e.getMessage()); @@ -44,12 +44,12 @@ public void initialise(GremlinGraphFactory tgf, GremlinSchema schema) throws public void writeSchema(GremlinGraphFactory tgf, GremlinSchema schema) throws SchemaWriterException { initialise(tgf, schema); super.writeSchema(tgf, schema); + mgmt.commit(); } @Override protected boolean isPropertyAvailable(Object vertexClass, String name) { - Object prop = ((VertexLabel) vertexClass).getProperty(name); - return prop != null; + return ((JanusGraphElement) vertexClass).keys().contains(name); } @Override @@ -57,7 +57,7 @@ protected Object createVertexClass(GremlinSchema schema) throws Exception { VertexLabel vertexClass = mgmt.getVertexLabel(schema.getClassName()); if(vertexClass == null) { vertexClass = mgmt.makeVertexLabel(schema.getClassName()).make(); - mgmt.commit(); +// mgmt.commit(); } return vertexClass; } @@ -67,7 +67,7 @@ protected Object createEdgeClass(GremlinSchema schema) throws Exception { EdgeLabel edgeClass = mgmt.getEdgeLabel(schema.getClassName()); if(edgeClass == null) { edgeClass = mgmt.makeEdgeLabel(schema.getClassName()).make(); - mgmt.commit(); +// mgmt.commit(); } return edgeClass; } @@ -93,7 +93,8 @@ protected Object createEdgeClass(String name, Object outVertex, Object inVertex, multiplicity = Multiplicity.ONE2MANY; } - EdgeLabel edgeLabel = mgmt.makeEdgeLabel(name).directed().multiplicity(multiplicity).make(); +// EdgeLabel edgeLabel = mgmt.makeEdgeLabel(name).directed().multiplicity(multiplicity).make(); + EdgeLabel edgeLabel = mgmt.getOrCreateEdgeLabel(name); return edgeLabel; } @@ -119,19 +120,22 @@ protected Object setEdgeIn(Object edgeClass, Object vertexClass) { @Override protected Object createProperty(Object parentElement, String name, Class cls) { + if (cls == double.class) { + cls = Double.class; + } return mgmt.makePropertyKey(name).dataType(cls).make(); } @Override protected void createNonUniqueIndex(Object prop) { PropertyKey property = (PropertyKey) prop; - mgmt.buildIndex(property.getName(), Vertex.class).addKey(property).buildCompositeIndex(); + mgmt.buildIndex(property.name(), Vertex.class).addKey(property).buildCompositeIndex(); } @Override protected void createUniqueIndex(Object prop) { PropertyKey property = (PropertyKey) prop; - mgmt.buildIndex(property.getName(), Vertex.class).addKey(property).unique().buildCompositeIndex(); + mgmt.buildIndex(property.name(), Vertex.class).addKey(property).unique().buildCompositeIndex(); } @Override diff --git a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/tx/titan/TitanGremlinGraphFactory.java b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/tx/janus/JanusGremlinGraphFactory.java similarity index 55% rename from spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/tx/titan/TitanGremlinGraphFactory.java rename to spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/tx/janus/JanusGremlinGraphFactory.java index e8e888e..077f973 100644 --- a/spring-data-gremlin-titan/src/main/java/org/springframework/data/gremlin/tx/titan/TitanGremlinGraphFactory.java +++ b/spring-data-gremlin-janus/src/main/java/org/springframework/data/gremlin/tx/janus/JanusGremlinGraphFactory.java @@ -1,64 +1,64 @@ -package org.springframework.data.gremlin.tx.titan; - -import static org.springframework.util.Assert.notNull; +package org.springframework.data.gremlin.tx.janus; import org.apache.commons.configuration.Configuration; +import org.janusgraph.core.JanusGraph; +import org.janusgraph.core.JanusGraphFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.tx.AbstractGremlinGraphFactory; -import com.thinkaurelius.titan.core.TitanFactory; -import com.thinkaurelius.titan.core.TitanGraph; +import static org.springframework.util.Assert.notNull; /** - * An {@link AbstractGremlinGraphFactory} for OrentDB providing an {@link TitanGraph} implementation of {@link com.tinkerpop.blueprints.Graph}. + * An {@link AbstractGremlinGraphFactory} for OrentDB providing an {@link JanusGraph} implementation of {@link org.apache.tinkerpop.gremlin.structure.Graph}. * * @author Gman */ -public class TitanGremlinGraphFactory extends AbstractGremlinGraphFactory { +public class JanusGremlinGraphFactory extends AbstractGremlinGraphFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(TitanGremlinGraphFactory.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JanusGremlinGraphFactory.class); - private TitanGraph graph = null; + private JanusGraph graph = null; private Configuration configuration; @Override protected void createPool() { - if(configuration != null){ - graph = TitanFactory.open(configuration); + if (configuration != null) { + graph = JanusGraphFactory.open(configuration); } else { notNull(url); - graph = TitanFactory.open(url); + graph = JanusGraphFactory.open(url); + } } @Override - public boolean isActive(TitanGraph graph) { - return graph.getManagementSystem().isOpen(); + public boolean isActive(JanusGraph graph) { + return graph.isOpen(); } @Override - public boolean isClosed(TitanGraph graph) { + public boolean isClosed(JanusGraph graph) { return graph.isClosed(); } @Override - public void beginTx(TitanGraph graph) { + public void beginTx(JanusGraph graph) { graph.newTransaction(); } @Override - public void commitTx(TitanGraph graph) { - graph.commit(); + public void commitTx(JanusGraph graph) { + graph.tx().commit(); } @Override - public void rollbackTx(TitanGraph graph) { - graph.rollback(); + public void rollbackTx(JanusGraph graph) { + graph.tx().rollback(); } @Override - public TitanGraph openGraph() { + public JanusGraph openGraph() { if (graph == null || graph.isClosed()) { createPool(); } diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_AddressRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_AddressRepositoryTest.java new file mode 100644 index 0000000..9f7deaa --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_AddressRepositoryTest.java @@ -0,0 +1,10 @@ +package org.springframework.data.gremlin.object.tests.janus.core; + +import org.springframework.data.gremlin.object.core.repository.AbstractAddressRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +@ContextConfiguration(classes = Janus_Core_TestConfiguration.class) +public class Janus_Core_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_EdgeRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_EdgeRepositoryTest.java new file mode 100644 index 0000000..22f61a5 --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_EdgeRepositoryTest.java @@ -0,0 +1,10 @@ +package org.springframework.data.gremlin.object.tests.janus.core; + +import org.springframework.data.gremlin.object.core.repository.AbstractEdgeRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +@ContextConfiguration(classes = Janus_Core_TestConfiguration.class) +public class Janus_Core_EdgeRepositoryTest extends AbstractEdgeRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_PersonRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_PersonRepositoryTest.java similarity index 76% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_PersonRepositoryTest.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_PersonRepositoryTest.java index 32567d4..5c3a58b 100644 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_PersonRepositoryTest.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_PersonRepositoryTest.java @@ -1,14 +1,14 @@ -package org.springframework.data.gremlin.object.tests.titan.core; +package org.springframework.data.gremlin.object.tests.janus.core; import org.springframework.data.gremlin.object.core.repository.AbstractPersonRepositoryTest; import org.springframework.test.context.ContextConfiguration; /** - * Created by gman on 24/06/15. + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. */ -@ContextConfiguration(classes = Titan_Core_TestConfiguration.class) +@ContextConfiguration(classes = Janus_Core_TestConfiguration.class) @SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_Core_PersonRepositoryTest extends AbstractPersonRepositoryTest { +public class Janus_Core_PersonRepositoryTest extends AbstractPersonRepositoryTest { // @Autowired // protected NativePersonRepository nativePersonRepository; diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TestConfiguration.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TestConfiguration.java old mode 100755 new mode 100644 similarity index 71% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TestConfiguration.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TestConfiguration.java index e46dfc2..84b7692 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TestConfiguration.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TestConfiguration.java @@ -1,6 +1,5 @@ -package org.springframework.data.gremlin.object.tests.titan.core; +package org.springframework.data.gremlin.object.tests.janus.core; -import org.apache.commons.io.FileUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -10,38 +9,34 @@ import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.repository.GremlinRepositoryContext; import org.springframework.data.gremlin.repository.GremlinRepositoryWithNativeSupport; -import org.springframework.data.gremlin.repository.titan.TitanGraphAdapter; -import org.springframework.data.gremlin.repository.titan.TitanGremlinRepository; +import org.springframework.data.gremlin.repository.janus.JanusGraphAdapter; +import org.springframework.data.gremlin.repository.janus.JanusGremlinRepository; import org.springframework.data.gremlin.schema.GremlinBeanPostProcessor; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; -import org.springframework.data.gremlin.schema.generator.DefaultSchemaGenerator; -import org.springframework.data.gremlin.schema.generator.SchemaGenerator; import org.springframework.data.gremlin.schema.writer.SchemaWriter; -import org.springframework.data.gremlin.schema.writer.titan.TitanSchemaWriter; +import org.springframework.data.gremlin.schema.writer.janus.JanusSchemaWriter; import org.springframework.data.gremlin.support.GremlinRepositoryFactoryBean; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.data.gremlin.tx.GremlinTransactionManager; -import org.springframework.data.gremlin.tx.titan.TitanGremlinGraphFactory; +import org.springframework.data.gremlin.tx.janus.JanusGremlinGraphFactory; import org.springframework.transaction.annotation.EnableTransactionManagement; -import java.io.File; -import java.io.IOException; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ @Configuration @EnableTransactionManagement @EnableGremlinRepositories(basePackages = "org.springframework.data.gremlin.object.core", excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = GremlinRepositoryWithNativeSupport.class) }, repositoryFactoryBeanClass = GremlinRepositoryFactoryBean.class) -public class Titan_Core_TestConfiguration { +public class Janus_Core_TestConfiguration { @Bean - public TitanGremlinGraphFactory factory() { - try { - FileUtils.forceDeleteOnExit(new File("/tmp/graph")); - } catch (IOException e) { - e.printStackTrace(); - } - TitanGremlinGraphFactory factory = new TitanGremlinGraphFactory(); + public JanusGremlinGraphFactory factory() { + JanusGremlinGraphFactory factory = new JanusGremlinGraphFactory(); factory.setUrl("inmemory"); + // factory.setUsername("admin"); // factory.setPassword("admin"); @@ -60,12 +55,12 @@ public GremlinTransactionManager transactionManager() { @Bean public SchemaWriter schemaWriter() { - return new TitanSchemaWriter(); + return new JanusSchemaWriter(); } @Bean public GremlinGraphAdapter graphAdapter() { - return new TitanGraphAdapter(); + return new JanusGraphAdapter(); } @Bean @@ -75,7 +70,7 @@ public static GremlinBeanPostProcessor tinkerpopSchemaManager() { @Bean public GremlinRepositoryContext databaseContext(GremlinGraphFactory graphFactory, GremlinGraphAdapter graphAdapter, GremlinSchemaFactory schemaFactory, SchemaWriter schemaWriter) { - return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, TitanGremlinRepository.class); + return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, JanusGremlinRepository.class); } @Bean diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TransactionRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TransactionRepositoryTest.java new file mode 100644 index 0000000..34c9b79 --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/core/Janus_Core_TransactionRepositoryTest.java @@ -0,0 +1,13 @@ +package org.springframework.data.gremlin.object.tests.janus.core; + +import org.springframework.data.gremlin.object.core.repository.AbstractTransactionRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +@ContextConfiguration(classes = Janus_Core_TestConfiguration.class) +@SuppressWarnings("SpringJavaAutowiringInspection") +public class Janus_Core_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { + +} diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_AddressRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_AddressRepositoryTest.java new file mode 100644 index 0000000..59b9cbc --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_AddressRepositoryTest.java @@ -0,0 +1,10 @@ +package org.springframework.data.gremlin.object.tests.janus.jpa; + +import org.springframework.data.gremlin.object.jpa.repository.AbstractAddressRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +@ContextConfiguration(classes = Janus_JPA_TestConfiguration.class) +public class Janus_JPA_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_PersonRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_PersonRepositoryTest.java similarity index 76% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_PersonRepositoryTest.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_PersonRepositoryTest.java index 344c8e0..f217034 100644 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_PersonRepositoryTest.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_PersonRepositoryTest.java @@ -1,14 +1,14 @@ -package org.springframework.data.gremlin.object.tests.titan.jpa; +package org.springframework.data.gremlin.object.tests.janus.jpa; import org.springframework.data.gremlin.object.jpa.repository.AbstractPersonRepositoryTest; import org.springframework.test.context.ContextConfiguration; /** - * Created by gman on 24/06/15. + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. */ -@ContextConfiguration(classes = Titan_JPA_TestConfiguration.class) +@ContextConfiguration(classes = Janus_JPA_TestConfiguration.class) @SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_JPA_PersonRepositoryTest extends AbstractPersonRepositoryTest { +public class Janus_JPA_PersonRepositoryTest extends AbstractPersonRepositoryTest { // @Autowired // protected NativePersonRepository nativePersonRepository; diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TestConfiguration.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TestConfiguration.java old mode 100755 new mode 100644 similarity index 81% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TestConfiguration.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TestConfiguration.java index 9ecf1ea..0ee8cee --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TestConfiguration.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TestConfiguration.java @@ -1,4 +1,4 @@ -package org.springframework.data.gremlin.object.tests.titan.jpa; +package org.springframework.data.gremlin.object.tests.janus.jpa; import org.apache.commons.io.FileUtils; import org.springframework.context.annotation.Bean; @@ -10,37 +10,41 @@ import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.repository.GremlinRepositoryContext; import org.springframework.data.gremlin.repository.GremlinRepositoryWithNativeSupport; -import org.springframework.data.gremlin.repository.titan.TitanGraphAdapter; -import org.springframework.data.gremlin.repository.titan.TitanGremlinRepository; +import org.springframework.data.gremlin.repository.janus.JanusGraphAdapter; +import org.springframework.data.gremlin.repository.janus.JanusGremlinRepository; import org.springframework.data.gremlin.schema.GremlinBeanPostProcessor; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.schema.generator.SchemaGenerator; import org.springframework.data.gremlin.schema.generator.jpa.JpaSchemaGenerator; import org.springframework.data.gremlin.schema.writer.SchemaWriter; -import org.springframework.data.gremlin.schema.writer.titan.TitanSchemaWriter; +import org.springframework.data.gremlin.schema.writer.janus.JanusSchemaWriter; import org.springframework.data.gremlin.support.GremlinRepositoryFactoryBean; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.data.gremlin.tx.GremlinTransactionManager; -import org.springframework.data.gremlin.tx.titan.TitanGremlinGraphFactory; +import org.springframework.data.gremlin.tx.janus.JanusGremlinGraphFactory; import org.springframework.transaction.annotation.EnableTransactionManagement; import java.io.File; import java.io.IOException; +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ + @Configuration @EnableTransactionManagement @EnableGremlinRepositories(basePackages = "org.springframework.data.gremlin.object.jpa", excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = GremlinRepositoryWithNativeSupport.class) }, repositoryFactoryBeanClass = GremlinRepositoryFactoryBean.class) -public class Titan_JPA_TestConfiguration { +public class Janus_JPA_TestConfiguration { @Bean - public TitanGremlinGraphFactory factory() { + public JanusGremlinGraphFactory factory() { try { FileUtils.forceDeleteOnExit(new File("/tmp/graph")); } catch (IOException e) { e.printStackTrace(); } - TitanGremlinGraphFactory factory = new TitanGremlinGraphFactory(); + JanusGremlinGraphFactory factory = new JanusGremlinGraphFactory(); factory.setUrl("inmemory"); // factory.setUsername("admin"); // factory.setPassword("admin"); @@ -65,12 +69,12 @@ public SchemaGenerator schemaGenerator() { @Bean public SchemaWriter schemaWriter() { - return new TitanSchemaWriter(); + return new JanusSchemaWriter(); } @Bean public GremlinGraphAdapter graphAdapter() { - return new TitanGraphAdapter(); + return new JanusGraphAdapter(); } @Bean @@ -80,7 +84,7 @@ public static GremlinBeanPostProcessor tinkerpopSchemaManager(SchemaGenerator sc @Bean public GremlinRepositoryContext databaseContext(GremlinGraphFactory graphFactory, GremlinGraphAdapter graphAdapter, GremlinSchemaFactory schemaFactory, SchemaWriter schemaWriter) { - return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, TitanGremlinRepository.class); + return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, JanusGremlinRepository.class); } @Bean diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TransactionRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TransactionRepositoryTest.java new file mode 100644 index 0000000..bdfefdf --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/jpa/Janus_JPA_TransactionRepositoryTest.java @@ -0,0 +1,14 @@ +package org.springframework.data.gremlin.object.tests.janus.jpa; + +import org.springframework.data.gremlin.object.jpa.repository.AbstractTransactionRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ + +@ContextConfiguration(classes = Janus_JPA_TestConfiguration.class) +@SuppressWarnings("SpringJavaAutowiringInspection") +public class Janus_JPA_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { + +} diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_AddressRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_AddressRepositoryTest.java new file mode 100644 index 0000000..57e1ac5 --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_AddressRepositoryTest.java @@ -0,0 +1,11 @@ +package org.springframework.data.gremlin.object.tests.janus.neo4j; + +import org.springframework.data.gremlin.object.neo4j.repository.AbstractAddressRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ + +@ContextConfiguration(classes = Janus_Neo4j_TestConfiguration.class) +public class Janus_Neo4j_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_PersonRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_PersonRepositoryTest.java similarity index 76% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_PersonRepositoryTest.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_PersonRepositoryTest.java index db8ffe6..1df16d8 100644 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_PersonRepositoryTest.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_PersonRepositoryTest.java @@ -1,14 +1,15 @@ -package org.springframework.data.gremlin.object.tests.titan.neo4j; +package org.springframework.data.gremlin.object.tests.janus.neo4j; import org.springframework.data.gremlin.object.neo4j.repository.AbstractPersonRepositoryTest; import org.springframework.test.context.ContextConfiguration; /** - * Created by gman on 24/06/15. + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. */ -@ContextConfiguration(classes = Titan_Neo4j_TestConfiguration.class) + +@ContextConfiguration(classes = Janus_Neo4j_TestConfiguration.class) @SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_Neo4j_PersonRepositoryTest extends AbstractPersonRepositoryTest { +public class Janus_Neo4j_PersonRepositoryTest extends AbstractPersonRepositoryTest { // @Autowired // protected NativePersonRepository nativePersonRepository; diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TestConfiguration.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TestConfiguration.java old mode 100755 new mode 100644 similarity index 81% rename from spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TestConfiguration.java rename to spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TestConfiguration.java index 1884b23..58c2c33 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TestConfiguration.java +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TestConfiguration.java @@ -1,4 +1,4 @@ -package org.springframework.data.gremlin.object.tests.titan.neo4j; +package org.springframework.data.gremlin.object.tests.janus.neo4j; import org.apache.commons.io.FileUtils; import org.springframework.context.annotation.Bean; @@ -10,37 +10,41 @@ import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.data.gremlin.repository.GremlinRepositoryContext; import org.springframework.data.gremlin.repository.GremlinRepositoryWithNativeSupport; -import org.springframework.data.gremlin.repository.titan.TitanGraphAdapter; -import org.springframework.data.gremlin.repository.titan.TitanGremlinRepository; +import org.springframework.data.gremlin.repository.janus.JanusGraphAdapter; +import org.springframework.data.gremlin.repository.janus.JanusGremlinRepository; import org.springframework.data.gremlin.schema.GremlinBeanPostProcessor; import org.springframework.data.gremlin.schema.GremlinSchemaFactory; import org.springframework.data.gremlin.schema.generator.Neo4jSchemaGenerator; import org.springframework.data.gremlin.schema.generator.SchemaGenerator; import org.springframework.data.gremlin.schema.writer.SchemaWriter; -import org.springframework.data.gremlin.schema.writer.titan.TitanSchemaWriter; +import org.springframework.data.gremlin.schema.writer.janus.JanusSchemaWriter; import org.springframework.data.gremlin.support.GremlinRepositoryFactoryBean; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.data.gremlin.tx.GremlinTransactionManager; -import org.springframework.data.gremlin.tx.titan.TitanGremlinGraphFactory; +import org.springframework.data.gremlin.tx.janus.JanusGremlinGraphFactory; import org.springframework.transaction.annotation.EnableTransactionManagement; import java.io.File; import java.io.IOException; +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ + @Configuration @EnableTransactionManagement @EnableGremlinRepositories(basePackages = "org.springframework.data.gremlin.object.neo4j", excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = GremlinRepositoryWithNativeSupport.class) }, repositoryFactoryBeanClass = GremlinRepositoryFactoryBean.class) -public class Titan_Neo4j_TestConfiguration { +public class Janus_Neo4j_TestConfiguration { @Bean - public TitanGremlinGraphFactory factory() { + public JanusGremlinGraphFactory factory() { try { FileUtils.forceDeleteOnExit(new File("/tmp/graph")); } catch (IOException e) { e.printStackTrace(); } - TitanGremlinGraphFactory factory = new TitanGremlinGraphFactory(); + JanusGremlinGraphFactory factory = new JanusGremlinGraphFactory(); factory.setUrl("inmemory"); // factory.setUsername("admin"); // factory.setPassword("admin"); @@ -65,12 +69,12 @@ public SchemaGenerator schemaGenerator() { @Bean public SchemaWriter schemaWriter() { - return new TitanSchemaWriter(); + return new JanusSchemaWriter(); } @Bean public GremlinGraphAdapter graphAdapter() { - return new TitanGraphAdapter(); + return new JanusGraphAdapter(); } @Bean @@ -80,7 +84,7 @@ public static GremlinBeanPostProcessor tinkerpopSchemaManager(SchemaGenerator sc @Bean public GremlinRepositoryContext databaseContext(GremlinGraphFactory graphFactory, GremlinGraphAdapter graphAdapter, GremlinSchemaFactory schemaFactory, SchemaWriter schemaWriter) { - return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, TitanGremlinRepository.class); + return new GremlinRepositoryContext(graphFactory, graphAdapter, schemaFactory, schemaWriter, JanusGremlinRepository.class); } @Bean diff --git a/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TransactionRepositoryTest.java b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TransactionRepositoryTest.java new file mode 100644 index 0000000..587da25 --- /dev/null +++ b/spring-data-gremlin-janus/src/test/java/org/springframework/data/gremlin/object/tests/janus/neo4j/Janus_Neo4j_TransactionRepositoryTest.java @@ -0,0 +1,13 @@ +package org.springframework.data.gremlin.object.tests.janus.neo4j; + +import org.springframework.data.gremlin.object.neo4j.repository.AbstractTransactionRepositoryTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * Created by mmichail (zifnab87) on 13/04/17 based on gman's titan files. + */ +@ContextConfiguration(classes = Janus_Neo4j_TestConfiguration.class) +@SuppressWarnings("SpringJavaAutowiringInspection") +public class Janus_Neo4j_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { + +} diff --git a/spring-data-gremlin-orientdb/build.gradle b/spring-data-gremlin-orientdb/build.gradle index c3b0a1b..ee83f0f 100644 --- a/spring-data-gremlin-orientdb/build.gradle +++ b/spring-data-gremlin-orientdb/build.gradle @@ -1,8 +1,22 @@ + +version = '0.1.0-SNAPSHOT' + +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'eclipse' +apply plugin: 'maven' +apply plugin: 'maven-publish' +apply plugin: 'signing' +apply plugin: 'propdeps' +apply plugin: 'propdeps-maven' +apply plugin: 'propdeps-idea' +apply plugin: 'propdeps-eclipse' + dependencies { - compile project(':spring-data-gremlin-core') - compile('com.orientechnologies:orientdb-lucene:2.0.13') - compile('com.orientechnologies:orientdb-graphdb:2.0.13') + compile('com.orientechnologies:orientdb-core:2.2.18') + compile('com.michaelpollmeier:orientdb-gremlin:3.2.3.0') testCompile project(':spring-data-gremlin-schemagen-jpa') testCompile project(':spring-data-gremlin-schemagen-neo4j') + testCompile project(':spring-data-gremlin-core') testCompile project(':spring-data-gremlin-test') -} \ No newline at end of file +} diff --git a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/query/orientdb/NativeOrientdbGremlinQuery.java b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/query/orientdb/NativeOrientdbGremlinQuery.java index 443d862..06bdf73 100644 --- a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/query/orientdb/NativeOrientdbGremlinQuery.java +++ b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/query/orientdb/NativeOrientdbGremlinQuery.java @@ -67,7 +67,9 @@ protected Object doRunQuery(DefaultParameters parameters, Object[] values, boole } try { - Object result = orientGraphFactory.graph().command(new OCommandSQL(queryString)).execute(params); + + // TODO I don't know how to pass parameters in the orientdb query + Object result = orientGraphFactory.graph().executeSql(queryString); return result; } catch (RuntimeException e) { e.printStackTrace(); diff --git a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGraphAdapter.java b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGraphAdapter.java index e7973dc..a4d2a89 100644 --- a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGraphAdapter.java +++ b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGraphAdapter.java @@ -1,7 +1,7 @@ package org.springframework.data.gremlin.repository.orientdb; -import com.tinkerpop.blueprints.Vertex; -import com.tinkerpop.blueprints.impls.orient.OrientGraph; +import org.apache.tinkerpop.gremlin.orientdb.OrientGraph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; diff --git a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGremlinRepository.java b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGremlinRepository.java index c541ef8..56ab52b 100644 --- a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGremlinRepository.java +++ b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/repository/orientdb/OrientDBGremlinRepository.java @@ -1,9 +1,9 @@ package org.springframework.data.gremlin.repository.orientdb; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Vertex; -import com.tinkerpop.blueprints.impls.orient.OrientGraph; +import org.apache.tinkerpop.gremlin.orientdb.OrientGraph; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -42,9 +42,9 @@ public long count() { long count = 0; try { if (schema.isVertexSchema()) { - count = orientGraphFactory.graph().countVertices(schema.getClassName()); + count = orientGraphFactory.graph().traversal().V().hasLabel(schema.getClassName()).count().next(); } else { - count = orientGraphFactory.graph().countEdges(schema.getClassName()); + count = orientGraphFactory.graph().traversal().E(schema.getClassName()).count().next(); } } catch (Exception e) { } @@ -105,7 +105,7 @@ public Iterable findALlVerticiesForSchema() { OrientGraph graph = orientGraphFactory.graph(); List result = new ArrayList<>(); - for (Vertex vertex : graph.getVerticesOfClass(schema.getClassName())) { + for (Vertex vertex : graph.traversal().V().hasLabel(schema.getClassName()).toList()) { result.add(vertex); } return result; @@ -115,7 +115,7 @@ public Iterable findAllEdgesForSchema() { OrientGraph graph = orientGraphFactory.graph(); List result = new ArrayList<>(); - for (Edge edge : graph.getEdgesOfClass(schema.getClassName())) { + for (Edge edge : graph.traversal().E(schema.getClassName()).toList()) { result.add(edge); } return result; diff --git a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/schema/writer/orientdb/OrientDbSchemaWriter.java b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/schema/writer/orientdb/OrientDbSchemaWriter.java index 80eeaa1..a87d9fc 100644 --- a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/schema/writer/orientdb/OrientDbSchemaWriter.java +++ b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/schema/writer/orientdb/OrientDbSchemaWriter.java @@ -37,7 +37,7 @@ public void initialise(GremlinGraphFactory tgf, GremlinSchema schema) throws LOGGER.debug("Initialising..."); try { dbf = (OrientDBGremlinGraphFactory) tgf; - oSchema = dbf.graphNoTx().getRawGraph().getMetadata().getSchema(); + oSchema = dbf.graphNoTx().getRawDatabase().getMetadata().getSchema(); } catch (RuntimeException e) { String msg = String.format("Could not create schema %s. ERROR: %s", schema, e.getMessage()); @@ -169,12 +169,10 @@ protected void createUniqueIndex(Object prop) { @Override protected void createSpatialIndex(GremlinSchema schema, GremlinProperty latitude, GremlinProperty longitude) { - String indexName = schema.getClassName() + ".lat_lon"; if (dbf.graphNoTx().getIndex(indexName, Vertex.class) == null) { try { - dbf.graphNoTx().command(new OCommandSQL(String.format("CREATE INDEX %s ON %s(%s,%s) SPATIAL ENGINE LUCENE", indexName, schema.getClassName(), latitude.getName(), longitude.getName()))) - .execute(); + dbf.graphNoTx().executeCommand(new OCommandSQL(String.format("CREATE INDEX %s ON %s(%s,%s) SPATIAL ENGINE LUCENE", indexName, schema.getClassName(), latitude.getName(), longitude.getName()))); } catch (Exception e1) { e1.printStackTrace(); } diff --git a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/tx/orientdb/OrientDBGremlinGraphFactory.java b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/tx/orientdb/OrientDBGremlinGraphFactory.java index 5f82327..0dd71ff 100644 --- a/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/tx/orientdb/OrientDBGremlinGraphFactory.java +++ b/spring-data-gremlin-orientdb/src/main/java/org/springframework/data/gremlin/tx/orientdb/OrientDBGremlinGraphFactory.java @@ -1,9 +1,8 @@ package org.springframework.data.gremlin.tx.orientdb; import com.orientechnologies.orient.core.db.ODatabase; -import com.tinkerpop.blueprints.impls.orient.OrientGraph; -import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory; -import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx; +import org.apache.tinkerpop.gremlin.orientdb.OrientGraph; +import org.apache.tinkerpop.gremlin.orientdb.OrientGraphFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.tx.AbstractGremlinGraphFactory; @@ -21,7 +20,7 @@ public class OrientDBGremlinGraphFactory extends AbstractGremlinGraphFactory oldLikes = new ArrayList(); + CollectionUtils.addAll(oldLikes, likesRepository.findAll()); + Likes likes = new Likes(graham, lara); likesRepository.save(likes); - List allLikes = new ArrayList(); - CollectionUtils.addAll(allLikes, likesRepository.findAll()); - assertEquals(2, allLikes.size()); + List newLikes = new ArrayList(); + CollectionUtils.addAll(newLikes, likesRepository.findAll()); + assertEquals(oldLikes.size() + 1, newLikes.size()); } @@ -62,12 +66,14 @@ public void should_deleteAll_Located() throws Exception { @Test public void should_save_edge() throws Exception { + List oldLocated = new ArrayList(); + CollectionUtils.addAll(oldLocated, locatedRepository.findAll()); Located located = new Located(new Date(), graham, locationRepository.save(new Location(35, 165))); locatedRepository.save(located); List newLocated = new ArrayList(); CollectionUtils.addAll(newLocated, locatedRepository.findAll()); - assertEquals(6, newLocated.size()); + assertEquals(oldLocated.size() + 1, newLocated.size()); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/BaseRepositoryTest.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/BaseRepositoryTest.java index 242a1e4..283e7b5 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/BaseRepositoryTest.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/BaseRepositoryTest.java @@ -1,10 +1,13 @@ package org.springframework.data.gremlin.object.core.repository; -import com.tinkerpop.blueprints.*; -import com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.util.Pipeline; -import org.junit.After; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -13,11 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.gremlin.object.core.TestService; import org.springframework.data.gremlin.object.core.domain.*; -import org.springframework.data.gremlin.object.core.domain.Address; -import org.springframework.data.gremlin.object.core.domain.Area; -import org.springframework.data.gremlin.object.core.domain.Located; -import org.springframework.data.gremlin.object.core.domain.Location; -import org.springframework.data.gremlin.object.core.domain.Person; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.TestExecutionListeners; @@ -30,8 +28,11 @@ import javax.script.ScriptException; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.Consumer; +import static org.apache.tinkerpop.gremlin.process.traversal.P.within; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -72,13 +73,20 @@ public void before() { Graph graph = factory.graph(); factory.beginTx(graph); - for (Vertex vertex : graph.getVertices()) { - graph.removeVertex(vertex); - } - - for (Edge edge : graph.getEdges()) { - graph.removeEdge(edge); - } + graph.vertices().forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + vertex.remove(); + } + }); + + + graph.edges().forEachRemaining(new Consumer() { + @Override + public void accept(Edge edge) { + edge.remove(); + } + }); factory.commitTx(graph); Address address = new Address(new Country("Australia"), "Newcastle", "Scenic Dr", new Area("2291")); @@ -116,27 +124,26 @@ public void before() { repository.save(lara); repository.save(new Person("Jake", "Webber", address, false)); repository.save(new Person("Sandra", "Ivanovic", new Address(new Country("Australia"), "Sydney", "Wilson St", new Area("2043")), false)); -// Graph graph = factory.graph(); - Likes like = new Likes(graham, lara); likesRepository.save(like); - Iterable addresses = graph.query().has("street").vertices(); + List addresses = graph.traversal().V().has("street").toList(); assertNotNull(addresses); for (Vertex addr : addresses) { assertNotNull(addr); - assertTrue(addr.getProperty("street").equals("Wilson St") || addr.getProperty("street").equals("Scenic Dr")); + String street = addr.value("street").toString(); + assertTrue(street.equals("Wilson St") || street.equals("Scenic Dr")); } ScriptEngine engine = new GremlinGroovyScriptEngine(); Bindings bindings = engine.createBindings(); - bindings.put("g", graph); + bindings.put("g", graph.traversal()); bindings.put("firstName", "Jake"); try { - Pipeline obj = (Pipeline) engine.eval("g.V().has('firstName', firstName)", bindings); + GraphTraversal obj = (GraphTraversal) engine.eval("g.V().has('firstName', firstName)", bindings); assertTrue(obj.hasNext()); Object o = obj.next(); assertNotNull(o); @@ -144,49 +151,40 @@ public void before() { e.printStackTrace(); } - GremlinPipeline pipe = new GremlinPipeline(graph).V().or(new GremlinPipeline().has("firstName", "Jake"), new GremlinPipeline().has("firstName", "Graham")); - assertTrue("No Jake or Graham in Pipe!", pipe.hasNext()); - for (Vertex obj : pipe) { - assertNotNull(obj); - assertTrue(obj.getProperty("firstName").equals("Graham") || obj.getProperty("firstName").equals("Jake")); - } + GraphTraversalSource source = graph.traversal(); - GremlinPipeline linkedPipe = new GremlinPipeline(graph).V().outE("lives_at").inV().has("city", "Newcastle"); + GraphTraversal pipe = source.V().has("firstName", within("Jake", "Graham")); - assertTrue("No lives_at in Pipe!", linkedPipe.hasNext()); - for (Element obj : linkedPipe) { + assertTrue("No Jake or Graham in Pipe!", pipe.hasNext()); + while (pipe.hasNext()) { + Vertex obj = pipe.next(); assertNotNull(obj); - assertTrue(obj.getProperty("city").equals("Newcastle")); + String firstName = obj.value("firstName").toString(); + assertTrue(firstName.equals("Graham") || firstName.equals("Jake")); } - GremlinPipeline likesPipe = new GremlinPipeline(graph).V().has("firstName", "Lara").inE("Likes"); + GraphTraversal linkedPipe = source.V().outE("lives_at").inV().has("city", "Newcastle"); - assertTrue("No likes in Pipe!", likesPipe.hasNext()); - for (Element obj : likesPipe) { + assertTrue("No lives_at in Pipe!", linkedPipe.hasNext()); + while (linkedPipe.hasNext()) { + Vertex obj = linkedPipe.next(); assertNotNull(obj); - Edge edge = (Edge)obj; - Vertex v = edge.getVertex(Direction.OUT); - assertTrue(v.getProperty("firstName").equals("Graham")); + assertTrue(obj.value("city").toString().equals("Newcastle")); } - factory.commitTx(graph); - } - -// @After - public void after() { + GraphTraversal likesPipe = source.V().has("firstName", "Lara").inE("Likes"); - Graph graph = factory.graph(); - factory.beginTx(graph); - for (Vertex vertex : graph.getVertices()) { - graph.removeVertex(vertex); + assertTrue("No likes in Pipe!", likesPipe.hasNext()); + while (likesPipe.hasNext()) { + Edge edge = likesPipe.next(); + assertNotNull(edge); + Vertex v = edge.outVertex(); + assertTrue(v.value("firstName").toString().equals("Graham")); } - for (Edge edge : graph.getEdges()) { - graph.removeEdge(edge); - } factory.commitTx(graph); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/LikesRepository.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/LikesRepository.java index 28d0665..f5323d1 100644 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/LikesRepository.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/LikesRepository.java @@ -19,7 +19,7 @@ public interface LikesRepository extends GremlinRepository { @Query(value = "graph.E().has('date')") List findByHasDate(); - @Query(value = "graph.V().has('firstName', ?).outE('Likes').as('x').inV.filter{it.firstName == ?}.back('x')") + @Query(value = "graph.V().has('firstName', ?).outE('Likes').as('x').inV().has('firstName', ?).select('x')") List findByLiking(String liker, String liked); diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/PersonRepository.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/PersonRepository.java index 4fc3af8..613b5a3 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/PersonRepository.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/core/repository/PersonRepository.java @@ -66,7 +66,7 @@ public interface PersonRepository extends GremlinRepository { Page findByLastName(String lastName, Pageable pageable); - @Query(value = "graph.V('lastName', ?)") + @Query(value = "graph.V().has('lastName', ?)") Page queryLastName(String lastName, Pageable pageable); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/BaseRepositoryTest.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/BaseRepositoryTest.java index 62f3bbf..7e2b4d9 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/BaseRepositoryTest.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/BaseRepositoryTest.java @@ -1,12 +1,12 @@ package org.springframework.data.gremlin.object.jpa.repository; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Graph; -import com.tinkerpop.blueprints.Vertex; -import com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.util.Pipeline; -import org.junit.After; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; +import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,11 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.gremlin.object.jpa.TestService; import org.springframework.data.gremlin.object.jpa.domain.*; -import org.springframework.data.gremlin.object.jpa.domain.Address; -import org.springframework.data.gremlin.object.jpa.domain.Area; -import org.springframework.data.gremlin.object.jpa.domain.Country; -import org.springframework.data.gremlin.object.jpa.domain.Location; -import org.springframework.data.gremlin.object.jpa.domain.Person; import org.springframework.data.gremlin.tx.GremlinGraphFactory; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.TestExecutionListeners; @@ -31,7 +26,9 @@ import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.Consumer; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -64,6 +61,24 @@ public abstract class BaseRepositoryTest { @Before public void before() { + Graph graph = factory.graph(); + factory.beginTx(graph); + graph.vertices().forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + vertex.remove(); + } + }); + + + graph.edges().forEachRemaining(new Consumer() { + @Override + public void accept(Edge edge) { + edge.remove(); + } + }); + factory.commitTx(graph); + Address address = new Address(new Country("Australia"), "Newcastle", "Scenic Dr", new Area("2291")); addressRepository.save(address); @@ -95,23 +110,23 @@ public void before() { repository.save(new Person("Lara", "Ivanovic", address, true)); repository.save(new Person("Jake", "Webber", address, false)); repository.save(new Person("Sandra", "Ivanovic", new Address(new Country("Australia"), "Sydney", "Wilson St", new Area("2043")), false)); - Graph graph = factory.graph(); - Iterable addresses = graph.query().has("street").vertices(); + + List addresses = graph.traversal().V().has("street").toList(); assertNotNull(addresses); for (Vertex addr : addresses) { assertNotNull(addr); - assertTrue(addr.getProperty("street").equals("Wilson St") || addr.getProperty("street").equals("Scenic Dr")); + assertTrue(addr.value("street").equals("Wilson St") || addr.value("street").equals("Scenic Dr")); } ScriptEngine engine = new GremlinGroovyScriptEngine(); Bindings bindings = engine.createBindings(); - bindings.put("g", graph); + bindings.put("g", graph.traversal()); bindings.put("firstName", "Jake"); try { - Pipeline obj = (Pipeline) engine.eval("g.V().has('firstName', firstName)", bindings); + GraphTraversal obj = (GraphTraversal) engine.eval("g.V().has('firstName', firstName)", bindings); assertTrue(obj.hasNext()); Object o = obj.next(); assertNotNull(o); @@ -119,37 +134,28 @@ public void before() { e.printStackTrace(); } - GremlinPipeline pipe = new GremlinPipeline(graph).V().or(new GremlinPipeline().has("firstName", "Jake"), new GremlinPipeline().has("firstName", "Graham")); + GraphTraversalSource source = graph.traversal(); + GraphTraversal pipe = source.V().has("firstName", P.within("Jake", "Graham")); assertTrue("No Jake or Graham in Pipe!", pipe.hasNext()); - for (Vertex obj : pipe) { + while (pipe.hasNext()) { + Vertex obj = pipe.next(); assertNotNull(obj); - assertTrue(obj.getProperty("firstName").equals("Graham") || obj.getProperty("firstName").equals("Jake")); + assertTrue(obj.value("firstName").equals("Graham") || obj.value("firstName").equals("Jake")); } - - GremlinPipeline linkedPipe = new GremlinPipeline(graph).V().outE("lives_at").inV().has("city", "Newcastle"); + GraphTraversal linkedPipe = source.V().outE("lives_at").inV().has("city", "Newcastle"); assertTrue("No lives_at in Pipe!", linkedPipe.hasNext()); - for (Element obj : linkedPipe) { + while (linkedPipe.hasNext()) { + Vertex obj = linkedPipe.next(); assertNotNull(obj); - assertTrue(obj.getProperty("city").equals("Newcastle")); + assertTrue(obj.value("city").equals("Newcastle")); } factory.commitTx(graph); } - @After - public void after() { - - Graph graph = factory.graph(); - factory.beginTx(graph); - for (Vertex vertex : graph.getVertices()) { - graph.removeVertex(vertex); - } - factory.commitTx(graph); - } - @Test public void should_autowire_repos() { assertNotNull(repository); diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/PersonRepository.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/PersonRepository.java index 9f0d61f..2af2e57 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/PersonRepository.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/jpa/repository/PersonRepository.java @@ -66,7 +66,7 @@ public interface PersonRepository extends GremlinRepository { Page findByLastName(String lastName, Pageable pageable); - @Query(value = "graph.V('lastName', ?)") + @Query(value = "graph.V().has('lastName', ?)") Page queryLastName(String lastName, Pageable pageable); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/BaseRepositoryTest.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/BaseRepositoryTest.java index 021f5e0..5f958ef 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/BaseRepositoryTest.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/BaseRepositoryTest.java @@ -1,10 +1,12 @@ package org.springframework.data.gremlin.object.neo4j.repository; -import com.tinkerpop.blueprints.*; -import com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.util.Pipeline; -import org.junit.After; +import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; +import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,7 +27,9 @@ import javax.script.ScriptException; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.Consumer; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -67,13 +71,20 @@ public void before() { Graph graph = factory.graph(); factory.beginTx(graph); - for (Vertex vertex : graph.getVertices()) { - graph.removeVertex(vertex); - } - - for (Edge edge : graph.getEdges()) { - graph.removeEdge(edge); - } + graph.vertices().forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + vertex.remove(); + } + }); + + + graph.edges().forEachRemaining(new Consumer() { + @Override + public void accept(Edge edge) { + edge.remove(); + } + }); factory.commitTx(graph); Address address = new Address("Australia", "Newcastle", "Scenic Dr", new Area("2291")); @@ -112,26 +123,26 @@ public void before() { repository.save(lara); repository.save(new Person("Jake", "Webber", address, false)); repository.save(new Person("Sandra", "Ivanovic", new Address("Australia", "Sydney", "Wilson St", new Area("2043")), false)); -// Graph graph = factory.graph(); + // Graph graph = factory.graph(); Likes like = new Likes(graham, lara); likesRepository.save(like); - Iterable addresses = graph.query().has("street").vertices(); + List addresses = graph.traversal().V().has("street").toList(); assertNotNull(addresses); for (Vertex addr : addresses) { assertNotNull(addr); - assertTrue(addr.getProperty("street").equals("Wilson St") || addr.getProperty("street").equals("Scenic Dr")); + assertTrue(addr.value("street").equals("Wilson St") || addr.value("street").equals("Scenic Dr")); } ScriptEngine engine = new GremlinGroovyScriptEngine(); Bindings bindings = engine.createBindings(); - bindings.put("g", graph); + bindings.put("g", graph.traversal()); bindings.put("firstName", "Jake"); try { - Pipeline obj = (Pipeline) engine.eval("g.V().has('firstName', firstName)", bindings); + GraphTraversal obj = (GraphTraversal) engine.eval("g.V().has('firstName', firstName)", bindings); assertTrue(obj.hasNext()); Object o = obj.next(); assertNotNull(o); @@ -139,48 +150,37 @@ public void before() { e.printStackTrace(); } - GremlinPipeline pipe = new GremlinPipeline(graph).V().or(new GremlinPipeline().has("firstName", "Jake"), new GremlinPipeline().has("firstName", "Graham")); + + GraphTraversalSource source = graph.traversal(); + GraphTraversal pipe = source.V().has("firstName", P.within( "Jake", "Graham")); assertTrue("No Jake or Graham in Pipe!", pipe.hasNext()); - for (Vertex obj : pipe) { + while (pipe.hasNext()) { + Vertex obj = pipe.next(); assertNotNull(obj); - assertTrue(obj.getProperty("firstName").equals("Graham") || obj.getProperty("firstName").equals("Jake")); + assertTrue(obj.value("firstName").equals("Graham") || obj.value("firstName").equals("Jake")); } - GremlinPipeline linkedPipe = new GremlinPipeline(graph).V().outE("lives_at").inV().has("city", "Newcastle"); + GraphTraversal linkedPipe = source.V().outE("lives_at").inV().has("city", "Newcastle"); assertTrue("No lives_at in Pipe!", linkedPipe.hasNext()); - for (Element obj : linkedPipe) { + while (linkedPipe.hasNext()) { + Vertex obj = linkedPipe.next(); assertNotNull(obj); - assertTrue(obj.getProperty("city").equals("Newcastle")); + assertTrue(obj.value("city").equals("Newcastle")); } - GremlinPipeline likesPipe = new GremlinPipeline(graph).V().has("firstName", "Lara").inE("Likes"); + GraphTraversal likesPipe = source.V().has("firstName", "Lara").inE("Likes"); assertTrue("No likes in Pipe!", likesPipe.hasNext()); - for (Element obj : likesPipe) { - assertNotNull(obj); - Edge edge = (Edge)obj; - Vertex v = edge.getVertex(Direction.OUT); - assertTrue(v.getProperty("firstName").equals("Graham")); - } - - factory.commitTx(graph); - } - -// @After - public void after() { - - Graph graph = factory.graph(); - factory.beginTx(graph); - for (Vertex vertex : graph.getVertices()) { - graph.removeVertex(vertex); + while (likesPipe.hasNext()) { + Edge edge = likesPipe.next(); + assertNotNull(edge); + Vertex v = edge.outVertex(); + assertTrue(v.value("firstName").equals("Graham")); } - for (Edge edge : graph.getEdges()) { - graph.removeEdge(edge); - } factory.commitTx(graph); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/LikesRepository.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/LikesRepository.java index 20561f7..7f4229d 100644 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/LikesRepository.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/LikesRepository.java @@ -15,7 +15,7 @@ public interface LikesRepository extends GremlinRepository { List findByPerson1_FirstName(String firstName); - @Query(value = "graph.V().has('firstName', ?).outE('Likes').as('x').inV.filter{it.firstName == ?}.back('x')") + @Query(value = "graph.V().has('firstName', ?).outE('Likes').as('x').inV().has(firstName,?).select('x')") List findByLiking(String liker, String liked); } diff --git a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/PersonRepository.java b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/PersonRepository.java index 3a56007..19454ff 100755 --- a/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/PersonRepository.java +++ b/spring-data-gremlin-test/src/main/java/org/springframework/data/gremlin/object/neo4j/repository/PersonRepository.java @@ -66,7 +66,7 @@ public interface PersonRepository extends GremlinRepository { Page findByLastName(String lastName, Pageable pageable); - @Query(value = "graph.V('lastName', ?)") + @Query(value = "graph.V().has('lastName', ?)") Page queryLastName(String lastName, Pageable pageable); } diff --git a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGraphAdapter.java b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGraphAdapter.java index dc4473e..02f920a 100644 --- a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGraphAdapter.java +++ b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGraphAdapter.java @@ -1,14 +1,14 @@ package org.springframework.data.gremlin.repository.tinker; -import com.tinkerpop.blueprints.Vertex; -import com.tinkerpop.blueprints.impls.tg.TinkerGraph; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.repository.GremlinGraphAdapter; import org.springframework.transaction.annotation.Transactional; /** - * Created by gman on 27/06/15. + * Created by gman on 27/06/15.. */ public class TinkerGraphAdapter extends GremlinGraphAdapter { @@ -17,8 +17,7 @@ public class TinkerGraphAdapter extends GremlinGraphAdapter { @Override @Transactional(readOnly = false) public Vertex createVertex(TinkerGraph graph, String className) { - Vertex vertex = graph.addVertex(null); - vertex.setProperty("label", className); + Vertex vertex = graph.addVertex(className); return vertex; } diff --git a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGremlinRepository.java b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGremlinRepository.java index e856415..335ef4d 100644 --- a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGremlinRepository.java +++ b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/repository/tinker/TinkerGremlinRepository.java @@ -1,8 +1,8 @@ package org.springframework.data.gremlin.repository.tinker; -import com.tinkerpop.blueprints.Edge; -import com.tinkerpop.blueprints.Element; -import com.tinkerpop.blueprints.Vertex; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -17,9 +17,10 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; /** - * Titan specific extension of the {@link SimpleGremlinRepository} providing custom implementations of {@code count()}, {@code deleteAll()}, + * Tinker specific extension of the {@link SimpleGremlinRepository} providing custom implementations of {@code count()}, {@code deleteAll()}, * {@code findAll(Pageable)} and {@code findAll()}. * * @author Gman @@ -92,18 +93,25 @@ public Iterable findAllElementsForSchema() { } public Iterable findALlVerticiesForSchema() { - List result = new ArrayList<>(); - for (Vertex vertex : graphFactory.graph().getVertices("label", schema.getClassName())) { - result.add(vertex); - } + final List result = new ArrayList<>(); + graphFactory.graph().traversal().V().hasLabel(schema.getClassName()).forEachRemaining(new Consumer() { + @Override + public void accept(Vertex vertex) { + + result.add(vertex); + } + }); return result; } public Iterable findAllEdgesForSchema() { - List result = new ArrayList<>(); - for (Edge edge : graphFactory.graph().getEdges("label", schema.getClassName())) { - result.add(edge); - } + final List result = new ArrayList<>(); + graphFactory.graph().traversal().E().hasLabel(schema.getClassName()).forEachRemaining(new Consumer() { + @Override + public void accept(Edge edge) { + result.add(edge); + } + }); return result; } diff --git a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/tx/tinker/TinkerGremlinGraphFactory.java b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/tx/tinker/TinkerGremlinGraphFactory.java index 81fd76c..2e131b8 100644 --- a/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/tx/tinker/TinkerGremlinGraphFactory.java +++ b/spring-data-gremlin-tinker/src/main/java/org/springframework/data/gremlin/tx/tinker/TinkerGremlinGraphFactory.java @@ -1,13 +1,13 @@ package org.springframework.data.gremlin.tx.tinker; - -import com.tinkerpop.blueprints.impls.tg.TinkerGraph; +import org.apache.commons.configuration.BaseConfiguration; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.gremlin.tx.AbstractGremlinGraphFactory; /** - * An {@link AbstractGremlinGraphFactory} for OrentDB providing an {@link TinkerGraph} implementation of {@link com.tinkerpop.blueprints.Graph}. + * An {@link AbstractGremlinGraphFactory} for OrentDB providing an {@link TinkerGraph} implementation of {@link org.apache.tinkerpop.gremlin.structure.Graph}. * * @author Gman */ @@ -19,7 +19,9 @@ public class TinkerGremlinGraphFactory extends AbstractGremlinGraphFactory { - - private static final Logger LOGGER = LoggerFactory.getLogger(TitanGraphAdapter.class); - - @Override - @Transactional(readOnly = false) - public Vertex createVertex(TitanGraph graph, String className) { - Vertex vertex = graph.addVertexWithLabel(className); - return vertex; - } - -} diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_AddressRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_AddressRepositoryTest.java deleted file mode 100644 index de2ec3b..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_AddressRepositoryTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.core; - -import org.springframework.data.gremlin.object.core.repository.AbstractAddressRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_Core_TestConfiguration.class) -public class Titan_Core_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_EdgeRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_EdgeRepositoryTest.java deleted file mode 100644 index 001b7d1..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_EdgeRepositoryTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.core; - -import org.springframework.data.gremlin.object.core.repository.AbstractEdgeRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_Core_TestConfiguration.class) -public class Titan_Core_EdgeRepositoryTest extends AbstractEdgeRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TransactionRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TransactionRepositoryTest.java deleted file mode 100644 index 3f84f2a..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/core/Titan_Core_TransactionRepositoryTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.core; - -import org.springframework.data.gremlin.object.core.repository.AbstractTransactionRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_Core_TestConfiguration.class) -@SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_Core_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { - -} diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_AddressRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_AddressRepositoryTest.java deleted file mode 100644 index 07cfe96..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_AddressRepositoryTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.jpa; - -import org.springframework.data.gremlin.object.jpa.repository.AbstractAddressRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_JPA_TestConfiguration.class) -public class Titan_JPA_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TransactionRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TransactionRepositoryTest.java deleted file mode 100644 index 4de78f3..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/jpa/Titan_JPA_TransactionRepositoryTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.jpa; - -import org.springframework.data.gremlin.object.jpa.repository.AbstractTransactionRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_JPA_TestConfiguration.class) -@SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_JPA_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { - -} diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_AddressRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_AddressRepositoryTest.java deleted file mode 100644 index 400c143..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_AddressRepositoryTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.neo4j; - -import org.springframework.data.gremlin.object.neo4j.repository.AbstractAddressRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_Neo4j_TestConfiguration.class) -public class Titan_Neo4j_AddressRepositoryTest extends AbstractAddressRepositoryTest { } diff --git a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TransactionRepositoryTest.java b/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TransactionRepositoryTest.java deleted file mode 100644 index 4df13be..0000000 --- a/spring-data-gremlin-titan/src/test/java/org/springframework/data/gremlin/object/tests/titan/neo4j/Titan_Neo4j_TransactionRepositoryTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.data.gremlin.object.tests.titan.neo4j; - -import org.springframework.data.gremlin.object.neo4j.repository.AbstractTransactionRepositoryTest; -import org.springframework.test.context.ContextConfiguration; - -/** - * Created by gman on 24/06/15. - */ -@ContextConfiguration(classes = Titan_Neo4j_TestConfiguration.class) -@SuppressWarnings("SpringJavaAutowiringInspection") -public class Titan_Neo4j_TransactionRepositoryTest extends AbstractTransactionRepositoryTest { - -}