-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathLunaticJsonRawDataMongoAdapter.java
More file actions
141 lines (118 loc) · 6.38 KB
/
Copy pathLunaticJsonRawDataMongoAdapter.java
File metadata and controls
141 lines (118 loc) · 6.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package fr.insee.genesis.infrastructure.adapter;
import fr.insee.genesis.Constants;
import fr.insee.genesis.domain.model.surveyunit.GroupedInterrogation;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort;
import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonRawDataDocument;
import fr.insee.genesis.infrastructure.mappers.GroupedInterrogationDocumentMapper;
import fr.insee.genesis.infrastructure.mappers.LunaticJsonRawDataDocumentMapper;
import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Slf4j
@Service
@Qualifier("lunaticJsonMongoAdapter")
public class LunaticJsonRawDataMongoAdapter implements LunaticJsonRawDataPersistencePort {
private final LunaticJsonMongoDBRepository repository;
private final MongoTemplate mongoTemplate;
public LunaticJsonRawDataMongoAdapter(LunaticJsonMongoDBRepository repository, MongoTemplate mongoTemplate) {
this.repository = repository;
this.mongoTemplate = mongoTemplate;
}
@Override
public void save(LunaticJsonRawDataModel rawData) {
LunaticJsonRawDataDocument doc = LunaticJsonRawDataDocumentMapper.INSTANCE.modelToDocument(rawData);
repository.insert(doc);
}
@Override
public Set<String> findDistinctQuestionnaireIdsByNullProcessDate(){
return new HashSet<>(repository.findDistinctQuestionnaireIdByProcessDateIsNull());
}
@Override
public Set<Mode> findModesByQuestionnaire(String questionnaireId) {
return new HashSet<>(repository.findModesByQuestionnaireId(questionnaireId));
}
@Override
public List<LunaticJsonRawDataModel> findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List<String> interrogationIdList) {
List<LunaticJsonRawDataDocument> rawDataDocs = repository.findByQuestionnaireModeAndInterrogations(questionnaireId, mode, interrogationIdList);
return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocs);
}
@Override
public Page<LunaticJsonRawDataModel> findRawDataByQuestionnaireId(String questionnaireId, Pageable pageable) {
Page<LunaticJsonRawDataDocument> rawDataDocsPage = repository.findByQuestionnaireId(questionnaireId, pageable);
List<LunaticJsonRawDataModel> modelList = LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocsPage.getContent());
return new PageImpl<>(modelList, rawDataDocsPage.getPageable(), rawDataDocsPage.getTotalElements());
}
@Override
public List<LunaticJsonRawDataModel> findRawDataByInterrogationId(String interrogationId) {
List<LunaticJsonRawDataDocument> rawDataDocs = repository.findByInterrogationId(interrogationId);
return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocs);
}
@Override
public void updateProcessDates(String questionnaireId, Set<String> interrogationIds) {
mongoTemplate.updateMulti(
Query.query(Criteria.where("questionnaireId").is(questionnaireId).and("interrogationId").in(interrogationIds))
, new Update().set("processDate", LocalDateTime.now())
, Constants.MONGODB_LUNATIC_RAWDATA_COLLECTION_NAME
);
}
@Override
public Set<String> findDistinctQuestionnaireIds() {
List<String> ids = mongoTemplate.query(LunaticJsonRawDataDocument.class)
.distinct("questionnaireId")
.as(String.class)
.all();
return ids.stream()
.filter(id -> id != null && !id.isBlank())
.collect(java.util.stream.Collectors.toSet());
}
@Override
public Page<LunaticJsonRawDataModel> findByCampaignIdAndDate(String campaignId, Instant startDt, Instant endDt, Pageable pageable) {
Page<LunaticJsonRawDataDocument> rawDataDocsPage = repository.findByCampaignIdAndRecordDateBetween(campaignId,startDt,endDt,pageable);
List<LunaticJsonRawDataModel> modelList = LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocsPage.getContent());
return new PageImpl<>(modelList, rawDataDocsPage.getPageable(), rawDataDocsPage.getTotalElements());
}
@Override
public long countRawResponsesByQuestionnaireId(String questionnaireId) {
return repository.countByQuestionnaireId(questionnaireId);
}
@Override
public List<GroupedInterrogation> findProcessedIdsGroupedByQuestionnaireSince(LocalDateTime since){
return GroupedInterrogationDocumentMapper.INSTANCE.listDocumentToListModel(repository.aggregateRawGrouped(since));
}
@Override
public List<GroupedInterrogation> findUnprocessedIds() {
return GroupedInterrogationDocumentMapper.INSTANCE.listDocumentToListModel(repository.aggregateRawGroupedWithNullProcessDate());
}
@Override
public Set<String> findUnprocessedInterrogationIdsByCollectionInstrumentId(String collectionInstrumentId) {
Set<String> interrogationIds = new HashSet<>();
repository.aggregateRawGroupedWithNullProcessDate(collectionInstrumentId).forEach(
groupedInterrogationDocument -> interrogationIds.addAll(groupedInterrogationDocument.getInterrogationIds())
);
return interrogationIds;
}
@Override
public boolean existsByInterrogationId(String interrogationId) {
return repository.existsByInterrogationId(interrogationId);
}
@Override
public long countDistinctInterrogationIdsByQuestionnaireId(String questionnaireId) {
Long count = repository.countDistinctInterrogationIdsByQuestionnaireId(questionnaireId);
return count != null ? count : 0;
}
}