From 5bf211f2ebb17dd2b8090367a5c2d64a88ebc911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kami=C5=84ski?= Date: Wed, 26 Nov 2025 09:19:50 +0100 Subject: [PATCH] =?UTF-8?q?Saving=20reasonable=20refactorings=20from=20PR?= =?UTF-8?q?=20that=20has=20to=20be=20abandoned=20and=20=E2=80=A6=20(#24356?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Saving reasonable refactorigns from PR that has to be andandoned and closed * Deprecatig proper version of the class - OSv3 one... --- .../elasticsearch7/SearchRequestFactory.java | 7 +- .../opensearch2/SearchRequestFactory.java | 7 +- .../opensearch3/SearchRequestFactory.java | 8 +- .../opensearch3/SearchRequestFactoryOS.java | 78 +++++++++++++++++++ 4 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactoryOS.java diff --git a/graylog-storage-elasticsearch7/src/main/java/org/graylog/storage/elasticsearch7/SearchRequestFactory.java b/graylog-storage-elasticsearch7/src/main/java/org/graylog/storage/elasticsearch7/SearchRequestFactory.java index 122c746a55..211fafd0b4 100644 --- a/graylog-storage-elasticsearch7/src/main/java/org/graylog/storage/elasticsearch7/SearchRequestFactory.java +++ b/graylog-storage-elasticsearch7/src/main/java/org/graylog/storage/elasticsearch7/SearchRequestFactory.java @@ -72,7 +72,7 @@ public class SearchRequestFactory { return searchSourceBuilder; } - public SearchSourceBuilder create(SearchCommand searchCommand) { + public BoolQueryBuilder createQueryBuilder(final SearchCommand searchCommand) { final String query = QueryStringUtils.normalizeQuery(searchCommand.query()); final QueryBuilder queryBuilder = translateQueryString(query); @@ -88,6 +88,11 @@ public class SearchRequestFactory { .must(queryBuilder); filterQueryBuilder.ifPresent(filteredQueryBuilder::filter); rangeQueryBuilder.ifPresent(filteredQueryBuilder::filter); + return filteredQueryBuilder; + } + + public SearchSourceBuilder create(SearchCommand searchCommand) { + final BoolQueryBuilder filteredQueryBuilder = createQueryBuilder(searchCommand); applyStreamsFilter(filteredQueryBuilder, searchCommand); diff --git a/graylog-storage-opensearch2/src/main/java/org/graylog/storage/opensearch2/SearchRequestFactory.java b/graylog-storage-opensearch2/src/main/java/org/graylog/storage/opensearch2/SearchRequestFactory.java index 5ceed66059..a5d559ee33 100644 --- a/graylog-storage-opensearch2/src/main/java/org/graylog/storage/opensearch2/SearchRequestFactory.java +++ b/graylog-storage-opensearch2/src/main/java/org/graylog/storage/opensearch2/SearchRequestFactory.java @@ -72,7 +72,7 @@ public class SearchRequestFactory { return searchSourceBuilder; } - public SearchSourceBuilder create(SearchCommand searchCommand) { + public BoolQueryBuilder createQueryBuilder(final SearchCommand searchCommand) { final String query = QueryStringUtils.normalizeQuery(searchCommand.query()); final QueryBuilder queryBuilder = translateQueryString(query); @@ -88,6 +88,11 @@ public class SearchRequestFactory { .must(queryBuilder); filterQueryBuilder.ifPresent(filteredQueryBuilder::filter); rangeQueryBuilder.ifPresent(filteredQueryBuilder::filter); + return filteredQueryBuilder; + } + + public SearchSourceBuilder create(SearchCommand searchCommand) { + final BoolQueryBuilder filteredQueryBuilder = createQueryBuilder(searchCommand); applyStreamsFilter(filteredQueryBuilder, searchCommand); diff --git a/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactory.java b/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactory.java index 189ec6a030..f80847c6a0 100644 --- a/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactory.java +++ b/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactory.java @@ -43,6 +43,7 @@ import static org.graylog.shaded.opensearch2.org.opensearch.index.query.QueryBui import static org.graylog.shaded.opensearch2.org.opensearch.index.query.QueryBuilders.queryStringQuery; import static org.graylog.shaded.opensearch2.org.opensearch.index.query.QueryBuilders.termsQuery; +@Deprecated public class SearchRequestFactory { private static final Sorting DEFAULT_SORTING = new Sorting("_doc", Sorting.Direction.ASC); private final boolean allowHighlighting; @@ -72,7 +73,7 @@ public class SearchRequestFactory { return searchSourceBuilder; } - public SearchSourceBuilder create(SearchCommand searchCommand) { + private BoolQueryBuilder createQueryBuilder(final SearchCommand searchCommand) { final String query = QueryStringUtils.normalizeQuery(searchCommand.query()); final QueryBuilder queryBuilder = translateQueryString(query); @@ -88,6 +89,11 @@ public class SearchRequestFactory { .must(queryBuilder); filterQueryBuilder.ifPresent(filteredQueryBuilder::filter); rangeQueryBuilder.ifPresent(filteredQueryBuilder::filter); + return filteredQueryBuilder; + } + + public SearchSourceBuilder create(SearchCommand searchCommand) { + final BoolQueryBuilder filteredQueryBuilder = createQueryBuilder(searchCommand); applyStreamsFilter(filteredQueryBuilder, searchCommand); diff --git a/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactoryOS.java b/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactoryOS.java new file mode 100644 index 0000000000..f9f77eeaa1 --- /dev/null +++ b/graylog-storage-opensearch3/src/main/java/org/graylog/storage/opensearch3/SearchRequestFactoryOS.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2020 Graylog, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * . + */ +package org.graylog.storage.opensearch3; + +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.graylog.storage.search.SearchCommand; +import org.graylog2.search.QueryStringUtils; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; + +import java.util.Optional; + +/** + * Opensearch 3 version of {@link SearchRequestFactory}, that will eventually replace its deprecated predecessor. + * Currently, it does not cover all the necessary functionality. + */ +public class SearchRequestFactoryOS { + + private final boolean allowLeadingWildcardSearches; + + @Inject + public SearchRequestFactoryOS(@Named("allow_leading_wildcard_searches") final boolean allowLeadingWildcardSearches) { + this.allowLeadingWildcardSearches = allowLeadingWildcardSearches; + } + + public Query createQueryBuilder(final SearchCommand searchCommand) { + final String query = QueryStringUtils.normalizeQuery(searchCommand.query()); + BoolQuery.Builder topQueryBuilder; + if (QueryStringUtils.isEmptyOrMatchAllQueryString(query)) { + topQueryBuilder = QueryBuilders.bool() + .must( + QueryBuilders.matchAll() + .build() + .toQuery() + ); + } else { + topQueryBuilder = QueryBuilders.bool() + .must( + QueryBuilders.queryString() + .query(query) + .allowLeadingWildcard(allowLeadingWildcardSearches) + .build() + .toQuery() + ); + } + + + final Optional rangeQueryBuilder = searchCommand.range() + .map(TimeRangeQueryFactory::createTimeRangeQuery) + .map(rangeQuery -> QueryBuilders.bool().must(rangeQuery.toQuery())); + final Optional filterQueryBuilder = searchCommand.filter() + .filter(filter -> !QueryStringUtils.isEmptyOrMatchAllQueryString(filter)) + .map(filter -> QueryBuilders.queryString().query(filter).build().toQuery()) + .map(queryStringQuery -> QueryBuilders.bool().must(queryStringQuery)); + + + filterQueryBuilder.ifPresent(builder -> topQueryBuilder.filter(builder.build().toQuery())); + rangeQueryBuilder.ifPresent(builder -> topQueryBuilder.filter(builder.build().toQuery())); + return topQueryBuilder.build().toQuery(); + } + +}