You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/06/04 12:15:30 UTC

[16/43] incubator-tinkerpop git commit: added LabelP which is a Predicate for checking Neo4j labels (multi-labels).

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/preprocessor
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");