|
56 | 56 |
|
57 | 57 | import org.apache.commons.collections4.CollectionUtils;
|
58 | 58 |
|
| 59 | +import de.symeda.sormas.api.Disease; |
59 | 60 | import de.symeda.sormas.api.EntityRelevanceStatus;
|
60 | 61 | import de.symeda.sormas.api.RequestContextHolder;
|
61 | 62 | import de.symeda.sormas.api.caze.IsCase;
|
62 | 63 | import de.symeda.sormas.api.common.DeletableEntityType;
|
63 | 64 | import de.symeda.sormas.api.common.DeletionDetails;
|
| 65 | +import de.symeda.sormas.api.common.DeletionReason; |
64 | 66 | import de.symeda.sormas.api.common.progress.ProcessedEntity;
|
65 | 67 | import de.symeda.sormas.api.common.progress.ProcessedEntityStatus;
|
66 | 68 | import de.symeda.sormas.api.contact.ContactReferenceDto;
|
67 | 69 | import de.symeda.sormas.api.disease.DiseaseVariant;
|
68 | 70 | import de.symeda.sormas.api.event.EventParticipantReferenceDto;
|
69 | 71 | import de.symeda.sormas.api.feature.FeatureType;
|
| 72 | +import de.symeda.sormas.api.i18n.I18nProperties; |
| 73 | +import de.symeda.sormas.api.i18n.Strings; |
70 | 74 | import de.symeda.sormas.api.sample.IsSample;
|
| 75 | +import de.symeda.sormas.api.sample.PathogenTestCriteria; |
71 | 76 | import de.symeda.sormas.api.sample.PathogenTestResultType;
|
72 | 77 | import de.symeda.sormas.api.sample.PathogenTestType;
|
73 | 78 | import de.symeda.sormas.api.sample.SampleAssociationType;
|
|
87 | 92 | import de.symeda.sormas.backend.caze.CaseService;
|
88 | 93 | import de.symeda.sormas.backend.common.AbstractDeletableAdoService;
|
89 | 94 | import de.symeda.sormas.backend.common.AbstractDomainObject;
|
| 95 | +import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal; |
90 | 96 | import de.symeda.sormas.backend.common.CriteriaBuilderHelper;
|
91 | 97 | import de.symeda.sormas.backend.common.DeletableAdo;
|
92 | 98 | import de.symeda.sormas.backend.common.JurisdictionFlagsService;
|
@@ -145,6 +151,8 @@ public class SampleService extends AbstractDeletableAdoService<Sample>
|
145 | 151 | protected FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
|
146 | 152 | @EJB
|
147 | 153 | private SpecialCaseAccessService specialCaseAccessService;
|
| 154 | + @EJB |
| 155 | + private ConfigFacadeEjbLocal configFacade; |
148 | 156 |
|
149 | 157 | public SampleService() {
|
150 | 158 | super(Sample.class, DeletableEntityType.SAMPLE);
|
@@ -1276,4 +1284,37 @@ public List<DiseaseVariant> getAssociatedDiseaseVariants(String sampleUuid) {
|
1276 | 1284 | cq.select(pathogenTestJoin.get(PathogenTest.TESTED_DISEASE_VARIANT));
|
1277 | 1285 | return em.createQuery(cq).getResultList();
|
1278 | 1286 | }
|
| 1287 | + |
| 1288 | + public void cleanupOldCovidSamples() { |
| 1289 | + final Integer maxAgeDays = configFacade.getNegaiveCovidSamplesMaxAgeDays(); |
| 1290 | + if (maxAgeDays == null) { |
| 1291 | + return; |
| 1292 | + } |
| 1293 | + |
| 1294 | + CriteriaBuilder cb = em.getCriteriaBuilder(); |
| 1295 | + CriteriaQuery<PathogenTest> cq = cb.createQuery(PathogenTest.class); |
| 1296 | + Root<PathogenTest> from = cq.from(PathogenTest.class); |
| 1297 | + |
| 1298 | + cq.where( |
| 1299 | + cb.equal(from.get(PathogenTest.TESTED_DISEASE), Disease.CORONAVIRUS), |
| 1300 | + cb.equal(from.get(PathogenTest.TEST_RESULT), PathogenTestResultType.NEGATIVE), |
| 1301 | + cb.notEqual(from.get(PathogenTest.DELETED), true), |
| 1302 | + cb.lessThan( |
| 1303 | + CriteriaBuilderHelper.coalesce( |
| 1304 | + cb, |
| 1305 | + Date.class, |
| 1306 | + from.get(PathogenTest.TEST_DATE_TIME), |
| 1307 | + from.get(PathogenTest.REPORT_DATE), |
| 1308 | + from.get(PathogenTest.CREATION_DATE)), |
| 1309 | + DateHelper.subtractDays(new Date(), maxAgeDays))); |
| 1310 | + em.createQuery(cq).getResultList().stream().collect(Collectors.groupingBy(PathogenTest::getSample)).forEach((sample, tests) -> { |
| 1311 | + if (pathogenTestService.count(new PathogenTestCriteria().sample(sample.toReference())) == tests.size()) { |
| 1312 | + delete(sample, new DeletionDetails(DeletionReason.OTHER_REASON, I18nProperties.getString(Strings.entityAutomaticSoftDeletion))); |
| 1313 | + } else { |
| 1314 | + tests.forEach( |
| 1315 | + p -> pathogenTestService |
| 1316 | + .delete(p, new DeletionDetails(DeletionReason.OTHER_REASON, I18nProperties.getString(Strings.entityAutomaticSoftDeletion)))); |
| 1317 | + } |
| 1318 | + }); |
| 1319 | + } |
1279 | 1320 | }
|
0 commit comments