Found an ancient bug in B_LP_O_S_SE_SL_Traverser that only reared its ugly head with how LABELED_PATH requirements are now computed. Bug fixed and optimized LABELED_PATH requirment analysis.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8ac09c88 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8ac09c88 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8ac09c88 Branch: refs/heads/master Commit: 8ac09c8866df1bbbe23576b07bfda6820ba60c07 Parents: af5f336 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Wed Mar 29 11:41:31 2017 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Wed Mar 29 11:41:31 2017 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../traversal/traverser/B_LP_O_S_SE_SL_Traverser.java | 2 +- .../gremlin/process/traversal/util/DefaultTraversal.java | 2 +- .../gremlin/process/traversal/util/TraversalHelper.java | 9 ++++++--- 4 files changed, 9 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ac09c88/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 5731497..78055af 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Fixed a `NullPointerException` bug in `B_LP_O_S_SE_SL_Traverser`. * `PathRetractionStrategy` now uses the marker-model to reduce recursive lookups of invalidating steps. * `ProfileStrategy` now uses the marker-model to reduce recursive lookups of `ProfileSideEffectStep`. * `Mutating` steps now implement `Scoping` interface. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ac09c88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java index fc16366..74a049c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java @@ -121,7 +121,7 @@ public class B_LP_O_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> { && ((B_LP_O_S_SE_SL_Traverser) object).t.equals(this.t) && ((B_LP_O_S_SE_SL_Traverser) object).future.equals(this.future) && ((B_LP_O_S_SE_SL_Traverser) object).loops == this.loops - && (null == this.sack || null != this.sideEffects.getSackMerger()) + && (null == this.sack || (null != this.sideEffects && null != this.sideEffects.getSackMerger())) // hmmm... serialization in OLAP destroys the transient sideEffects && ((B_LP_O_S_SE_SL_Traverser) object).path.popEquals(Pop.last, this.path); // this should be Pop.all? } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ac09c88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java index c0e54db..c8f4b24 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java @@ -147,7 +147,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { for (final Step<?, ?> step : this.getSteps()) { this.requirements.addAll(step.getRequirements()); } - if (TraversalHelper.hasLabels(this)) + if (!this.requirements.contains(TraverserRequirement.LABELED_PATH) && TraversalHelper.hasLabels(this)) this.requirements.add(TraverserRequirement.LABELED_PATH); if (!this.getSideEffects().keys().isEmpty()) this.requirements.add(TraverserRequirement.SIDE_EFFECTS); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8ac09c88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java index 95862d0..de4e36f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java @@ -45,6 +45,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; @@ -435,7 +436,7 @@ public final class TraversalHelper { * Determine if any child step of a {@link TraversalParent} match the step given the provided {@link Predicate}. * * @param predicate the match function - * @param step the step to perform the action on + * @param step the step to perform the action on * @return {@code true} if there is a match and {@code false} otherwise */ public static boolean anyStepRecursively(final Predicate<Step> predicate, final TraversalParent step) { @@ -552,8 +553,10 @@ public final class TraversalHelper { public static boolean hasLabels(final Traversal.Admin<?, ?> traversal) { for (final Step<?, ?> step : traversal.getSteps()) { - if (!step.getLabels().isEmpty()) - return true; + for (final String label : step.getLabels()) { + if (!Graph.Hidden.isHidden(label)) + return true; + } if (step instanceof TraversalParent) { for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) { if (TraversalHelper.hasLabels(local))