Fix bucket alignment: compute 5-min floor in Java, not ClickHouse SQL
All checks were successful
CI / build (push) Successful in 1m12s
CI / docker (push) Successful in 40s
CI / deploy (push) Successful in 31s

JDBC sends Timestamp params as strings, causing toStartOfFiveMinutes()
to fail with 'Illegal type String'. Floor to 5-minute boundaries in
Java instead and pass plain bucket >= ? comparisons.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-15 11:10:40 +01:00
parent f660e88a17
commit 8e6f8e2693

View File

@@ -99,8 +99,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
// Current period — read from rollup
var conditions = new ArrayList<String>();
var params = new ArrayList<Object>();
conditions.add("bucket >= toStartOfFiveMinutes(?)");
params.add(Timestamp.from(from));
conditions.add("bucket >= ?");
params.add(Timestamp.from(floorToFiveMinutes(from)));
conditions.add("bucket <= ?");
params.add(Timestamp.from(to));
addScopeFilters(routeId, agentIds, conditions, params);
@@ -139,8 +139,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
Instant prevTo = prevFrom.plus(window);
var prevConditions = new ArrayList<String>();
var prevParams = new ArrayList<Object>();
prevConditions.add("bucket >= toStartOfFiveMinutes(?)");
prevParams.add(Timestamp.from(prevFrom));
prevConditions.add("bucket >= ?");
prevParams.add(Timestamp.from(floorToFiveMinutes(prevFrom)));
prevConditions.add("bucket <= ?");
prevParams.add(Timestamp.from(prevTo));
addScopeFilters(routeId, agentIds, prevConditions, prevParams);
@@ -165,8 +165,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
Instant todayStart = Instant.now().truncatedTo(java.time.temporal.ChronoUnit.DAYS);
var todayConditions = new ArrayList<String>();
var todayParams = new ArrayList<Object>();
todayConditions.add("bucket >= toStartOfFiveMinutes(?)");
todayParams.add(Timestamp.from(todayStart));
todayConditions.add("bucket >= ?");
todayParams.add(Timestamp.from(floorToFiveMinutes(todayStart)));
addScopeFilters(routeId, agentIds, todayConditions, todayParams);
String todayWhere = " WHERE " + String.join(" AND ", todayConditions);
@@ -194,8 +194,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
var conditions = new ArrayList<String>();
var params = new ArrayList<Object>();
conditions.add("bucket >= toStartOfFiveMinutes(?)");
params.add(Timestamp.from(from));
conditions.add("bucket >= ?");
params.add(Timestamp.from(floorToFiveMinutes(from)));
conditions.add("bucket <= ?");
params.add(Timestamp.from(to));
addScopeFilters(routeId, agentIds, conditions, params);
@@ -326,6 +326,14 @@ public class ClickHouseSearchEngine implements SearchEngine {
}
}
/**
* Floor an Instant to the start of its 5-minute bucket.
*/
private static Instant floorToFiveMinutes(Instant instant) {
long epochSecond = instant.getEpochSecond();
return Instant.ofEpochSecond(epochSecond - (epochSecond % 300));
}
/**
* Escape special LIKE characters to prevent LIKE injection.
*/