You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/03 06:02:52 UTC
incubator-tinkerpop git commit: added LabelP which is a Predicate for
checking Neo4j labels (multi-labels).
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 1140dd858 -> cf96f646b
added LabelP which is a Predicate for checking Neo4j labels (multi-labels).
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/cf96f646
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/cf96f646
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/cf96f646
Branch: refs/heads/master
Commit: cf96f646be5e2249fc8e39ad0099d23d81e40337
Parents: 1140dd8
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Jun 2 22:02:45 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Jun 2 22:02:45 2015 -0600
----------------------------------------------------------------------
.../neo4j/groovy/plugin/Neo4jGremlinPlugin.java | 2 +
.../gremlin/neo4j/process/traversal/LabelP.java | 59 ++++++++++++++++++++
.../structure/trait/MultiMetaNeo4jTrait.java | 12 +++-
.../trait/NoMultiNoMetaNeo4jTrait.java | 12 +++-
.../structure/NativeNeo4jStructureTest.java | 46 +++++++++++++++
5 files changed, 127 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf96f646/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java
index b76c5dd..f3fe37c 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.groovy.plugin.AbstractGremlinPlugin;
import org.apache.tinkerpop.gremlin.groovy.plugin.IllegalEnvironmentException;
import org.apache.tinkerpop.gremlin.groovy.plugin.PluginAcceptor;
import org.apache.tinkerpop.gremlin.groovy.plugin.PluginInitializationException;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
import java.util.HashSet;
@@ -34,6 +35,7 @@ public final class Neo4jGremlinPlugin extends AbstractGremlinPlugin {
private static final Set<String> IMPORTS = new HashSet<String>() {{
add(IMPORT_SPACE + Neo4jGraph.class.getPackage().getName() + DOT_STAR);
+ add(IMPORT_STATIC_SPACE + LabelP.class.getCanonicalName() + DOT_STAR);
}};
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf96f646/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/LabelP.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/LabelP.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/LabelP.java
new file mode 100644
index 0000000..57bb11a
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/LabelP.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one
+ * * or more contributor license agreements. See the NOTICE file
+ * * distributed with this work for additional information
+ * * regarding copyright ownership. The ASF licenses this file
+ * * to you under the Apache License, Version 2.0 (the
+ * * "License"); you may not use this file except in compliance
+ * * with the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing,
+ * * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * * KIND, either express or implied. See the License for the
+ * * specific language governing permissions and limitations
+ * * under the License.
+ *
+ */
+
+package org.apache.tinkerpop.gremlin.neo4j.process.traversal;
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+
+import java.io.Serializable;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LabelP extends P<String> {
+
+ private LabelP(final String label) {
+ super(LabelBiPredicate.instance(), label);
+ }
+
+ public static P<String> of(final String label) {
+ return new LabelP(label);
+ }
+
+ public static final class LabelBiPredicate implements BiPredicate<String, String>, Serializable {
+
+ private static final LabelBiPredicate INSTANCE = new LabelBiPredicate();
+
+ private LabelBiPredicate() {
+ }
+
+ @Override
+ public boolean test(final String labels, final String checkLabel) {
+ return labels.contains(checkLabel);
+ }
+
+ public static LabelBiPredicate instance() {
+ return INSTANCE;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf96f646/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/MultiMetaNeo4jTrait.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/MultiMetaNeo4jTrait.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/MultiMetaNeo4jTrait.java
index 115dde6..c84b32d 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/MultiMetaNeo4jTrait.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/MultiMetaNeo4jTrait.java
@@ -21,6 +21,7 @@
package org.apache.tinkerpop.gremlin.neo4j.structure.trait;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jHelper;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jProperty;
@@ -52,7 +53,7 @@ import java.util.stream.Stream;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class MultiMetaNeo4jTrait implements Neo4jTrait {
+public final class MultiMetaNeo4jTrait implements Neo4jTrait {
private static final MultiMetaNeo4jTrait INSTANCE = new MultiMetaNeo4jTrait();
@@ -271,11 +272,18 @@ public class MultiMetaNeo4jTrait implements Neo4jTrait {
////// do index lookups //////
graph.tx().readWrite();
// get a label being search on
- final Optional<String> label = hasContainers.stream()
+ Optional<String> label = hasContainers.stream()
.filter(hasContainer -> hasContainer.getKey().equals(T.label.getAccessor()))
.filter(hasContainer -> Compare.eq == hasContainer.getBiPredicate())
.map(hasContainer -> (String) hasContainer.getValue())
.findAny();
+ if (!label.isPresent())
+ label = hasContainers.stream()
+ .filter(hasContainer -> hasContainer.getKey().equals(T.label.getAccessor()))
+ .filter(hasContainer -> hasContainer.getPredicate() instanceof LabelP)
+ .map(hasContainer -> (String) hasContainer.getValue())
+ .findAny();
+
if (label.isPresent()) {
// find a vertex by label and key/value
for (final HasContainer hasContainer : hasContainers) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf96f646/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/NoMultiNoMetaNeo4jTrait.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/NoMultiNoMetaNeo4jTrait.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/NoMultiNoMetaNeo4jTrait.java
index 217a815..6a2dca1 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/NoMultiNoMetaNeo4jTrait.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/trait/NoMultiNoMetaNeo4jTrait.java
@@ -21,6 +21,7 @@
package org.apache.tinkerpop.gremlin.neo4j.structure.trait;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jHelper;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
@@ -45,7 +46,7 @@ import java.util.function.Predicate;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class NoMultiNoMetaNeo4jTrait implements Neo4jTrait {
+public final class NoMultiNoMetaNeo4jTrait implements Neo4jTrait {
private static final NoMultiNoMetaNeo4jTrait INSTANCE = new NoMultiNoMetaNeo4jTrait();
@@ -156,11 +157,18 @@ public class NoMultiNoMetaNeo4jTrait implements Neo4jTrait {
////// do index lookups //////
graph.tx().readWrite();
// get a label being search on
- final Optional<String> label = hasContainers.stream()
+ Optional<String> label = hasContainers.stream()
.filter(hasContainer -> hasContainer.getKey().equals(T.label.getAccessor()))
.filter(hasContainer -> Compare.eq == hasContainer.getBiPredicate())
.map(hasContainer -> (String) hasContainer.getValue())
.findAny();
+ if (!label.isPresent())
+ label = hasContainers.stream()
+ .filter(hasContainer -> hasContainer.getKey().equals(T.label.getAccessor()))
+ .filter(hasContainer -> hasContainer.getPredicate() instanceof LabelP)
+ .map(hasContainer -> (String) hasContainer.getValue())
+ .findAny();
+
if (label.isPresent()) {
// find a vertex by label and key/value
for (final HasContainer hasContainer : hasContainers) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf96f646/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureTest.java
index 60b68f6..f467f32 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureTest.java
@@ -24,6 +24,7 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
import org.apache.tinkerpop.gremlin.neo4j.AbstractNeo4jGremlinTest;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP;
import org.apache.tinkerpop.gremlin.neo4j.structure.trait.MultiMetaNeo4jTrait;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
@@ -58,6 +59,51 @@ public class NativeNeo4jStructureTest extends AbstractNeo4jGremlinTest {
}
@Test
+ public void shouldSupportHasContainersWithMultiLabels() throws Exception {
+ final Neo4jVertex vertex = (Neo4jVertex) this.graph.addVertex(T.label,"person","name","marko");
+ graph.tx().commit();
+ assertTrue(g.V().has(T.label, "person").hasNext());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("person")).values("name").next());
+ assertEquals("marko", g.V().has(T.label, "person").values("name").next());
+ // more labels
+ vertex.addLabel("animal");
+ vertex.addLabel("object");
+ graph.tx().commit();
+ // no indices (neo4j graph step)
+ assertFalse(g.V().has(T.label, "person").hasNext());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("person")).values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("animal")).values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("object")).values("name").next());
+ // no indices (has step)
+ assertFalse(g.V().as("a").select("a").has(T.label, "person").hasNext());
+ assertEquals("marko", g.V().as("a").select("a").has(T.label, LabelP.of("person")).values("name").next());
+ assertEquals("marko", g.V().as("a").select("a").has(T.label, LabelP.of("animal")).values("name").next());
+ assertEquals("marko", g.V().as("a").select("a").has(T.label, LabelP.of("object")).values("name").next());
+ // indices (neo4j graph step)
+ this.getGraph().cypher("CREATE INDEX ON :person(name)").iterate();
+ graph.tx().commit();
+ Thread.sleep(500);
+ assertFalse(g.V().has(T.label, "person").has("name", "marko").hasNext());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("person")).has("name", "marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("animal")).has("name","marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("object")).has("name","marko").values("name").next());
+ this.getGraph().cypher("CREATE INDEX ON :animal(name)").iterate();
+ graph.tx().commit();
+ Thread.sleep(500);
+ assertFalse(g.V().has(T.label, "animal").has("name", "marko").hasNext());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("person")).has("name", "marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("animal")).has("name","marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("object")).has("name","marko").values("name").next());
+ this.getGraph().cypher("CREATE INDEX ON :object(name)").iterate();
+ graph.tx().commit();
+ Thread.sleep(500);
+ assertFalse(g.V().has(T.label, "object").has("name", "marko").hasNext());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("person")).has("name", "marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("animal")).has("name","marko").values("name").next());
+ assertEquals("marko", g.V().has(T.label, LabelP.of("object")).has("name","marko").values("name").next());
+ }
+
+ @Test
public void shouldNotThrowConcurrentModificationException() {
this.graph.addVertex("name", "a");
this.graph.addVertex("name", "b");