diff --git a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/cypher/executor/GraphQueryExecutor.java b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/cypher/executor/GraphQueryExecutor.java index 8db5c94c5109..7fad028a8603 100644 --- a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/cypher/executor/GraphQueryExecutor.java +++ b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/cypher/executor/GraphQueryExecutor.java @@ -145,15 +145,27 @@ public StatementResult run( statusCallback .getQueryLogger() .info("logical IR plan \n\n {} \n\n", planSummary.getLogicalPlan().explain()); - statusCallback - .getQueryLogger() - .debug("physical IR plan {}", planSummary.getPhysicalPlan().explain()); - if (planSummary.getLogicalPlan().isReturnEmpty()) { - return StatementResults.initial(); + boolean returnEmpty = planSummary.getLogicalPlan().isReturnEmpty(); + if (!returnEmpty) { + statusCallback + .getQueryLogger() + .debug("physical IR plan {}", planSummary.getPhysicalPlan().explain()); } QueryTimeoutConfig timeoutConfig = getQueryTimeoutConfig(); GraphPlanExecutor executor; - if (cacheValue.result != null && cacheValue.result.isCompleted) { + if (returnEmpty) { + executor = + new GraphPlanExecutor() { + @Override + public void execute( + GraphPlanner.Summary summary, + IrMeta irMeta, + ExecutionResponseListener listener) + throws Exception { + listener.onCompleted(); + } + }; + } else if (cacheValue.result != null && cacheValue.result.isCompleted) { executor = new GraphPlanExecutor() { @Override diff --git a/interactive_engine/compiler/src/test/java/com/alibaba/graphscope/common/ir/planner/rbo/ScanEarlyStopTest.java b/interactive_engine/compiler/src/test/java/com/alibaba/graphscope/common/ir/planner/rbo/ScanEarlyStopTest.java index c5b0cb7ed558..6a27d4583276 100644 --- a/interactive_engine/compiler/src/test/java/com/alibaba/graphscope/common/ir/planner/rbo/ScanEarlyStopTest.java +++ b/interactive_engine/compiler/src/test/java/com/alibaba/graphscope/common/ir/planner/rbo/ScanEarlyStopTest.java @@ -22,6 +22,7 @@ import com.alibaba.graphscope.common.ir.planner.GraphIOProcessor; import com.alibaba.graphscope.common.ir.planner.GraphRelOptimizer; import com.alibaba.graphscope.common.ir.tools.GraphBuilder; +import com.alibaba.graphscope.common.ir.tools.LogicalPlan; import com.google.common.collect.ImmutableMap; import org.apache.calcite.rel.RelNode; @@ -105,4 +106,18 @@ public void scan_early_stop_1_test() { + " 10>}])", after.explain().trim()); } + + @Test + public void scan_early_stop_2_test() { + GraphBuilder builder = Utils.mockGraphBuilder(optimizer, irMeta); + RelNode before = + com.alibaba.graphscope.cypher.antlr4.Utils.eval( + "Match (:PERSON)-[n:KNOWS]->(b) Where n.creationDate > $date Return" + + " n Limit 0", + builder) + .build(); + RelNode after = optimizer.optimize(before, new GraphIOProcessor(builder, irMeta)); + LogicalPlan plan = new LogicalPlan(after); + Assert.assertTrue(plan.isReturnEmpty()); + } }