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;
}
/**