001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.search;
016    
017    import com.liferay.portal.kernel.search.geolocation.GeoLocationPoint;
018    import com.liferay.portal.kernel.util.ArrayUtil;
019    import com.liferay.portal.kernel.util.StringPool;
020    
021    import java.io.Serializable;
022    
023    import java.util.ArrayList;
024    import java.util.LinkedList;
025    import java.util.List;
026    import java.util.Locale;
027    import java.util.Map;
028    
029    /**
030     * @author Bruno Farache
031     * @author Brian Wing Shun Chan
032     * @author Allen Chiang
033     * @author Alex Wallace
034     */
035    public class Field implements Serializable {
036    
037            public static final String ANY = StringPool.STAR;
038    
039            public static final String ARTICLE_ID = "articleId";
040    
041            public static final String ASSET_CATEGORY_ID = "assetCategoryId";
042    
043            public static final String ASSET_CATEGORY_IDS = "assetCategoryIds";
044    
045            public static final String ASSET_CATEGORY_TITLE = "assetCategoryTitle";
046    
047            public static final String ASSET_CATEGORY_TITLES = "assetCategoryTitles";
048    
049            public static final String ASSET_PARENT_CATEGORY_ID = "parentCategoryId";
050    
051            public static final String ASSET_PARENT_CATEGORY_IDS = "parentCategoryIds";
052    
053            public static final String ASSET_TAG_IDS = "assetTagIds";
054    
055            public static final String ASSET_TAG_NAMES = "assetTagNames";
056    
057            public static final String ASSET_VOCABULARY_ID = "assetVocabularyId";
058    
059            public static final String ASSET_VOCABULARY_IDS = "assetVocabularyIds";
060    
061            public static final String CAPTION = "caption";
062    
063            public static final String CATEGORY_ID = "categoryId";
064    
065            public static final String CLASS_NAME_ID = "classNameId";
066    
067            public static final String CLASS_PK = "classPK";
068    
069            public static final String CLASS_TYPE_ID = "classTypeId";
070    
071            public static final String COMMENTS = "comments";
072    
073            public static final String COMPANY_ID = "companyId";
074    
075            public static final String CONTENT = "content";
076    
077            public static final String CREATE_DATE = "createDate";
078    
079            public static final String DEFAULT_LANGUAGE_ID = "defaultLanguageId";
080    
081            public static final String DESCRIPTION = "description";
082    
083            public static final String ENTRY_CLASS_NAME = "entryClassName";
084    
085            public static final String ENTRY_CLASS_PK = "entryClassPK";
086    
087            public static final String EXPIRATION_DATE = "expirationDate";
088    
089            public static final String FOLDER_ID = "folderId";
090    
091            public static final String GEO_LOCATION = "geoLocation";
092    
093            public static final String GROUP_ID = "groupId";
094    
095            public static final String GROUP_ROLE_ID = "groupRoleId";
096    
097            public static final String HIDDEN = "hidden";
098    
099            public static final String KEYWORD_SEARCH = "keywordSearch";
100    
101            public static final String[] KEYWORDS = {
102                    Field.ASSET_CATEGORY_TITLES, Field.ASSET_TAG_NAMES, Field.COMMENTS,
103                    Field.CONTENT, Field.DESCRIPTION, Field.PROPERTIES, Field.TITLE,
104                    Field.URL, Field.USER_NAME
105            };
106    
107            public static final String LANGUAGE_ID = "languageId";
108    
109            public static final String LAYOUT_UUID = "layoutUuid";
110    
111            public static final String MODIFIED_DATE = "modified";
112    
113            public static final String NAME = "name";
114    
115            public static final String NODE_ID = "nodeId";
116    
117            public static final String ORGANIZATION_ID = "organizationId";
118    
119            /**
120             * @deprecated As of 7.0.0, replaced by {@link #ENTRY_CLASS_NAME}
121             */
122            @Deprecated
123            public static final String PORTLET_ID = "portletId";
124    
125            public static final String PRIORITY = "priority";
126    
127            public static final String PROPERTIES = "properties";
128    
129            public static final String PUBLISH_DATE = "publishDate";
130    
131            public static final String RATINGS = "ratings";
132    
133            public static final String RELATED_ENTRY = "relatedEntry";
134    
135            public static final String REMOVED_BY_USER_NAME = "removedByUserName";
136    
137            public static final String REMOVED_DATE = "removedDate";
138    
139            public static final String ROLE_ID = "roleId";
140    
141            public static final String ROOT_ENTRY_CLASS_NAME = "rootEntryClassName";
142    
143            public static final String ROOT_ENTRY_CLASS_PK = "rootEntryClassPK";
144    
145            public static final String SCOPE_GROUP_ID = "scopeGroupId";
146    
147            public static final String SNIPPET = "snippet";
148    
149            public static final String SPELL_CHECK_WORD = "spellCheckWord";
150    
151            public static final String STAGING_GROUP = "stagingGroup";
152    
153            public static final String STATUS = "status";
154    
155            public static final String SUBTITLE = "subtitle";
156    
157            public static final String TITLE = "title";
158    
159            public static final String TREE_PATH = "treePath";
160    
161            public static final String TYPE = "type";
162    
163            public static final String UID = "uid";
164    
165            public static final String[] UNSCORED_FIELD_NAMES = {
166                    Field.ASSET_CATEGORY_IDS, Field.COMPANY_ID, Field.ENTRY_CLASS_NAME,
167                    Field.ENTRY_CLASS_PK, Field.FOLDER_ID, Field.GROUP_ID,
168                    Field.GROUP_ROLE_ID, Field.ROLE_ID, Field.SCOPE_GROUP_ID, Field.USER_ID
169            };
170    
171            public static final String URL = "url";
172    
173            public static final String USER_GROUP_ID = "userGroupId";
174    
175            public static final String USER_ID = "userId";
176    
177            public static final String USER_NAME = "userName";
178    
179            public static final String VERSION = "version";
180    
181            public static final String VIEW_COUNT = "viewCount";
182    
183            public Field(String name) {
184                    _name = name;
185            }
186    
187            public Field(String name, Map<Locale, String> localizedValues) {
188                    _name = name;
189                    _localizedValues = localizedValues;
190            }
191    
192            public Field(String name, String value) {
193                    this(name, new String[] {value});
194            }
195    
196            public Field(String name, String[] values) {
197                    _name = name;
198                    _values = values;
199            }
200    
201            public void addField(Field field) {
202                    _fields.add(field);
203            }
204    
205            /**
206             * @deprecated As of 7.0.0, replaced by {@link Query#getBoost}
207             */
208            @Deprecated
209            public float getBoost() {
210                    return _boost;
211            }
212    
213            public List<Field> getFields() {
214                    return _fields;
215            }
216    
217            public GeoLocationPoint getGeoLocationPoint() {
218                    return _geoLocationPoint;
219            }
220    
221            public Map<Locale, String> getLocalizedValues() {
222                    return _localizedValues;
223            }
224    
225            public String getName() {
226                    return _name;
227            }
228    
229            public Class<? extends Number> getNumericClass() {
230                    return _numericClass;
231            }
232    
233            public Field getParentField() {
234                    return _parentField;
235            }
236    
237            public String getValue() {
238                    if (ArrayUtil.isNotEmpty(_values)) {
239                            return _values[0];
240                    }
241                    else {
242                            return null;
243                    }
244            }
245    
246            public String[] getValues() {
247                    return _values;
248            }
249    
250            public boolean hasChildren() {
251                    return !getFields().isEmpty();
252            }
253    
254            public boolean isArray() {
255                    return false;
256            }
257    
258            public boolean isLocalized() {
259                    if (_localizedValues != null) {
260                            return true;
261                    }
262                    else {
263                            return false;
264                    }
265            }
266    
267            public boolean isNested() {
268                    if (getParentField() != null) {
269                            return true;
270                    }
271    
272                    return false;
273            }
274    
275            public boolean isNumeric() {
276                    return _numeric;
277            }
278    
279            public boolean isSortable() {
280                    return _sortable;
281            }
282    
283            public boolean isTokenized() {
284                    return _tokenized;
285            }
286    
287            /**
288             * @deprecated As of 7.0.0, replaced by {@link Query#setBoost(float)}
289             */
290            @Deprecated
291            public void setBoost(float boost) {
292                    _boost = boost;
293            }
294    
295            public void setGeoLocationPoint(GeoLocationPoint geoLocationPoint) {
296                    _geoLocationPoint = geoLocationPoint;
297            }
298    
299            public void setLocalizedValues(Map<Locale, String> localizedValues) {
300                    _localizedValues = localizedValues;
301            }
302    
303            public void setName(String name) {
304                    _name = name;
305            }
306    
307            public void setNumeric(boolean numeric) {
308                    _numeric = numeric;
309            }
310    
311            public void setNumericClass(Class<? extends Number> numericClass) {
312                    _numericClass = numericClass;
313            }
314    
315            public void setParentField(Field parentField) {
316                    _parentField = parentField;
317            }
318    
319            public void setSortable(boolean sortable) {
320                    _sortable = sortable;
321            }
322    
323            public void setTokenized(boolean tokenized) {
324                    _tokenized = tokenized;
325            }
326    
327            public void setValue(String value) {
328                    setValues(new String[] {value});
329            }
330    
331            public void setValues(String[] values) {
332                    _values = values;
333            }
334    
335            public static class NestedFieldBuilder {
336    
337                    public NestedFieldBuilder addNestedField(
338                            String name, String... values) {
339    
340                            Field field = new Field(name);
341    
342                            field.addField(new Field("value", values));
343    
344                            _addField(field);
345    
346                            return this;
347                    }
348    
349                    public NestedFieldBuilder endArray() {
350                            return endField();
351                    }
352    
353                    public NestedFieldBuilder endField() {
354                            if (_nestedFieldsBuilderFields.size() > 1) {
355                                    _nestedFieldsBuilderFields.removeLast();
356                            }
357    
358                            return this;
359                    }
360    
361                    public Field getField() {
362                            if (!_nestedFieldsBuilderFields.isEmpty()) {
363                                    return _nestedFieldsBuilderFields.getLast();
364                            }
365    
366                            return null;
367                    }
368    
369                    public NestedFieldBuilder startArray(String name) {
370                            FieldArray fieldArray = new FieldArray(name);
371    
372                            return _startField(fieldArray);
373                    }
374    
375                    public NestedFieldBuilder startField() {
376                            return startField(null);
377                    }
378    
379                    public NestedFieldBuilder startField(String name) {
380                            Field field = new Field(name);
381    
382                            return _startField(field);
383                    }
384    
385                    private void _addField(Field field) {
386                            Field lastField = _nestedFieldsBuilderFields.getLast();
387    
388                            lastField.addField(field);
389                    }
390    
391                    private NestedFieldBuilder _startField(Field field) {
392                            if (!_nestedFieldsBuilderFields.isEmpty()) {
393                                    _addField(field);
394                            }
395    
396                            _nestedFieldsBuilderFields.add(field);
397    
398                            return this;
399                    }
400    
401                    private final LinkedList<Field> _nestedFieldsBuilderFields =
402                            new LinkedList<>();
403    
404            }
405    
406            private float _boost = 1;
407            private final List<Field> _fields = new ArrayList<>();
408            private GeoLocationPoint _geoLocationPoint;
409            private Map<Locale, String> _localizedValues;
410            private String _name;
411            private boolean _numeric;
412            private Class<? extends Number> _numericClass;
413            private Field _parentField;
414            private boolean _sortable;
415            private boolean _tokenized;
416            private String[] _values;
417    
418    }