From 53db46b560f28e6662a8f69dac681a9ddac36f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Tue, 7 Jul 2015 09:13:28 +0200 Subject: [PATCH] Query refactoring: SpanFirstQueryBuilder and Parser Moving the query building functionality from the parser to the builders new toQuery() method analogous to other recent query refactorings. Relates to #10217 --- .../index/query/SpanFirstQueryBuilder.java | 81 ++++++++++++++++++- .../index/query/SpanFirstQueryParser.java | 25 +++--- .../query/SpanFirstQueryBuilderTest.java | 66 +++++++++++++++ 3 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 core/src/test/java/org/elasticsearch/index/query/SpanFirstQueryBuilderTest.java diff --git a/core/src/main/java/org/elasticsearch/index/query/SpanFirstQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/SpanFirstQueryBuilder.java index 1dc0fc46ee5..2a5211540b2 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SpanFirstQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SpanFirstQueryBuilder.java @@ -19,9 +19,15 @@ package org.elasticsearch.index.query; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.spans.SpanFirstQuery; +import org.apache.lucene.search.spans.SpanQuery; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; +import java.util.Objects; public class SpanFirstQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder{ @@ -31,11 +37,44 @@ public class SpanFirstQueryBuilder extends AbstractQueryBuildermatchBuilder + * whose end position is less than or equal to end. + * @param matchBuilder inner {@link SpanQueryBuilder} + * @param end maximum end position of the match, needs to be positive + * @throws IllegalArgumentException for negative end positions + */ public SpanFirstQueryBuilder(SpanQueryBuilder matchBuilder, int end) { - this.matchBuilder = matchBuilder; - this.end = end; + this.matchBuilder = Objects.requireNonNull(matchBuilder); + if (end >= 0) { + this.end = end; + } else { + throw new IllegalArgumentException("end parameter needs to be positive"); + } + } + + /** + * only used for prototype + */ + private SpanFirstQueryBuilder() { + this.matchBuilder = null; + this.end = -1; + } + + /** + * @return the inner {@link SpanQueryBuilder} defined in this query + */ + public SpanQueryBuilder matchBuilder() { + return this.matchBuilder; + } + + /** + * @return maximum end position of the matching inner span query + */ + public int end() { + return this.end; } @Override @@ -48,6 +87,42 @@ public class SpanFirstQueryBuilder extends AbstractQueryBuilder { + + @Override + protected Query doCreateExpectedQuery(SpanFirstQueryBuilder testQueryBuilder, QueryParseContext context) throws IOException { + SpanQuery innerQuery = (SpanQuery) testQueryBuilder.matchBuilder().toQuery(context); + return new SpanFirstQuery(innerQuery, testQueryBuilder.end()); + } + + @Override + protected SpanFirstQueryBuilder doCreateTestQueryBuilder() { + SpanTermQueryBuilder innerQueryBuilder = new SpanTermQueryBuilderTest().createTestQueryBuilder(); + return new SpanFirstQueryBuilder(innerQueryBuilder, randomIntBetween(0, 1000)); + } + + @Test + public void testValidate() { + int totalExpectedErrors = 0; + SpanQueryBuilder innerSpanQueryBuilder; + if (randomBoolean()) { + innerSpanQueryBuilder = new SpanTermQueryBuilder("", "test"); + totalExpectedErrors++; + } else { + innerSpanQueryBuilder = new SpanTermQueryBuilder("name", "value"); + } + SpanFirstQueryBuilder queryBuilder = new SpanFirstQueryBuilder(innerSpanQueryBuilder, 10); + assertValidate(queryBuilder, totalExpectedErrors); + } + + @Test(expected=IllegalArgumentException.class) + public void testEndValueNegative() { + new SpanFirstQueryBuilder(new SpanTermQueryBuilder("name", "value"), -1); + } + + @Test(expected=NullPointerException.class) + public void testInnerQueryNull() { + new SpanFirstQueryBuilder(null, 1); + } +}