Skip to content

Commit 1397e32

Browse files
committed
Refacto Filter:
Create new QueryFilter utils class add deprecated on all fields /Search endpoint
1 parent 94d01c4 commit 1397e32

File tree

10 files changed

+148
-130
lines changed

10 files changed

+148
-130
lines changed

jdbc/src/main/java/io/kestra/jdbc/repository/AbstractJdbcTriggerRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,8 @@ public ArrayListTotal<Trigger> find(Pageable pageable,String tenantId, List<Quer
266266
.select(field("value"))
267267
.hint(context.configuration().dialect().supports(SQLDialect.MYSQL) ? "SQL_CALC_FOUND_ROWS" : null)
268268
.from(this.jdbcRepository.getTable())
269-
.where(this.fullTextCondition(query))
270-
.and(this.defaultFilter(tenantId));
269+
.where(this.defaultFilter(tenantId))
270+
.and(this.fullTextCondition(query));
271271

272272
filter(select, filters);
273273
// Return paginated results

webserver/src/main/java/io/kestra/webserver/controllers/api/ExecutionController.java

+18-17
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@
4242
import io.kestra.webserver.responses.BulkResponse;
4343
import io.kestra.webserver.responses.PagedResults;
4444
import io.kestra.webserver.utils.PageableUtils;
45+
import io.kestra.webserver.utils.QueryFilterUtils;
4546
import io.kestra.webserver.utils.RequestUtils;
46-
import io.kestra.webserver.utils.TimeLineSearchUtils;
47+
import io.kestra.webserver.utils.TimeLineSearch;
4748
import io.kestra.webserver.utils.filepreview.FileRender;
4849
import io.kestra.webserver.utils.filepreview.FileRenderBuilder;
4950
import io.micronaut.context.annotation.Value;
@@ -193,20 +194,20 @@ public PagedResults<Execution> find(
193194
@Parameter(description = "The sort of current page") @Nullable @QueryValue List<String> sort,
194195
@Parameter(description = "Filters") @QueryFilterFormat List<QueryFilter> filters,
195196
//Deprecated params
196-
@Parameter(description = "A string filter") @Nullable @QueryValue(value = "q") String query,
197-
@Parameter(description = "The scope of the executions to include") @Nullable @QueryValue(value = "scope") List<FlowScope> scope,
198-
@Parameter(description = "A namespace filter prefix") @Nullable @QueryValue String namespace,
199-
@Parameter(description = "A flow id filter") @Nullable @QueryValue String flowId,
200-
@Parameter(description = "The start datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
201-
@Parameter(description = "The end datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate,
202-
@Parameter(description = "A time range filter relative to the current time", examples = {
197+
@Parameter(description = "A string filter", deprecated = true) @Nullable @QueryValue(value = "q") String query,
198+
@Parameter(description = "The scope of the executions to include",deprecated = true) @Nullable @QueryValue(value = "scope") List<FlowScope> scope,
199+
@Parameter(description = "A namespace filter prefix",deprecated = true) @Nullable @QueryValue String namespace,
200+
@Parameter(description = "A flow id filter",deprecated = true) @Nullable @QueryValue String flowId,
201+
@Parameter(description = "The start datetime",deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
202+
@Parameter(description = "The end datetime",deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate,
203+
@Parameter(description = "A time range filter relative to the current time",deprecated = true, examples = {
203204
@ExampleObject(name = "Filter last 5 minutes", value = "PT5M"),
204205
@ExampleObject(name = "Filter last 24 hours", value = "P1D")
205206
}) @Nullable @QueryValue Duration timeRange,
206-
@Parameter(description = "A state filter") @Nullable @QueryValue List<State.Type> state,
207-
@Parameter(description = "A labels filter as a list of 'key:value'") @Nullable @QueryValue @Format("MULTI") List<String> labels,
208-
@Parameter(description = "The trigger execution id") @Nullable @QueryValue String triggerExecutionId,
209-
@Parameter(description = "A execution child filter") @Nullable @QueryValue ExecutionRepositoryInterface.ChildFilter childFilter
207+
@Parameter(description = "A state filter",deprecated = true) @Nullable @QueryValue List<State.Type> state,
208+
@Parameter(description = "A labels filter as a list of 'key:value'", deprecated = true) @Nullable @QueryValue @Format("MULTI") List<String> labels,
209+
@Parameter(description = "The trigger execution id", deprecated = true) @Nullable @QueryValue String triggerExecutionId,
210+
@Parameter(description = "A execution child filter", deprecated = true) @Nullable @QueryValue ExecutionRepositoryInterface.ChildFilter childFilter
210211

211212
) {
212213

@@ -229,15 +230,15 @@ public PagedResults<Execution> find(
229230
}
230231
final ZonedDateTime now = ZonedDateTime.now();
231232

232-
TimeLineSearchUtils timeLineSearchUtils = TimeLineSearchUtils.extractFrom(filters);
233-
validateTimeline(timeLineSearchUtils.startDate(), timeLineSearchUtils.endDate());
233+
TimeLineSearch timeLineSearch = TimeLineSearch.extractFrom(filters);
234+
validateTimeline(timeLineSearch.getStartDate(), timeLineSearch.getEndDate());
234235

235-
ZonedDateTime resolvedStartDate = resolveAbsoluteDateTime(timeLineSearchUtils.startDate(),
236-
timeLineSearchUtils.timeRange(),
236+
ZonedDateTime resolvedStartDate = resolveAbsoluteDateTime(timeLineSearch.getStartDate(),
237+
timeLineSearch.getTimeRange(),
237238
now);
238239

239240
// Update filters with the resolved startDate
240-
filters = timeLineSearchUtils.updateFilters(filters, resolvedStartDate);
241+
filters = QueryFilterUtils.updateFilters(filters, resolvedStartDate);
241242

242243
return PagedResults.of(executionRepository.find(
243244

webserver/src/main/java/io/kestra/webserver/controllers/api/FlowController.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,10 @@ public PagedResults<Flow> find(
206206
@Parameter(description = "The sort of current page") @Nullable @QueryValue List<String> sort,
207207
@Parameter(description = "Filters") @QueryFilterFormat() List<QueryFilter> filters,
208208
// Deprecated params
209-
@Parameter(description = "A string filter") @Nullable @QueryValue(value = "q") String query,
210-
@Parameter(description = "The scope of the flows to include") @Nullable @QueryValue List<FlowScope> scope,
211-
@Parameter(description = "A namespace filter prefix") @Nullable @QueryValue String namespace,
212-
@Parameter(description = "A labels filter as a list of 'key:value'") @Nullable @QueryValue @Format("MULTI") List<String> labels
209+
@Parameter(description = "A string filter",deprecated = true) @Nullable @QueryValue(value = "q") String query,
210+
@Parameter(description = "The scope of the flows to include", deprecated = true) @Nullable @QueryValue List<FlowScope> scope,
211+
@Parameter(description = "A namespace filter prefix", deprecated = true) @Nullable @QueryValue String namespace,
212+
@Parameter(description = "A labels filter as a list of 'key:value'", deprecated = true) @Nullable @QueryValue @Format("MULTI") List<String> labels
213213

214214
) throws HttpStatusException {
215215
// If filters is empty, map old params to QueryFilter

webserver/src/main/java/io/kestra/webserver/controllers/api/LogController.java

+15-13
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import io.kestra.webserver.converters.QueryFilterFormat;
99
import io.kestra.webserver.responses.PagedResults;
1010
import io.kestra.webserver.utils.PageableUtils;
11+
import io.kestra.webserver.utils.QueryFilterUtils;
1112
import io.kestra.webserver.utils.RequestUtils;
12-
import io.kestra.webserver.utils.TimeLineSearchUtils;
13+
import io.kestra.webserver.utils.TimeLineSearch;
1314
import io.micronaut.context.annotation.Requires;
1415
import io.micronaut.core.annotation.Nullable;
1516
import io.micronaut.core.convert.format.Format;
@@ -58,17 +59,18 @@ public PagedResults<LogEntry> find(
5859
@Parameter(description = "The sort of current page") @Nullable @QueryValue List<String> sort,
5960
@Parameter(description = "Filters") @Nullable @QueryFilterFormat List<QueryFilter> filters,
6061
// Deprecated params
61-
@Parameter(description = "A namespace filter prefix") @Nullable @QueryValue String namespace,
62-
@Parameter(description = "A flow id filter") @Nullable @QueryValue String flowId,
63-
@Parameter(description = "A trigger id filter") @Nullable @QueryValue String triggerId,
64-
@Parameter(description = "The min log level filter") @Nullable @QueryValue Level minLevel,
65-
@Parameter(description = "The start datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
66-
@Parameter(description = "The end datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate
62+
@Parameter(description = "A string filter", deprecated = true) @Nullable @QueryValue(value = "q") String query,
63+
@Parameter(description = "A namespace filter prefix",deprecated = true) @Nullable @QueryValue String namespace,
64+
@Parameter(description = "A flow id filter", deprecated = true) @Nullable @QueryValue String flowId,
65+
@Parameter(description = "A trigger id filter",deprecated = true) @Nullable @QueryValue String triggerId,
66+
@Parameter(description = "The min log level filter", deprecated = true) @Nullable @QueryValue Level minLevel,
67+
@Parameter(description = "The start datetime", deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
68+
@Parameter(description = "The end datetime", deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate
6769
) throws HttpStatusException {
6870
// If filters is empty, map old params to QueryFilter
6971
if (filters == null || filters.isEmpty()) {
7072
filters = RequestUtils.mapLegacyParamsToFilters(
71-
null,
73+
query,
7274
namespace,
7375
flowId,
7476
triggerId,
@@ -84,15 +86,15 @@ public PagedResults<LogEntry> find(
8486
}
8587
final ZonedDateTime now = ZonedDateTime.now();
8688

87-
TimeLineSearchUtils timeLineSearchUtils = TimeLineSearchUtils.extractFrom(filters);
88-
validateTimeline(timeLineSearchUtils.startDate(), timeLineSearchUtils.endDate());
89+
TimeLineSearch timeLineSearch = TimeLineSearch.extractFrom(filters);
90+
validateTimeline(timeLineSearch.getStartDate(), timeLineSearch.getEndDate());
8991

90-
ZonedDateTime resolvedStartDate = RequestUtils.resolveAbsoluteDateTime(timeLineSearchUtils.startDate(),
91-
timeLineSearchUtils.timeRange(),
92+
ZonedDateTime resolvedStartDate = RequestUtils.resolveAbsoluteDateTime(timeLineSearch.getStartDate(),
93+
timeLineSearch.getTimeRange(),
9294
now);
9395

9496
// Update filters with the resolved startDate
95-
filters = timeLineSearchUtils.updateFilters(filters, resolvedStartDate);
97+
filters = QueryFilterUtils.updateFilters(filters, resolvedStartDate);
9698
return PagedResults.of(logRepository.find(
9799
PageableUtils.from(page, size, sort),
98100
tenantService.resolveTenant(),

webserver/src/main/java/io/kestra/webserver/controllers/api/TaskRunController.java

+17-16
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import io.kestra.webserver.converters.QueryFilterFormat;
99
import io.kestra.webserver.responses.PagedResults;
1010
import io.kestra.webserver.utils.PageableUtils;
11+
import io.kestra.webserver.utils.QueryFilterUtils;
1112
import io.kestra.webserver.utils.RequestUtils;
12-
import io.kestra.webserver.utils.TimeLineSearchUtils;
13+
import io.kestra.webserver.utils.TimeLineSearch;
1314
import io.micronaut.context.annotation.Requires;
1415
import io.micronaut.core.annotation.Nullable;
1516
import io.micronaut.core.convert.format.Format;
@@ -49,19 +50,19 @@ public PagedResults<TaskRun> findTaskRun(
4950
@Parameter(description = "The sort of current page") @Nullable @QueryValue List<String> sort,
5051
@Parameter(description = "Filters") @QueryFilterFormat List<QueryFilter> filters,
5152
// Deprecated params
52-
@Parameter(description = "A string filter") @Nullable @QueryValue(value = "q") String query,
53-
@Parameter(description = "A namespace filter prefix") @Nullable @QueryValue String namespace,
54-
@Parameter(description = "A flow id filter") @Nullable @QueryValue String flowId,
55-
@Parameter(description = "The start datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
56-
@Parameter(description = "The end datetime") @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate,
57-
@Parameter(description = "A time range filter relative to the current time", examples = {
53+
@Parameter(description = "A string filter",deprecated = true) @Nullable @QueryValue(value = "q") String query,
54+
@Parameter(description = "A namespace filter prefix", deprecated = true) @Nullable @QueryValue String namespace,
55+
@Parameter(description = "A flow id filter",deprecated = true) @Nullable @QueryValue String flowId,
56+
@Parameter(description = "The start datetime",deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime startDate,
57+
@Parameter(description = "The end datetime", deprecated = true) @Nullable @Format("yyyy-MM-dd'T'HH:mm[:ss][.SSS][XXX]") @QueryValue ZonedDateTime endDate,
58+
@Parameter(description = "A time range filter relative to the current time", deprecated = true, examples = {
5859
@ExampleObject(name = "Filter last 5 minutes", value = "PT5M"),
5960
@ExampleObject(name = "Filter last 24 hours", value = "P1D")
6061
}) @Nullable @QueryValue Duration timeRange,
61-
@Parameter(description = "A state filter") @Nullable @QueryValue List<State.Type> state,
62-
@Parameter(description = "A labels filter as a list of 'key:value'") @Nullable @QueryValue @Format("MULTI") List<String> labels,
63-
@Parameter(description = "The trigger execution id") @Nullable @QueryValue String triggerExecutionId,
64-
@Parameter(description = "A execution child filter") @Nullable @QueryValue ExecutionRepositoryInterface.ChildFilter childFilter
62+
@Parameter(description = "A state filter",deprecated = true) @Nullable @QueryValue List<State.Type> state,
63+
@Parameter(description = "A labels filter as a list of 'key:value'", deprecated = true) @Nullable @QueryValue @Format("MULTI") List<String> labels,
64+
@Parameter(description = "The trigger execution id",deprecated = true) @Nullable @QueryValue String triggerExecutionId,
65+
@Parameter(description = "A execution child filter", deprecated = true) @Nullable @QueryValue ExecutionRepositoryInterface.ChildFilter childFilter
6566

6667
) throws HttpStatusException {
6768

@@ -84,15 +85,15 @@ public PagedResults<TaskRun> findTaskRun(
8485
}
8586
final ZonedDateTime now = ZonedDateTime.now();
8687

87-
TimeLineSearchUtils timeLineSearchUtils = TimeLineSearchUtils.extractFrom(filters);
88-
validateTimeline(timeLineSearchUtils.startDate(), timeLineSearchUtils.endDate());
88+
TimeLineSearch timeLineSearch = TimeLineSearch.extractFrom(filters);
89+
validateTimeline(timeLineSearch.getStartDate(), timeLineSearch.getEndDate());
8990

90-
ZonedDateTime resolvedStartDate = RequestUtils.resolveAbsoluteDateTime(timeLineSearchUtils.startDate(),
91-
timeLineSearchUtils.timeRange(),
91+
ZonedDateTime resolvedStartDate = RequestUtils.resolveAbsoluteDateTime(timeLineSearch.getStartDate(),
92+
timeLineSearch.getTimeRange(),
9293
now);
9394

9495
// Update filters with the resolved startDate
95-
filters = timeLineSearchUtils.updateFilters(filters, resolvedStartDate);
96+
filters = QueryFilterUtils.updateFilters(filters, resolvedStartDate);
9697

9798
return PagedResults.of(executionRepository.findTaskRun(
9899
PageableUtils.from(page, size, sort),

webserver/src/main/java/io/kestra/webserver/controllers/api/TriggerController.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ public PagedResults<Triggers> search(
7979
@Parameter(description = "The sort of current page") @Nullable @QueryValue List<String> sort,
8080
@Parameter(description = "Filters") @QueryFilterFormat List<QueryFilter> filters,
8181
// Deprecated params
82-
@Parameter(description = "A string filter") @Nullable @QueryValue(value = "q") String query,
83-
@Parameter(description = "A namespace filter prefix") @Nullable @QueryValue String namespace,
84-
@Parameter(description = "The identifier of the worker currently evaluating the trigger") @Nullable @QueryValue String workerId,
85-
@Parameter(description = "The flow identifier") @Nullable @QueryValue String flowId
82+
@Parameter(description = "A string filter",deprecated = true) @Nullable @QueryValue(value = "q") String query,
83+
@Parameter(description = "A namespace filter prefix", deprecated = true) @Nullable @QueryValue String namespace,
84+
@Parameter(description = "The identifier of the worker currently evaluating the trigger", deprecated = true) @Nullable @QueryValue String workerId,
85+
@Parameter(description = "The flow identifier",deprecated = true) @Nullable @QueryValue String flowId
8686

8787

8888
) throws HttpStatusException {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.kestra.webserver.utils;
2+
3+
import io.kestra.core.models.QueryFilter;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
import java.time.ZonedDateTime;
8+
import java.util.List;
9+
10+
@Data
11+
@Builder
12+
public class QueryFilterUtils {
13+
14+
public static List<QueryFilter> updateFilters(List<QueryFilter> filters, ZonedDateTime resolvedStartDate) {
15+
16+
return filters.stream()
17+
.filter(filter -> !isTimeRangeFilter(filter)) // Remove TIME_RANGE filter
18+
.map(filter -> isStartDateFilter(filter)
19+
? createUpdatedStartDateFilter(filter, resolvedStartDate)
20+
: filter)
21+
.toList();
22+
}
23+
24+
private static boolean isStartDateFilter(QueryFilter filter) {
25+
return filter.field() == QueryFilter.Field.START_DATE;
26+
}
27+
28+
private static boolean isTimeRangeFilter(QueryFilter filter) {
29+
return filter.field() == QueryFilter.Field.TIME_RANGE;
30+
}
31+
32+
private static QueryFilter createUpdatedStartDateFilter(QueryFilter filter, ZonedDateTime resolvedStartDate) {
33+
return QueryFilter.builder()
34+
.field(QueryFilter.Field.START_DATE)
35+
.operation(filter.operation())
36+
.value(resolvedStartDate.toString())
37+
.build();
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.kestra.webserver.utils;
2+
3+
import io.kestra.core.models.QueryFilter;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
import java.time.Duration;
8+
import java.time.ZonedDateTime;
9+
import java.time.format.DateTimeParseException;
10+
import java.util.List;
11+
@Data
12+
@Builder
13+
public class TimeLineSearch {
14+
private ZonedDateTime startDate;
15+
private ZonedDateTime endDate;
16+
private Duration timeRange;
17+
public static TimeLineSearch extractFrom(List<QueryFilter> filters) {
18+
ZonedDateTime startDate = null;
19+
ZonedDateTime endDate = null;
20+
Duration timeRange = null;
21+
22+
for (QueryFilter filter : filters) {
23+
switch (filter.field()) {
24+
case START_DATE -> startDate = ZonedDateTime.parse(filter.value().toString());
25+
case END_DATE -> endDate = ZonedDateTime.parse(filter.value().toString());
26+
case TIME_RANGE -> timeRange = parseDuration(filter.value().toString());
27+
}
28+
}
29+
30+
return new TimeLineSearch(startDate, endDate, timeRange);
31+
}
32+
private static Duration parseDuration(String duration) {
33+
try {
34+
return Duration.parse(duration);
35+
} catch (DateTimeParseException e){
36+
throw new IllegalArgumentException("Invalid duration: " + duration);
37+
}
38+
}
39+
40+
41+
}

0 commit comments

Comments
 (0)