From 4cf7495183548de6aa7535db3662cd067bd0cb4c Mon Sep 17 00:00:00 2001 From: Bryson Spilman Date: Fri, 10 Jul 2026 13:43:26 -0700 Subject: [PATCH 1/3] CWMSVUE-634 - Updates query against locations to allow for comparison against large collection size. --- .../main/java/cwms/cda/api/PublishedController.java | 7 +++++-- .../cda/data/dao/PublishedRetrievalParameters.java | 12 +++++++----- .../cwms/cda/data/dao/PublishedTimeSeriesDao.java | 7 +++++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java index 3457aa9af..03243c374 100644 --- a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java +++ b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java @@ -56,6 +56,8 @@ import io.javalin.plugin.openapi.annotations.OpenApiContent; import io.javalin.plugin.openapi.annotations.OpenApiParam; import io.javalin.plugin.openapi.annotations.OpenApiResponse; +import java.util.Arrays; +import java.util.List; import javax.servlet.http.HttpServletResponse; import org.jetbrains.annotations.NotNull; import org.jooq.DSLContext; @@ -64,7 +66,7 @@ public final class PublishedController implements CrudHandler { private static final String TAG = "Published"; private final MetricRegistry metrics; private final Histogram requestResultSize; - private static final int DEFAULT_PAGE_SIZE = 20; + private static final int DEFAULT_PAGE_SIZE = 500; public PublishedController(MetricRegistry metrics) { this.metrics = metrics; @@ -131,7 +133,8 @@ public void getAll(@NotNull Context ctx) { try (Timer.Context ignored = markAndTime(GET_ALL)) { DSLContext dsl = getDslContext(ctx); PublishedTimeSeriesDao dao = new PublishedTimeSeriesDao(dsl); - PublishedRetrievalParameters retrievalParams = new PublishedRetrievalParameters(locationIdMask, officeIdMask); + List locationIds = locationIdMask != null ? Arrays.asList(locationIdMask.split("\\|")) : null; + PublishedRetrievalParameters retrievalParams = new PublishedRetrievalParameters(locationIds, officeIdMask); LocationToPublishedDataList result = dao.retrievePublishedTimeSeriesIds(retrievalParams, cursor, pageSize); String formatHeader = ctx.header(Header.ACCEPT); diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedRetrievalParameters.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedRetrievalParameters.java index f35a6aa12..04152dcd5 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedRetrievalParameters.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedRetrievalParameters.java @@ -22,19 +22,21 @@ * SOFTWARE. */ package cwms.cda.data.dao; +import java.util.Collections; +import java.util.List; import java.util.Optional; public class PublishedRetrievalParameters { - private final String locationIdsMask; + private final List locationIds; private final String officeIdsMask; - public PublishedRetrievalParameters(String locationIdsMask, String officeIdsMask) { - this.locationIdsMask = locationIdsMask; + public PublishedRetrievalParameters(List locationIds, String officeIdsMask) { + this.locationIds = locationIds != null ? Collections.unmodifiableList(locationIds) : Collections.emptyList(); this.officeIdsMask = officeIdsMask; } - public Optional getLocationId() { - return Optional.ofNullable(locationIdsMask); + public List getLocationIds() { + return locationIds; } public Optional getOfficeId() { diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedTimeSeriesDao.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedTimeSeriesDao.java index f9e564950..c288f71fd 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedTimeSeriesDao.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/PublishedTimeSeriesDao.java @@ -31,7 +31,6 @@ import cwms.cda.data.dto.timeseriesprofile.TimeSeriesProfile; import java.math.BigDecimal; import java.sql.Timestamp; -import java.time.Instant; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -64,7 +63,11 @@ public LocationToPublishedDataList retrievePublishedTimeSeriesIds(PublishedRetri String cursorLocId = null; Condition officeCondition = caseInsensitiveLikeRegexNullTrue(AV_A2W_TS_CODES_BY_LOC2.DB_OFFICE_ID, retrievalParameters.getOfficeId().orElse("*")); - Condition locationCondition = caseInsensitiveLikeRegexNullTrue(AV_A2W_TS_CODES_BY_LOC2.LOCATION_ID, retrievalParameters.getLocationId().orElse("*")); + Condition locationCondition = noCondition(); + List locationIds = retrievalParameters.getLocationIds(); + if (locationIds != null && !locationIds.isEmpty()) { + locationCondition = upper(AV_A2W_TS_CODES_BY_LOC2.LOCATION_ID).in(locationIds.stream().map(String::toUpperCase).collect(toList())); + } Condition whereClause = locationCondition.and(officeCondition); From 27f037bfdb4687fa776a1027b21705693baaef20 Mon Sep 17 00:00:00 2001 From: Bryson Spilman Date: Fri, 10 Jul 2026 15:11:03 -0700 Subject: [PATCH 2/3] CWMSVUE-634 - Added updated description for location mask format for published endpoint --- .../src/main/java/cwms/cda/api/PublishedController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java index 03243c374..86733e3a5 100644 --- a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java +++ b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java @@ -97,7 +97,8 @@ public void delete(@NotNull Context context, @NotNull String s) { @OpenApi( queryParams = { @OpenApiParam(name = OFFICE_MASK, description = "Office Id used to filter the results."), - @OpenApiParam(name = LOCATION_MASK, description = "Location Id used to filter the results."), + @OpenApiParam(name = LOCATION_MASK, description = "A pipe-separated list of Location IDs used to filter the results. " + + "For example, 'Location1|Location2'."), @OpenApiParam(name = PAGE, description = "This end point can return a lot of data, this " + "identifies where in the request you are. This is an opaque " From a4f099a0ab930aab142712b1478a369db1483177 Mon Sep 17 00:00:00 2001 From: Bryson Spilman Date: Fri, 10 Jul 2026 15:14:20 -0700 Subject: [PATCH 3/3] CWMSVUE-634 - Added real location names for example in location mask description for published endpoint --- .../src/main/java/cwms/cda/api/PublishedController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java index 86733e3a5..ce857bcc6 100644 --- a/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java +++ b/cwms-data-api/src/main/java/cwms/cda/api/PublishedController.java @@ -98,7 +98,7 @@ public void delete(@NotNull Context context, @NotNull String s) { queryParams = { @OpenApiParam(name = OFFICE_MASK, description = "Office Id used to filter the results."), @OpenApiParam(name = LOCATION_MASK, description = "A pipe-separated list of Location IDs used to filter the results. " - + "For example, 'Location1|Location2'."), + + "For example, 'AARK|ADDI'."), @OpenApiParam(name = PAGE, description = "This end point can return a lot of data, this " + "identifies where in the request you are. This is an opaque "