package querqy.rewrite.commonrules.model; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static querqy.QuerqyMatchers.boostQ; import static querqy.QuerqyMatchers.bq; import static querqy.QuerqyMatchers.dmq; import static querqy.QuerqyMatchers.term; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Map; import org.junit.Assert; import org.junit.Test; import querqy.model.BoostQuery; import querqy.model.ExpandedQuery; import querqy.model.Query; import querqy.rewrite.commonrules.AbstractCommonRulesTest; import querqy.rewrite.commonrules.CommonRulesRewriter; import querqy.rewrite.commonrules.LineParser; import querqy.rewrite.commonrules.model.BoostInstruction.BoostDirection; public class BoostInstructionTest extends AbstractCommonRulesTest { @Test public void testThatBoostQueriesAreMarkedAsGenerated() { 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(); assertThat(upQueries, contains( boostQ( bq( dmq(term("a", true)), dmq( term("b", true)) ), 0.5f ))); } @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 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); } } @Test public void testThatPlaceHolderGetsReplaced() 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(); assertThat(downQueries, contains( boostQ( bq( dmq( term("a", true)), dmq( term("blm", true)) ), 0.2f ))); } @Test public void testThatPlaceHolderGetsReplacedAsASeperateToken() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a $1").getUserQuery(), BoostDirection.DOWN, 0.3f); 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(); assertThat(downQueries, contains( boostQ( bq( dmq( term("a", true)), dmq( term("lm", true)) ), 0.3f ))); } @Test public void testThatPlaceHolderGetsReplacedAsAnInfix() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a c$1d").getUserQuery(), BoostDirection.UP, 0.3f); builder.addRule((Input) LineParser.parseInput("k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("x klm y"); Collection<BoostQuery> upQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostUpQueries(); assertThat(upQueries, contains( boostQ( bq( dmq( term("a", true)), dmq( term("clmd", true)) ), 0.3f ))); } }