package querqy.rewrite.commonrules.model;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static querqy.QuerqyMatchers.bq;
import static querqy.QuerqyMatchers.dmq;
import static querqy.QuerqyMatchers.term;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import querqy.model.ExpandedQuery;
import querqy.model.Query;
import querqy.rewrite.commonrules.AbstractCommonRulesTest;
import querqy.rewrite.commonrules.CommonRulesRewriter;
public class CommonRulesRewriterTest extends AbstractCommonRulesTest {
@Test
public void testInputBoundaryOnBothSides() {
RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false);
SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1")));
builder.addRule(new Input(Arrays.asList(mkTerm("a")), true, true), 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)
)
));
query = makeQuery("a b");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("a", false)
),
dmq(
term("b", false)
)
));
query = makeQuery("b a");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false)
)
));
query = makeQuery("b a c");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false)
),
dmq(
term("c", false)
)
));
}
@Test
public void testInputBoundaryOnLeftHandSide() {
RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false);
SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1")));
builder.addRule(new Input(Arrays.asList(mkTerm("a")), true, false), 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)
)
));
query = makeQuery("a b");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("a", false),
term("s1", true)
),
dmq(
term("b", false)
)
));
query = makeQuery("b a");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false)
)
));
query = makeQuery("b a c");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false)
),
dmq(
term("c", false)
)
));
}
@Test
public void testInputBoundaryOnRightHandSide() {
RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false);
SynonymInstruction synInstruction = new SynonymInstruction(Arrays.asList(mkTerm("s1")));
builder.addRule(new Input(Arrays.asList(mkTerm("a")), false, true), 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)
)
));
query = makeQuery("a b");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("a", false)
),
dmq(
term("b", false)
)
));
query = makeQuery("b a");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false),
term("s1", true)
)
));
query = makeQuery("b a c");
rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery();
assertThat(rewritten,
bq(
dmq(
term("b", false)
),
dmq(
term("a", false)
),
dmq(
term("c", false)
)
));
}
@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 = 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())));
}
}