diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java index 08b13dfc..ebd48008 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java @@ -166,6 +166,8 @@ public class OpenSearchIndex implements SearchIndex { filter.add(termQuery("agent_id.keyword", request.agentId())); if (request.correlationId() != null) filter.add(termQuery("correlation_id.keyword", request.correlationId())); + if (request.application() != null && !request.application().isBlank()) + filter.add(termQuery("application_name.keyword", request.application())); // Full-text search across all fields + nested processor fields if (request.text() != null && !request.text().isBlank()) { diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java index 1c9a9351..ec1a80fb 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchRequest.java @@ -59,6 +59,18 @@ public record SearchRequest( "durationMs", "executionId", "applicationName" ); + /** Maps camelCase API sort field names to snake_case OpenSearch/DB column names. */ + private static final java.util.Map SORT_FIELD_TO_COLUMN = java.util.Map.ofEntries( + java.util.Map.entry("startTime", "start_time"), + java.util.Map.entry("status", "status"), + java.util.Map.entry("agentId", "agent_id"), + java.util.Map.entry("routeId", "route_id"), + java.util.Map.entry("correlationId", "correlation_id"), + java.util.Map.entry("durationMs", "duration_ms"), + java.util.Map.entry("executionId", "execution_id"), + java.util.Map.entry("applicationName", "application_name") + ); + public SearchRequest { if (limit <= 0) limit = DEFAULT_LIMIT; if (limit > MAX_LIMIT) limit = MAX_LIMIT; @@ -67,12 +79,9 @@ public record SearchRequest( if (!"asc".equalsIgnoreCase(sortDir)) sortDir = "desc"; } - /** - * Returns the validated sort field name for OpenSearch ORDER BY. - * Field names match the ExecutionDocument record fields (camelCase). - */ + /** Returns the snake_case column name for OpenSearch/DB ORDER BY. */ public String sortColumn() { - return sortField; + return SORT_FIELD_TO_COLUMN.getOrDefault(sortField, "start_time"); } /** Create a copy with resolved agentIds (from application name lookup). */