Skip to content

Commit 15896b7

Browse files
authored
Merge pull request #159 from twilmes/issue_155_hasId
Issue 155: Updated JanusGraphStepStrategy to fold hasId steps into JanusGraphStep
2 parents 4672830 + 49e3bde commit 15896b7

File tree

6 files changed

+149
-135
lines changed

6 files changed

+149
-135
lines changed

janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/HasStepFolder.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
package org.janusgraph.graphdb.tinkerpop.optimize;
1616

17+
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
18+
import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
1719
import org.janusgraph.core.Cardinality;
1820
import org.janusgraph.core.PropertyKey;
1921
import org.janusgraph.core.JanusGraphTransaction;
@@ -33,6 +35,7 @@
3335

3436
import org.javatuples.Pair;
3537

38+
import java.util.Arrays;
3639
import java.util.Comparator;
3740
import java.util.List;
3841

@@ -41,26 +44,26 @@
4144
*/
4245
public interface HasStepFolder<S, E> extends Step<S, E> {
4346

44-
public void addAll(Iterable<HasContainer> hasContainers);
47+
void addAll(Iterable<HasContainer> hasContainers);
4548

46-
public void orderBy(String key, Order order);
49+
void orderBy(String key, Order order);
4750

48-
public void setLimit(int limit);
51+
void setLimit(int limit);
4952

50-
public int getLimit();
53+
int getLimit();
5154

52-
public static boolean validJanusGraphHas(HasContainer has) {
55+
static boolean validJanusGraphHas(HasContainer has) {
5356
return JanusGraphPredicate.Converter.supports(has.getBiPredicate());
5457
}
5558

56-
public static boolean validJanusGraphHas(Iterable<HasContainer> has) {
59+
static boolean validJanusGraphHas(Iterable<HasContainer> has) {
5760
for (HasContainer h : has) {
5861
if (!validJanusGraphHas(h)) return false;
5962
}
6063
return true;
6164
}
6265

63-
public static boolean validJanusGraphOrder(OrderGlobalStep ostep, Traversal rootTraversal,
66+
static boolean validJanusGraphOrder(OrderGlobalStep ostep, Traversal rootTraversal,
6467
boolean isVertexOrder) {
6568
for (Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>> comp : (List<Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>>>) ostep.getComparators()) {
6669
if (!(comp.getValue1() instanceof ElementValueComparator)) return false;
@@ -76,8 +79,29 @@ public static boolean validJanusGraphOrder(OrderGlobalStep ostep, Traversal root
7679
return true;
7780
}
7881

79-
public static void foldInHasContainer(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
82+
static void foldInIds(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
83+
Step<?, ?> currentStep = janusgraphStep.getNextStep();
84+
while (true) {
85+
if (currentStep instanceof HasContainerHolder) {
86+
for (final HasContainer hasContainer : ((HasContainerHolder) currentStep).getHasContainers()) {
87+
if (GraphStep.processHasContainerIds((GraphStep) janusgraphStep, hasContainer)) {
88+
currentStep.getLabels().forEach(janusgraphStep::addLabel);
89+
traversal.removeStep(currentStep);
90+
}
91+
}
92+
}
93+
else if (currentStep instanceof IdentityStep) {
94+
// do nothing, has no impact
95+
} else if (currentStep instanceof NoOpBarrierStep) {
96+
// do nothing, has no impact
97+
} else {
98+
break;
99+
}
100+
currentStep = currentStep.getNextStep();
101+
}
102+
}
80103

104+
static void foldInHasContainer(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
81105
Step<?, ?> currentStep = janusgraphStep.getNextStep();
82106
while (true) {
83107
if (currentStep instanceof HasContainerHolder) {
@@ -89,6 +113,8 @@ public static void foldInHasContainer(final HasStepFolder janusgraphStep, final
89113
}
90114
} else if (currentStep instanceof IdentityStep) {
91115
// do nothing, has no impact
116+
} else if (currentStep instanceof NoOpBarrierStep) {
117+
// do nothing, has no impact
92118
} else {
93119
break;
94120
}
@@ -105,7 +131,7 @@ public static void foldInHasContainer(final HasStepFolder janusgraphStep, final
105131
// } else return false;
106132
// }
107133

108-
public static void foldInOrder(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal,
134+
static void foldInOrder(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal,
109135
final Traversal<?, ?> rootTraversal, boolean isVertexOrder) {
110136
Step<?, ?> currentStep = janusgraphStep.getNextStep();
111137
OrderGlobalStep<?, ?> lastOrder = null;
@@ -120,6 +146,8 @@ public static void foldInOrder(final HasStepFolder janusgraphStep, final Travers
120146
// do nothing, can be skipped
121147
} else if (currentStep instanceof HasStep) {
122148
// do nothing, can be skipped
149+
} else if (currentStep instanceof NoOpBarrierStep) {
150+
// do nothing, can be skipped
123151
} else {
124152
break;
125153
}
@@ -139,7 +167,7 @@ public static void foldInOrder(final HasStepFolder janusgraphStep, final Travers
139167
}
140168
}
141169

142-
public static class OrderEntry {
170+
class OrderEntry {
143171

144172
public final String key;
145173
public final Order order;
@@ -150,7 +178,7 @@ public OrderEntry(String key, Order order) {
150178
}
151179
}
152180

153-
public static <E extends Ranging> void foldInRange(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
181+
static <E extends Ranging> void foldInRange(final HasStepFolder janusgraphStep, final Traversal.Admin<?, ?> traversal) {
154182
Step<?, ?> nextStep = JanusGraphTraversalUtil.getNextNonIdentityStep(janusgraphStep);
155183

156184
if (nextStep instanceof RangeGlobalStep) {

janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStep.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.janusgraph.graphdb.tinkerpop.optimize;
1616

1717
import com.google.common.collect.Iterables;
18+
import org.apache.tinkerpop.gremlin.structure.Graph;
1819
import org.janusgraph.core.JanusGraphQuery;
1920
import org.janusgraph.core.JanusGraphTransaction;
2021
import org.janusgraph.graphdb.query.BaseQuery;
@@ -33,7 +34,9 @@
3334
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
3435

3536
import java.util.ArrayList;
37+
import java.util.Arrays;
3638
import java.util.Collections;
39+
import java.util.Iterator;
3740
import java.util.List;
3841

3942
/**
@@ -51,6 +54,10 @@ public JanusGraphStep(final GraphStep<S, E> originalStep) {
5154
super(originalStep.getTraversal(), originalStep.getReturnClass(), originalStep.isStartStep(), originalStep.getIds());
5255
originalStep.getLabels().forEach(this::addLabel);
5356
this.setIteratorSupplier(() -> {
57+
if (this.ids != null && this.ids.length > 0) {
58+
final Graph graph = (Graph)traversal.asAdmin().getGraph().get();
59+
return iteratorList((Iterator)graph.vertices(this.ids));
60+
}
5461
JanusGraphTransaction tx = JanusGraphTraversalUtil.getTx(traversal);
5562
JanusGraphQuery query = tx.query();
5663
for (HasContainer condition : hasContainers) {
@@ -65,7 +72,8 @@ public JanusGraphStep(final GraphStep<S, E> originalStep) {
6572

6673
@Override
6774
public String toString() {
68-
return this.hasContainers.isEmpty() ? super.toString() : StringFactory.stepString(this, this.hasContainers);
75+
return this.hasContainers.isEmpty() ?
76+
super.toString() : StringFactory.stepString(this, Arrays.toString(this.ids), this.hasContainers);
6977
}
7078

7179
@Override
@@ -102,5 +110,15 @@ public List<HasContainer> getHasContainers() {
102110
public void addHasContainer(final HasContainer hasContainer) {
103111
this.addAll(Collections.singleton(hasContainer));
104112
}
113+
114+
private <E extends Element> Iterator<E> iteratorList(final Iterator<E> iterator) {
115+
final List<E> list = new ArrayList<E>();
116+
while (iterator.hasNext()) {
117+
final E e = iterator.next();
118+
if (HasContainer.testAll(e, this.hasContainers))
119+
list.add(e);
120+
}
121+
return list.iterator();
122+
}
105123
}
106124

janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStepStrategy.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public void apply(final Traversal.Admin<?, ?> traversal) {
4646
//Try to optimize for index calls
4747
final JanusGraphStep<?, ?> janusGraphStep = new JanusGraphStep<>(originalGraphStep);
4848
TraversalHelper.replaceStep(originalGraphStep, (Step) janusGraphStep, traversal);
49+
HasStepFolder.foldInIds(janusGraphStep, traversal);
4950
HasStepFolder.foldInHasContainer(janusGraphStep, traversal);
5051
HasStepFolder.foldInOrder(janusGraphStep, traversal, traversal, janusGraphStep.returnsVertex());
5152
HasStepFolder.foldInRange(janusGraphStep, traversal);

janusgraph-test/src/test/java/org/janusgraph/blueprints/process/traversal/strategy/JanusGraphStrategySuite.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

janusgraph-test/src/test/java/org/janusgraph/blueprints/process/traversal/strategy/JanusGraphStrategyTest.java

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)