use of org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder in project janusgraph by JanusGraph.
the class HasStepFolder method foldInIds.
static void foldInIds(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
Step<?, ?> currentStep = janusgraphStep.getNextStep();
while (true) {
if (currentStep instanceof HasContainerHolder) {
final HasContainerHolder hasContainerHolder = (HasContainerHolder) currentStep;
final GraphStep graphStep = (GraphStep) janusgraphStep;
// HasContainer collection that we get back is immutable so we keep track of which containers
// need to be deleted after they've been folded into the JanusGraphStep and then remove them from their
// step using HasContainer.removeHasContainer
final List<HasContainer> removableHasContainers = new ArrayList<>();
final Set<String> stepLabels = currentStep.getLabels();
hasContainerHolder.getHasContainers().forEach(hasContainer -> {
if (GraphStep.processHasContainerIds(graphStep, hasContainer)) {
stepLabels.forEach(janusgraphStep::addLabel);
// this has container is no longer needed because its ids will be folded into the JanusGraphStep
removableHasContainers.add(hasContainer);
}
});
if (!removableHasContainers.isEmpty()) {
removableHasContainers.forEach(hasContainerHolder::removeHasContainer);
}
// if all has containers have been removed, the current step can be removed
if (hasContainerHolder.getHasContainers().isEmpty()) {
traversal.removeStep(currentStep);
}
} else if (currentStep instanceof IdentityStep) {
// do nothing, has no impact
} else if (currentStep instanceof NoOpBarrierStep) {
// do nothing, has no impact
} else {
break;
}
currentStep = currentStep.getNextStep();
}
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder in project unipop by unipop-graph.
the class PredicatesUtil method collectPredicates.
public static void collectPredicates(ReceivesPredicatesHolder step, Traversal.Admin traversal) {
Step nextStep = step.getNextStep();
Set<PredicatesHolder> predicates = new HashSet<>();
while (true) {
if (nextStep instanceof HasContainerHolder) {
HasContainerHolder hasContainerHolder = (HasContainerHolder) nextStep;
hasContainerHolder.getHasContainers().stream().map(PredicatesHolderFactory::predicate).forEach(predicates::add);
traversal.removeStep(nextStep);
if (collectLabels(nextStep, step))
break;
} else // }
if (nextStep instanceof RangeGlobalStep) {
RangeGlobalStep rangeGlobalStep = (RangeGlobalStep) nextStep;
int limit = rangeGlobalStep.getHighRange() > Integer.MAX_VALUE ? -1 : (int) rangeGlobalStep.getHighRange();
step.setLimit(limit);
collectLabels(nextStep, step);
break;
} else {
break;
}
nextStep = nextStep.getNextStep();
}
PredicatesHolder predicate = PredicatesHolderFactory.and(predicates);
step.addPredicate(predicate);
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder in project sqlg by pietermartin.
the class BaseStrategy method handleHasSteps.
protected void handleHasSteps(ListIterator<Step<?, ?>> iterator, int pathCount) {
// Collect the hasSteps
int countToGoPrevious = 0;
while (iterator.hasNext()) {
Step<?, ?> currentStep = iterator.next();
countToGoPrevious++;
String notNullKey;
String nullKey;
if (currentStep instanceof HasContainerHolder) {
HasContainerHolder hasContainerHolder = (HasContainerHolder) currentStep;
List<HasContainer> hasContainers = hasContainerHolder.getHasContainers();
List<HasContainer> toRemoveHasContainers = new ArrayList<>();
if (isNotWithMultipleColumnValue(hasContainerHolder)) {
toRemoveHasContainers.addAll(optimizeLabelHas(this.currentReplacedStep, hasContainers));
// important to do optimizeIdHas after optimizeLabelHas as it might add its labels to the previous labelHasContainers labels.
// i.e. for neq and without 'or' logic
toRemoveHasContainers.addAll(optimizeIdHas(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeHas(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeWithInOut(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeBetween(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeInside(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeOutside(this.currentReplacedStep, hasContainers));
toRemoveHasContainers.addAll(optimizeTextContains(this.currentReplacedStep, hasContainers));
if (toRemoveHasContainers.size() == hasContainers.size()) {
if (!currentStep.getLabels().isEmpty()) {
final IdentityStep identityStep = new IdentityStep<>(this.traversal);
currentStep.getLabels().forEach(label -> this.currentReplacedStep.addLabel(pathCount + BaseStrategy.PATH_LABEL_SUFFIX + label));
TraversalHelper.insertAfterStep(identityStep, currentStep, this.traversal);
}
if (this.traversal.getSteps().contains(currentStep)) {
this.traversal.removeStep(currentStep);
}
iterator.remove();
countToGoPrevious--;
}
}
} else if ((notNullKey = isNotNullStep(currentStep)) != null) {
this.currentReplacedStep.addHasContainer(new HasContainer(notNullKey, new P<>(Existence.NOTNULL, null)));
if (!currentStep.getLabels().isEmpty()) {
final IdentityStep identityStep = new IdentityStep<>(this.traversal);
currentStep.getLabels().forEach(label -> this.currentReplacedStep.addLabel(pathCount + BaseStrategy.PATH_LABEL_SUFFIX + label));
TraversalHelper.insertAfterStep(identityStep, currentStep, this.traversal);
}
if (this.traversal.getSteps().contains(currentStep)) {
this.traversal.removeStep(currentStep);
}
iterator.remove();
countToGoPrevious--;
} else if ((nullKey = isNullStep(currentStep)) != null) {
this.currentReplacedStep.addHasContainer(new HasContainer(nullKey, new P<>(Existence.NULL, null)));
if (!currentStep.getLabels().isEmpty()) {
final IdentityStep identityStep = new IdentityStep<>(this.traversal);
currentStep.getLabels().forEach(label -> this.currentReplacedStep.addLabel(pathCount + BaseStrategy.PATH_LABEL_SUFFIX + label));
TraversalHelper.insertAfterStep(identityStep, currentStep, this.traversal);
}
if (this.traversal.getSteps().contains(currentStep)) {
this.traversal.removeStep(currentStep);
}
iterator.remove();
countToGoPrevious--;
} else if (currentStep instanceof IdentityStep) {
// do nothing
} else {
for (int i = 0; i < countToGoPrevious; i++) {
iterator.previous();
}
break;
}
}
}
use of org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder in project janusgraph by JanusGraph.
the class HasStepFolder method foldInIds.
static void foldInIds(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
Step<?, ?> currentStep = janusgraphStep.getNextStep();
while (true) {
if (currentStep instanceof HasContainerHolder) {
final HasContainerHolder hasContainerHolder = (HasContainerHolder) currentStep;
final GraphStep graphStep = (GraphStep) janusgraphStep;
// HasContainer collection that we get back is immutable so we keep track of which containers
// need to be deleted after they've been folded into the JanusGraphStep and then remove them from their
// step using HasContainer.removeHasContainer
final List<HasContainer> removableHasContainers = new ArrayList<>();
final Set<String> stepLabels = currentStep.getLabels();
hasContainerHolder.getHasContainers().forEach(hasContainer -> {
if (GraphStep.processHasContainerIds(graphStep, hasContainer)) {
stepLabels.forEach(janusgraphStep::addLabel);
// this has container is no longer needed because its ids will be folded into the JanusGraphStep
removableHasContainers.add(hasContainer);
}
});
if (!removableHasContainers.isEmpty()) {
removableHasContainers.forEach(hasContainerHolder::removeHasContainer);
}
// if all has containers have been removed, the current step can be removed
if (hasContainerHolder.getHasContainers().isEmpty()) {
traversal.removeStep(currentStep);
}
} else if (currentStep instanceof IdentityStep || currentStep instanceof NoOpBarrierStep) {
// do nothing, has no impact
} else {
break;
}
currentStep = currentStep.getNextStep();
}
}
Aggregations