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");
             }
         };
     }

Reply via email to