From 2ac97cb6ebf022aec6f00a44a8e22cbe814f2df5 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 28 Jul 2017 21:17:04 +0800 Subject: [PATCH 1/4] add distinct method for MongoTemplate --- .../data/mongodb/core/MongoTemplate.java | 21 ++++ .../data/mongodb/core/MongoTemplateTests.java | 109 ++++++++++++++---- 2 files changed, 105 insertions(+), 25 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index c1a0c7ebe2..795d9fc031 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -124,6 +124,7 @@ import com.mongodb.ReadPreference; import com.mongodb.WriteConcern; import com.mongodb.client.AggregateIterable; +import com.mongodb.client.DistinctIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MapReduceIterable; import com.mongodb.client.MongoCollection; @@ -654,6 +655,26 @@ public T findById(Object id, Class entityClass, String collectionName) { return doFindOne(collectionName, new Document(idKey, id), null, entityClass); } + public List distinct(Query query, String field, Class entityClass, Class resultClass) { + return distinct(query, field, determineCollectionName(entityClass), resultClass); + } + + public List distinct(Query query, String field, String collectionName, Class resultClass) { + MongoCollection collection = this.getCollection(collectionName); + DistinctIterable iterable = collection.distinct(field, query.getQueryObject(), resultClass); + + MongoCursor cursor = iterable.iterator(); + + List result = new ArrayList(); + + while (cursor.hasNext()) { + T object = cursor.next(); + result.add(object); + } + + return result; + } + public GeoResults geoNear(NearQuery near, Class entityClass) { return geoNear(near, entityClass, determineCollectionName(entityClass)); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 4cdb3fbefc..052872fc41 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -15,21 +15,16 @@ */ package org.springframework.data.mongodb.core; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.junit.Assume.*; -import static org.springframework.data.mongodb.core.query.Criteria.*; -import static org.springframework.data.mongodb.core.query.Query.*; -import static org.springframework.data.mongodb.core.query.Update.*; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.lang.reflect.InvocationTargetException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.*; +import com.mongodb.DBRef; +import com.mongodb.Mongo; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.FindIterable; +import com.mongodb.client.ListIndexesIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.result.UpdateResult; import org.bson.types.ObjectId; import org.hamcrest.collection.IsMapContaining; @@ -84,16 +79,50 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import com.mongodb.DBRef; -import com.mongodb.Mongo; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.FindIterable; -import com.mongodb.client.ListIndexesIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.result.UpdateResult; +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isOneOf; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.junit.Assume.assumeThat; +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.Query.query; +import static org.springframework.data.mongodb.core.query.Update.update; /** * Integration test for {@link MongoTemplate}. @@ -734,6 +763,36 @@ public void testFindAndRemove() throws Exception { assertThat(notFound, nullValue()); } + @Test + public void testDistinct() { + Address address1 = new Address(); + address1.state = "PA"; + address1.city = "Philadelphia"; + + Address address2 = new Address(); + address2.state = "PA"; + address2.city = " New York"; + + MyPerson person1 = new MyPerson(); + person1.name = "Ben"; + person1.address = address1; + + MyPerson person2 = new MyPerson(); + person2.name = "Eric"; + person2.address = address2; + + template.save(person1); + template.save(person2); + + Query query = new BasicQuery("{'address.state' : 'PA'}"); + List nameList = template.distinct(query, "name", MyPerson.class, String.class); + assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName()))); + + String collectionName = template.determineCollectionName(MyPerson.class); + nameList = template.distinct(query, "name", collectionName, String.class); + assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName()))); + } + @Test public void testUsingAnInQueryWithObjectId() throws Exception { From 26863eb62181f1b8d95a903297c572fbf508ef64 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 31 Jul 2017 11:24:09 +0800 Subject: [PATCH 2/4] add a distinct method without query param --- .../org/springframework/data/mongodb/core/MongoTemplate.java | 4 ++++ .../data/mongodb/core/MongoTemplateTests.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 795d9fc031..f789893789 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -655,6 +655,10 @@ public T findById(Object id, Class entityClass, String collectionName) { return doFindOne(collectionName, new Document(idKey, id), null, entityClass); } + public List distinct(String field, Class entityClass, Class resultClass) { + return distinct(new Query(), field, determineCollectionName(entityClass), resultClass); + } + public List distinct(Query query, String field, Class entityClass, Class resultClass) { return distinct(query, field, determineCollectionName(entityClass), resultClass); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 052872fc41..6a0df055de 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -784,8 +784,11 @@ public void testDistinct() { template.save(person1); template.save(person2); + List nameList = template.distinct("name", MyPerson.class, String.class); + assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName()))); + Query query = new BasicQuery("{'address.state' : 'PA'}"); - List nameList = template.distinct(query, "name", MyPerson.class, String.class); + nameList = template.distinct(query, "name", MyPerson.class, String.class); assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName()))); String collectionName = template.determineCollectionName(MyPerson.class); From 6af8437d550655d4aafc053693a32ba8ec9f69e4 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 31 Jul 2017 11:29:00 +0800 Subject: [PATCH 3/4] reformat code --- .../data/mongodb/core/MongoTemplate.java | 91 +++++++++++-------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index f789893789..d9ae8411fc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -15,18 +15,32 @@ */ package org.springframework.data.mongodb.core; -import static org.springframework.data.mongodb.core.query.Criteria.*; -import static org.springframework.data.mongodb.core.query.SerializationUtils.*; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -import java.io.IOException; -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; +import com.mongodb.Cursor; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.Mongo; +import com.mongodb.MongoClient; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.DistinctIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MapReduceIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.CreateCollectionOptions; +import com.mongodb.client.model.DeleteOptions; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.FindOneAndDeleteOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.ReturnDocument; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.util.JSONParseException; import org.bson.Document; import org.bson.conversions.Bson; @@ -115,32 +129,29 @@ import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; -import com.mongodb.Cursor; -import com.mongodb.DBCollection; -import com.mongodb.DBCursor; -import com.mongodb.Mongo; -import com.mongodb.MongoClient; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.AggregateIterable; -import com.mongodb.client.DistinctIterable; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MapReduceIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateCollectionOptions; -import com.mongodb.client.model.DeleteOptions; -import com.mongodb.client.model.Filters; -import com.mongodb.client.model.FindOneAndDeleteOptions; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.ReturnDocument; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.util.JSONParseException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Scanner; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; /** * Primary implementation of {@link MongoOperations}. @@ -655,11 +666,11 @@ public T findById(Object id, Class entityClass, String collectionName) { return doFindOne(collectionName, new Document(idKey, id), null, entityClass); } - public List distinct(String field, Class entityClass, Class resultClass) { + public List distinct(String field, Class entityClass, Class resultClass) { return distinct(new Query(), field, determineCollectionName(entityClass), resultClass); } - public List distinct(Query query, String field, Class entityClass, Class resultClass) { + public List distinct(Query query, String field, Class entityClass, Class resultClass) { return distinct(query, field, determineCollectionName(entityClass), resultClass); } From af9785094d2c4846a4b42ad8caa7a937d8188516 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 3 Aug 2017 14:58:47 +0800 Subject: [PATCH 4/4] add author info --- .../org/springframework/data/mongodb/core/MongoTemplate.java | 1 + .../springframework/data/mongodb/core/MongoTemplateTests.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index d9ae8411fc..f8e602b3f9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -173,6 +173,7 @@ * @author Laszlo Csontos * @author Maninder Singh * @author Borislav Rangelov + * @author duozhilin */ @SuppressWarnings("deprecation") public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 6a0df055de..f4c2a6321a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -136,6 +136,7 @@ * @author Christoph Strobl * @author Mark Paluch * @author Laszlo Csontos + * @author duozhilin */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:infrastructure.xml")