| | |
| | | assertTrue(latest.getPayloadJson().contains("Voltage")); |
| | | } |
| | | |
| | | /** |
| | | * 工步与循环的分段推导读的就是这条查询(ADR-0067):某一个来源库在该通道上的采样行, |
| | | * 按 (设备时间, 协议序号) 升序——推导依赖这个次序判断哪一段还在进行;其他来源库、 |
| | | * 其他通道与其他来源的行都不混进来。 |
| | | */ |
| | | @Test |
| | | void samplesOfOneSourceRefComeBackInWatermarkOrderAndNothingElseDoes() |
| | | { |
| | | mapper.insertIngestRecord(sample(26, "DB_20260927_155209/Ws26_IV_0:12", 12L, "{\"Voltage\":1.3}", |
| | | Instant.parse("2026-09-27T07:53:20Z"))); |
| | | mapper.insertIngestRecord(sample(26, "DB_20260927_155209/Ws26_IV_0:11", 11L, "{\"Voltage\":1.2}", |
| | | Instant.parse("2026-09-27T07:52:20Z"))); |
| | | // 换了来源库(厂商侧另一次测试)、另一个通道:都不属于本次推导范围。 |
| | | TDeviceIngestRecord laterTest = sample(26, "DB_20260928_101010/Ws26_IV_0:1", 1L, "{\"Voltage\":1.4}", |
| | | Instant.parse("2026-09-28T02:10:10Z")); |
| | | laterTest.setSourceRef("DB_20260928_101010/Ws26_IV_0"); |
| | | mapper.insertIngestRecord(laterTest); |
| | | mapper.insertIngestRecord(sample(18, "DB_20260923_161840/Ws18_IV_0:5", 5L, "{\"Voltage\":1.1}", |
| | | Instant.parse("2026-09-23T08:18:40Z"))); |
| | | |
| | | List<TDeviceIngestRecord> rows = mapper.selectSamplesOfSource(ADAPTER, 0, 0, 1, 26, |
| | | "DB_20260927_155209/Ws26_IV_0"); |
| | | |
| | | assertEquals(List.of(11L, 12L), rows.stream().map(TDeviceIngestRecord::getRecordSequence).toList()); |
| | | assertTrue(mapper.selectSamplesOfSource(ADAPTER, 0, 0, 1, 26, "DB_20261001_000000/Ws26_IV_0").isEmpty()); |
| | | } |
| | | |
| | | /** 供 H2 别名使用的 HEX 等价实现;H2 没有 MySQL 的 HEX()。 */ |
| | | public static String hexOf(byte[] value) |
| | | { |