for (Input input : inputs) { BoostInstruction bi = new BoostInstruction(query, direction, boost); builder.addRule(input, new Instructions(Collections.singletonList((Instruction) bi)));
public void nextLine(String line) throws RuleParseException { line = stripLine(line); if (line.length() > 0) { Object lineObject = LineParser.parse(line, input, querqyParserFactory); if (lineObject instanceof Input) { putRule(); input = (Input) lineObject; instructions = new Instructions(); } else if (lineObject instanceof ValidationError) { throw new RuleParseException(lineNumber, ((ValidationError) lineObject).getMessage()); } else { instructions.add((Instruction) lineObject); } } }
public void putRule() throws RuleParseException { if (input != null) { if (instructions.isEmpty()) { throw new RuleParseException(lineNumber, "Instruction expected"); } builder.addRule(input, instructions); input = null; // instructions = new Instructions(); } }
Instructions instructions(String... names) { List<Instruction> instructions = new LinkedList<>(); for (String name : names) { instructions.add(new SimpleInstruction(name)); } return new Instructions(instructions); }
@SuppressWarnings("unchecked") @Test public void testThatSingleDecorationIsEmitted() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); DecorateInstruction deco = new DecorateInstruction("deco1"); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) deco))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a x"); Map<String, Object> context = new HashMap<>(); rewriter.rewrite(query, context); assertThat((Set<Object>)context.get(DecorateInstruction.CONTEXT_KEY), contains( equalTo((Object) "deco1") )); }
@SuppressWarnings("unchecked") @Test public void testDecorationForEmptyInput() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); DecorateInstruction deco = new DecorateInstruction("deco1"); builder.addRule((Input) LineParser.parseInput(LineParser.BOUNDARY + "" + LineParser.BOUNDARY), new Instructions(Arrays.asList((Instruction) deco))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery(""); Map<String, Object> context = new HashMap<>(); rewriter.rewrite(query, context); assertThat((Set<Object>) context.get(DecorateInstruction.CONTEXT_KEY), contains( equalTo((Object) "deco1") )); }
@Test public void testActionsAreLoggedInContext() { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstructionA = new SynonymInstruction(Arrays.asList(mkTerm("aSynonym"))); SynonymInstruction synInstructionB = new SynonymInstruction(Arrays.asList(mkTerm("bSynonym"))); builder.addRule(new Input(Arrays.asList(mkTerm("a")), true, false), new Instructions(Arrays.asList((Instruction) synInstructionA))); builder.addRule(new Input(Arrays.asList(mkTerm("b")), true, false), new Instructions(Arrays.asList((Instruction) synInstructionB))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a b"); Map<String, Object> context = new HashMap<>(); Query rewritten = (Query) rewriter.rewrite(query, context).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), term("aSynonym", true) ), dmq( term("b", false) ) )); assertThat(context.get(CommonRulesRewriter.CONTEXT_KEY_DEBUG_DATA), is(nullValue())); context.put(CommonRulesRewriter.CONTEXT_KEY_DEBUG_ENABLED, true); rewriter.rewrite(query, context).getUserQuery(); assertThat(context.containsKey(CommonRulesRewriter.CONTEXT_KEY_DEBUG_DATA), is(true)); assertThat(context.get(CommonRulesRewriter.CONTEXT_KEY_DEBUG_DATA).toString(), containsString(synInstructionA.toString())); assertThat(context.get(CommonRulesRewriter.CONTEXT_KEY_DEBUG_DATA).toString(), not(containsString(synInstructionB.toString()))); }
DecorateInstruction deco3 = new DecorateInstruction("deco3"); builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) deco1, (Instruction) deco2))); builder.addRule(new Input(Arrays.asList(mkTerm("a")), false, false), new Instructions(Arrays.asList((Instruction) deco3)));
new Action( Arrays.asList( new Instructions( Arrays.asList( (Instruction) new SynonymInstruction(
@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 test01() throws Exception { RulesCollection rules = createRulesFromResource("rules-test.txt", false); Term t1 = new Term(null, "aa"); Term t2 = new Term(null, "l"); PositionSequence<InputSequenceElement> seq = new PositionSequence<>(); seq.nextPosition(); seq.addElement(t1); seq.nextPosition(); seq.addElement(t2); List<Action> actions = rules.getRewriteActions(seq); assertThat(actions, contains( new Action( Arrays.asList( new Instructions(Arrays.asList((Instruction) new DeleteInstruction(Arrays.asList(mkTerm("aa")))))), new TermMatches(new TermMatch(t1)), 0, 1))); }
@Test public void test05() throws Exception { RulesCollection rules = createRulesFromResource("rules-test.txt", false); Term t1 = new Term(null, "tf2"); PositionSequence<InputSequenceElement> seq = new PositionSequence<>(); seq.nextPosition(); seq.addElement(t1); List<Action> actions = rules.getRewriteActions(seq); assertThat(actions, contains( new Action( Arrays.asList( new Instructions( Arrays.asList( (Instruction) new FilterInstruction(makeQueryUsingFactory("flt2 flt3"))) )), new TermMatches(new TermMatch(t1)), 0, 1) )); }
@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)) ) ); }
SynonymInstruction synInstruction2 = new SynonymInstruction(Arrays.asList(mkTerm("s2"))); SynonymInstruction synInstruction3 = new SynonymInstruction(Arrays.asList(mkTerm("s3"))); builder.addRule(new Input(Arrays.asList(mkTerm("a"))), new Instructions(Arrays.asList((Instruction) synInstruction1))); builder.addRule(new Input(Arrays.asList(mkTerm("b"))), new Instructions(Arrays.asList((Instruction) synInstruction2))); builder.addRule(new Input(Arrays.asList(mkTerm("c"))), new Instructions(Arrays.asList((Instruction) synInstruction3))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules);
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 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 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 testThatTermIsRemovedIfThereIsAnotherTermInTheSameDMQ() 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); ExpandedQuery expandedQuery = makeQuery("a"); Query query = (Query) expandedQuery.getUserQuery(); DisjunctionMaxQuery dmq = query.getClauses(DisjunctionMaxQuery.class).get(0); querqy.model.Term termB = new querqy.model.Term(dmq, null, "b"); dmq.addClause(termB); Query rewritten = (Query) rewriter.rewrite(expandedQuery, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("b") ) )); }