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 }