From 00662529f33f7e54d237282e135758f7012b20d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 21 Nov 2025 09:27:21 +0100 Subject: [PATCH] datastore: add the function estimatedCount() to call the MongoDB function estimatedDocumentCount(), #TASK-5564 --- .../commons/datastore/mongodb/MongoDBCollection.java | 6 ++++++ .../commons/datastore/mongodb/MongoDBNativeQuery.java | 10 +++++++++- .../datastore/mongodb/MongoDBCollectionTest.java | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java index 645cc98ef..fdec23406 100644 --- a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java +++ b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java @@ -131,6 +131,12 @@ public DataResult count(ClientSession clientSession, Bson query) { return endQuery(Collections.emptyList(), l, start); } + public DataResult estimatedCount() { + long start = startQuery(); + long l = mongoDBNativeQuery.estimatedCount(); + return endQuery(Collections.emptyList(), l, start); + } + public DataResult distinct(String key, Bson query) { long start = startQuery(); List l = new ArrayList<>(); diff --git a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java index 0876bacdd..e385f3731 100644 --- a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java +++ b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java @@ -64,6 +64,10 @@ public long count(ClientSession clientSession, Bson query) { } } + public long estimatedCount() { + return dbCollection.estimatedDocumentCount(); + } + public DistinctIterable distinct(String key) { return distinct(key, null, Document.class); } @@ -235,7 +239,11 @@ public MongoDBIterator find(ClientSession clientSession, Bson query, Bson Future countFuture = null; if (options != null && options.getBoolean(QueryOptions.COUNT)) { ExecutorService executor = Executors.newSingleThreadExecutor(); - countFuture = executor.submit(() -> count(clientSession, query)); + if (clientSession == null && (query == null || query.equals(Filters.empty()) || query.toBsonDocument().isEmpty())) { + countFuture = executor.submit(this::estimatedCount); + } else { + countFuture = executor.submit(() -> count(clientSession, query)); + } } FindIterable findIterable = null; diff --git a/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java b/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java index da5c10398..254ce9b42 100644 --- a/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java +++ b/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java @@ -296,6 +296,12 @@ public void testCount1() throws Exception { assertEquals("The number must be equals", N, queryResult.getNumMatches()); } + @Test + public void testEstimatedCount() { + DataResult queryResult = mongoDBCollection.estimatedCount(); + assertEquals("The number of documents must be equals", N, queryResult.getNumMatches()); + } + @Test public void testDistinct1() throws Exception { DataResult queryResult = mongoDBCollection.distinct("age", null, Integer.class);