Skip to content

Commit 13c4d03

Browse files
ericchristophstrobl
authored andcommitted
DATAMONGO-1761 - Add distinct(…) method for MongoTemplate.
Original Pull Request: #494
1 parent 395573b commit 13c4d03

File tree

2 files changed

+62
-28
lines changed

2 files changed

+62
-28
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,8 @@
2424
import lombok.RequiredArgsConstructor;
2525

2626
import java.io.IOException;
27-
import java.util.ArrayList;
28-
import java.util.Collection;
29-
import java.util.Collections;
30-
import java.util.HashMap;
31-
import java.util.HashSet;
32-
import java.util.Iterator;
33-
import java.util.LinkedHashSet;
34-
import java.util.List;
35-
import java.util.Map;
27+
import java.util.*;
3628
import java.util.Map.Entry;
37-
import java.util.Optional;
38-
import java.util.Scanner;
39-
import java.util.Set;
4029
import java.util.concurrent.TimeUnit;
4130

4231
import org.bson.Document;
@@ -127,15 +116,12 @@
127116
import org.springframework.util.ResourceUtils;
128117
import org.springframework.util.StringUtils;
129118

130-
import com.mongodb.Cursor;
131-
import com.mongodb.DBCollection;
132-
import com.mongodb.DBCursor;
133-
import com.mongodb.Mongo;
134119
import com.mongodb.MongoClient;
135120
import com.mongodb.MongoException;
136121
import com.mongodb.ReadPreference;
137122
import com.mongodb.WriteConcern;
138123
import com.mongodb.client.AggregateIterable;
124+
import com.mongodb.client.DistinctIterable;
139125
import com.mongodb.client.FindIterable;
140126
import com.mongodb.client.MapReduceIterable;
141127
import com.mongodb.client.MongoCollection;
@@ -173,6 +159,7 @@
173159
* @author Laszlo Csontos
174160
* @author Maninder Singh
175161
* @author Borislav Rangelov
162+
* @author duozhilin
176163
*/
177164
@SuppressWarnings("deprecation")
178165
public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider {
@@ -808,6 +795,30 @@ public <T> T findById(Object id, Class<T> entityClass, String collectionName) {
808795
return doFindOne(collectionName, new Document(idKey, id), new Document(), entityClass);
809796
}
810797

798+
public <T, Z> List<T> distinct(String field, Class<Z> entityClass, Class<T> resultClass) {
799+
return distinct(new Query(), field, determineCollectionName(entityClass), resultClass);
800+
}
801+
802+
public <T, Z> List<T> distinct(Query query, String field, Class<Z> entityClass, Class<T> resultClass) {
803+
return distinct(query, field, determineCollectionName(entityClass), resultClass);
804+
}
805+
806+
public <T> List<T> distinct(Query query, String field, String collectionName, Class<T> resultClass) {
807+
MongoCollection<Document> collection = this.getCollection(collectionName);
808+
DistinctIterable<T> iterable = collection.distinct(field, query.getQueryObject(), resultClass);
809+
810+
MongoCursor<T> cursor = iterable.iterator();
811+
812+
List<T> result = new ArrayList<T>();
813+
814+
while (cursor.hasNext()) {
815+
T object = cursor.next();
816+
result.add(object);
817+
}
818+
819+
return result;
820+
}
821+
811822
@Override
812823
public <T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass) {
813824
return geoNear(near, entityClass, determineCollectionName(entityClass));

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,7 @@
3333
import java.lang.reflect.InvocationTargetException;
3434
import java.math.BigDecimal;
3535
import java.math.BigInteger;
36-
import java.util.ArrayList;
37-
import java.util.Arrays;
38-
import java.util.Calendar;
39-
import java.util.Collections;
40-
import java.util.Date;
41-
import java.util.HashMap;
42-
import java.util.HashSet;
43-
import java.util.LinkedHashMap;
44-
import java.util.List;
45-
import java.util.Locale;
46-
import java.util.Map;
47-
import java.util.UUID;
36+
import java.util.*;
4837

4938
import org.bson.types.ObjectId;
5039
import org.hamcrest.collection.IsMapContaining;
@@ -122,6 +111,7 @@
122111
* @author Christoph Strobl
123112
* @author Mark Paluch
124113
* @author Laszlo Csontos
114+
* @author duozhilin
125115
*/
126116
@RunWith(SpringJUnit4ClassRunner.class)
127117
@ContextConfiguration("classpath:infrastructure.xml")
@@ -749,6 +739,39 @@ public void testFindAndRemove() throws Exception {
749739
assertThat(notFound, nullValue());
750740
}
751741

742+
@Test
743+
public void testDistinct() {
744+
Address address1 = new Address();
745+
address1.state = "PA";
746+
address1.city = "Philadelphia";
747+
748+
Address address2 = new Address();
749+
address2.state = "PA";
750+
address2.city = " New York";
751+
752+
MyPerson person1 = new MyPerson();
753+
person1.name = "Ben";
754+
person1.address = address1;
755+
756+
MyPerson person2 = new MyPerson();
757+
person2.name = "Eric";
758+
person2.address = address2;
759+
760+
template.save(person1);
761+
template.save(person2);
762+
763+
List<String> nameList = template.distinct("name", MyPerson.class, String.class);
764+
assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName())));
765+
766+
Query query = new BasicQuery("{'address.state' : 'PA'}");
767+
nameList = template.distinct(query, "name", MyPerson.class, String.class);
768+
assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName())));
769+
770+
String collectionName = template.determineCollectionName(MyPerson.class);
771+
nameList = template.distinct(query, "name", collectionName, String.class);
772+
assertTrue(nameList.containsAll(Arrays.asList(person1.getName(), person2.getName())));
773+
}
774+
752775
@Test
753776
public void testUsingAnInQueryWithObjectId() throws Exception {
754777

0 commit comments

Comments
 (0)