001
014
015 package com.liferay.portal.search.lucene;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.search.ParseException;
020 import com.liferay.portal.kernel.search.Query;
021 import com.liferay.portal.kernel.search.QueryTranslator;
022 import com.liferay.portal.kernel.search.StringQueryImpl;
023 import com.liferay.portal.kernel.util.StringPool;
024
025 import java.lang.reflect.Field;
026
027 import org.apache.lucene.index.Term;
028 import org.apache.lucene.queryParser.QueryParser;
029 import org.apache.lucene.search.BooleanClause;
030 import org.apache.lucene.search.BooleanQuery;
031 import org.apache.lucene.search.TermQuery;
032 import org.apache.lucene.search.WildcardQuery;
033
034
037 public class QueryTranslatorImpl implements QueryTranslator {
038
039 public Object translate(Query query) throws ParseException {
040 if (query instanceof BooleanQueryImpl) {
041 return ((BooleanQueryImpl)query).getBooleanQuery();
042 }
043 else if (query instanceof LuceneQueryImpl) {
044 return ((LuceneQueryImpl)query).getQuery();
045 }
046 else if (query instanceof StringQueryImpl) {
047 QueryParser queryParser = new QueryParser(
048 LuceneHelperUtil.getVersion(), StringPool.BLANK,
049 LuceneHelperUtil.getAnalyzer());
050
051 try {
052 return queryParser.parse(query.toString());
053 }
054 catch (org.apache.lucene.queryParser.ParseException pe) {
055 throw new ParseException(pe);
056 }
057 }
058 else if (query instanceof TermQueryImpl) {
059 return ((TermQueryImpl)query).getTermQuery();
060 }
061 else if (query instanceof TermRangeQueryImpl) {
062 return ((TermRangeQueryImpl)query).getTermRangeQuery();
063 }
064 else {
065 return null;
066 }
067 }
068
069 public Object translateForSolr(Query query) {
070 Object queryObject = query.getWrappedQuery();
071
072 if (queryObject instanceof org.apache.lucene.search.Query) {
073 adjustQuery((org.apache.lucene.search.Query)queryObject);
074 }
075
076 return query;
077 }
078
079 protected void adjustQuery(org.apache.lucene.search.Query query) {
080 if (query instanceof BooleanQuery) {
081 BooleanQuery booleanQuery = (BooleanQuery)query;
082
083 for (BooleanClause booleanClause : booleanQuery.getClauses()) {
084 adjustQuery(booleanClause.getQuery());
085 }
086 }
087 else if (query instanceof TermQuery) {
088 TermQuery termQuery = (TermQuery)query;
089
090 Term term = termQuery.getTerm();
091
092 try {
093 String text = term.text();
094
095 if (text.matches("^\\s*[^\"].*\\s+.*[^\"]\\s*$(?m)")) {
096 text = StringPool.QUOTE.concat(text).concat(
097 StringPool.QUOTE);
098
099 _textField.set(term, text);
100 }
101 }
102 catch (Exception e) {
103 _log.error(e, e);
104 }
105 }
106 else if (query instanceof WildcardQuery) {
107 WildcardQuery wildcardQuery = (WildcardQuery)query;
108
109 Term term = wildcardQuery.getTerm();
110
111 try {
112 String text = term.text();
113
114 if (text.matches("^\\s*\\*.*(?m)")) {
115 text = text.replaceFirst("\\*", StringPool.BLANK);
116
117 _textField.set(term, text);
118 }
119 }
120 catch (Exception e) {
121 _log.error(e, e);
122 }
123 }
124 }
125
126 private static Log _log = LogFactoryUtil.getLog(QueryTranslatorImpl.class);
127
128 private static Field _textField = null;
129
130 static {
131 try {
132 _textField = Term.class.getDeclaredField("text");
133
134 _textField.setAccessible(true);
135 }
136 catch (Exception e) {
137 _log.error(e, e);
138 }
139 }
140
141 }