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