diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDao.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDao.java index 28912056144ad028f3ee6ab5534d51635d8d4111..f9dfa3774b1ca485426daa4c010a77ebec8ea738 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDao.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDao.java @@ -125,13 +125,14 @@ public interface PraDailyValueDao { List<Indicator> findIndicators(Integer year); /** - * The last {@link DailyValue#getDate()} for the indicator on a year. + * The last {@link DailyValue#getDate()} for the indicator in a period. * * @param indicator indicator to search - * @param year year + * @param firstDay first day of period + * @param lastDay last day of period * @return last date or null */ - LocalDate findLastDate(Indicator indicator, Integer year); + LocalDate findLastDate(Indicator indicator, LocalDate firstDay, LocalDate lastDay); /** * @return the regions related to computed values diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernate.java index 28a1044a98765ca0b736280b410d4943f088d352..a6a4f32a3332e130207f4a5e9a9d98acbce8ac31 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernate.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernate.java @@ -267,12 +267,13 @@ public class PraDailyValueDaoHibernate extends DaoHibernate<PraDailyValue> imple } @Override - public final LocalDate findLastDate(final Indicator indicator, final Integer year) { + public final LocalDate findLastDate(final Indicator indicator, final LocalDate firstDay, final LocalDate lastDay) { final var jpql = """ SELECT MAX(t.date) FROM PraDailyValue AS t - WHERE t.indicator=:indicator AND EXTRACT(YEAR FROM t.date) = :year"""; - return super.findOneByJPQL(jpql, Map.of(PARAM_INDICATOR, indicator, PARAM_YEAR, year), LocalDate.class); + WHERE t.indicator=:indicator AND t.date BETWEEN :firstDay AND :lastDay"""; + final var params = Map.of(PARAM_INDICATOR, indicator, "firstDay", firstDay, "lastDay", lastDay); + return super.findOneByJPQL(jpql, params, LocalDate.class); } private List<PraDailyValue> findPraDailyValues(final String sql, final Map<String, Object> params) { diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java b/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java index 4783deeb54c8acd5bf464d2052f1f31a36a614fb..42d0fb970fca6efe8705b5006532993def9fec62 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java @@ -96,19 +96,6 @@ public class IndicatorResource implements IndicatorService { */ private static final String PARAM_YEAR = "year"; - /** - * Get the date related to the year. - * - * @param year year - * @param dateTemplate date template with YYYY for year and XXXX for previous year - * @return date from template. - */ - private static LocalDate getDate(final Integer year, final String dateTemplate) { - return LocalDate.parse(dateTemplate// - .replace("YYYY", String.valueOf(year))// - .replace("XXXX", String.valueOf(year - 1))); - } - private static String getTranslation(final Map<String, String> names, final Locale locale) { final var locales = List.of(locale, Locale.FRENCH, Locale.ENGLISH); for (final Locale l : locales) { @@ -225,7 +212,7 @@ public class IndicatorResource implements IndicatorService { */ private void addMetadata(final FeatureCollection collection, final Indicator indicator, final Integer year, final Locale locale, final boolean comparison) { - final var periodFirstDay = getDate(year, indicator.getPeriod().getFirstDay()); + final var periodFirstDay = DateUtils.toLocalDate(year, indicator.getPeriod().getFirstDay()); final Feature feature = new Feature(); final MultiPolygon multiPolygon = new MultiPolygon(); feature.setGeometry(multiPolygon); @@ -357,9 +344,9 @@ public class IndicatorResource implements IndicatorService { throwWebApplicationException(Response.Status.BAD_REQUEST, indicatorUid + " is unknown for " + periodCode); } - final var firstDay = getDate(year, indicator.getPeriod().getFirstDay()); - final var lastDay = getDate(year, indicator.getPeriod().getLastDay()); - final var date = praDailyValueDao.findLastDate(indicator, year); + final var firstDay = DateUtils.toLocalDate(year, indicator.getPeriod().getFirstDay()); + final var lastDay = DateUtils.toLocalDate(year, indicator.getPeriod().getLastDay()); + final var date = praDailyValueDao.findLastDate(indicator, firstDay, lastDay); if (date == null) { throwWebApplicationException(Response.Status.NOT_FOUND, "No value found for indicator " + indicatorUid + " in " + year); @@ -474,7 +461,9 @@ public class IndicatorResource implements IndicatorService { throwWebApplicationException(Response.Status.BAD_REQUEST, indicatorUid + " is unknown for " + periodCode); } addMetadata(collection, indicator, year, locale, Boolean.TRUE.equals(comparison)); - final LocalDate date = praDailyValueDao.findLastDate(indicator, year); + final LocalDate firstDay = DateUtils.toLocalDate(year, indicator.getPeriod().getFirstDay()); + final LocalDate lastDay = DateUtils.toLocalDate(year, indicator.getPeriod().getLastDay()); + final LocalDate date = praDailyValueDao.findLastDate(indicator, firstDay, lastDay); if (date == null) { throwWebApplicationException(Response.Status.NOT_FOUND, "No value found for indicator " + indicatorUid + " in " + year); diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/util/DateUtils.java b/www-server/src/main/java/fr/agrometinfo/www/server/util/DateUtils.java index c7c35af4085a284b79ffb31ea13fc8e40f3e70fa..2d5842dffd1bc2febc554a5dd6c12fbd4a6bb4f4 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/util/DateUtils.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/util/DateUtils.java @@ -44,4 +44,18 @@ public interface DateUtils { static LocalDate toLocalDate(@NonNull final Date date) { return new java.sql.Timestamp(date.getTime()).toLocalDateTime().toLocalDate(); } + + /** + * Get the date related to the year. + * + * @param year year + * @param dateTemplate date template with YYYY for year and XXXX for previous + * year + * @return date from template. + */ + static LocalDate toLocalDate(final Integer year, final String dateTemplate) { + return LocalDate.parse(dateTemplate// + .replace("YYYY", String.valueOf(year))// + .replace("XXXX", String.valueOf(year - 1))); + } } diff --git a/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyValueDaoHibernateTest.java b/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyValueDaoHibernateTest.java index d7c373830536f6ca9f4716481dc40f4bc3bcaf38..e21ac9219e4b65ca7db754370fd146dad51acf6d 100644 --- a/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyValueDaoHibernateTest.java +++ b/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyValueDaoHibernateTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.Test; import fr.agrometinfo.www.server.model.Indicator; +import fr.agrometinfo.www.server.util.DateUtils; /** * Test DailyValueDao Hibernate implementation. @@ -34,7 +35,9 @@ class DailyValueDaoHibernateTest { @Test void findAverageComputedValue() { final var indicator = indicatorDao.findByCodeAndPeriod("rainsum", "year"); - final var date = praDailyValueDao.findLastDate(indicator, YEAR); + final var firstDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getFirstDay()); + final var lastDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getLastDay()); + final var date = praDailyValueDao.findLastDate(indicator, firstDay, lastDay); final var region = praDailyValueDao.findRegions().get(0); final var actual = dao.findAverageComputedValue(indicator, date, (int) region.getId()); final Double expected = 22.d; diff --git a/www-server/src/test/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernateTest.java b/www-server/src/test/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernateTest.java index 20d7f63307b048a675db60eae0f5e51e1260d76a..93f527cb9a91412e3714c5857f1a50f84b62c3f0 100644 --- a/www-server/src/test/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernateTest.java +++ b/www-server/src/test/java/fr/agrometinfo/www/server/dao/PraDailyValueDaoHibernateTest.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.Test; import fr.agrometinfo.www.server.model.Indicator; +import fr.agrometinfo.www.server.util.DateUtils; /** * Test PraDailyValueDao Hibernate implementation. @@ -26,7 +27,9 @@ class PraDailyValueDaoHibernateTest { @Test void find() { final var indicator = indicatorDao.findByCodeAndPeriod("rainsum", "year"); - final var date = dao.findLastDate(indicator, DailyValueDaoHibernateTest.YEAR); + final var firstDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getFirstDay()); + final var lastDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getLastDay()); + final var date = dao.findLastDate(indicator, firstDay, lastDay); final var actual = dao.find(indicator, date); assertNotNull(actual); } @@ -43,7 +46,9 @@ class PraDailyValueDaoHibernateTest { @Test void findLastDate() { final var indicator = indicatorDao.findByCodeAndPeriod("rainsum", "year"); - final var actual = dao.findLastDate(indicator, YEAR); + final var firstDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getFirstDay()); + final var lastDay = DateUtils.toLocalDate(YEAR, indicator.getPeriod().getLastDay()); + final var actual = dao.findLastDate(indicator, firstDay, lastDay); assertNotNull(actual); }