Added functionality for the camel-mongodb component to support Distinct Mongo queries. This work is in support of CAMEL-11259 https://issues.apache.org/jira/browse/CAMEL-11259
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8196eeb8 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8196eeb8 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8196eeb8 Branch: refs/heads/master Commit: 8196eeb87353e5b214bbcc9b7511cc296fee1e80 Parents: 6ced621 Author: Mark Webb <[email protected]> Authored: Thu May 11 17:28:56 2017 -0400 Committer: Claus Ibsen <[email protected]> Committed: Wed May 17 09:31:45 2017 +0200 ---------------------------------------------------------------------- .../component/mongodb/MongoDbConstants.java | 1 + .../component/mongodb/MongoDbOperation.java | 3 +- .../component/mongodb/MongoDbProducer.java | 54 ++++++++++++++++---- .../mongodb/MongoDbFindOperationTest.java | 35 +++++++++++++ 4 files changed, 81 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8196eeb8/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbConstants.java ---------------------------------------------------------------------- diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbConstants.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbConstants.java index 8f36dd9..446a662 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbConstants.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbConstants.java @@ -37,6 +37,7 @@ public final class MongoDbConstants { public static final String FROM_TAILABLE = "CamelMongoDbTailable"; public static final String WRITERESULT = "CamelMongoWriteResult"; public static final String OID = "CamelMongoOid"; + public static final String DISTINCT_QUERY_FIELD = "CamelMongoDbDistinctQueryField"; private MongoDbConstants() { } http://git-wip-us.apache.org/repos/asf/camel/blob/8196eeb8/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbOperation.java ---------------------------------------------------------------------- diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbOperation.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbOperation.java index f7b5de5..00228cd 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbOperation.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbOperation.java @@ -23,7 +23,8 @@ public enum MongoDbOperation { findOneByQuery, findAll, // group, // future operation - // mapReduce, // future operation + // mapReduce, // future operation, + findDistinct, // create/update operations insert, http://git-wip-us.apache.org/repos/asf/camel/blob/8196eeb8/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java ---------------------------------------------------------------------- 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 52e4ed6..c453047 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 @@ -23,17 +23,6 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; -import com.mongodb.BasicDBList; -import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; -import com.mongodb.client.AggregateIterable; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; - import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadException; import org.apache.camel.Processor; @@ -45,6 +34,18 @@ import org.bson.conversions.Bson; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.mongodb.BasicDBList; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.DistinctIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; + /** * The MongoDb producer. */ @@ -57,6 +58,7 @@ public class MongoDbProducer extends DefaultProducer { bind(MongoDbOperation.aggregate, createDoAggregate()); bind(MongoDbOperation.command, createDoCommand()); bind(MongoDbOperation.count, createDoCount()); + bind(MongoDbOperation.findDistinct, createDoDistinct()); bind(MongoDbOperation.findAll, createDoFindAll()); bind(MongoDbOperation.findById, createDoFindById()); bind(MongoDbOperation.findOneByQuery, createDoFindOneByQuery()); @@ -293,6 +295,36 @@ public class MongoDbProducer extends DefaultProducer { }; } + private Function<Exchange, Object> createDoDistinct() { + return exchange -> { + Iterable<String> result = new ArrayList<>(); + MongoCollection<BasicDBObject> dbCol = calculateCollection(exchange); + + // get the parameters out of the Exchange Header + String distinctFieldName = exchange.getIn().getHeader(MongoDbConstants.DISTINCT_QUERY_FIELD, String.class); + BasicDBObject query = null; + // do not run around looking for a type converter unless there is a need for it + if (exchange.getIn().getBody() != null) { + query = exchange.getIn().getBody(BasicDBObject.class); + } + + DistinctIterable<String> ret = null; + if (query != null) { + ret = dbCol.distinct(distinctFieldName, query, String.class); + } else { + ret = dbCol.distinct(distinctFieldName, String.class); + } + + try { + ret.iterator().forEachRemaining(((List<String>) result)::add); + exchange.getOut().setHeader(MongoDbConstants.RESULT_PAGE_SIZE, ((List<String>) result).size()); + } finally { + ret.iterator().close(); + } + return result; + }; + } + private Function<Exchange, Object> createDoFindAll() { return exchange1 -> { Iterable<BasicDBObject> result; http://git-wip-us.apache.org/repos/asf/camel/blob/8196eeb8/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java ---------------------------------------------------------------------- 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 148a020..8218049 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 @@ -158,6 +158,7 @@ public class MongoDbFindOperationTest extends AbstractMongoDbTest { headers.put(MongoDbConstants.NUM_TO_SKIP, numToSkip); headers.put(MongoDbConstants.LIMIT, 100); Object result = template.requestBodyAndHeaders("direct:findAll", (Object) null, headers); + System.out.println(result.getClass()); assertTrue("Result is not of type List", result instanceof List); @SuppressWarnings("unchecked") @@ -184,6 +185,38 @@ public class MongoDbFindOperationTest extends AbstractMongoDbTest { } @Test + public void testFindDistinctNoQuery() { + // Test that the collection has 0 documents in it + assertEquals(0, testCollection.count()); + pumpDataIntoTestCollection(); + + Object result = template.requestBodyAndHeader("direct:findDistinct", null, MongoDbConstants.DISTINCT_QUERY_FIELD, "scientist"); + assertTrue("Result is not of type List", result instanceof List); + + @SuppressWarnings("unchecked") + List<String> resultList = (List<String>)result; + assertEquals(10, resultList.size()); + } + + @Test + public void testFindDistinctWithQuery() { + // Test that the collection has 0 documents in it + assertEquals(0, testCollection.count()); + pumpDataIntoTestCollection(); + + DBObject query = BasicDBObjectBuilder.start("scientist", "Einstein").get(); + + Object result = template.requestBodyAndHeader("direct:findDistinct", query, MongoDbConstants.DISTINCT_QUERY_FIELD, "scientist"); + assertTrue("Result is not of type List", result instanceof List); + + @SuppressWarnings("unchecked") + List<String> resultList = (List<String>)result; + assertEquals(1, resultList.size()); + + assertEquals("Einstein", resultList.get(0)); + } + + @Test public void testFindOneByQuery() throws Exception { // Test that the collection has 0 documents in it assertEquals(0, testCollection.count()); @@ -255,6 +288,8 @@ public class MongoDbFindOperationTest extends AbstractMongoDbTest { .to("mongodb:myDb?database={{mongodb.testDb}}&collection={{mongodb.testCollection}}&operation=findById&dynamicity=true") .to("mock:resultFindById"); + from("direct:findDistinct").to("mongodb:myDb?database={{mongodb.testDb}}&collection={{mongodb.testCollection}}&operation=findDistinct&dynamicity=true") + .to("mock:resultFindDistinct"); } }; }
