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