Fix bucket alignment: compute 5-min floor in Java, not ClickHouse SQL
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:
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user