/** * */ package querqy.lucene.contrib.rewrite; import java.io.IOException; import java.util.LinkedList; import org.apache.lucene.analysis.synonym.SynonymMap; import querqy.model.AbstractNodeVisitor; import querqy.model.BooleanQuery; import querqy.model.DisjunctionMaxQuery; import querqy.model.ExpandedQuery; import querqy.model.Node; import querqy.model.Query; import querqy.model.Term; import querqy.rewrite.QueryRewriter; /** * @author rene * */ public class LuceneSynonymsRewriter extends AbstractNodeVisitor<Node> implements QueryRewriter { final SynonymMap synonymMap; LinkedList<Sequences> sequencesStack = new LinkedList<>(); public LuceneSynonymsRewriter(SynonymMap synonymMap) { this.synonymMap = synonymMap; } /* * (non-Javadoc) * * @see qp.rewrite.QueryRewriter#rewrite(qp.model.Query) */ @Override public ExpandedQuery rewrite(ExpandedQuery query) { Query userQuery = query.getUserQuery(); if (userQuery != null) { visit(userQuery); } return query; } @Override public Node visit(Query query) { return visit((BooleanQuery) query); } @Override public Node visit(DisjunctionMaxQuery disjunctionMaxQuery) { sequencesStack.getLast().nextPosition(disjunctionMaxQuery); return super.visit(disjunctionMaxQuery); } @Override public Node visit(Term term) { if (!term.isGenerated()) { try { sequencesStack.getLast().putTerm(term); } catch (IOException e) { throw new RuntimeException(e); } } return super.visit(term); } @Override public Node visit(BooleanQuery booleanQuery) { if ((!sequencesStack.isEmpty()) && booleanQuery.getParent() instanceof BooleanQuery) { // left-hand siblings might be DMQs with Terms - terminate sequences sequencesStack.getLast().apply(); } // new Sequences object for child DMQ/Term objects sequencesStack.add(new Sequences(synonymMap)); super.visit(booleanQuery); sequencesStack.removeLast().apply(); return null; } }