diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java
index 142c95620b..7c61b5463e 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java
@@ -67,6 +67,7 @@
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinGlobalStep;
@@ -171,6 +172,10 @@ public static void extractHasContainer(HugeGraphStep, ?> newStep,
step = step.getNextStep();
if (step instanceof HasStep) {
HasContainerHolder holder = (HasContainerHolder) step;
+ if (followedByMatchStep(step) &&
+ hasIndexRequiredPredicate(holder)) {
+ break;
+ }
for (HasContainer has : holder.getHasContainers()) {
if (!GraphStep.processHasContainerIds(newStep, has)) {
newStep.addHasContainer(has);
@@ -182,6 +187,37 @@ public static void extractHasContainer(HugeGraphStep, ?> newStep,
} while (step instanceof HasStep || step instanceof NoOpBarrierStep);
}
+ private static boolean followedByMatchStep(Step, ?> step) {
+ Step, ?> next = step.getNextStep();
+ while (next instanceof HasStep || next instanceof NoOpBarrierStep) {
+ next = next.getNextStep();
+ }
+ return next instanceof MatchStep;
+ }
+
+ private static boolean hasIndexRequiredPredicate(HasContainerHolder holder) {
+ for (HasContainer has : holder.getHasContainers()) {
+ if (hasIndexRequiredPredicate(has)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean hasIndexRequiredPredicate(HasContainer has) {
+ List
> predicates = new ArrayList<>();
+ collectPredicates(predicates, ImmutableList.of(has.getPredicate()));
+ for (P