View Javadoc
1   package org.wikimedia.search.extra.termfreq;
2   
3   import static org.hamcrest.CoreMatchers.containsString;
4   import static org.hamcrest.CoreMatchers.instanceOf;
5   
6   import java.io.IOException;
7   import java.util.Arrays;
8   import java.util.Collection;
9   
10  import org.apache.lucene.index.Term;
11  import org.apache.lucene.search.Query;
12  import org.elasticsearch.common.ParsingException;
13  import org.elasticsearch.common.compress.CompressedXContent;
14  import org.elasticsearch.index.mapper.MapperService;
15  import org.elasticsearch.index.query.QueryShardContext;
16  import org.elasticsearch.plugins.Plugin;
17  import org.elasticsearch.test.AbstractQueryTestCase;
18  import org.elasticsearch.test.TestGeoShapeFieldMapperPlugin;
19  import org.wikimedia.search.extra.ExtraCorePlugin;
20  
21  public class TermFreqFilterQueryBuilderESTest extends AbstractQueryTestCase<TermFreqFilterQueryBuilder> {
22  
23      private static final String MY_FIELD = "test_field";
24  
25      @Override
26      protected void initializeAdditionalMappings(MapperService mapperService) throws IOException {
27          mapperService.merge("_doc",
28                  new CompressedXContent("{\"properties\":{\"" + MY_FIELD + "\":{\"type\":\"text\" }}}"),
29                  MapperService.MergeReason.MAPPING_UPDATE);
30      }
31  
32      @Override
33      protected Collection<Class<? extends Plugin>> getPlugins() {
34          return Arrays.asList(ExtraCorePlugin.class, TestGeoShapeFieldMapperPlugin.class);
35      }
36  
37      @Override
38      protected TermFreqFilterQueryBuilder doCreateTestQueryBuilder() {
39          TermFreqFilterQueryBuilder builder = new TermFreqFilterQueryBuilder(MY_FIELD, "test_term");
40          if (random().nextBoolean()) {
41              builder.setEqual(random().nextInt(100));
42          } else {
43              int from = random().nextInt(100);
44              int to = random().nextInt(100) + 2 + from;
45  
46              boolean fromSet = false;
47              if (random().nextBoolean()) {
48                  if (random().nextBoolean()) {
49                      builder.setFromStrict(from);
50                  } else {
51                      builder.setFrom(from);
52                  }
53                  fromSet = true;
54              }
55              if (!fromSet || random().nextBoolean()) {
56                  if (random().nextBoolean()) {
57                      builder.setToStrict(to);
58                  } else {
59                      builder.setTo(to);
60                  }
61              }
62          }
63          return builder;
64      }
65  
66      @Override
67      protected void doAssertLuceneQuery(TermFreqFilterQueryBuilder termFreqQueryBuilder, Query query, QueryShardContext searchContext) throws IOException {
68          assertThat(query, instanceOf(TermFreqFilterQuery.class));
69          TermFreqFilterQuery tquery = (TermFreqFilterQuery) query;
70          assertEquals(new Term(termFreqQueryBuilder.getField(), termFreqQueryBuilder.getTerm()), tquery.getTerm());
71          if (termFreqQueryBuilder.getEqual() != null) {
72              assertNull(termFreqQueryBuilder.getFrom());
73              assertNull(termFreqQueryBuilder.getTo());
74              assertTrue(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getEqual()),
75                      tquery.getPredicate().test(termFreqQueryBuilder.getEqual()));
76              assertFalse(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getEqual() + 1),
77                      tquery.getPredicate().test(termFreqQueryBuilder.getEqual() + 1));
78              assertFalse(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getEqual() + 1),
79                      tquery.getPredicate().test(termFreqQueryBuilder.getEqual() - 1));
80          } else if (termFreqQueryBuilder.getTo() != null || termFreqQueryBuilder.getFrom() != null) {
81              if (termFreqQueryBuilder.getTo() != null) {
82                  assertTrue(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getTo() - 1),
83                          tquery.getPredicate().test(termFreqQueryBuilder.getTo() - 1));
84                  assertFalse(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getTo() + 1),
85                          tquery.getPredicate().test(termFreqQueryBuilder.getTo() + 1));
86                  assertEquals(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getTo()),
87                          termFreqQueryBuilder.isIncludeTo(), tquery.getPredicate().test(termFreqQueryBuilder.getTo()));
88              }
89              if (termFreqQueryBuilder.getFrom() != null) {
90                  assertTrue(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getFrom() + 1),
91                          tquery.getPredicate().test(termFreqQueryBuilder.getFrom() + 1));
92                  assertFalse(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getFrom() - 1),
93                          tquery.getPredicate().test(termFreqQueryBuilder.getFrom() - 1));
94                  assertEquals(tquery.getPredicate() + " with " + (termFreqQueryBuilder.getFrom()),
95                          termFreqQueryBuilder.isIncludeFrom(), tquery.getPredicate().test(termFreqQueryBuilder.getFrom()));
96              }
97          } else {
98              throw new AssertionError("at least eq, to or from must be set");
99          }
100     }
101 
102     public void testInvalidQueries() {
103         TermFreqFilterQueryBuilder builder = new TermFreqFilterQueryBuilder();
104 
105         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
106                 containsString("term"));
107         builder.setTerm("term");
108 
109         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
110                 containsString("field"));
111         builder.setField("field");
112 
113         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
114                 containsString("Invalid range provided"));
115 
116         builder.setFrom(2);
117         builder.setTo(1);
118         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
119                 containsString("Invalid range provided"));
120 
121         builder.setFromStrict(1);
122         builder.setTo(1);
123         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
124                 containsString("Invalid range provided"));
125 
126         builder.setFromStrict(1);
127         builder.setToStrict(2);
128         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
129                 containsString("Invalid range provided"));
130 
131         builder.setTo(null);
132         builder.setEqual(2);
133         assertThat(expectThrows(ParsingException.class, () -> parseQuery(builder)).getMessage(),
134                 containsString("eq cannot be used with"));
135     }
136 }