From f9b5f235cc51f3e17b1f00beebdc3c106be7a67d Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Fri, 24 Apr 2026 09:59:05 +0200 Subject: [PATCH] feat(search): extend SearchRequest with attributeFilters (legacy ctor preserved) --- .../server/core/search/SearchRequest.java | 30 ++++++++++++++++--- .../core/search/AttributeFilterTest.java | 27 +++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchRequest.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchRequest.java index de15c4b8..02ae76ea 100644 --- a/cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchRequest.java +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/search/SearchRequest.java @@ -54,7 +54,8 @@ public record SearchRequest( String sortField, String sortDir, String afterExecutionId, - String environment + String environment, + List attributeFilters ) { private static final int DEFAULT_LIMIT = 50; @@ -83,6 +84,24 @@ public record SearchRequest( if (offset < 0) offset = 0; if (sortField == null || !ALLOWED_SORT_FIELDS.contains(sortField)) sortField = "startTime"; if (!"asc".equalsIgnoreCase(sortDir)) sortDir = "desc"; + if (attributeFilters == null) attributeFilters = List.of(); + } + + /** Legacy 21-arg constructor preserved for existing call sites — defaults attributeFilters to empty. */ + public SearchRequest( + String status, Instant timeFrom, Instant timeTo, + Long durationMin, Long durationMax, String correlationId, + String text, String textInBody, String textInHeaders, String textInErrors, + String routeId, String instanceId, String processorType, + String applicationId, List instanceIds, + int offset, int limit, String sortField, String sortDir, + String afterExecutionId, String environment + ) { + this(status, timeFrom, timeTo, durationMin, durationMax, correlationId, + text, textInBody, textInHeaders, textInErrors, + routeId, instanceId, processorType, applicationId, instanceIds, + offset, limit, sortField, sortDir, afterExecutionId, environment, + List.of()); } /** Returns the snake_case column name for ORDER BY. */ @@ -96,7 +115,8 @@ public record SearchRequest( status, timeFrom, timeTo, durationMin, durationMax, correlationId, text, textInBody, textInHeaders, textInErrors, routeId, instanceId, processorType, applicationId, resolvedInstanceIds, - offset, limit, sortField, sortDir, afterExecutionId, environment + offset, limit, sortField, sortDir, afterExecutionId, environment, + attributeFilters ); } @@ -106,7 +126,8 @@ public record SearchRequest( status, timeFrom, timeTo, durationMin, durationMax, correlationId, text, textInBody, textInHeaders, textInErrors, routeId, instanceId, processorType, applicationId, instanceIds, - offset, limit, sortField, sortDir, afterExecutionId, env + offset, limit, sortField, sortDir, afterExecutionId, env, + attributeFilters ); } @@ -122,7 +143,8 @@ public record SearchRequest( status, ts, timeTo, durationMin, durationMax, correlationId, text, textInBody, textInHeaders, textInErrors, routeId, instanceId, processorType, applicationId, instanceIds, - offset, limit, sortField, sortDir, afterExecutionId, environment + offset, limit, sortField, sortDir, afterExecutionId, environment, + attributeFilters ); } } diff --git a/cameleer-server-core/src/test/java/com/cameleer/server/core/search/AttributeFilterTest.java b/cameleer-server-core/src/test/java/com/cameleer/server/core/search/AttributeFilterTest.java index bad0c232..db9cd092 100644 --- a/cameleer-server-core/src/test/java/com/cameleer/server/core/search/AttributeFilterTest.java +++ b/cameleer-server-core/src/test/java/com/cameleer/server/core/search/AttributeFilterTest.java @@ -58,4 +58,31 @@ class AttributeFilterTest { AttributeFilter f = new AttributeFilter("order", "47"); assertThat(f.toLikePattern()).isNull(); } + + @Test + void searchRequest_canonicalCtor_acceptsAttributeFilters() { + SearchRequest r = new SearchRequest( + null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, 0, 50, null, null, null, null, + java.util.List.of(new AttributeFilter("order", "47"))); + assertThat(r.attributeFilters()).hasSize(1); + assertThat(r.attributeFilters().get(0).key()).isEqualTo("order"); + } + + @Test + void searchRequest_legacyCtor_defaultsAttributeFiltersToEmpty() { + SearchRequest r = new SearchRequest( + null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, 0, 50, null, null, null, null); + assertThat(r.attributeFilters()).isEmpty(); + } + + @Test + void searchRequest_compactCtor_normalizesNullAttributeFilters() { + SearchRequest r = new SearchRequest( + null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, 0, 50, null, null, null, null, + null); + assertThat(r.attributeFilters()).isNotNull().isEmpty(); + } }