@Override public Set<TraverserRequirement> getRequirements() { return this.getSelfAndChildRequirements(); } }
@Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); integrateChild(this.notTraversal); }
@Override public void apply(final Traversal.Admin<?, ?> traversal) { //Only optimize SqlgGraph. StarGraph also passes through here. if (!(traversal.getGraph().orElseThrow(IllegalStateException::new) instanceof SqlgGraph)) { return; } if (!SqlgTraversalUtil.mayOptimize(traversal)) { return; } List<NotStep> notSteps = TraversalHelper.getStepsOfAssignableClass(NotStep.class, traversal); //noinspection unchecked for (NotStep<S> notStep : notSteps) { //reducing barrier steps like count does not work with Sqlg's barrier optimizations List<ReducingBarrierStep> reducingBarrierSteps = TraversalHelper.getStepsOfAssignableClassRecursively(ReducingBarrierStep.class, traversal); if (!reducingBarrierSteps.isEmpty()) { return; } SqlgNotStepBarrier<S> sqlgNotStepBarrier = new SqlgNotStepBarrier<>(traversal, notStep.getLocalChildren().get(0)); for (String label : notStep.getLabels()) { sqlgNotStepBarrier.addLabel(label); } TraversalHelper.replaceStep( notStep, sqlgNotStepBarrier, notStep.getTraversal() ); } }
/** * Removes objects from the traversal stream when the traversal provided as an argument does not return any objects. * * @param notTraversal the traversal to filter by. * @return the traversal with an appended {@link NotStep}. * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#not-step" target="_blank">Reference Documentation - Not Step</a> * @since 3.0.0-incubating */ public default GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) { this.asAdmin().getBytecode().addStep(Symbols.not, notTraversal); return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), (Traversal<E, ?>) notTraversal)); }
/** * if this is a hasNot(property) step, returns the property key, otherwise returns null * * @param currentStep the step * @return the property which should be not null */ private String isNullStep(Step<?, ?> currentStep) { if (currentStep instanceof NotStep<?>) { NotStep<?> tfs = (NotStep<?>) currentStep; List<?> c = tfs.getLocalChildren(); if (c != null && c.size() == 1) { Traversal.Admin<?, ?> a = (Traversal.Admin<?, ?>) c.iterator().next(); Step<?, ?> s = a.getEndStep(); if (a.getSteps().size() == 1 && s instanceof PropertiesStep<?>) { PropertiesStep<?> ps = (PropertiesStep<?>) s; String[] keys = ps.getPropertyKeys(); if (keys != null && keys.length == 1) { return keys[0]; } } } } return null; }
@Override public void apply(final Traversal.Admin<?, ?> traversal) { //Only optimize SqlgGraph. StarGraph also passes through here. if (!(traversal.getGraph().orElseThrow(IllegalStateException::new) instanceof SqlgGraph)) { return; } if (!SqlgTraversalUtil.mayOptimize(traversal)) { return; } List<NotStep> notSteps = TraversalHelper.getStepsOfAssignableClass(NotStep.class, traversal); //noinspection unchecked for (NotStep<S> notStep : notSteps) { //reducing barrier steps like count does not work with Sqlg's barrier optimizations List<ReducingBarrierStep> reducingBarrierSteps = TraversalHelper.getStepsOfAssignableClassRecursively(ReducingBarrierStep.class, traversal); if (!reducingBarrierSteps.isEmpty()) { return; } SqlgNotStepBarrier<S> sqlgNotStepBarrier = new SqlgNotStepBarrier<>(traversal, notStep.getLocalChildren().get(0)); for (String label : notStep.getLabels()) { sqlgNotStepBarrier.addLabel(label); } TraversalHelper.replaceStep( notStep, sqlgNotStepBarrier, notStep.getTraversal() ); } }
/** * Filters vertices, edges and vertex properties based on the non-existence of properties. * * @param propertyKey the key of the property to filter on for existence * @return the traversal with an appended {@link HasStep} * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#has-step" target="_blank">Reference Documentation - Has Step</a> * @since 3.0.0-incubating */ public default GraphTraversal<S, E> hasNot(final String propertyKey) { this.asAdmin().getBytecode().addStep(Symbols.hasNot, propertyKey); return this.asAdmin().addStep(new NotStep(this.asAdmin(), __.values(propertyKey))); }
/** * if this is a hasNot(property) step, returns the property key, otherwise returns null * * @param currentStep the step * @return the property which should be not null */ private String isNullStep(Step<?, ?> currentStep) { if (currentStep instanceof NotStep<?>) { NotStep<?> tfs = (NotStep<?>) currentStep; List<?> c = tfs.getLocalChildren(); if (c != null && c.size() == 1) { Traversal.Admin<?, ?> a = (Traversal.Admin<?, ?>) c.iterator().next(); Step<?, ?> s = a.getEndStep(); if (a.getSteps().size() == 1 && s instanceof PropertiesStep<?>) { PropertiesStep<?> ps = (PropertiesStep<?>) s; String[] keys = ps.getPropertyKeys(); if (keys != null && keys.length == 1) { return keys[0]; } } } } return null; }
final Step<?, ?> filterStep = parent.asStep(); final Traversal.Admin parentTraversal = filterStep.getTraversal(); final Step notStep = new NotStep<>(parentTraversal, traversal.getSteps().isEmpty() ? __.identity() : traversal); filterStep.getLabels().forEach(notStep::addLabel); TraversalHelper.replaceStep(prev, new NotStep<>(traversal, inner), traversal); else traversal.asAdmin().addStep(new NotStep<>(traversal, inner));
public NotStep(final Traversal.Admin traversal, final Traversal<S, ?> notTraversal) { super(traversal); this.notTraversal = this.integrateChild(notTraversal.asAdmin()); }
@Override public Set<TraverserRequirement> getRequirements() { return this.getSelfAndChildRequirements(); } }
/** * Removes objects from the traversal stream when the traversal provided as an argument does not return any objects. * * @param notTraversal the traversal to filter by. * @return the traversal with an appended {@link NotStep}. * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#not-step" target="_blank">Reference Documentation - Not Step</a> * @since 3.0.0-incubating */ public default GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) { this.asAdmin().getBytecode().addStep(Symbols.not, notTraversal); return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), (Traversal<E, ?>) notTraversal)); }
@Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); integrateChild(this.notTraversal); }
/** * Filters vertices, edges and vertex properties based on the non-existence of properties. * * @param propertyKey the key of the property to filter on for existence * @return the traversal with an appended {@link HasStep} * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#has-step" target="_blank">Reference Documentation - Has Step</a> * @since 3.0.0-incubating */ public default GraphTraversal<S, E> hasNot(final String propertyKey) { this.asAdmin().getBytecode().addStep(Symbols.hasNot, propertyKey); return this.asAdmin().addStep(new NotStep(this.asAdmin(), __.values(propertyKey))); }
public NotStep(final Traversal.Admin traversal, final Traversal<S, ?> notTraversal) { super(traversal); this.notTraversal = this.integrateChild(notTraversal.asAdmin()); }
final Step<?, ?> filterStep = parent.asStep(); final Traversal.Admin parentTraversal = filterStep.getTraversal(); final Step notStep = new NotStep<>(parentTraversal, traversal.getSteps().isEmpty() ? __.identity() : traversal); filterStep.getLabels().forEach(notStep::addLabel); TraversalHelper.replaceStep(prev, new NotStep<>(traversal, inner), traversal); else traversal.asAdmin().addStep(new NotStep<>(traversal, inner));