This is an automated email from the ASF dual-hosted git repository. janbednar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new af7e383 CAMEL-15604 support allowDiskUse for MongoDB find operations af7e383 is described below commit af7e383e9fc1d25ce9665f74d33672cc5b507952 Author: Jan Bednář <m...@janbednar.eu> AuthorDate: Sun Oct 4 17:45:16 2020 +0200 CAMEL-15604 support allowDiskUse for MongoDB find operations --- .../camel/catalog/docs/mongodb-component.adoc | 2 ++ .../src/main/docs/mongodb-component.adoc | 2 ++ .../camel/component/mongodb/MongoDbProducer.java | 21 ++++++++++++++------- .../camel/component/mongodb/MongoDbContainer.java | 6 ++---- .../component/mongodb/MongoDbFindOperationTest.java | 21 +++++++++++++++++++++ .../modules/ROOT/pages/mongodb-component.adoc | 2 ++ 6 files changed, 43 insertions(+), 11 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mongodb-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mongodb-component.adoc index fcbeea5..d96c6fd 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mongodb-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mongodb-component.adoc @@ -311,6 +311,8 @@ documents must fit within a maximum size, and it removes the need to send a request to close the cursor server-side. The batch size can be changed even after a cursor is iterated, in which case the setting will apply on the next batch retrieval. |int/Integer +|`CamelMongoDbAllowDiskUse` |`MongoDbConstants.ALLOW_DISK_USE` | Sets allowDiskUse MongoDB flag. +This is supported since MongoDB Server 4.3.1. Using this header with older MongoDB Server version can cause query to fail. |boolean/Boolean |======================================================================= Example with option outputType=MongoIterable and batch size : diff --git a/components/camel-mongodb/src/main/docs/mongodb-component.adoc b/components/camel-mongodb/src/main/docs/mongodb-component.adoc index fcbeea5..d96c6fd 100644 --- a/components/camel-mongodb/src/main/docs/mongodb-component.adoc +++ b/components/camel-mongodb/src/main/docs/mongodb-component.adoc @@ -311,6 +311,8 @@ documents must fit within a maximum size, and it removes the need to send a request to close the cursor server-side. The batch size can be changed even after a cursor is iterated, in which case the setting will apply on the next batch retrieval. |int/Integer +|`CamelMongoDbAllowDiskUse` |`MongoDbConstants.ALLOW_DISK_USE` | Sets allowDiskUse MongoDB flag. +This is supported since MongoDB Server 4.3.1. Using this header with older MongoDB Server version can cause query to fail. |boolean/Boolean |======================================================================= Example with option outputType=MongoIterable and batch size : diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java index 6d7f48d..53a844e 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java @@ -298,7 +298,6 @@ public class MongoDbProducer extends DefaultProducer { Bson sortBy = exchange.getIn().getHeader(SORT_BY, Bson.class); Bson fieldFilter = exchange.getIn().getHeader(FIELDS_PROJECTION, Bson.class); - if (fieldFilter == null) { fieldFilter = new Document(); } @@ -307,7 +306,13 @@ public class MongoDbProducer extends DefaultProducer { sortBy = new Document(); } - Document ret = dbCol.find(query).projection(fieldFilter).sort(sortBy).first(); + Document ret = dbCol + .find(query) + .projection(fieldFilter) + .sort(sortBy) + .allowDiskUse(exchange.getIn().getHeader(MongoDbConstants.ALLOW_DISK_USE, Boolean.class)) + .first(); + exchange.getMessage().setHeader(RESULT_TOTAL_SIZE, ret == null ? 0 : 1); return ret; } catch (InvalidPayloadException e) { @@ -344,7 +349,6 @@ public class MongoDbProducer extends DefaultProducer { } else { ret = dbCol.distinct(distinctFieldName, String.class); } - try { ret.iterator().forEachRemaining(result::add); exchange.getMessage().setHeader(MongoDbConstants.RESULT_PAGE_SIZE, result.size()); @@ -401,6 +405,7 @@ public class MongoDbProducer extends DefaultProducer { ret.limit(limit); } + ret.allowDiskUse(exchange.getIn().getHeader(MongoDbConstants.ALLOW_DISK_USE, Boolean.class)); if (!MongoDbOutputType.MongoIterable.equals(endpoint.getOutputType())) { try { result = new ArrayList<>(); @@ -543,9 +548,7 @@ public class MongoDbProducer extends DefaultProducer { aggregationResult.batchSize(batchSize); } - Boolean allowDiskUse - = exchange.getIn().getHeader(MongoDbConstants.ALLOW_DISK_USE, Boolean.FALSE, Boolean.class); - aggregationResult.allowDiskUse(allowDiskUse); + aggregationResult.allowDiskUse(exchange.getIn().getHeader(MongoDbConstants.ALLOW_DISK_USE, Boolean.class)); Iterable<Document> result; if (!MongoDbOutputType.MongoIterable.equals(endpoint.getOutputType())) { @@ -595,7 +598,11 @@ public class MongoDbProducer extends DefaultProducer { if (fieldFilter == null) { fieldFilter = new Document(); } - ret = dbCol.find(o).projection(fieldFilter).first(); + ret = dbCol + .find(o) + .projection(fieldFilter) + .allowDiskUse(exchange.getIn().getHeader(MongoDbConstants.ALLOW_DISK_USE, Boolean.class)) + .first(); exchange.getMessage().setHeader(RESULT_TOTAL_SIZE, ret == null ? 0 : 1); return ret; } catch (InvalidPayloadException e) { diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java index 58a7e61..d88a252 100644 --- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java +++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java @@ -29,7 +29,7 @@ public class MongoDbContainer extends GenericContainer { private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbContainer.class); private static final String CONTAINER_NAME = "mongo"; private static final int MONGODB_PORT = 27017; - private static final String MONGO_IMAGE = "mongo:4.0"; + private static final String MONGO_IMAGE = "mongo:4.4"; public MongoDbContainer() { super(MONGO_IMAGE); @@ -43,9 +43,7 @@ public class MongoDbContainer extends GenericContainer { "--replSet", "replicationName", "--oplogSize", "5000", "--syncdelay", "0", - "--noauth", - "--noprealloc", - "--smallfiles"); + "--noauth"); } @Override diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java index 379d2cd..88cec2d 100644 --- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java +++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java @@ -70,6 +70,27 @@ public class MongoDbFindOperationTest extends AbstractMongoDbTest { } @Test + public void testFindAllAllowDiskUse() throws Exception { + // Test that the collection has 0 documents in it + assertEquals(0, testCollection.countDocuments()); + pumpDataIntoTestCollection(); + + Object result + = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.ALLOW_DISK_USE, true); + assertTrue(result instanceof List, "Result (allowDiskUse=true) is not of type List"); + assertListSize("Result (allowDiskUse=true) does not contain all entries in collection", (List<Document>) result, 1000); + + result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.ALLOW_DISK_USE, false); + assertTrue(result instanceof List, "Result (allowDiskUse=false) is not of type List"); + assertListSize("Result (allowDiskUse=false) does not contain all entries in collection", (List<Document>) result, + 1000); + + result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.ALLOW_DISK_USE, null); + assertTrue(result instanceof List, "Result (allowDiskUse=null) is not of type List"); + assertListSize("Result (allowDiskUse=null) does not contain all entries in collection", (List<Document>) result, 1000); + } + + @Test public void testFindAllWithQueryAndNoFIlter() throws Exception { // Test that the collection has 0 documents in it assertEquals(0, testCollection.countDocuments()); diff --git a/docs/components/modules/ROOT/pages/mongodb-component.adoc b/docs/components/modules/ROOT/pages/mongodb-component.adoc index dd589e8..1227420 100644 --- a/docs/components/modules/ROOT/pages/mongodb-component.adoc +++ b/docs/components/modules/ROOT/pages/mongodb-component.adoc @@ -313,6 +313,8 @@ documents must fit within a maximum size, and it removes the need to send a request to close the cursor server-side. The batch size can be changed even after a cursor is iterated, in which case the setting will apply on the next batch retrieval. |int/Integer +|`CamelMongoDbAllowDiskUse` |`MongoDbConstants.ALLOW_DISK_USE` | Sets allowDiskUse MongoDB flag. +This is supported since MongoDB Server 4.3.1. Using this header with older MongoDB Server version can cause query to fail. |boolean/Boolean |======================================================================= Example with option outputType=MongoIterable and batch size :