diff --git a/cwms-data-api/src/main/java/cwms/cda/data/dao/TimeSeriesIdentifierDescriptorDao.java b/cwms-data-api/src/main/java/cwms/cda/data/dao/TimeSeriesIdentifierDescriptorDao.java index 332f5c08f..73d0c4123 100644 --- a/cwms-data-api/src/main/java/cwms/cda/data/dao/TimeSeriesIdentifierDescriptorDao.java +++ b/cwms-data-api/src/main/java/cwms/cda/data/dao/TimeSeriesIdentifierDescriptorDao.java @@ -224,19 +224,32 @@ private TimeSeriesIdentifierDescriptor toDescriptorWithAliases(Record6 getTimeSeriesIdentifier(String office, String timeseriesId) { AV_CWMS_TS_ID2 view = AV_CWMS_TS_ID2.AV_CWMS_TS_ID2; - return connectionResult(dsl, connection -> { - Record5 - result = dsl.select(view.CWMS_TS_ID, view.DB_OFFICE_ID, view.INTERVAL, - view.TIME_ZONE_ID, view.TS_ACTIVE_FLAG) + Table innerTable = AV_CWMS_TS_ID2.AV_CWMS_TS_ID2.as("alias_table"); + Field tsId = innerTable.field("CWMS_TS_ID", String.class); + Field innerTsCode = innerTable.field("TS_CODE", BigDecimal.class); + Field aliasedItem = innerTable.field("ALIASED_ITEM", String.class); + return dsl + .select(view.DB_OFFICE_ID, + view.CWMS_TS_ID, + view.INTERVAL_UTC_OFFSET, + view.TS_ACTIVE_FLAG, + view.TIME_ZONE_ID, + DSL.multiset( + dsl.selectDistinct( + tsId + ).from(innerTable) + .where(view.TS_CODE.eq(innerTsCode)) + .and(aliasedItem.isNotNull()) + ).convertFrom(rs -> rs.map(r -> r.get(tsId, String.class))) + ) .from(view) - .where(view.CWMS_TS_ID.eq(timeseriesId).and(view.DB_OFFICE_ID.eq(office.toUpperCase()))).fetchOne(); - Optional retval = Optional.empty(); - if (result != null) { - retval = Optional.of(toDto(result)); - } - - return retval; - }); + .where(view.CWMS_TS_ID.eq(timeseriesId) + .and(view.DB_OFFICE_ID.eq(office.toUpperCase()))) + .orderBy(view.DB_OFFICE_ID, view.CWMS_TS_ID, + view.INTERVAL_UTC_OFFSET, + view.TS_ACTIVE_FLAG, + view.TIME_ZONE_ID) + .fetchOptional(this::toDescriptorWithAliases); } public static TimeSeriesIdentifierDescriptor toDto(Record5 rec) { diff --git a/cwms-data-api/src/test/java/cwms/cda/api/TimeSeriesIdentifierDescriptorControllerTestIT.java b/cwms-data-api/src/test/java/cwms/cda/api/TimeSeriesIdentifierDescriptorControllerTestIT.java index a0e7ee767..302a2dd16 100644 --- a/cwms-data-api/src/test/java/cwms/cda/api/TimeSeriesIdentifierDescriptorControllerTestIT.java +++ b/cwms-data-api/src/test/java/cwms/cda/api/TimeSeriesIdentifierDescriptorControllerTestIT.java @@ -65,6 +65,7 @@ import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -530,7 +531,7 @@ void pagingTest() throws Exception { } - @Test + @RepeatedTest(2) void testAliasedTimeSeries() throws Exception { // Test Structure // @@ -541,7 +542,8 @@ void testAliasedTimeSeries() throws Exception { // 5. Retrieve with aliases createLocation("Alder Springs", true, "SPK"); - String likePattern = "Alder Springs\\.Precip-Cumulative\\.Inst\\.15Minutes\\.0\\.DescriptorTEST_ALIASES.*"; + final String likePattern = "Alder Springs\\.Precip-Cumulative\\.Inst\\.15Minutes\\.0\\.DescriptorTEST_ALIASES.*"; + final String formatPattern = "Alder Springs.Precip-Cumulative.Inst.15Minutes.0.DescriptorTEST_ALIASES%d"; // Check that we don't have any ts like this in the catalog. List names = getIdsLike(OFFICE, likePattern); @@ -553,7 +555,7 @@ void testAliasedTimeSeries() throws Exception { // Create a bunch of ts and store them. int count = 8; for (int i = 0; i < count; i++) { - String tsId = String.format("Alder Springs.Precip-Cumulative.Inst.15Minutes.0.DescriptorTEST_ALIASES%d", i); + String tsId = String.format(formatPattern, i); TimeSeriesIdentifierDescriptor ts = buildTimeSeriesIdentifierDescriptor(OFFICE, tsId); String serializedTs = om.writeValueAsString(ts); @@ -668,6 +670,24 @@ void testAliasedTimeSeries() throws Exception { .assertThat() .statusCode(is(HttpServletResponse.SC_OK)) .body("descriptors[0].aliases.size()", greaterThan(0)); + + + // get by path single + given() + .log().ifValidationFails(LogDetail.ALL, true) + .accept(Formats.JSONV2) + .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.TIMESERIES_ID_REGEX, likePattern) + .queryParam(Controllers.EXCLUDE_EMPTY, false) + .queryParam(Controllers.INCLUDE_ALIASES, true) + .when() + .get("/timeseries/identifier-descriptor/{timeseries-id}", String.format("Alder Springs.Precip-Cumulative.Inst.15Minutes.0.DescriptorTEST_ALIASES%d",0)) + .then() + .log().ifValidationFails(LogDetail.ALL, true) + .assertThat() + .statusCode(is(HttpServletResponse.SC_OK)) + .body("aliases.size()", greaterThan(0)); + } @Test