@Override public ExpandedQuery rewrite(ExpandedQuery query) { QuerqyQuery<?> userQuery = query.getUserQuery(); if (userQuery != null && userQuery instanceof Query) { visit((Query) userQuery); } return query; }
@Override public ExpandedQuery rewrite(ExpandedQuery query, Map<String, Object> context) { QuerqyQuery<?> userQuery = query.getUserQuery(); if (userQuery instanceof Query) { this.expandedQuery = query; this.context = context; sequencesStack.add(new PositionSequence<Term>()); super.visit((BooleanQuery) query.getUserQuery()); applySequence(sequencesStack.removeLast(), true); } return query; }
@Override public ExpandedQuery rewrite(final ExpandedQuery query) { final QuerqyQuery<?> userQuery = query.getUserQuery(); if (userQuery != null && userQuery instanceof Query){ previousTerm = null; termsToAdd = new LinkedList<>(); visit((Query) userQuery); for (Term term : termsToAdd) { term.getParent().addClause(term); } } return query; }
public void testThatMainQueryIsNotMarkedAsGenerated() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("-a b").getUserQuery(), BoostDirection.UP, 0.5f); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) boostInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x"); QuerqyQuery<?> mainQuery = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertFalse(mainQuery.isGenerated()); }
@Test public void testThatMainQueryIsNotMarkedAsGenerated() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); FilterInstruction filterInstruction = new FilterInstruction(makeQuery("a").getUserQuery()); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) filterInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x"); QuerqyQuery<?> mainQuery = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertFalse(mainQuery.isGenerated()); }
@Test public void testThatTermIsNotRemovedOnceIfThereASecondDMQWithTheSameTermAndNoOtherTermExists() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); DeleteInstruction delete = new DeleteInstruction(Arrays.asList(mkTerm("a"))); builder.addRule(new Input(Arrays.asList(mkTerm("a")), false, false), new Instructions(Arrays.asList((Instruction) delete))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); Query rewritten = (Query) rewriter.rewrite(makeQuery("a a"), EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a") ) )); }
@Test public void testThatTermIsRemovedIfThereASecondDMQWithoutTheTerm() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); DeleteInstruction delete = new DeleteInstruction(Arrays.asList(mkTerm("a"))); builder.addRule(new Input(Arrays.asList(mkTerm("a")), false, false), new Instructions(Arrays.asList((Instruction) delete))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); Query rewritten = (Query) rewriter.rewrite(makeQuery("a b"), EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("b") ) )); }
@Test public void testThatNothingIsDeletedIfWeWouldEndUpWithAnEmptyQuery() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); DeleteInstruction delete = new DeleteInstruction(Arrays.asList(mkTerm("a"))); builder.addRule(new Input(Arrays.asList(mkTerm("a")), false, false), new Instructions(Arrays.asList((Instruction) delete))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a"); Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a") ) )); }
@Test public void testThatFilterQueriesAreMarkedAsGenerated() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); FilterInstruction filterInstruction = new FilterInstruction(makeQuery("a").getUserQuery()); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) filterInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x"); Collection<QuerqyQuery<?>> filterQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getFilterQueries(); QuerqyQuery<?> qq = filterQueries.iterator().next(); assertTrue(qq instanceof BooleanQuery); assertThat((BooleanQuery) qq, bq( dmq(must(), term("a", true)) ) ); }
@Test public void testThatSingleTermIsExpandedWithSingleTerm() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1"))); builder.addRule(new Input(Arrays.asList(mkTerm("a"))), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a"); Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), term("s1", true) ) )); }
@Test public void testThatShinglingDoesNotTriggerExceptionOnSingleTerm() throws Exception { Query query = new Query(); addTerm(query, "t1"); ExpandedQuery expandedQuery = new ExpandedQuery(query); ShingleRewriter rewriter = new ShingleRewriter(); rewriter.rewrite(expandedQuery); assertThat((Query) expandedQuery.getUserQuery(), bq( dmq( term("t1") ) ) ); }
@Test public void testThatWildcardDoesNotMatchZeroChars() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm( "p1"), mkTerm("$1"))); builder.addRule((Input) LineParser.parseInput("p1*"), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("p1"); Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("p1", false) ) )); }
@Test public void testShinglingForTwoTokensWithOnFieldNameNullDontShingle() { Query query = new Query(); addTerm(query, "f1", "cde"); addTerm(query, "ajk"); ExpandedQuery expandedQuery = new ExpandedQuery(query); ShingleRewriter rewriter = new ShingleRewriter(); rewriter.rewrite(expandedQuery); assertThat((Query) expandedQuery.getUserQuery(), bq(dmq(term("f1", "cde")), dmq(term("ajk")))); }
@Test public void testThatBoostQueriesAreMarkedAsGenerated() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a").getUserQuery(), BoostDirection.UP, 0.5f); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) boostInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x"); Collection<BoostQuery> upQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostUpQueries(); assertThat(upQueries, contains( boostQ( bq( dmq(must(), term("a", true)) ), 0.5f ))); }
@Test public void testShinglingForTwoTokensWithDifferentFieldsDontShingle() { Query query = new Query(); addTerm(query, "f1", "cde"); addTerm(query, "f2", "ajk"); ExpandedQuery expandedQuery = new ExpandedQuery(query); ShingleRewriter rewriter = new ShingleRewriter(); rewriter.rewrite(expandedQuery); assertThat((Query) expandedQuery.getUserQuery(), bq(dmq(term("cde")), dmq(term("ajk")))); }
@Test public void testThatUpQueriesAreOfTypeQuery() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a b").getUserQuery(), BoostDirection.UP, 0.5f); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) boostInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x"); Collection<BoostQuery> upQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostUpQueries(); for (BoostQuery bq : upQueries) { Assert.assertTrue(bq.getQuery() instanceof Query); } }
@Test public void testThatDeleteIsAppliedToWildcardInput() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); Input input = (Input) LineParser.parseInput("k*"); DeleteInstruction deleteInstruction = new DeleteInstruction(input.getInputTerms()); builder.addRule(input, new Instructions(Collections.singletonList((Instruction) deleteInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x klm"); Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("x") ) )); }
@Test public void testThatDeleteIsAppliedToMultiTermWildcardInput() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); Input input = (Input) LineParser.parseInput("ab k*"); DeleteInstruction deleteInstruction = new DeleteInstruction(input.getInputTerms()); builder.addRule(input, new Instructions(Collections.singletonList((Instruction) deleteInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x ab klm"); Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("x") ) )); }
Query rewritten = (Query) rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
@Test public void testThatDownQueriesAreOfTypeQuery() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a b$1").getUserQuery(), BoostDirection.DOWN, 0.2f); builder.addRule((Input) LineParser.parseInput("x k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x klm y"); Collection<BoostQuery> downQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostDownQueries(); for (BoostQuery bq : downQueries) { Assert.assertTrue(bq.getQuery() instanceof Query); } }