diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f4784def2b36..30bd1a3fdcda 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,10 +15,6 @@ updates: update-types: ["version-update:semver-patch"] - dependency-name: "com.amazonaws:aws-java-sdk-bom" update-types: ["version-update:semver-patch"] - # Lucene >=10 requires JDK 21 - - dependency-name: "org.apache.lucene:lucene-*" - versions: - - ">= 10" # we want to manually update the opensearch-java client as long as it requires intensive testing - dependency-name: "org.opensearch.client:opensearch-java" groups: diff --git a/data-node/pom.xml b/data-node/pom.xml index 7aef5a68e9d2..22ddefcffb0e 100644 --- a/data-node/pom.xml +++ b/data-node/pom.xml @@ -42,9 +42,6 @@ org.graylog.datanode.bootstrap.Main UTF-8 - - 10.3.2 - 2.19.5 21.0.7 diff --git a/graylog2-server/src/main/java/org/graylog/plugins/views/search/validation/FixedBooleanQuery.java b/graylog2-server/src/main/java/org/graylog/plugins/views/search/validation/FixedBooleanQuery.java index 8bd7cd51c7ef..af52d986f28a 100644 --- a/graylog2-server/src/main/java/org/graylog/plugins/views/search/validation/FixedBooleanQuery.java +++ b/graylog2-server/src/main/java/org/graylog/plugins/views/search/validation/FixedBooleanQuery.java @@ -75,8 +75,8 @@ public Spliterator spliterator() { @Override public void visit(QueryVisitor visitor) { delegate.clauses().forEach(c -> { - final QueryVisitor sub = visitor.getSubVisitor(c.getOccur(), delegate); - c.getQuery().visit(sub); + final QueryVisitor sub = visitor.getSubVisitor(c.occur(), delegate); + c.query().visit(sub); }); } } diff --git a/graylog2-server/src/main/java/org/graylog2/utilities/lucene/LuceneInMemorySearchEngine.java b/graylog2-server/src/main/java/org/graylog2/utilities/lucene/LuceneInMemorySearchEngine.java index d8d2fa22f815..5c905e684d1e 100644 --- a/graylog2-server/src/main/java/org/graylog2/utilities/lucene/LuceneInMemorySearchEngine.java +++ b/graylog2-server/src/main/java/org/graylog2/utilities/lucene/LuceneInMemorySearchEngine.java @@ -27,8 +27,6 @@ import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryparser.flexible.core.QueryNodeException; -import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser; -import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; @@ -41,15 +39,10 @@ import org.graylog2.rest.resources.entities.EntityAttribute; import org.graylog2.search.SearchQuery; import org.graylog2.search.SearchQueryField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; -import java.text.NumberFormat; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -91,7 +84,7 @@ public PaginatedList search(SearchQuery query, String sortField, SortOrder or TopDocs results = searcher.search(luceneQuery, end, sort); // fetch enough docs final List searchResults = extractSearchResults(results, searcher, start, perPage, entries); - final int totalCount = Math.toIntExact(results.totalHits.value); + final int totalCount = Math.toIntExact(results.totalHits.value()); return new PaginatedList<>(searchResults, totalCount, page, perPage); } } diff --git a/graylog2-server/src/test/java/org/graylog2/utilities/lucene/LuceneQueryBuilderTest.java b/graylog2-server/src/test/java/org/graylog2/utilities/lucene/LuceneQueryBuilderTest.java index fc2653bd6b60..4a9f4e29f9d9 100644 --- a/graylog2-server/src/test/java/org/graylog2/utilities/lucene/LuceneQueryBuilderTest.java +++ b/graylog2-server/src/test/java/org/graylog2/utilities/lucene/LuceneQueryBuilderTest.java @@ -74,10 +74,10 @@ void testSimpleTermQuery() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getOccur()).isEqualTo(BooleanClause.Occur.SHOULD); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.occur()).isEqualTo(BooleanClause.Occur.SHOULD); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); assertThat(regexpQuery.getRegexp().field()).isEqualTo("name"); assertThat(regexpQuery.getRegexp().text()).isEqualTo(".*john.*"); } @@ -92,10 +92,10 @@ void testExactMatchWithEqualsOperator() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getOccur()).isEqualTo(BooleanClause.Occur.SHOULD); - assertThat(clause.getQuery()).isInstanceOf(TermQuery.class); + assertThat(clause.occur()).isEqualTo(BooleanClause.Occur.SHOULD); + assertThat(clause.query()).isInstanceOf(TermQuery.class); - TermQuery termQuery = (TermQuery) clause.getQuery(); + TermQuery termQuery = (TermQuery) clause.query(); assertThat(termQuery.getTerm().field()).isEqualTo("name"); assertThat(termQuery.getTerm().text()).isEqualTo("john"); } @@ -110,9 +110,9 @@ void testRegexpQuery() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); assertThat(regexpQuery.getRegexp().field()).isEqualTo("name"); // When user provides wildcards, just convert them without adding substring matching assertThat(regexpQuery.getRegexp().text()).isEqualTo("jo.*n"); @@ -126,9 +126,9 @@ void testRegexpQueryWithQuestionMark() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); // Wildcards in input are converted: ? -> . (no additional .* wrapping when wildcards present) assertThat(regexpQuery.getRegexp().text()).isEqualTo("jo.n"); } @@ -141,9 +141,9 @@ void testRegexpQueryWithPrefixWildcard() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); // User provided wildcard, so no additional wrapping assertThat(regexpQuery.getRegexp().text()).isEqualTo(".*john"); } @@ -156,9 +156,9 @@ void testRegexpQueryWithSuffixWildcard() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); // User provided wildcard, so no additional wrapping assertThat(regexpQuery.getRegexp().text()).isEqualTo("john.*"); } @@ -172,9 +172,9 @@ void testRegexpQueryWithSubstringMatching() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); // Should be wrapped with .* for substring matching: "local" matches "localhost" assertThat(regexpQuery.getRegexp().text()).isEqualTo(".*local.*"); } @@ -187,9 +187,9 @@ void testGreaterThanQuery() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(PointRangeQuery.class); + assertThat(clause.query()).isInstanceOf(PointRangeQuery.class); - PointRangeQuery rangeQuery = (PointRangeQuery) clause.getQuery(); + PointRangeQuery rangeQuery = (PointRangeQuery) clause.query(); assertThat(rangeQuery.getField()).isEqualTo("age"); // For age:>30, the range should be [31, MAX_VALUE] (exclusive converted to inclusive by adding 1) assertThat(rangeQuery.toString()).contains("age:[31 TO 2147483647]"); @@ -203,9 +203,9 @@ void testGreaterThanOrEqualsQuery() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(PointRangeQuery.class); + assertThat(clause.query()).isInstanceOf(PointRangeQuery.class); - PointRangeQuery rangeQuery = (PointRangeQuery) clause.getQuery(); + PointRangeQuery rangeQuery = (PointRangeQuery) clause.query(); assertThat(rangeQuery.getField()).isEqualTo("age"); // For age:>=30, the range should be [30, MAX_VALUE] assertThat(rangeQuery.toString()).contains("age:[30 TO 2147483647]"); @@ -219,9 +219,9 @@ void testLessThanQuery() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(PointRangeQuery.class); + assertThat(clause.query()).isInstanceOf(PointRangeQuery.class); - PointRangeQuery rangeQuery = (PointRangeQuery) clause.getQuery(); + PointRangeQuery rangeQuery = (PointRangeQuery) clause.query(); assertThat(rangeQuery.getField()).isEqualTo("age"); // For age:<30, the range should be [MIN_VALUE, 29] (exclusive converted to inclusive by subtracting 1) assertThat(rangeQuery.toString()).contains("age:[-2147483648 TO 29]"); @@ -235,9 +235,9 @@ void testLessThanOrEqualsQuery() { assertThat(query).isInstanceOf(BooleanQuery.class); BooleanQuery booleanQuery = (BooleanQuery) query; BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(PointRangeQuery.class); + assertThat(clause.query()).isInstanceOf(PointRangeQuery.class); - PointRangeQuery rangeQuery = (PointRangeQuery) clause.getQuery(); + PointRangeQuery rangeQuery = (PointRangeQuery) clause.query(); assertThat(rangeQuery.getField()).isEqualTo("age"); // For age:<=30, the range should be [MIN_VALUE, 30] assertThat(rangeQuery.toString()).contains("age:[-2147483648 TO 30]"); @@ -253,7 +253,7 @@ void testNegatedQuery() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().get(0); - assertThat(clause.getOccur()).isEqualTo(BooleanClause.Occur.MUST_NOT); + assertThat(clause.occur()).isEqualTo(BooleanClause.Occur.MUST_NOT); } @Test @@ -265,13 +265,13 @@ void testMultipleFields() { BooleanQuery booleanQuery = (BooleanQuery) query; assertThat(booleanQuery.clauses()).hasSize(2); - assertThat(booleanQuery.clauses().get(0).getOccur()).isEqualTo(BooleanClause.Occur.SHOULD); - assertThat(booleanQuery.clauses().get(1).getOccur()).isEqualTo(BooleanClause.Occur.SHOULD); + assertThat(booleanQuery.clauses().get(0).occur()).isEqualTo(BooleanClause.Occur.SHOULD); + assertThat(booleanQuery.clauses().get(1).occur()).isEqualTo(BooleanClause.Occur.SHOULD); // First clause should be RegexpQuery for name - assertThat(booleanQuery.clauses().get(0).getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(booleanQuery.clauses().get(0).query()).isInstanceOf(RegexpQuery.class); // Second clause should be PointRangeQuery for age (numeric field) - assertThat(booleanQuery.clauses().get(1).getQuery()).isInstanceOf(PointRangeQuery.class); + assertThat(booleanQuery.clauses().get(1).query()).isInstanceOf(PointRangeQuery.class); } @Test @@ -284,8 +284,8 @@ void testMultipleValuesForSameField() { assertThat(booleanQuery.clauses()).hasSize(2); // Default operator is REGEXP, so both should be RegexpQuery with substring matching - assertThat(booleanQuery.clauses().get(0).getQuery()).isInstanceOf(RegexpQuery.class); - assertThat(booleanQuery.clauses().get(1).getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(booleanQuery.clauses().get(0).query()).isInstanceOf(RegexpQuery.class); + assertThat(booleanQuery.clauses().get(1).query()).isInstanceOf(RegexpQuery.class); } @Test @@ -297,12 +297,12 @@ void testMixedPositiveAndNegativeQueries() { BooleanQuery booleanQuery = (BooleanQuery) query; assertThat(booleanQuery.clauses()).hasSize(2); - assertThat(booleanQuery.clauses().get(0).getOccur()).isEqualTo(BooleanClause.Occur.SHOULD); - assertThat(booleanQuery.clauses().get(1).getOccur()).isEqualTo(BooleanClause.Occur.MUST_NOT); + assertThat(booleanQuery.clauses().get(0).occur()).isEqualTo(BooleanClause.Occur.SHOULD); + assertThat(booleanQuery.clauses().get(1).occur()).isEqualTo(BooleanClause.Occur.MUST_NOT); // Both should be RegexpQuery (default operator) - assertThat(booleanQuery.clauses().get(0).getQuery()).isInstanceOf(RegexpQuery.class); - assertThat(booleanQuery.clauses().get(1).getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(booleanQuery.clauses().get(0).query()).isInstanceOf(RegexpQuery.class); + assertThat(booleanQuery.clauses().get(1).query()).isInstanceOf(RegexpQuery.class); } @Test @@ -316,9 +316,9 @@ void testDefaultField() { BooleanClause clause = booleanQuery.clauses().get(0); // Default operator is REGEXP, so it should use RegexpQuery with substring matching - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); assertThat(regexpQuery.getRegexp().field()).isEqualTo("defaultfield"); assertThat(regexpQuery.getRegexp().text()).isEqualTo(".*john.*"); } @@ -334,9 +334,9 @@ void testCaseInsensitiveRegexpQuery() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); assertThat(regexpQuery.getRegexp().field()).isEqualTo("name"); // Input "John" should be lowercased to "john" for case-insensitive matching assertThat(regexpQuery.getRegexp().text()).isEqualTo(".*john.*"); @@ -353,9 +353,9 @@ void testCaseInsensitiveExactMatch() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(TermQuery.class); + assertThat(clause.query()).isInstanceOf(TermQuery.class); - TermQuery termQuery = (TermQuery) clause.getQuery(); + TermQuery termQuery = (TermQuery) clause.query(); assertThat(termQuery.getTerm().field()).isEqualTo("name"); // Input "JOHN" should be lowercased to "john" for case-insensitive matching assertThat(termQuery.getTerm().text()).isEqualTo("john"); @@ -372,9 +372,9 @@ void testCaseInsensitiveWithWildcards() { assertThat(booleanQuery.clauses()).hasSize(1); BooleanClause clause = booleanQuery.clauses().getFirst(); - assertThat(clause.getQuery()).isInstanceOf(RegexpQuery.class); + assertThat(clause.query()).isInstanceOf(RegexpQuery.class); - RegexpQuery regexpQuery = (RegexpQuery) clause.getQuery(); + RegexpQuery regexpQuery = (RegexpQuery) clause.query(); assertThat(regexpQuery.getRegexp().field()).isEqualTo("name"); // Input "Jo*N" should be lowercased and wildcards converted: "jo.*n" assertThat(regexpQuery.getRegexp().text()).isEqualTo("jo.*n"); diff --git a/pom.xml b/pom.xml index f36415dc6eb6..303be2b93ad7 100644 --- a/pom.xml +++ b/pom.xml @@ -162,7 +162,7 @@ 4.3.0 0.9.0.1-7 2.26.0 - 9.12.3 + 10.3.2 1.11.0 4.2.39 5.8.0