USACE / USACE/cwms-data-api

Latest Schema reports invalid time series in slightly different way

Open
#1,471 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Java
Stars
28
Forks
25
Avg merge
4d 22h
Merged PRs (30d)
20

Description

Describe the bug
Tests have started to fail that rely on specific behavior from the LRTS options

Expected behavior
Correct and well presented failures

To Reproduce
Run tests using LRTS intervals against latest-dev schema

Logs/Incident Identifier

BinaryTimeSeriesControllerTestIT (schema: latest-dev) > BinaryTimeSeriesControllerTestIT.test_create_get_delete_get_lrts (schema: latest-dev) > [2] */* STANDARD_ERROR
    17-Nov-2025 16:19:56.690 WARNING [http-nio-auto-1-exec-4] cwms.cda.ApiServlet.lambda$init$8 error on request[5710f2dc-4b5c-4ad8-bd26-642e4c0cd089]: /cwms-data/timeseries/binary/
    	org.jooq.exception.DataAccessException: SQL [{ call "CWMS_20"."CWMS_TEXT"."STORE_TS_BINARY" (?, ?, ?, ?, cast(? as date), ?, ?, ?, ?, ?) }]; ORA-20998: ERROR: INVALID Time Series Identifier "TsBinTestLoc.Binary.Inst.1DayLocal.0.lrts": No such interval
    ORA-06512: at "CWMS_20.CWMS_ERR", line 80
    ORA-06512: at "CWMS_20.CWMS_TS", line 8834
    ORA-01403: no data found
    ORA-06512: at "CWMS_20.CWMS_TS", line 8807
    ORA-06512: at "CWMS_20.CWMS_TS", line 61
    ORA-06512: at "CWMS_20.CWMS_TS", line 26
    ORA-06512: at "CWMS_20.CWMS_TS", line 10874
    ORA-06512: at "CWMS_20.CWMS_TEXT", line 3914
    ORA-06512: at line 1

    		at org.jooq_3.18.7.ORACLE18C.debug(Unknown Source)
    		at org.jooq.impl.Tools.translate(Tools.java:3470)
    		at org.jooq.impl.Tools.translate(Tools.java:3458)
    		at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:802)
    		at org.jooq.impl.AbstractRoutine.executeCallableStatement(AbstractRoutine.java:611)
    		at org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:405)
    		at org.jooq.impl.Tools.attach(Tools.java:1610)
    		at org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:374)
    		at usace.cwms.db.jooq.codegen.packages.CWMS_TEXT_PACKAGE.call_STORE_TS_BINARY__2(CWMS_TEXT_PACKAGE.java:2123)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.store(TimeSeriesBinaryDao.java:140)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.storeRow(TimeSeriesBinaryDao.java:298)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.lambda$storeRows$2(TimeSeriesBinaryDao.java:284)
    		at org.jooq.impl.DefaultDSLContext.lambda$transaction$5(DefaultDSLContext.java:593)
    		at org.jooq.impl.DefaultDSLContext.lambda$transactionResult0$3(DefaultDSLContext.java:531)
    		at org.jooq.impl.Tools$3$1.block(Tools.java:6068)
    		at java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3128)
    		at org.jooq.impl.Tools$3.get(Tools.java:6065)
    		at org.jooq.impl.DefaultDSLContext.transactionResult0(DefaultDSLContext.java:579)
    		at org.jooq.impl.DefaultDSLContext.transactionResult(DefaultDSLContext.java:503)
    		at org.jooq.impl.DefaultDSLContext.transaction(DefaultDSLContext.java:592)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.lambda$storeRows$3(TimeSeriesBinaryDao.java:281)
    		at org.jooq.impl.DefaultDSLContext.lambda$connection$12(DefaultDSLContext.java:697)
    		at org.jooq.impl.DefaultDSLContext.connectionResult(DefaultDSLContext.java:658)
    		at org.jooq.impl.DefaultDSLContext.connection(DefaultDSLContext.java:696)
    		at cwms.cda.data.dao.JooqDao.connection(JooqDao.java:734)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.storeRows(TimeSeriesBinaryDao.java:279)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.store(TimeSeriesBinaryDao.java:153)
    		at cwms.cda.data.dao.binarytimeseries.TimeSeriesBinaryDao.store(TimeSeriesBinaryDao.java:146)
    		at cwms.cda.api.BinaryTimeSeriesController.create(BinaryTimeSeriesController.java:212)
    		at io.javalin.apibuilder.CrudFunction$3.invoke$lambda-0(CrudHandler.kt:32)
    		at io.javalin.apibuilder.CrudFunctionHandler.handle(CrudHandler.kt)
    		at cwms.cda.security.CdaAccessManager.manage(CdaAccessManager.java:37)
    		at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96)
    		at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43)
    		at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43)
    		at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:99)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85)
    		at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
    		at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2241)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85)
    		at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119)
    		at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:680)
    		at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658)
    		at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2100)
    		at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85)
    		at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
    		at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2241)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85)
    		at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119)
    		at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:680)
    		at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658)
    		at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2100)
    		at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85)
    		at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
    		at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2241)
    		at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85)
    		at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89)
    		at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
    		at cwms.cda.ApiServlet.service(ApiServlet.java:910)
    		at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
    		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:197)
    		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142)
    		at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:129)
    		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166)
    		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142)
    		at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:334)
    		at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:161)
    		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166)
    		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142)
    		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166)
    		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88)
    		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
    		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)
    		at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240)
    		at fixtures.tomcat.SingleSignOnWrapper.invoke(SingleSignOnWrapper.java:21)
    		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)
    		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
    		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)
    		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935)
    		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1831)
    		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    		at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973)
    		at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491)
    		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
    		at java.base/java.lang.Thread.run(Thread.java:829)
    	Caused by: java.sql.SQLException: ORA-20998: ERROR: INVALID Time Series Identifier "TsBinTestLoc.Binary.Inst.1DayLocal.0.lrts": No such interval
    ORA-06512: at "CWMS_20.CWMS_ERR", line 80
    ORA-06512: at "CWMS_20.CWMS_TS", line 8834
    ORA-01403: no data found
    ORA-06512: at "CWMS_20.CWMS_TS", line 8807
    ORA-06512: at "CWMS_20.CWMS_TS", line 61
    ORA-06512: at "CWMS_20.CWMS_TS", line 26
    ORA-06512: at "CWMS_20.CWMS_TS", line 10874
    ORA-06512: at "CWMS_20.CWMS_TEXT", line 3914
    ORA-06512: at line 1

    		at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
    		at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:461)
    		at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1104)
    		at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:550)
    		at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:268)
    		at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
    		at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:265)
    		at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:86)
    		at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:965)
    		at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1205)
    		at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666)
    		at oracle.jdbc.driver.T4CCallableStatement.executeInternal(T4CCallableStatement.java:1358)
    		at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3778)
    		at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4251)
    		at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1081)
    		at jdk.internal.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
    		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    		at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:214)
    		at com.sun.proxy.$Proxy63.execute(Unknown Source)
    		at jdk.internal.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
    		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    		at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:214)
    		at com.sun.proxy.$Proxy63.execute(Unknown Source)
    		at jdk.internal.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
    		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    		at org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor$StatementProxy.invoke(StatementDecoratorInterceptor.java:237)
    		at com.sun.proxy.$Proxy63.execute(Unknown Source)
    		at jdk.internal.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
    		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    		at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:123)
    		at com.sun.proxy.$Proxy63.execute(Unknown Source)
    		at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:219)
    		at org.jooq.impl.Tools.executeStatementAndGetFirstResultSet(Tools.java:4695)
    		at org.jooq.impl.AbstractRoutine.execute0(AbstractRoutine.java:622)
    		at org.jooq.impl.AbstractRoutine.executeCallableStatement(AbstractRoutine.java:582)
    		... 84 more
    	Caused by: Error : 20998, Position : 0, Sql = BEGIN "CWMS_20"."CWMS_TEXT"."STORE_TS_BINARY" (:1 , :2 , :3 , :4 , cast(:5  as date), :6 , :7 , :8 , :9 , :10 ) ; END;, OriginalSql = { call "CWMS_20"."CWMS_TEXT"."STORE_TS_BINARY" (?, ?, ?, ?, cast(? as date), ?, ?, ?, ?, ?) }, Error Msg = ORA-20998: ERROR: INVALID Time Series Identifier "TsBinTestLoc.Binary.Inst.1DayLocal.0.lrts": No such interval
    ORA-06512: at "CWMS_20.CWMS_ERR", line 80
    ORA-06512: at "CWMS_20.CWMS_TS", line 8834
    ORA-01403: no data found
    ORA-06512: at "CWMS_20.CWMS_TS", line 8807
    ORA-06512: at "CWMS_20.CWMS_TS", line 61
    ORA-06512: at "CWMS_20.CWMS_TS", line 26
    ORA-06512: at "CWMS_20.CWMS_TS", line 10874
    ORA-06512: at "CWMS_20.CWMS_TEXT", line 3914
    ORA-06512: at line 1

    		at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:513)
    		... 122 more

CURL Commands
N/A

CDA Version (please complete the following information):

  • Version develop, anything released to date

Additional context
Add any other context about the problem here.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running BinaryTimeSeriesControllerTestIT.test_create_get_delete_get_lrts with LRTS intervals against the latest-dev schema. Trace the failure from BinaryTimeSeriesController.create through TimeSeriesBinaryDao.store and compare the reported invalid-interval behavior with the test's expected behavior. Done means the affected tests produce correct, well-presented failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, backend, database
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.