001
014
015 package com.liferay.portal.kernel.search;
016
017 import com.liferay.portal.kernel.util.CharPool;
018 import com.liferay.portal.kernel.util.StringPool;
019 import com.liferay.portal.kernel.util.StringUtil;
020 import com.liferay.portal.kernel.util.Validator;
021
022 import java.util.ArrayList;
023 import java.util.HashMap;
024 import java.util.List;
025 import java.util.Map;
026 import java.util.regex.Pattern;
027
028
032 public abstract class BaseBooleanQueryImpl
033 extends BaseQueryImpl implements BooleanQuery {
034
035 @Override
036 public void addTerms(String[] fields, String values) throws ParseException {
037 if (Validator.isNull(values)) {
038 return;
039 }
040
041 if (fields == null) {
042 fields = new String[0];
043 }
044
045 for (String field : fields) {
046 addTerm(field, values);
047 }
048 }
049
050 @Override
051 public void addTerms(String[] fields, String value, boolean like)
052 throws ParseException {
053
054 if (Validator.isNull(value)) {
055 return;
056 }
057
058 for (String field : fields) {
059 addTerm(field, value, like);
060 }
061 }
062
063 protected void addTerms(
064 String[] fields, Map<String, List<String>> termFieldsValuesMap)
065 throws ParseException {
066
067 for (String field : fields) {
068 List<String> valuesList = termFieldsValuesMap.get(field);
069
070 for (String value : valuesList) {
071 addTerm(field, value);
072 }
073 }
074 }
075
076 protected String getTermFieldRemainderValues(
077 String field, String values, List<String> valuesList, String pattern,
078 String replacement) {
079
080 if (Validator.isNull(values)) {
081 return values;
082 }
083
084 if (Validator.isNull(pattern) || Validator.isNull(replacement)) {
085 return values;
086 }
087
088 if (Validator.isNotNull(field)) {
089 field += ":";
090 }
091 else {
092 field = StringPool.BLANK;
093 }
094
095 while (values.matches(pattern)) {
096 String value = values.replaceAll(pattern, replacement);
097
098 valuesList.add(value);
099
100 String duplicate =
101 "(?i)\\s*" + Pattern.quote(field + value) + "\\s*";
102
103 values = values.replaceAll(duplicate, StringPool.SPACE);
104 values = values.trim();
105 }
106
107 return values;
108 }
109
110 protected Map<String, List<String>> getTermFieldsValuesMap(
111 String[] fields, String values) {
112
113 Map<String, List<String>> termFieldsValuesMap =
114 new HashMap<String, List<String>>();
115
116 for (String field : fields) {
117 List<String> valuesList = new ArrayList<String>();
118
119 values = getTermFieldRemainderValues(
120 field, values, valuesList,
121 "(?i)^.*" + field + ":([\"\'])(.+?)(\\1).*$", "$1$2$3");
122
123 values = getTermFieldRemainderValues(
124 field, values, valuesList,
125 "(?i)^.*" + field + ":([^\\s\"']*).*$", "$1");
126
127 termFieldsValuesMap.put(field, valuesList);
128 }
129
130 values = values.trim();
131
132 List<String> valuesList = new ArrayList<String>();
133
134 if (Validator.isNotNull(values)) {
135 values = getTermFieldRemainderValues(
136 null, values, valuesList,
137 "^[^\"\']*([\"\'])(.+?)(\\1)[^\"\']*$", "$1$2$3");
138
139 valuesList.add(values);
140 }
141
142 termFieldsValuesMap.put("no_field", valuesList);
143
144 return termFieldsValuesMap;
145 }
146
147 protected String[] parseKeywords(String values) {
148 if (!values.contains(StringPool.QUOTE)) {
149 return StringUtil.split(values, CharPool.SPACE);
150 }
151
152 List<String> keywords = new ArrayList<String>();
153
154 while (values.length() > 0) {
155 if (values.startsWith(StringPool.QUOTE)) {
156 values = values.substring(1);
157
158 if (values.contains(StringPool.QUOTE)) {
159 int pos = values.indexOf(StringPool.QUOTE);
160
161 keywords.add(values.substring(0, pos));
162
163 values = values.substring(pos + 1);
164 values = values.trim();
165 }
166 }
167 else {
168 if (values.contains(StringPool.SPACE)) {
169 int pos = values.indexOf(StringPool.SPACE);
170
171 keywords.add(values.substring(0, pos));
172
173 values = values.substring(pos + 1);
174 values = values.trim();
175 }
176 else {
177 keywords.add(values);
178
179 break;
180 }
181 }
182 }
183
184 return keywords.toArray(new String[keywords.size()]);
185 }
186
187 }