[MediaWiki-commits] [Gerrit] search/extra[master]: Abstract routing out of token count router
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/370776 ) Change subject: Abstract routing out of token count router .. Abstract routing out of token count router In preparation for adding a new kind of query router abstract most of the routing implementation out of the token count router so it can be reused. Change-Id: If593b7250472b7f5d849ca307a5d34e9126504f5 --- A src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java M src/main/java/org/wikimedia/search/extra/tokencount/TokenCountRouterQueryBuilder.java M src/test/java/org/wikimedia/search/extra/regex/SourceRegexBuilderESTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterBuilderESTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterParserTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterQueryIntegrationTest.java 6 files changed, 357 insertions(+), 238 deletions(-) Approvals: jenkins-bot: Verified DCausse: Looks good to me, approved diff --git a/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java b/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java new file mode 100644 index 000..7f71722 --- /dev/null +++ b/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java @@ -0,0 +1,303 @@ +package org.wikimedia.search.extra.tokencount; + +import com.google.common.annotations.VisibleForTesting; +import lombok.AccessLevel; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.apache.lucene.search.Query; +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.ParsingException; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.ContextParser; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.query.AbstractQueryBuilder; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; +import org.wikimedia.search.extra.tokencount.AbstractRouterQueryBuilder.Condition; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +@Getter +@Setter +@Accessors(fluent = true, chain = true) +abstract public class AbstractRouterQueryBuilder> extends AbstractQueryBuilder { +private static final ParseField FALLBACK = new ParseField("fallback"); +private static final ParseField CONDITIONS = new ParseField("conditions"); +private static final ParseField QUERY = new ParseField("query"); + +@Getter(AccessLevel.PRIVATE) +private List conditions; + +private QueryBuilder fallback; + +AbstractRouterQueryBuilder() { +this.conditions = new ArrayList<>(); +} + +AbstractRouterQueryBuilder(StreamInput in, Writeable.Reader reader) throws IOException { +super(in); +conditions = in.readList(reader); +fallback = in.readNamedWriteable(QueryBuilder.class); +} + +protected void doWriteTo(StreamOutput out) throws IOException { +out.writeList(conditions); +out.writeNamedWriteable(fallback); +} + +QueryBuilder doRewrite(Predicate condition) { +QueryBuilder qb = conditions.stream() +.filter(condition) +.findFirst() +.map(Condition::query) +.orElse(fallback); + +if (boost() != DEFAULT_BOOST || queryName() != null) { +// AbstractQueryBuilder#rewrite will copy non default boost/name +// to the rewritten query, we pass a fresh BoolQuery so we don't +// override the one on the rewritten query here +// Is this really useful? +return new BoolQueryBuilder().must(qb); +} +return qb; + +} + +@Override +protected boolean doEquals(QB other) { +AbstractRouterQueryBuilderqb = other; +return Objects.equals(fallback, qb.fallback) && +Objects.equals(conditions, qb.conditions); +} + +@Override +protected int doHashCode() { +return Objects.hash(fallback, conditions); +} + +@Override +protected Query doToQuery(QueryShardContext queryShardContext) throws IOException { +throw new UnsupportedOperationException("This query must be
[MediaWiki-commits] [Gerrit] search/extra[master]: Abstract routing out of token count router
EBernhardson has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/370776 ) Change subject: Abstract routing out of token count router .. Abstract routing out of token count router In preparation for adding a new kind of query router abstract most of the routing implementation out of the token count router so it can be reused. Change-Id: If593b7250472b7f5d849ca307a5d34e9126504f5 --- A src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java M src/main/java/org/wikimedia/search/extra/tokencount/TokenCountRouterQueryBuilder.java M src/test/java/org/wikimedia/search/extra/QueryBuilderTestUtils.java M src/test/java/org/wikimedia/search/extra/regex/SourceRegexBuilderESTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterBuilderESTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterParserTest.java M src/test/java/org/wikimedia/search/extra/tokencount/TokenCountRouterQueryIntegrationTest.java 7 files changed, 342 insertions(+), 225 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/search/extra refs/changes/76/370776/1 diff --git a/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java b/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java new file mode 100644 index 000..ce5520c --- /dev/null +++ b/src/main/java/org/wikimedia/search/extra/tokencount/AbstractRouterQueryBuilder.java @@ -0,0 +1,299 @@ +package org.wikimedia.search.extra.tokencount; + +import lombok.AccessLevel; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.apache.lucene.search.Query; +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.ParsingException; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.*; +import org.elasticsearch.index.query.*; +import org.wikimedia.search.extra.tokencount.AbstractRouterQueryBuilder.Condition; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + +@Getter +@Setter +@Accessors(fluent = true, chain = true) +abstract public class AbstractRouterQueryBuilder> extends AbstractQueryBuilder { +static final ParseField FALLBACK = new ParseField("fallback"); +static final ParseField CONDITIONS = new ParseField("conditions"); +static final ParseField QUERY = new ParseField("query"); + +@Getter(AccessLevel.PROTECTED) +private List conditions; + +private QueryBuilder fallback; + +AbstractRouterQueryBuilder() { +this.conditions = new ArrayList<>(); +} + +AbstractRouterQueryBuilder(StreamInput in, Writeable.Reader reader) throws IOException { +super(in); +conditions = in.readList(reader); +fallback = in.readNamedWriteable(QueryBuilder.class); +} + +protected void doWriteTo(StreamOutput out) throws IOException { +out.writeList(conditions); +out.writeNamedWriteable(fallback); +} + +QueryBuilder doRewrite(Predicate condition) throws IOException { +QueryBuilder qb = conditions.stream() +.filter(condition) +.findFirst() +.map(Condition::query) +.orElse(fallback); + +if (boost() != DEFAULT_BOOST || queryName() != null) { +// AbstractQueryBuilder#rewrite will copy non default boost/name +// to the rewritten query, we pass a fresh BoolQuery so we don't +// override the one on the rewritten query here +// Is this really useful? +return new BoolQueryBuilder().must(qb); +} +return qb; + +} + +@Override +protected boolean doEquals(QB other) { +AbstractRouterQueryBuilderqb = other; +return Objects.equals(fallback, qb.fallback) && +Objects.equals(conditions, qb.conditions); +} + +@Override +protected int doHashCode() { +return Objects.hash(fallback, conditions); +} + +@Override +protected Query doToQuery(QueryShardContext queryShardContext) throws IOException { +throw new UnsupportedOperationException("This query must be rewritten."); +} + +protected void addXContent(XContentBuilder builder, Params params) throws IOException { +} + +@Override +protected void doXContent(XContentBuilder builder, Params params) throws IOException { +builder.startObject(getWriteableName()); +if (fallback() != null) { +builder.field(FALLBACK.getPreferredName(), fallback()); +} +if (!conditions().isEmpty()) { +