[MediaWiki-commits] [Gerrit] search/extra[master]: Abstract routing out of token count router

2017-09-04 Thread jenkins-bot (Code Review)
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) {
+AbstractRouterQueryBuilder qb = 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

2017-08-08 Thread EBernhardson (Code Review)
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) {
+AbstractRouterQueryBuilder qb = 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()) {
+