Skip to content

Commit 2cba979

Browse files
committed
Fix count and update in MongoDb stores
* The `into()` query can't infer the type for entity if we provide `Object.class` * The `updateFirst()` does not support sort queries any more - replace with `findAndModify()` * Add `getMessageGroupCount()` into tests **Cherry-pick to 5.3.x & 5.2.x**
1 parent b20d276 commit 2cba979

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
import java.util.Collection;
2121
import java.util.Iterator;
2222
import java.util.List;
23+
import java.util.Map;
2324
import java.util.UUID;
2425
import java.util.stream.Collectors;
2526
import java.util.stream.StreamSupport;
2627

2728
import org.springframework.data.domain.Sort;
2829
import org.springframework.data.mongodb.MongoDatabaseFactory;
30+
import org.springframework.data.mongodb.core.FindAndModifyOptions;
2931
import org.springframework.data.mongodb.core.MongoTemplate;
3032
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
3133
import org.springframework.data.mongodb.core.query.Criteria;
@@ -247,9 +249,8 @@ public int getMessageCountForAllMessageGroups() {
247249
@ManagedAttribute
248250
public int getMessageGroupCount() {
249251
Query query = Query.query(Criteria.where(MessageDocumentFields.GROUP_ID).exists(true));
250-
return getMongoTemplate().getCollection(this.collectionName)
251-
.distinct(MessageDocumentFields.GROUP_ID, query.getQueryObject(), Object.class)
252-
.into(new ArrayList<>())
252+
return getMongoTemplate()
253+
.findDistinct(query, MessageDocumentFields.GROUP_ID, this.collectionName, Object.class)
253254
.size();
254255
}
255256

@@ -278,7 +279,9 @@ public Collection<Message<?>> getMessagesForGroup(Object groupId) {
278279
}
279280

280281
private void updateGroup(Object groupId, Update update) {
281-
getMongoTemplate().updateFirst(groupOrderQuery(groupId), update, this.collectionName);
282+
getMongoTemplate()
283+
.findAndModify(groupOrderQuery(groupId), update, FindAndModifyOptions.none(), Map.class,
284+
this.collectionName);
282285
}
283286

284287
private static Update lastModifiedUpdate() {

spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -428,20 +428,15 @@ public Collection<Message<?>> getMessagesForGroup(Object groupId) {
428428
@Override
429429
@ManagedAttribute
430430
public int getMessageCountForAllMessageGroups() {
431-
Query query = Query.query(Criteria.where(MessageDocumentFields.MESSAGE_ID).exists(true)
432-
.and(MessageDocumentFields.GROUP_ID).exists(true));
433-
long count = this.template.count(query, this.collectionName);
434-
Assert.isTrue(count <= Integer.MAX_VALUE, "Message count is out of Integer's range");
435-
return (int) count;
431+
Query query = Query.query(Criteria.where(GROUP_ID_KEY).exists(true));
432+
return (int) this.template.count(query, this.collectionName);
436433
}
437434

438435
@Override
439436
@ManagedAttribute
440437
public int getMessageGroupCount() {
441-
Query query = Query.query(Criteria.where(MessageDocumentFields.GROUP_ID).exists(true));
442-
return this.template.getCollection(this.collectionName)
443-
.distinct(MessageDocumentFields.GROUP_ID, query.getQueryObject(), Object.class)
444-
.into(new ArrayList<>())
438+
Query query = Query.query(Criteria.where(GROUP_ID_KEY).exists(true));
439+
return this.template.findDistinct(query, GROUP_ID_KEY, this.collectionName, Object.class)
445440
.size();
446441
}
447442

@@ -471,7 +466,7 @@ private static Query whereGroupIdIs(Object groupId) {
471466

472467
private void updateGroup(Object groupId, Update update) {
473468
Query query = whereGroupIdIs(groupId).with(Sort.by(Sort.Direction.DESC, GROUP_UPDATE_TIMESTAMP_KEY, SEQUENCE));
474-
this.template.updateFirst(query, update, this.collectionName);
469+
this.template.findAndModify(query, update, FindAndModifyOptions.none(), Map.class, this.collectionName);
475470
}
476471

477472
private int getNextId() {

spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/AbstractMongoDbMessageGroupStoreTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public void testMessageGroupWithAddedMessagePrimitiveGroupId() {
9595
assertThat(messageA.getHeaders().getId()).isEqualTo(retrievedMessage.getHeaders().getId());
9696
// ensure that 'message_group' header that is only used internally is not propagated
9797
assertThat(retrievedMessage.getHeaders().get("message_group")).isNull();
98+
assertThat(store.getMessageGroupCount()).isEqualTo(1);
9899
}
99100

100101
@Test

0 commit comments

Comments
 (0)