001: package org.compass.core.lucene.engine.queryparser;
002:
003: import org.apache.lucene.index.Term;
004: import org.apache.lucene.search.BooleanClause;
005: import org.apache.lucene.search.BooleanQuery;
006: import org.apache.lucene.search.PhraseQuery;
007: import org.apache.lucene.search.Query;
008: import org.apache.lucene.search.TermQuery;
009: import org.apache.lucene.search.payloads.BoostingTermQuery;
010: import org.apache.lucene.search.spans.SpanTermQuery;
011: import org.compass.core.engine.SearchEngineException;
012: import org.compass.core.engine.SearchEngineFactory;
013: import org.compass.core.lucene.engine.all.AllBoostingTermQuery;
014: import org.compass.core.mapping.ResourcePropertyLookup;
015:
016: /**
017: * @author kimchy
018: */
019: public abstract class QueryParserUtils {
020:
021: private QueryParserUtils() {
022: }
023:
024: /**
025: * If enabled and allowed, wraps the given query with a boolean query that adds a must match on the alias).
026: */
027: public static Query andAliasQueryIfNeeded(Query query,
028: ResourcePropertyLookup lookup,
029: boolean addAliasQueryWithDotPath,
030: SearchEngineFactory searchEngineFactory) {
031: if (query == null) {
032: return query;
033: }
034: if (!addAliasQueryWithDotPath) {
035: return query;
036: }
037: if (lookup == null) {
038: return query;
039: }
040: String alias = lookup.getDotPathAlias();
041: if (alias == null) {
042: return query;
043: }
044: BooleanQuery booleanQuery = new BooleanQuery();
045: booleanQuery.add(query, BooleanClause.Occur.MUST);
046: booleanQuery.add(new TermQuery(new Term(searchEngineFactory
047: .getAliasProperty(), alias)), BooleanClause.Occur.MUST);
048: booleanQuery.add(new TermQuery(new Term(searchEngineFactory
049: .getExtendedAliasProperty(), alias)),
050: BooleanClause.Occur.SHOULD);
051: return booleanQuery;
052: }
053:
054: public static interface QueryTermVisitor {
055:
056: Term replaceTerm(Term term) throws SearchEngineException;
057: }
058:
059: public static Query visit(Query query, QueryTermVisitor visitor)
060: throws SearchEngineException {
061: if (query instanceof TermQuery) {
062: Query q = new TermQuery(visitor
063: .replaceTerm(((TermQuery) query).getTerm()));
064: q.setBoost(query.getBoost());
065: return q;
066: }
067: if (query instanceof BoostingTermQuery) {
068: Query q = new BoostingTermQuery(visitor
069: .replaceTerm(((SpanTermQuery) query).getTerm()));
070: q.setBoost(query.getBoost());
071: return q;
072: }
073: if (query instanceof AllBoostingTermQuery) {
074: Query q = new AllBoostingTermQuery(visitor
075: .replaceTerm(((SpanTermQuery) query).getTerm()));
076: q.setBoost(query.getBoost());
077: return q;
078: }
079: if (query instanceof SpanTermQuery) {
080: Query q = new SpanTermQuery(visitor
081: .replaceTerm(((SpanTermQuery) query).getTerm()));
082: q.setBoost(query.getBoost());
083: return q;
084: }
085: if (query instanceof PhraseQuery) {
086: PhraseQuery original = (PhraseQuery) query;
087: PhraseQuery replaced = new PhraseQuery();
088: replaced.setBoost(original.getBoost());
089: replaced.setSlop(original.getSlop());
090: Term[] terms = original.getTerms();
091: int[] positions = original.getPositions();
092: for (int i = 0; i < terms.length; i++) {
093: replaced.add(visitor.replaceTerm(terms[i]),
094: positions[i]);
095: }
096: return replaced;
097: }
098: if (query instanceof BooleanQuery) {
099: BooleanQuery original = (BooleanQuery) query;
100: BooleanQuery replaced = new BooleanQuery(original
101: .isCoordDisabled());
102: replaced.setBoost(original.getBoost());
103: replaced.setMinimumNumberShouldMatch(original
104: .getMinimumNumberShouldMatch());
105: for (BooleanClause clause : original.getClauses()) {
106: replaced.add(visit(clause.getQuery(), visitor), clause
107: .getOccur());
108: }
109: return replaced;
110: }
111: return query;
112: }
113: }
|