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
|
// Current period — read from rollup
|
||||||
var conditions = new ArrayList<String>();
|
var conditions = new ArrayList<String>();
|
||||||
var params = new ArrayList<Object>();
|
var params = new ArrayList<Object>();
|
||||||
conditions.add("bucket >= toStartOfFiveMinutes(?)");
|
conditions.add("bucket >= ?");
|
||||||
params.add(Timestamp.from(from));
|
params.add(Timestamp.from(floorToFiveMinutes(from)));
|
||||||
conditions.add("bucket <= ?");
|
conditions.add("bucket <= ?");
|
||||||
params.add(Timestamp.from(to));
|
params.add(Timestamp.from(to));
|
||||||
addScopeFilters(routeId, agentIds, conditions, params);
|
addScopeFilters(routeId, agentIds, conditions, params);
|
||||||
@@ -139,8 +139,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
|
|||||||
Instant prevTo = prevFrom.plus(window);
|
Instant prevTo = prevFrom.plus(window);
|
||||||
var prevConditions = new ArrayList<String>();
|
var prevConditions = new ArrayList<String>();
|
||||||
var prevParams = new ArrayList<Object>();
|
var prevParams = new ArrayList<Object>();
|
||||||
prevConditions.add("bucket >= toStartOfFiveMinutes(?)");
|
prevConditions.add("bucket >= ?");
|
||||||
prevParams.add(Timestamp.from(prevFrom));
|
prevParams.add(Timestamp.from(floorToFiveMinutes(prevFrom)));
|
||||||
prevConditions.add("bucket <= ?");
|
prevConditions.add("bucket <= ?");
|
||||||
prevParams.add(Timestamp.from(prevTo));
|
prevParams.add(Timestamp.from(prevTo));
|
||||||
addScopeFilters(routeId, agentIds, prevConditions, prevParams);
|
addScopeFilters(routeId, agentIds, prevConditions, prevParams);
|
||||||
@@ -165,8 +165,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
|
|||||||
Instant todayStart = Instant.now().truncatedTo(java.time.temporal.ChronoUnit.DAYS);
|
Instant todayStart = Instant.now().truncatedTo(java.time.temporal.ChronoUnit.DAYS);
|
||||||
var todayConditions = new ArrayList<String>();
|
var todayConditions = new ArrayList<String>();
|
||||||
var todayParams = new ArrayList<Object>();
|
var todayParams = new ArrayList<Object>();
|
||||||
todayConditions.add("bucket >= toStartOfFiveMinutes(?)");
|
todayConditions.add("bucket >= ?");
|
||||||
todayParams.add(Timestamp.from(todayStart));
|
todayParams.add(Timestamp.from(floorToFiveMinutes(todayStart)));
|
||||||
addScopeFilters(routeId, agentIds, todayConditions, todayParams);
|
addScopeFilters(routeId, agentIds, todayConditions, todayParams);
|
||||||
String todayWhere = " WHERE " + String.join(" AND ", todayConditions);
|
String todayWhere = " WHERE " + String.join(" AND ", todayConditions);
|
||||||
|
|
||||||
@@ -194,8 +194,8 @@ public class ClickHouseSearchEngine implements SearchEngine {
|
|||||||
|
|
||||||
var conditions = new ArrayList<String>();
|
var conditions = new ArrayList<String>();
|
||||||
var params = new ArrayList<Object>();
|
var params = new ArrayList<Object>();
|
||||||
conditions.add("bucket >= toStartOfFiveMinutes(?)");
|
conditions.add("bucket >= ?");
|
||||||
params.add(Timestamp.from(from));
|
params.add(Timestamp.from(floorToFiveMinutes(from)));
|
||||||
conditions.add("bucket <= ?");
|
conditions.add("bucket <= ?");
|
||||||
params.add(Timestamp.from(to));
|
params.add(Timestamp.from(to));
|
||||||
addScopeFilters(routeId, agentIds, conditions, params);
|
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.
|
* Escape special LIKE characters to prevent LIKE injection.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user