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

wanghailin pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new 564863b933 [fix][connector-mango] fix split with avgSize zero error 
(#9255)
564863b933 is described below

commit 564863b933b0d9dc4d7492ec1b8c79e8c264cd2f
Author: CosmosNi <[email protected]>
AuthorDate: Wed Apr 30 10:58:36 2025 +0800

    [fix][connector-mango] fix split with avgSize zero error (#9255)
---
 .../source/split/SamplingSplitStrategy.java        | 13 ++++++++
 .../source/split/SamplingSplitStrategyTest.java    | 38 ++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git 
a/seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategy.java
 
b/seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategy.java
index be37d38eda..8f320a6c42 100644
--- 
a/seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategy.java
+++ 
b/seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategy.java
@@ -76,6 +76,19 @@ public class SamplingSplitStrategy implements 
MongoSplitStrategy, Serializable {
         long count = numAndAvgSize.getLeft();
         long avgSize = numAndAvgSize.getRight();
 
+        // Handle the case when avgSize is 0 to prevent division by zero
+        if (avgSize <= 0) {
+            // If there are documents in the collection, return a single split
+            if (count > 0) {
+                return Lists.newArrayList(
+                        MongoSplitUtils.createMongoSplit(
+                                0, matchQuery, projection, splitKey, null, 
null));
+            } else {
+                // If there are no documents, return an empty list
+                return Lists.newArrayList();
+            }
+        }
+
         long numDocumentsPerSplit = sizePerSplit / avgSize;
         int numSplits = (int) Math.ceil((double) count / numDocumentsPerSplit);
         int numSamples = (int) Math.floor(samplesPerSplit * numSplits);
diff --git 
a/seatunnel-connectors-v2/connector-mongodb/src/test/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategyTest.java
 
b/seatunnel-connectors-v2/connector-mongodb/src/test/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategyTest.java
index ec5b05844f..926ed3803a 100644
--- 
a/seatunnel-connectors-v2/connector-mongodb/src/test/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategyTest.java
+++ 
b/seatunnel-connectors-v2/connector-mongodb/src/test/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/split/SamplingSplitStrategyTest.java
@@ -71,4 +71,42 @@ public class SamplingSplitStrategyTest {
         assertEquals(Long.valueOf(13360484963L), result.getLeft());
         assertEquals(Long.valueOf(200), result.getRight());
     }
+
+    @Test
+    public void testSplitWithZeroAvgSize() {
+        // Mock the getDocumentNumAndAvgSize method to return zero avgSize
+        SamplingSplitStrategy spyStrategy =
+                new SamplingSplitStrategy(
+                        clientProvider, "_id", new BsonDocument(), new 
BsonDocument(), 10L, 1024L) {
+                    @Override
+                    protected ImmutablePair<Long, Long> 
getDocumentNumAndAvgSize() {
+                        return ImmutablePair.of(10L, 0L); // 10 documents with 
0 avgSize
+                    }
+                };
+
+        // This should not throw a division by zero exception
+        java.util.List<MongoSplit> splits = spyStrategy.split();
+
+        // Should return a single split when count > 0 and avgSize = 0
+        assertEquals(1, splits.size());
+    }
+
+    @Test
+    public void testSplitWithZeroAvgSizeAndZeroCount() {
+        // Mock the getDocumentNumAndAvgSize method to return zero avgSize and 
zero count
+        SamplingSplitStrategy spyStrategy =
+                new SamplingSplitStrategy(
+                        clientProvider, "_id", new BsonDocument(), new 
BsonDocument(), 10L, 1024L) {
+                    @Override
+                    protected ImmutablePair<Long, Long> 
getDocumentNumAndAvgSize() {
+                        return ImmutablePair.of(0L, 0L); // 0 documents with 0 
avgSize
+                    }
+                };
+
+        // This should not throw a division by zero exception
+        java.util.List<MongoSplit> splits = spyStrategy.split();
+
+        // Should return an empty list when count = 0 and avgSize = 0
+        assertEquals(0, splits.size());
+    }
 }

Reply via email to