4545import javax .persistence .criteria .Selection ;
4646import javax .persistence .criteria .Subquery ;
4747
48+ import de .symeda .sormas .api .environment .environmentsample .EnvironmentSampleMaterial ;
4849import org .apache .commons .lang3 .tuple .Pair ;
4950import org .jetbrains .annotations .NotNull ;
5051
@@ -147,6 +148,36 @@ public Map<SpecimenCondition, Long> getSampleCountsBySpecimenCondition(SampleDas
147148 (cb , root ) -> cb .and (buildExternalSamplePredicate (cb , root ), cb .equal (root .get (Sample .RECEIVED ), true )));
148149 }
149150
151+ public Map <SpecimenCondition , Long > getEnvironmentalSampleCountsBySpecimenCondition (SampleDashboardCriteria dashboardCriteria ) {
152+ return getEnvironmentalSampleCountsBySpecimenCondition (
153+ EnvironmentSample .SPECIMEN_CONDITION ,
154+ SpecimenCondition .class ,
155+ dashboardCriteria ,
156+ null );
157+ }
158+
159+ private Map <SpecimenCondition , Long > getEnvironmentalSampleCountsBySpecimenCondition (String property , Class <SpecimenCondition > propertyType ,
160+ SampleDashboardCriteria dashboardCriteria ,
161+ BiFunction <CriteriaBuilder , Root <EnvironmentSample >, Predicate > additionalFilters ) {
162+ final CriteriaBuilder cb = em .getCriteriaBuilder ();
163+ final CriteriaQuery <Tuple > cq = cb .createTupleQuery ();
164+ final Root <EnvironmentSample > sample = cq .from (EnvironmentSample .class );
165+ EnvironmentSampleJoins joins = new EnvironmentSampleJoins (sample );
166+ final Path <Object > groupingProperty = sample .get (property );
167+
168+ cq .multiselect (groupingProperty , cb .count (sample ));
169+
170+ final Predicate criteriaFilter = createEnvironmentSampleFilter (new EnvironmentSampleQueryContext (cb , cq , sample , joins ), dashboardCriteria );
171+ cq .where (CriteriaBuilderHelper .and (cb , criteriaFilter , additionalFilters != null ? additionalFilters .apply (cb , sample ) : null ));
172+
173+ cq .groupBy (groupingProperty );
174+
175+ return QueryHelper .getResultList (em , cq , null , null , Function .identity ())
176+ .stream ()
177+ .filter (t -> t .get (0 ) != null )
178+ .collect (Collectors .toMap (t -> propertyType .cast (t .get (0 )), t -> (Long ) t .get (1 )));
179+ }
180+
150181 private <T extends Enum <?>> Map <T , Long > getSampleCountsByEnumProperty (
151182 String property ,
152183 Class <T > propertyType ,
@@ -188,8 +219,27 @@ public Map<SampleShipmentStatus, Long> getSampleCountsByShipmentStatus(SampleDas
188219 cq .groupBy (shipped , received );
189220
190221 return QueryHelper .getResultList (em , cq , null , null , Function .identity ())
191- .stream ()
192- .collect (Collectors .toMap (t -> getSampleShipmentStatusByFlags ((Boolean ) t .get (0 ), (Boolean ) t .get (1 )), t -> (Long ) t .get (2 ), Long ::sum ));
222+ .stream ()
223+ .collect (Collectors .toMap (t -> getSampleShipmentStatusByFlags ((Boolean ) t .get (0 ), (Boolean ) t .get (1 )), t -> (Long ) t .get (2 ), Long ::sum ));
224+ }
225+
226+ public Map <SampleShipmentStatus , Long > getEnvironmentalSampleCountsByShipmentStatus (SampleDashboardCriteria dashboardCriteria ) {
227+ final CriteriaBuilder cb = em .getCriteriaBuilder ();
228+ final CriteriaQuery <Tuple > cq = cb .createTupleQuery ();
229+ final Root <EnvironmentSample > sample = cq .from (EnvironmentSample .class );
230+ EnvironmentSampleJoins joins = new EnvironmentSampleJoins (sample );
231+ Path <Boolean > shipped = sample .get (EnvironmentSample .DISPATCHED );
232+ Path <Boolean > received = sample .get (EnvironmentSample .RECEIVED );
233+ cq .multiselect (shipped , received , cb .count (sample ));
234+
235+ final Predicate criteriaFilter = createEnvironmentSampleFilter (new EnvironmentSampleQueryContext (cb , cq , sample , joins ), dashboardCriteria );
236+ cq .where (criteriaFilter );
237+
238+ cq .groupBy (shipped , received );
239+
240+ return QueryHelper .getResultList (em , cq , null , null , Function .identity ())
241+ .stream ()
242+ .collect (Collectors .toMap (t -> getSampleShipmentStatusByFlags ((Boolean ) t .get (0 ), (Boolean ) t .get (1 )), t -> (Long ) t .get (2 ), Long ::sum ));
193243 }
194244
195245 private SampleShipmentStatus getSampleShipmentStatusByFlags (Boolean shipped , Boolean received ) {
@@ -215,6 +265,54 @@ public Map<PathogenTestResultType, Long> getTestResultCountsByResultType(SampleD
215265 .collect (Collectors .toMap (t -> (PathogenTestResultType ) t .get (0 ), t -> (Long ) t .get (1 )));
216266 }
217267
268+ /**
269+ * Returns a map of counts of environment samples by result type.
270+ *
271+ * @param dashboardCriteria
272+ * @return
273+ */
274+ public Map <PathogenTestResultType , Long > getEnvironmentalTestResultCountsByResultType (SampleDashboardCriteria dashboardCriteria ) {
275+ final CriteriaBuilder cb = em .getCriteriaBuilder ();
276+ final CriteriaQuery <Tuple > cq = cb .createTupleQuery ();
277+ final Root <EnvironmentSample > sample = cq .from (EnvironmentSample .class );
278+ Join <EnvironmentSample , PathogenTest > pathogenTestJoin = sample .join (EnvironmentSample .PATHOGEN_TESTS , JoinType .LEFT );
279+ final Path <Object > pathogenTestResult = pathogenTestJoin .get (PathogenTest .TEST_RESULT );
280+ EnvironmentSampleJoins joins = new EnvironmentSampleJoins (sample );
281+ cq .multiselect (pathogenTestResult , cb .count (pathogenTestJoin ));
282+
283+ final Predicate criteriaFilter = createEnvironmentSampleFilter (new EnvironmentSampleQueryContext (cb , cq , sample , joins ), dashboardCriteria );
284+ cq .where (criteriaFilter );
285+
286+ cq .groupBy (pathogenTestResult );
287+
288+ return QueryHelper .getResultList (em , cq , null , null , Function .identity ())
289+ .stream ()
290+ .filter (t -> t .get (0 ) != null )
291+ .collect (Collectors .toMap (t -> (PathogenTestResultType ) t .get (0 ), t -> (Long ) t .get (1 )));
292+ }
293+
294+ /**
295+ * Returns a map of counts of environment samples by material type.
296+ *
297+ * @param dashboardCriteria
298+ * @return
299+ */
300+ public Map <EnvironmentSampleMaterial , Long > getEnvironmentalSampleCounts (SampleDashboardCriteria dashboardCriteria ) {
301+ // This method is used to get the counts of environment samples by material type
302+ final CriteriaBuilder cb = em .getCriteriaBuilder ();
303+ final CriteriaQuery <Tuple > cq = cb .createTupleQuery ();
304+ final Root <EnvironmentSample > sample = cq .from (EnvironmentSample .class );
305+ final Path <Object > groupingProperty = sample .get (EnvironmentSample .SAMPLE_MATERIAL );
306+ cq .multiselect (groupingProperty , cb .count (sample ));
307+ final Predicate criteriaFilter = createEnvironmentSampleFilter (new EnvironmentSampleQueryContext (cb , cq , sample , new EnvironmentSampleJoins (sample )), dashboardCriteria );
308+ cq .where (criteriaFilter );
309+ cq .groupBy (groupingProperty );
310+ return QueryHelper .getResultList (em , cq , null , null , Function .identity ())
311+ .stream ()
312+ .filter (t -> t .get (0 ) != null )
313+ .collect (Collectors .toMap (t -> (EnvironmentSampleMaterial ) t .get (0 ), t -> (Long ) t .get (1 )));
314+ }
315+
218316 private static <J extends ISampleJoins > List <Selection <?>> getCoordinatesSelection (
219317 SampleAssociationType associationType ,
220318 J joins ,
@@ -287,7 +385,7 @@ public Long countSamplesForMap(SampleDashboardCriteria criteria, Set<SampleAssoc
287385 return QueryHelper .getSingleResult (em , cq );
288386 }
289387
290- public Long countEnvironmentSamplesForMap (SampleDashboardCriteria criteria ) {
388+ public Long countEnvironmentalSamplesForMap (SampleDashboardCriteria criteria ) {
291389 final CriteriaBuilder cb = em .getCriteriaBuilder ();
292390 final CriteriaQuery <Long > cq = cb .createQuery (Long .class );
293391 final Root <EnvironmentSample > sample = cq .from (EnvironmentSample .class );
@@ -474,8 +572,8 @@ private Predicate createEnvironmentSampleFilter(EnvironmentSampleQueryContext qu
474572 filter = CriteriaBuilderHelper .and (cb , filter , dateFilter );
475573 }
476574
477- if (criteria .getSampleMaterial () != null ) {
478- filter = CriteriaBuilderHelper .and (cb , filter , cb .equal (sampleRoot .get (EnvironmentSample .SAMPLE_MATERIAL ), criteria .getSampleMaterial ()));
575+ if (criteria .getEnvironmentSampleMaterial () != null ) {
576+ filter = CriteriaBuilderHelper .and (cb , filter , cb .equal (sampleRoot .get (EnvironmentSample .SAMPLE_MATERIAL ), criteria .getEnvironmentSampleMaterial ()));
479577 }
480578
481579 return CriteriaBuilderHelper .and (
0 commit comments