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

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


The following commit(s) were added to refs/heads/master by this push:
     new e67a5a26452 fix(mongodb): update filter composition to handle MongoDB 
5.x driver (#36004)
e67a5a26452 is described below

commit e67a5a264529ea7295e2e996cc3a4f0211f30df1
Author: liferoad <[email protected]>
AuthorDate: Fri Aug 29 10:46:36 2025 -0400

    fix(mongodb): update filter composition to handle MongoDB 5.x driver 
(#36004)
    
    * fix(mongodb): update filter composition to handle MongoDB 5.x driver 
changes
    
    Modify filter composition logic to avoid $and wrapping when possible by 
merging conditions directly into a composite Document. This addresses behavior 
changes in MongoDB driver 5.x while maintaining backward compatibility.
    
    * fix the filter
    
    * disable spotbugs for sql
---
 .github/trigger_files/beam_PostCommit_SQL.json        |  2 +-
 sdks/java/extensions/sql/build.gradle                 |  2 ++
 .../sql/meta/provider/mongodb/MongoDbTable.java       | 19 ++++++++++++++++++-
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/.github/trigger_files/beam_PostCommit_SQL.json 
b/.github/trigger_files/beam_PostCommit_SQL.json
index 5df3841d236..5ac8a7f3f6e 100644
--- a/.github/trigger_files/beam_PostCommit_SQL.json
+++ b/.github/trigger_files/beam_PostCommit_SQL.json
@@ -1,4 +1,4 @@
 {
   "comment": "Modify this file in a trivial way to cause this test suite to 
run ",
-  "modification": 3
+  "modification": 4
 }
diff --git a/sdks/java/extensions/sql/build.gradle 
b/sdks/java/extensions/sql/build.gradle
index 5527493200f..f4c0ea0942a 100644
--- a/sdks/java/extensions/sql/build.gradle
+++ b/sdks/java/extensions/sql/build.gradle
@@ -41,6 +41,8 @@ applyJavaNature(
   ],
   // javacc generated code produces lint warnings
   disableLintWarnings: ['dep-ann', 'rawtypes'],
+  // Disable SpotBugs due to ASM bytecode analysis issue with BeamCalcRel class
+  enableSpotbugs: false,
 )
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: SQL"
diff --git 
a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/mongodb/MongoDbTable.java
 
b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/mongodb/MongoDbTable.java
index 34f56082324..35ea74996f3 100644
--- 
a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/mongodb/MongoDbTable.java
+++ 
b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/mongodb/MongoDbTable.java
@@ -21,6 +21,8 @@ import static 
org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.sql.SqlK
 import static 
org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.sql.SqlKind.COMPARISON;
 import static 
org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.sql.SqlKind.OR;
 
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoClientSettings;
 import com.mongodb.client.model.Filters;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -64,6 +66,7 @@ import 
org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.sql.SqlKind;
 import 
org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.sql.type.SqlTypeName;
 import 
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.annotations.VisibleForTesting;
 import 
org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList;
+import org.bson.BsonDocument;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 import org.bson.json.JsonMode;
@@ -178,7 +181,21 @@ public class MongoDbTable extends SchemaBaseBeamTable 
implements Serializable {
     if (cnf.size() == 1) {
       return cnf.get(0);
     }
-    return Filters.and(cnf);
+    // Convert all filters to BsonDocument and merge them into a single 
Document
+    // This avoids wrapping in $and which changed behavior in MongoDB driver 
5.x
+    Document compositeFilter = new Document();
+    for (Bson filter : cnf) {
+      // Convert any Bson filter to BsonDocument first
+      BsonDocument bsonDoc =
+          filter.toBsonDocument(BasicDBObject.class, 
MongoClientSettings.getDefaultCodecRegistry());
+      // Convert BsonDocument to Document for easier manipulation
+      Document doc = Document.parse(bsonDoc.toJson());
+      // Merge all top-level conditions into the composite filter
+      for (String key : doc.keySet()) {
+        compositeFilter.append(key, doc.get(key));
+      }
+    }
+    return compositeFilter;
   }
 
   /**

Reply via email to