From b5af50711179fa9961ad52b4a49ac4a83230e570 Mon Sep 17 00:00:00 2001 From: legendPei <804141866@qq.com> Date: Tue, 26 May 2026 16:14:52 +0800 Subject: [PATCH] fix(server): avoid match no-index extraction --- .../traversal/optimize/TraversalUtil.java | 36 ++++++++++++ .../hugegraph/core/CountStrategyCoreTest.java | 55 +++++++++++++++++++ 2 files changed, 91 insertions(+) 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