package querqy.rewrite.commonrules.model; import static org.hamcrest.MatcherAssert.assertThat; import static querqy.QuerqyMatchers.*; import java.util.Arrays; import org.junit.Test; import querqy.model.ExpandedQuery; import querqy.model.Query; import querqy.rewrite.commonrules.AbstractCommonRulesTest; import querqy.rewrite.commonrules.CommonRulesRewriter; import querqy.rewrite.commonrules.LineParser; public class SynonymInstructionTest extends AbstractCommonRulesTest { @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 = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), term("s1", true) ) )); } @Test public void testThatTermInManyIsExpandedWithSingleTerm() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction1 = new SynonymInstruction(Arrays.asList(mkTerm("s1"))); 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); ExpandedQuery query = makeQuery("a b c"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), term("s1", true) ), dmq( term("b", false), term("s2", true) ), dmq( term("c", false), term("s3", true) ) )); } @Test public void testThatSingleTermIsExpandedByMany() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1_1"), mkTerm("s1_2"))); 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 = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), bq( dmq(must(), term("s1_1", true)), dmq(must(), term("s1_2", true)) ) ) )); } @Test public void testThatMultipleTermsAreExpandedBySingle() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1"))); builder.addRule(new Input(Arrays.asList(mkTerm("a"), mkTerm("b"))), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a b"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), term("s1", true) ), dmq( term("b", false), term("s1", true) ) )); } @Test public void testThatMultipleTermsAreExpandedByMany() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm( "s1_1"), mkTerm("s1_2"))); builder.addRule(new Input(Arrays.asList(mkTerm("a"), mkTerm("b"))), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("a b c"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("a", false), bq( dmq(must(), term("s1_1", true)), dmq(must(), term("s1_2", true)) ) ), dmq( term("b", false), bq( dmq(must(), term("s1_1", true)), dmq(must(), term("s1_2", true)) ) ), dmq(term("c", false)) )); } @Test public void testThatPrefixIsMatchedAndPlaceHolderGetsReplaced() 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("p1xyz"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("p1xyz", false), bq( dmq(must(), term("p1", true)), dmq(must(), term("xyz", true)) ) ) )); } @Test public void testThatPrefixIsMatchedAndPlaceHolderGetsReplacedForLongerTerms() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm( "bus"), mkTerm("$1"))); builder.addRule((Input) LineParser.parseInput("bus*"), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("busstop"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("busstop", false), bq( dmq(must(), term("bus", true)), dmq(must(), term("stop", true)) ) ) )); } @Test public void testThatPrefixIsMatchedAndPlaceHolderGetsReplacedAtLastOfTwoTerms() throws Exception { RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm( "p2"), mkTerm("$1"))); builder.addRule((Input) LineParser.parseInput("p1 p2*"), new Instructions(Arrays.asList((Instruction) synInstruction))); RulesCollection rules = builder.build(); CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); ExpandedQuery query = makeQuery("p1 p2xyz"); Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("p1", false), bq( dmq(must(), term("p2", true)), dmq(must(), term("xyz", true)) ) ), dmq( term("p2xyz", false), bq( dmq(must(), term("p2", true)), dmq(must(), term("xyz", 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 = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); assertThat(rewritten, bq( dmq( term("p1", false) ) )); } }