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