This is an automated email from the ASF dual-hosted git repository.

imbajin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hugegraph.git


The following commit(s) were added to refs/heads/master by this push:
     new 42c039d69 fix(core): align count strategy connective steps (#3037)
42c039d69 is described below

commit 42c039d695c156c5c9e750d24ac24387a19eaa61
Author: contrueCT <[email protected]>
AuthorDate: Mon Jun 8 12:38:15 2026 +0800

    fix(core): align count strategy connective steps (#3037)
---
 .../traversal/optimize/HugeCountStrategy.java      | 33 +++++++-----
 .../hugegraph/core/CountStrategyCoreTest.java      | 63 ++++++++++++++++++++--
 2 files changed, 80 insertions(+), 16 deletions(-)

diff --git 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStrategy.java
 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStrategy.java
index 5a8c468a4..ea6de76ac 100644
--- 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStrategy.java
+++ 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStrategy.java
@@ -190,19 +190,17 @@ public final class HugeCountStrategy
                         traversal.asAdmin().removeStep(curr);
                         size -= 2;
                         if (!dismissCountIs) {
-                            final TraversalParent p;
-                            if ((p = traversal.getParent()) instanceof 
FilterStep &&
-                                !(p instanceof ConnectiveStep)) {
-                                final Step<?, ?> filterStep = parent.asStep();
-                                final Traversal.Admin parentTraversal =
-                                        filterStep.getTraversal();
-                                final Step notStep = new NotStep<>(
-                                        parentTraversal,
-                                        traversal.getSteps().isEmpty() ?
-                                        __.identity() : traversal);
-                                
filterStep.getLabels().forEach(notStep::addLabel);
+                            if (parent instanceof ConnectiveStep) {
+                                final Step<?, ?> notStep = 
this.transformToNotStep(
+                                        traversal, parent);
+                                TraversalHelper.removeAllSteps(traversal);
+                                traversal.addStep(notStep);
+                            } else if (parent instanceof FilterStep) {
+                                final Step filterStep = parent.asStep();
+                                final Step<?, ?> notStep = 
this.transformToNotStep(
+                                        traversal, parent);
                                 TraversalHelper.replaceStep(filterStep, 
notStep,
-                                                            parentTraversal);
+                                                            
filterStep.getTraversal());
                             } else {
                                 final Traversal.Admin inner;
                                 if (prev != null) {
@@ -256,6 +254,17 @@ public final class HugeCountStrategy
         }
     }
 
+    private Step<?, ?> transformToNotStep(final Traversal.Admin<?, ?> 
traversal,
+                                          final TraversalParent parent) {
+        final Step<?, ?> filterStep = parent.asStep();
+        final Traversal.Admin<?, ?> parentTraversal = 
filterStep.getTraversal();
+        final Step<?, ?> notStep = new NotStep<>(
+                parentTraversal,
+                traversal.getSteps().isEmpty() ? __.identity() : 
traversal.clone());
+        filterStep.getLabels().forEach(notStep::addLabel);
+        return notStep;
+    }
+
     private boolean doStrategy(final Step step) {
         if (!(step instanceof CountGlobalStep) ||
             !(step.getNextStep() instanceof IsStep) ||
diff --git 
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java
 
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java
index 58a0d992f..6e3167901 100644
--- 
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java
+++ 
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java
@@ -37,10 +37,11 @@ public class CountStrategyCoreTest extends BaseCoreTest {
     private void initSchema() {
         SchemaManager schema = graph().schema();
         schema.propertyKey("name").asText().create();
-        schema.vertexLabel("person").properties("name")
-              .nullableKeys("name").create();
-        schema.vertexLabel("software").properties("name")
-              .nullableKeys("name").create();
+        schema.propertyKey("none").asText().create();
+        schema.vertexLabel("person").properties("name", "none")
+              .nullableKeys("name", "none").create();
+        schema.vertexLabel("software").properties("name", "none")
+              .nullableKeys("name", "none").create();
         schema.edgeLabel("knows").link("person", "person").create();
         schema.edgeLabel("created").link("person", "software").create();
     }
@@ -510,4 +511,58 @@ public class CountStrategyCoreTest extends BaseCoreTest {
         Assert.assertTrue(hasRemainingHasStep(traversal, "vp2"));
         Assert.assertEquals(1L, traversal.next());
     }
+
+    @Test
+    public void testConnectiveAndCountIsZero() {
+        this.initSchema();
+        this.initGraph();
+
+        long count = graph().traversal().V()
+                            .filter(__.and(__.out().count().is(0),
+                                           __.in().count().is(0)))
+                            .count().next();
+
+        Assert.assertEquals(0L, count);
+    }
+
+    @Test
+    public void testConnectiveOrCountIsZero() {
+        this.initSchema();
+        this.initGraph();
+
+        long count = graph().traversal().V()
+                            .filter(__.or(__.out().count().is(0),
+                                          __.in().count().is(0)))
+                            .count().next();
+
+        Assert.assertEquals(3L, count);
+    }
+
+    @Test
+    public void testWhereOrWithMultiStepCountIsZero() {
+        this.initSchema();
+        this.initGraph();
+
+        long count = graph().traversal().V()
+                            .where(__.or(__.out("created").out("knows")
+                                           .count().is(0),
+                                         __.has("none")))
+                            .count().next();
+
+        Assert.assertEquals(3L, count);
+    }
+
+    @Test
+    public void testWhereOrWithMultipleCountIsZero() {
+        this.initSchema();
+        this.initGraph();
+
+        long count = graph().traversal().V()
+                            .where(__.or(__.out("created").out("knows")
+                                           .count().is(0),
+                                         __.has("none").count().is(0)))
+                            .count().next();
+
+        Assert.assertEquals(3L, count);
+    }
 }

Reply via email to