Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1456 5fc2163df -> beaf5208d
added ClassFilterStep which checks the class type of a traverser object. this is an internal utility class not exposed at the GraphTraversal level. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/beaf5208 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/beaf5208 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/beaf5208 Branch: refs/heads/TINKERPOP-1456 Commit: beaf5208ddafd90277e9c5b0f28074cf0b8cb6d4 Parents: 5fc2163 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Wed Sep 21 11:48:33 2016 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Wed Sep 21 11:48:33 2016 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../traversal/step/filter/ClassFilterStep.java | 54 ++++++++++++++++++++ .../strategy/decoration/SubgraphStrategy.java | 5 +- 3 files changed, 57 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/beaf5208/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 4c94aad..edc479f 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -29,6 +29,7 @@ TinkerPop 3.2.3 (Release Date: NOT OFFICIALLY RELEASED YET) * Fixed a bug in `TraversalVertexProgram` (OLAP) around ordering and connectives (i.e. `and()` and `or()`). * Added `AbstractGremlinProcessTest.checkOrderedResults()` to make testing ordered results easier. * `AbstractLambdaTraversal` now supports a `bypassTraversal` and thus, it is possible for strategies to redefine such lambda traversals. +* Added an internal utility `ClassFilterStep` which determines if the traverser object's class is an instance of the provided class. * `SubgraphStrategy` no longer `filter()`-wraps if the criteria is a chain of filters or connectives. * `SubgraphStrategy` now supports vertex property filtering. * Fixed a bug in Gremlin-Python `P` where predicates reversed the order of the predicates. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/beaf5208/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ClassFilterStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ClassFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ClassFilterStep.java new file mode 100644 index 0000000..1652005 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ClassFilterStep.java @@ -0,0 +1,54 @@ +/* + * 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.process.traversal.step.filter; + +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import org.apache.tinkerpop.gremlin.structure.util.StringFactory; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class ClassFilterStep<S, T> extends FilterStep<S> { + + private final Class<T> classFilter; + private final boolean isInstanceCheck; + + public ClassFilterStep(final Traversal.Admin traversal, final Class<T> classFilter, final boolean isInstanceCheck) { + super(traversal); + this.classFilter = classFilter; + this.isInstanceCheck = isInstanceCheck; + } + + public boolean filter(final Traverser.Admin<S> traverser) { + return !(this.isInstanceCheck ? + this.classFilter.isInstance(traverser.get()) : + this.classFilter.equals(traverser.get().getClass())); + + } + + public int hashCode() { + return super.hashCode() ^ this.classFilter.hashCode() + Boolean.valueOf(this.isInstanceCheck).hashCode(); + } + + public String toString() { + return StringFactory.stepString(this, this.classFilter); + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/beaf5208/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java index de7649d..5e92bc1 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java @@ -24,9 +24,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ClassFilterStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep; @@ -216,13 +216,12 @@ public final class SubgraphStrategy extends AbstractTraversalStrategy<TraversalS // turn g.V().values() to g.V().properties().xxx.value()\ if (null != this.vertexPropertyCriterion) { final OrStep<Object> wrappedCriterion = new OrStep(traversal, - new DefaultTraversal<>().addStep(new LambdaFilterStep<>(traversal, t -> !(t.get() instanceof VertexProperty))), + new DefaultTraversal<>().addStep(new ClassFilterStep<>(traversal, VertexProperty.class, true)), this.vertexPropertyCriterionIsAllFilter ? this.vertexPropertyCriterion.clone() : new DefaultTraversal<>().addStep(new TraversalFilterStep<>(traversal, this.vertexPropertyCriterion.clone()))); // turn all ElementValueTraversals into filters for (final Step<?, ?> step : traversal.getSteps()) { - // gremlin> g.V().local(properties('name','stateOfMind').group().by(key()).by(value().fold())) if (step instanceof TraversalParent) { Stream.concat(((TraversalParent) step).getGlobalChildren().stream(), ((TraversalParent) step).getLocalChildren().stream()) .filter(t -> t instanceof ElementValueTraversal)