From 0b2c7ddf84ee12f8c1698d4f2a2fed8e607c359e Mon Sep 17 00:00:00 2001 From: zack-rma Date: Mon, 20 Apr 2026 12:45:08 -0700 Subject: [PATCH 01/11] Removed distinct from select query. Updated total to remove join with values view. --- .../java/cwms/cda/api/TimeSeriesGroupController.java | 9 +++++++++ .../java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 8 +++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java b/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java index 43f937582b..4f3e5274f9 100644 --- a/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java +++ b/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java @@ -288,6 +288,15 @@ public void update(@NotNull Context ctx, @NotNull String oldGroupId) { timeSeriesGroupDao.unassignForOffice(group.getTimeSeriesCategory().getId(), group.getId(), group.getOfficeId(), office); } timeSeriesGroupDao.assignTs(group, office); + TimeSeriesGroup retrievedGroup = timeSeriesGroupDao.getTimeSeriesGroup(null, group.getOfficeId(), + null, null, oldGroupId); + if (!retrievedGroup.getDescription().equals(group.getDescription())) { + TimeSeriesGroup groupToStore = + new TimeSeriesGroup(retrievedGroup.getTimeSeriesCategory(), retrievedGroup.getOfficeId(), + retrievedGroup.getId(), group.getDescription(), retrievedGroup.getSharedAliasId(), + retrievedGroup.getSharedRefTsId()); + timeSeriesGroupDao.create(groupToStore, false, true); + } ctx.status(HttpServletResponse.SC_OK); } } diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index eb68a47bdb..de9b8e21f5 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -206,7 +206,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, SelectLimitPercentAfterOffsetStep query; if (includeAliases) { - query = dsl.select(asterisk()).from(dsl.selectDistinct(LOCATION_ALIAS_FIELDS_NEW_VIEW) + query = dsl.select(asterisk()).from(dsl.select(LOCATION_ALIAS_FIELDS_NEW_VIEW) .from(ref) .join(values) .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) @@ -221,7 +221,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .offset(offset) .limit(pageSize); } else { - query = dsl.selectDistinct(LOCATION_LEVEL_FIELDS_NEW_VIEW) + query = dsl.select(LOCATION_LEVEL_FIELDS_NEW_VIEW) .from(ref) .join(values) .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) @@ -234,11 +234,9 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, } if (!totalSet) { - total = dsl.fetchCount(dsl.selectDistinct(ref.OFFICE_ID, ref.LOCATION_LEVEL_ID, ref.LOCATION_LEVEL_DATE, + total = dsl.fetchCount(dsl.select(ref.OFFICE_ID, ref.LOCATION_LEVEL_ID, ref.LOCATION_LEVEL_DATE, values.CALENDAR_OFFSET, values.TIME_OFFSET) .from(ref) - .fullOuterJoin(values) - .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .where(whereCondition) ); } From c91107c6d448f6b64ec3ca7db249ee106a56d37b Mon Sep 17 00:00:00 2001 From: zack-rma Date: Mon, 20 Apr 2026 14:14:45 -0700 Subject: [PATCH 02/11] Updated select statement to resolve retrieval error --- .../cda/data/dao/LocationLevelsDaoImpl.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index de9b8e21f5..db23f662d5 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -181,34 +181,42 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, } if (supportsNewView()) { - Condition whereCondition = ref.LOCATION_LEVEL_ID.isNotNull(); + Condition whereCondition = field("LOCATION_LEVEL_ID", String.class).isNotNull(); if (office != null && !office.isEmpty()) { - whereCondition = whereCondition.and(ref.OFFICE_ID.eq(office.toUpperCase())); + whereCondition = whereCondition.and(field("OFFICE_ID", String.class).eq(office.toUpperCase())); } if (levelIdMask != null && !levelIdMask.isEmpty()) { whereCondition = whereCondition.and( - JooqDao.caseInsensitiveLikeRegex(ref.LOCATION_LEVEL_ID, levelIdMask)); + JooqDao.caseInsensitiveLikeRegex(field("LOCATION_LEVEL_ID", String.class), levelIdMask)); } if (beginZdt != null) { whereCondition = - whereCondition.and(ref.LOCATION_LEVEL_DATE.greaterOrEqual(Timestamp.from(beginZdt.toInstant()))); + whereCondition.and(field("LOCATION_LEVEL_DATE", Timestamp.class).greaterOrEqual(Timestamp.from(beginZdt.toInstant()))); } if (endZdt != null) { whereCondition = - whereCondition.and(ref.LOCATION_LEVEL_DATE.lessThan(Timestamp.from(endZdt.toInstant()))); + whereCondition.and(field("LOCATION_LEVEL_DATE", Timestamp.class).lessThan(Timestamp.from(endZdt.toInstant()))); } Map builderMap = new LinkedHashMap<>(); SelectLimitPercentAfterOffsetStep query; + var pagedRef = dsl.select(ref.LOCATION_LEVEL_CODE, + ref.LOCATION_LEVEL_ID, ref.ATTRIBUTE_ID, ref.OFFICE_ID, ref.LOCATION_LEVEL_DATE, ref.LOCATION_ID, + ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.EXPIRATION_DATE, + ref.LOCATION_LEVEL_COMMENT) + .from(ref) + .where(ref.OFFICE_ID.eq(office)) + .orderBy(ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE); + if (includeAliases) { query = dsl.select(asterisk()).from(dsl.select(LOCATION_ALIAS_FIELDS_NEW_VIEW) - .from(ref) - .join(values) + .from(pagedRef) + .leftJoin(values) .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .leftJoin(aliasView) .on(ref.OFFICE_ID.eq(aliasView.DB_OFFICE_ID)) @@ -221,21 +229,24 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .offset(offset) .limit(pageSize); } else { - query = dsl.select(LOCATION_LEVEL_FIELDS_NEW_VIEW) - .from(ref) - .join(values) - .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) + List> selectFields = new ArrayList<>(); + selectFields.addAll(LOCATION_LEVEL_FIELDS_NEW_VIEW); + selectFields.addAll(List.of(pagedRef.fields())); + query = dsl.select(selectFields) + .from(pagedRef) + .leftJoin(values) + .on(pagedRef.field("LOCATION_LEVEL_CODE", Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .where(whereCondition) - .orderBy(DSL.upper(ref.OFFICE_ID), DSL.upper(ref.LOCATION_LEVEL_ID), - ref.LOCATION_LEVEL_DATE, values.CALENDAR_OFFSET, values.TIME_OFFSET + .orderBy(DSL.upper(pagedRef.field("OFFICE_ID", String.class)), + DSL.upper(pagedRef.field("LOCATION_LEVEL_ID", String.class)), + pagedRef.field("LOCATION_LEVEL_DATE"), values.CALENDAR_OFFSET, values.TIME_OFFSET ) .offset(offset) .limit(pageSize); } if (!totalSet) { - total = dsl.fetchCount(dsl.select(ref.OFFICE_ID, ref.LOCATION_LEVEL_ID, ref.LOCATION_LEVEL_DATE, - values.CALENDAR_OFFSET, values.TIME_OFFSET) + total = dsl.fetchCount(dsl.select(ref.OFFICE_ID, ref.LOCATION_LEVEL_ID, ref.LOCATION_LEVEL_DATE) .from(ref) .where(whereCondition) ); @@ -1328,28 +1339,18 @@ private ZTSV_ARRAY buildTsvArray(Instant start, Instant end, Interval interval, } private static void buildLocationLevelSelectFieldsNewView() { - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.OFFICE_ID); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.LOCATION_LEVEL_ID); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.ATTRIBUTE_ID); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.LOCATION_LEVEL_DATE); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.CONNECTIONS); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.DURATION_ID); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.ATTRIBUTE_UNIT_EN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.ATTRIBUTE_VALUE_EN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.ATTRIBUTE_UNIT_SI); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.ATTRIBUTE_VALUE_SI); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.OFFICE_ID); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.LOCATION_LEVEL_ID); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.EXPIRATION_DATE); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.TSID); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.CONSTANT_LEVEL_EN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.CONSTANT_LEVEL_SI); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.INTERVAL_ORIGIN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.INTERPOLATE); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.ATTRIBUTE_ID); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.LEVEL_UNIT_EN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.LEVEL_UNIT_SI); - LOCATION_LEVEL_FIELDS_NEW_VIEW.add(ref.LOCATION_LEVEL_COMMENT); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.SEASONAL_VALUE_EN); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.SEASONAL_VALUE_SI); LOCATION_LEVEL_FIELDS_NEW_VIEW.add(values.CALENDAR_INTERVAL); From 0657e6af407c986335d5e3229290857ea3370fe9 Mon Sep 17 00:00:00 2001 From: zack-rma Date: Mon, 20 Apr 2026 14:38:54 -0700 Subject: [PATCH 03/11] Refactored paging handling --- .../cda/data/dao/LocationLevelsDaoImpl.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index db23f662d5..f6407aac8c 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -92,6 +92,7 @@ import org.jooq.Record; import org.jooq.Result; import org.jooq.SelectLimitPercentAfterOffsetStep; +import org.jooq.SelectSeekStep5; import org.jooq.Table; import org.jooq.conf.ParamType; import org.jooq.exception.DataAccessException; @@ -203,7 +204,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, Map builderMap = new LinkedHashMap<>(); - SelectLimitPercentAfterOffsetStep query; + SelectSeekStep5 query; var pagedRef = dsl.select(ref.LOCATION_LEVEL_CODE, ref.LOCATION_LEVEL_ID, ref.ATTRIBUTE_ID, ref.OFFICE_ID, ref.LOCATION_LEVEL_DATE, ref.LOCATION_ID, @@ -211,7 +212,9 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, ref.LOCATION_LEVEL_COMMENT) .from(ref) .where(ref.OFFICE_ID.eq(office)) - .orderBy(ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE); + .orderBy(ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE) + .offset(offset) + .limit(pageSize); if (includeAliases) { query = dsl.select(asterisk()).from(dsl.select(LOCATION_ALIAS_FIELDS_NEW_VIEW) @@ -225,9 +228,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .where(whereCondition)) .orderBy(field("OFFICE_ID"), field("LOCATION_LEVEL_ID"), field("LOCATION_LEVEL_DATE"), field("CALENDAR_OFFSET"), field("TIME_OFFSET") - ) - .offset(offset) - .limit(pageSize); + ); } else { List> selectFields = new ArrayList<>(); selectFields.addAll(LOCATION_LEVEL_FIELDS_NEW_VIEW); @@ -240,9 +241,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .orderBy(DSL.upper(pagedRef.field("OFFICE_ID", String.class)), DSL.upper(pagedRef.field("LOCATION_LEVEL_ID", String.class)), pagedRef.field("LOCATION_LEVEL_DATE"), values.CALENDAR_OFFSET, values.TIME_OFFSET - ) - .offset(offset) - .limit(pageSize); + ); } if (!totalSet) { @@ -252,7 +251,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, ); } - final SelectLimitPercentAfterOffsetStep queryFinal = query; + final SelectSeekStep5 queryFinal = query; logger.atFine().log("getLocationLevels query: %s", lazy(() -> queryFinal.getSQL(ParamType.INLINED))); From 59bdeaa62718397c6ea2c6603d061149c1826e80 Mon Sep 17 00:00:00 2001 From: zack-rma Date: Mon, 20 Apr 2026 16:18:07 -0700 Subject: [PATCH 04/11] Updated to use var --- .../src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index f6407aac8c..11038a788c 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -251,7 +251,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, ); } - final SelectSeekStep5 queryFinal = query; + final var queryFinal = query; logger.atFine().log("getLocationLevels query: %s", lazy(() -> queryFinal.getSQL(ParamType.INLINED))); From 8177d1af214111d2b04fedb6837f2149cffdfd03 Mon Sep 17 00:00:00 2001 From: Zack Olson Date: Tue, 21 Apr 2026 10:51:37 -0700 Subject: [PATCH 05/11] Update cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java Co-authored-by: Adam Korynta <47677856+adamkorynta@users.noreply.github.com> --- .../src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index 11038a788c..0d9c281b87 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -1105,7 +1105,7 @@ private void parseLevelsNewView(Record r, Map Date: Wed, 22 Apr 2026 16:41:02 -0700 Subject: [PATCH 06/11] Query cleanup and refactoring --- .../cda/data/dao/LocationLevelsDaoImpl.java | 26 ++++++++----------- .../cwms/cda/api/LevelsControllerTestIT.java | 2 +- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index 0d9c281b87..6c971b3d42 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -206,8 +206,8 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, SelectSeekStep5 query; - var pagedRef = dsl.select(ref.LOCATION_LEVEL_CODE, - ref.LOCATION_LEVEL_ID, ref.ATTRIBUTE_ID, ref.OFFICE_ID, ref.LOCATION_LEVEL_DATE, ref.LOCATION_ID, + var pagedRef = dsl.select(ref.LOCATION_LEVEL_CODE, ref.LOCATION_ID, + ref.LOCATION_LEVEL_ID, ref.ATTRIBUTE_ID, ref.OFFICE_ID, ref.LOCATION_LEVEL_DATE, ref.LOCATION_CODE, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.EXPIRATION_DATE, ref.LOCATION_LEVEL_COMMENT) .from(ref) @@ -217,14 +217,18 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .limit(pageSize); if (includeAliases) { - query = dsl.select(asterisk()).from(dsl.select(LOCATION_ALIAS_FIELDS_NEW_VIEW) + List> selectFields = new ArrayList<>(); + selectFields.addAll(LOCATION_ALIAS_FIELDS_NEW_VIEW); + selectFields.addAll(List.of(pagedRef.fields())); + selectFields.remove(pagedRef.field("LOCATION_ID", String.class)); + query = dsl.select(asterisk()).from(dsl.select(selectFields) .from(pagedRef) .leftJoin(values) - .on(ref.LOCATION_LEVEL_CODE.eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) + .on(pagedRef.field("LOCATION_LEVEL_CODE", Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .leftJoin(aliasView) - .on(ref.OFFICE_ID.eq(aliasView.DB_OFFICE_ID)) - .and(ref.LOCATION_ID.eq(aliasView.LOCATION_ID)) - .and(ref.LOCATION_CODE.eq(aliasView.LOCATION_CODE.cast(Long.class))) + .on(aliasView.DB_OFFICE_ID.eq(pagedRef.field("OFFICE_ID", String.class))) + .and(aliasView.LOCATION_ID.eq(pagedRef.field("LOCATION_ID", String.class))) + .and(aliasView.LOCATION_CODE.eq(pagedRef.field("LOCATION_CODE", BigDecimal.class))) .where(whereCondition)) .orderBy(field("OFFICE_ID"), field("LOCATION_LEVEL_ID"), field("LOCATION_LEVEL_DATE"), field("CALENDAR_OFFSET"), field("TIME_OFFSET") @@ -1359,17 +1363,11 @@ private static void buildLocationLevelSelectFieldsNewView() { } private static void buildAliasedLocationLevelSelectFieldsNewView() { - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.OFFICE_ID.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.LOCATION_LEVEL_ID.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.ATTRIBUTE_ID.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.LOCATION_LEVEL_DATE.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.CONNECTIONS.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.DURATION_ID.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.ATTRIBUTE_UNIT_EN.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.ATTRIBUTE_VALUE_EN.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.ATTRIBUTE_UNIT_SI.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.ATTRIBUTE_VALUE_SI.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.EXPIRATION_DATE)); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.TSID.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.CONSTANT_LEVEL_EN.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.CONSTANT_LEVEL_SI.getUnqualifiedName())); @@ -1377,7 +1375,6 @@ private static void buildAliasedLocationLevelSelectFieldsNewView() { LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.INTERPOLATE.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.LEVEL_UNIT_EN.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.LEVEL_UNIT_SI.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(ref.LOCATION_LEVEL_COMMENT.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.SEASONAL_VALUE_EN.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.SEASONAL_VALUE_SI.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.CALENDAR_INTERVAL.getUnqualifiedName())); @@ -1386,7 +1383,6 @@ private static void buildAliasedLocationLevelSelectFieldsNewView() { LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(values.TIME_OFFSET.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.LOCATION_ID)); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.ALIAS_ID.getUnqualifiedName())); - LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.LOCATION_CODE)); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.DB_OFFICE_ID.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.CATEGORY_ID.getUnqualifiedName())); LOCATION_ALIAS_FIELDS_NEW_VIEW.add(field(aliasView.GROUP_ID.getUnqualifiedName())); diff --git a/cwms-data-api/src/test/java/cwms/cda/api/LevelsControllerTestIT.java b/cwms-data-api/src/test/java/cwms/cda/api/LevelsControllerTestIT.java index e6410d6d66..574f07e514 100644 --- a/cwms-data-api/src/test/java/cwms/cda/api/LevelsControllerTestIT.java +++ b/cwms-data-api/src/test/java/cwms/cda/api/LevelsControllerTestIT.java @@ -1864,7 +1864,7 @@ void testRetrieveAllSeasonalLevel() throws Exception { .body("levels.size()", is(1)) .body("levels[0].expiration-date", equalTo(levelDate.plusYears(50).toInstant().toString())) .body("levels[0].seasonal-values.size()", is(numValues)) - .body("total", is(numValues)); + .body("total", is(1)); } @Test From 72912ef80697f65ccb2d91698150c450f36b2ab2 Mon Sep 17 00:00:00 2001 From: zack-rma Date: Thu, 23 Apr 2026 15:45:10 -0700 Subject: [PATCH 07/11] Fixed query where condition to filter results properly --- .../cda/data/dao/LocationLevelsDaoImpl.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index 6c971b3d42..cdd2c269e4 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -129,6 +129,12 @@ public class LocationLevelsDaoImpl extends JooqDao implements Loc private static final AV_LOCATION_LEVEL_VALUES values = AV_LOCATION_LEVEL_VALUES; private static final usace.cwms.db.jooq.codegen.tables.AV_LOC_ALIAS aliasView = AV_LOC_ALIAS; + private static final String LOCATION_LEVEL_CODE = "LOCATION_LEVEL_CODE"; + private static final String LOCATION_LEVEL_ID = "LOCATION_LEVEL_ID"; + private static final String LOCATION_LEVEL_DATE = "LOCATION_LEVEL_DATE"; + private static final String OFFICE_ID = "OFFICE_ID"; + private static final String TIME_OFFSET = "TIME_OFFSET"; + private static final String CALENDAR_OFFSET = "CALENDAR_OFFSET"; private static final String TABLE_ALIAS1 = "T1"; private static final String TABLE_ALIAS2 = "T2"; private static final String ALIASED_ATTRIBUTE_ID = TABLE_ALIAS1 + ".ATTRIBUTE_ID"; @@ -182,24 +188,24 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, } if (supportsNewView()) { - Condition whereCondition = field("LOCATION_LEVEL_ID", String.class).isNotNull(); + Condition whereCondition = field(LOCATION_LEVEL_ID, String.class).isNotNull(); if (office != null && !office.isEmpty()) { - whereCondition = whereCondition.and(field("OFFICE_ID", String.class).eq(office.toUpperCase())); + whereCondition = whereCondition.and(field(OFFICE_ID, String.class).eq(office.toUpperCase())); } if (levelIdMask != null && !levelIdMask.isEmpty()) { whereCondition = whereCondition.and( - JooqDao.caseInsensitiveLikeRegex(field("LOCATION_LEVEL_ID", String.class), levelIdMask)); + JooqDao.caseInsensitiveLikeRegex(field(LOCATION_LEVEL_ID, String.class), levelIdMask)); } if (beginZdt != null) { whereCondition = - whereCondition.and(field("LOCATION_LEVEL_DATE", Timestamp.class).greaterOrEqual(Timestamp.from(beginZdt.toInstant()))); + whereCondition.and(field(LOCATION_LEVEL_DATE, Timestamp.class).greaterOrEqual(Timestamp.from(beginZdt.toInstant()))); } if (endZdt != null) { whereCondition = - whereCondition.and(field("LOCATION_LEVEL_DATE", Timestamp.class).lessThan(Timestamp.from(endZdt.toInstant()))); + whereCondition.and(field(LOCATION_LEVEL_DATE, Timestamp.class).lessThan(Timestamp.from(endZdt.toInstant()))); } Map builderMap = new LinkedHashMap<>(); @@ -211,7 +217,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.EXPIRATION_DATE, ref.LOCATION_LEVEL_COMMENT) .from(ref) - .where(ref.OFFICE_ID.eq(office)) + .where(whereCondition) .orderBy(ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE) .offset(offset) .limit(pageSize); @@ -224,14 +230,14 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, query = dsl.select(asterisk()).from(dsl.select(selectFields) .from(pagedRef) .leftJoin(values) - .on(pagedRef.field("LOCATION_LEVEL_CODE", Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) + .on(pagedRef.field(LOCATION_LEVEL_CODE, Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .leftJoin(aliasView) - .on(aliasView.DB_OFFICE_ID.eq(pagedRef.field("OFFICE_ID", String.class))) + .on(aliasView.DB_OFFICE_ID.eq(pagedRef.field(OFFICE_ID, String.class))) .and(aliasView.LOCATION_ID.eq(pagedRef.field("LOCATION_ID", String.class))) .and(aliasView.LOCATION_CODE.eq(pagedRef.field("LOCATION_CODE", BigDecimal.class))) .where(whereCondition)) - .orderBy(field("OFFICE_ID"), field("LOCATION_LEVEL_ID"), - field("LOCATION_LEVEL_DATE"), field("CALENDAR_OFFSET"), field("TIME_OFFSET") + .orderBy(field(OFFICE_ID), field(LOCATION_LEVEL_ID), + field(LOCATION_LEVEL_DATE), field(CALENDAR_OFFSET), field(TIME_OFFSET) ); } else { List> selectFields = new ArrayList<>(); @@ -240,11 +246,11 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, query = dsl.select(selectFields) .from(pagedRef) .leftJoin(values) - .on(pagedRef.field("LOCATION_LEVEL_CODE", Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) + .on(pagedRef.field(LOCATION_LEVEL_CODE, Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) .where(whereCondition) - .orderBy(DSL.upper(pagedRef.field("OFFICE_ID", String.class)), - DSL.upper(pagedRef.field("LOCATION_LEVEL_ID", String.class)), - pagedRef.field("LOCATION_LEVEL_DATE"), values.CALENDAR_OFFSET, values.TIME_OFFSET + .orderBy(DSL.upper(pagedRef.field(OFFICE_ID, String.class)), + DSL.upper(pagedRef.field(LOCATION_LEVEL_ID, String.class)), + pagedRef.field(LOCATION_LEVEL_DATE), values.CALENDAR_OFFSET, values.TIME_OFFSET ); } @@ -360,7 +366,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .and(mapping.getLocationLevelId(TABLE_ALIAS1, null).eq(virtView.LOCATION_LEVEL_ID))) .where(whereCondition).asTable(TABLE_ALIAS2)) .orderBy(mapping.getOfficeId(null, null), mapping.getLocationLevelId(null, null), - field("LEVEL_DATE"), field("CALENDAR_OFFSET"), field("TIME_OFFSET"), + field("LEVEL_DATE"), field(CALENDAR_OFFSET), field(TIME_OFFSET), mapping.getLocationLevelId(TABLE_ALIAS2, null), field("EFFECTIVE_DATE_UTC") ) .offset(offset) @@ -1401,12 +1407,12 @@ private interface LocationFieldMapping { private static final class JooqLocationFieldMapping implements LocationFieldMapping { @Override public Field getOfficeId(String prefix, Table table) { - return table.field(DSL.name(prefix, "OFFICE_ID"), String.class); + return table.field(DSL.name(prefix, OFFICE_ID), String.class); } @Override public Field getLocationLevelId(String prefix, Table table) { - return table.field(DSL.name(prefix, "LOCATION_LEVEL_ID"), String.class); + return table.field(DSL.name(prefix, LOCATION_LEVEL_ID), String.class); } @Override @@ -1423,19 +1429,19 @@ public Field getUnitSystem() { private static final class AliasedLocationFieldMapping implements LocationFieldMapping { @Override public Field getOfficeId(String prefix, Table table) { - String field = prefix != null ? prefix + ".OFFICE_ID" : "OFFICE_ID"; + String field = prefix != null ? prefix + ".OFFICE_ID" : OFFICE_ID; return field(field, String.class); } @Override public Field getLocationLevelId(String prefix, Table table) { - String field = prefix != null ? prefix + ".LOCATION_LEVEL_ID" : "LOCATION_LEVEL_ID"; + String field = prefix != null ? prefix + ".LOCATION_LEVEL_ID" : LOCATION_LEVEL_ID; return field(field, String.class); } @Override public Field getLocationLevelCode() { - return field(String.format("%s.%s", TABLE_ALIAS1, "LOCATION_LEVEL_CODE"), Long.class); + return field(String.format("%s.%s", TABLE_ALIAS1, LOCATION_LEVEL_CODE), Long.class); } @Override @@ -1752,12 +1758,12 @@ public Field getInterpolate() { @Override public Field getCalendarOffset() { - return DSL.field(DSL.name(TABLE_ALIAS2, "CALENDAR_OFFSET"), String.class); + return DSL.field(DSL.name(TABLE_ALIAS2, CALENDAR_OFFSET), String.class); } @Override public Field getTimeOffset() { - return DSL.field(DSL.name(TABLE_ALIAS2, "TIME_OFFSET"), String.class); + return DSL.field(DSL.name(TABLE_ALIAS2, TIME_OFFSET), String.class); } @Override From 2879f3397d0f60696e9f23cba56c3117dfecc973 Mon Sep 17 00:00:00 2001 From: zack-rma Date: Tue, 5 May 2026 11:15:27 -0700 Subject: [PATCH 08/11] Reverted TS Group controller changes --- .../java/cwms/cda/api/TimeSeriesGroupController.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java b/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java index 4f3e5274f9..43f937582b 100644 --- a/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java +++ b/cwms-data-api/src/main/java/cwms/cda/api/TimeSeriesGroupController.java @@ -288,15 +288,6 @@ public void update(@NotNull Context ctx, @NotNull String oldGroupId) { timeSeriesGroupDao.unassignForOffice(group.getTimeSeriesCategory().getId(), group.getId(), group.getOfficeId(), office); } timeSeriesGroupDao.assignTs(group, office); - TimeSeriesGroup retrievedGroup = timeSeriesGroupDao.getTimeSeriesGroup(null, group.getOfficeId(), - null, null, oldGroupId); - if (!retrievedGroup.getDescription().equals(group.getDescription())) { - TimeSeriesGroup groupToStore = - new TimeSeriesGroup(retrievedGroup.getTimeSeriesCategory(), retrievedGroup.getOfficeId(), - retrievedGroup.getId(), group.getDescription(), retrievedGroup.getSharedAliasId(), - retrievedGroup.getSharedRefTsId()); - timeSeriesGroupDao.create(groupToStore, false, true); - } ctx.status(HttpServletResponse.SC_OK); } } From 036b06005f44de1f0a627b8d0147c8bf97c2d1cf Mon Sep 17 00:00:00 2001 From: zack-rma Date: Tue, 5 May 2026 12:01:56 -0700 Subject: [PATCH 09/11] Fixed total count for legacy query --- .../src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index f4d7cd5858..c9736b8107 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -395,8 +395,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, if (!totalSet) { total = dsl.fetchCount(dsl.selectDistinct(view.OFFICE_ID, view.LOCATION_LEVEL_ID, view.LEVEL_DATE, - view.CALENDAR_OFFSET, view.TIME_OFFSET, virtView.OFFICE_ID, virtView.LOCATION_LEVEL_ID, - virtView.EFFECTIVE_DATE_UTC) + virtView.OFFICE_ID, virtView.LOCATION_LEVEL_ID, virtView.EFFECTIVE_DATE_UTC) .from(view) .fullOuterJoin(virtView) .on(view.LOCATION_LEVEL_CODE.eq(virtView.LOCATION_LEVEL_CODE)) From d5cf63c9b9bc8602a93b85d6bc55a09a6c57e5f3 Mon Sep 17 00:00:00 2001 From: Zack Olson Date: Tue, 5 May 2026 12:54:43 -0700 Subject: [PATCH 10/11] Update cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java Added office ID to orderby Co-authored-by: Adam Korynta <47677856+adamkorynta@users.noreply.github.com> --- .../src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index c9736b8107..d189879276 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -225,7 +225,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, ref.LOCATION_LEVEL_COMMENT) .from(ref) .where(whereCondition) - .orderBy(ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE) + .orderBy(ref.OFFICE_ID, ref.LOCATION_ID, ref.PARAMETER_ID, ref.PARAMETER_TYPE_ID, ref.DURATION_ID, ref.SPECIFIED_LEVEL_ID, ref.LOCATION_LEVEL_DATE) .offset(offset) .limit(pageSize); From 027f17dc66027b54aeb0cad2d4d550158b45fd70 Mon Sep 17 00:00:00 2001 From: zack-rma Date: Tue, 5 May 2026 12:56:17 -0700 Subject: [PATCH 11/11] Removed duplicate where conditions --- .../main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java index d189879276..fff8d9b7e1 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/LocationLevelsDaoImpl.java @@ -241,8 +241,7 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .leftJoin(aliasView) .on(aliasView.DB_OFFICE_ID.eq(pagedRef.field(OFFICE_ID, String.class))) .and(aliasView.LOCATION_ID.eq(pagedRef.field("LOCATION_ID", String.class))) - .and(aliasView.LOCATION_CODE.eq(pagedRef.field("LOCATION_CODE", BigDecimal.class))) - .where(whereCondition)) + .and(aliasView.LOCATION_CODE.eq(pagedRef.field("LOCATION_CODE", BigDecimal.class)))) .orderBy(field(OFFICE_ID), field(LOCATION_LEVEL_ID), field(LOCATION_LEVEL_DATE), field(CALENDAR_OFFSET), field(TIME_OFFSET) ); @@ -254,7 +253,6 @@ public LocationLevels getLocationLevels(String cursor, int pageSize, .from(pagedRef) .leftJoin(values) .on(pagedRef.field(LOCATION_LEVEL_CODE, Long.class).eq(values.LOCATION_LEVEL_CODE.cast(Long.class))) - .where(whereCondition) .orderBy(DSL.upper(pagedRef.field(OFFICE_ID, String.class)), DSL.upper(pagedRef.field(LOCATION_LEVEL_ID, String.class)), pagedRef.field(LOCATION_LEVEL_DATE), values.CALENDAR_OFFSET, values.TIME_OFFSET