/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.search;
import com.liferay.portal.kernel.search.geolocation.GeoLocationPoint;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.StringPool;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* @author Bruno Farache
* @author Brian Wing Shun Chan
* @author Allen Chiang
* @author Alex Wallace
*/
public class Field implements Serializable {
public static final String ANY = StringPool.STAR;
public static final String ARTICLE_ID = "articleId";
public static final String ASSET_CATEGORY_ID = "assetCategoryId";
public static final String ASSET_CATEGORY_IDS = "assetCategoryIds";
public static final String ASSET_CATEGORY_TITLE = "assetCategoryTitle";
public static final String ASSET_CATEGORY_TITLES = "assetCategoryTitles";
public static final String ASSET_PARENT_CATEGORY_ID = "parentCategoryId";
public static final String ASSET_PARENT_CATEGORY_IDS = "parentCategoryIds";
public static final String ASSET_TAG_IDS = "assetTagIds";
public static final String ASSET_TAG_NAMES = "assetTagNames";
public static final String ASSET_VOCABULARY_ID = "assetVocabularyId";
public static final String ASSET_VOCABULARY_IDS = "assetVocabularyIds";
public static final String CAPTION = "caption";
public static final String CATEGORY_ID = "categoryId";
public static final String CLASS_NAME_ID = "classNameId";
public static final String CLASS_PK = "classPK";
public static final String CLASS_TYPE_ID = "classTypeId";
public static final String COMMENTS = "comments";
public static final String COMPANY_ID = "companyId";
public static final String CONTENT = "content";
public static final String CREATE_DATE = "createDate";
public static final String DEFAULT_LANGUAGE_ID = "defaultLanguageId";
public static final String DESCRIPTION = "description";
public static final String ENTRY_CLASS_NAME = "entryClassName";
public static final String ENTRY_CLASS_PK = "entryClassPK";
public static final String EXPIRATION_DATE = "expirationDate";
public static final String FOLDER_ID = "folderId";
public static final String GEO_LOCATION = "geoLocation";
public static final String GROUP_ID = "groupId";
public static final String GROUP_ROLE_ID = "groupRoleId";
public static final String HIDDEN = "hidden";
public static final String KEYWORD_SEARCH = "keywordSearch";
public static final String[] KEYWORDS = {
Field.ASSET_CATEGORY_TITLES, Field.ASSET_TAG_NAMES, Field.COMMENTS,
Field.CONTENT, Field.DESCRIPTION, Field.PROPERTIES, Field.TITLE,
Field.URL, Field.USER_NAME
};
public static final String LANGUAGE_ID = "languageId";
public static final String LAYOUT_UUID = "layoutUuid";
public static final String MODIFIED_DATE = "modified";
public static final String NAME = "name";
public static final String NODE_ID = "nodeId";
public static final String ORGANIZATION_ID = "organizationId";
/**
* @deprecated As of 7.0.0, replaced by {@link #ENTRY_CLASS_NAME}
*/
@Deprecated
public static final String PORTLET_ID = "portletId";
public static final String PRIORITY = "priority";
public static final String PROPERTIES = "properties";
public static final String PUBLISH_DATE = "publishDate";
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
public static final String RATINGS = "ratings";
public static final String RELATED_ENTRY = "relatedEntry";
public static final String REMOVED_BY_USER_NAME = "removedByUserName";
public static final String REMOVED_DATE = "removedDate";
public static final String ROLE_ID = "roleId";
public static final String ROOT_ENTRY_CLASS_NAME = "rootEntryClassName";
public static final String ROOT_ENTRY_CLASS_PK = "rootEntryClassPK";
public static final String SCOPE_GROUP_ID = "scopeGroupId";
public static final String SNIPPET = "snippet";
public static final String SPELL_CHECK_WORD = "spellCheckWord";
public static final String STAGING_GROUP = "stagingGroup";
public static final String STATUS = "status";
public static final String SUBTITLE = "subtitle";
public static final String TITLE = "title";
public static final String TREE_PATH = "treePath";
public static final String TYPE = "type";
public static final String UID = "uid";
public static final String[] UNSCORED_FIELD_NAMES = {
Field.ASSET_CATEGORY_IDS, Field.COMPANY_ID, Field.ENTRY_CLASS_NAME,
Field.ENTRY_CLASS_PK, Field.FOLDER_ID, Field.GROUP_ID,
Field.GROUP_ROLE_ID, Field.ROLE_ID, Field.SCOPE_GROUP_ID, Field.USER_ID
};
public static final String URL = "url";
public static final String USER_GROUP_ID = "userGroupId";
public static final String USER_ID = "userId";
public static final String USER_NAME = "userName";
public static final String VERSION = "version";
public static final String VIEW_ACTION_ID = "viewActionId";
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
public static final String VIEW_COUNT = "viewCount";
public static boolean validateFieldName(String name) {
if (name.contains(StringPool.COMMA) ||
name.contains(StringPool.PERIOD) ||
name.contains(StringPool.POUND) ||
name.contains(StringPool.SLASH) || name.contains(StringPool.STAR) ||
name.startsWith(StringPool.UNDERLINE)) {
return false;
}
return true;
}
public Field(String name) {
validate(name);
_name = name;
}
public Field(String name, Map<Locale, String> localizedValues) {
validate(name);
_name = name;
_localizedValues = localizedValues;
}
public Field(String name, String value) {
this(name, new String[] {value});
}
public Field(String name, String[] values) {
validate(name);
_name = name;
_values = values;
}
public void addField(Field field) {
_fields.add(field);
}
/**
* @deprecated As of 7.0.0, replaced by {@link Query#getBoost}
*/
@Deprecated
public float getBoost() {
return _boost;
}
public Date[] getDates() {
return _dates;
}
public List<Field> getFields() {
return _fields;
}
public GeoLocationPoint getGeoLocationPoint() {
return _geoLocationPoint;
}
public Map<Locale, String> getLocalizedValues() {
return _localizedValues;
}
public String getName() {
return _name;
}
public Class<? extends Number> getNumericClass() {
return _numericClass;
}
public Field getParentField() {
return _parentField;
}
public String getValue() {
if (ArrayUtil.isNotEmpty(_values)) {
return _values[0];
}
else {
return null;
}
}
public String[] getValues() {
return _values;
}
public boolean hasChildren() {
return !getFields().isEmpty();
}
public boolean isArray() {
return false;
}
public boolean isDate() {
if (_dates != null) {
return true;
}
else {
return false;
}
}
public boolean isLocalized() {
if (_localizedValues != null) {
return true;
}
else {
return false;
}
}
public boolean isNested() {
if (getParentField() != null) {
return true;
}
return false;
}
public boolean isNumeric() {
return _numeric;
}
public boolean isSortable() {
return _sortable;
}
public boolean isTokenized() {
return _tokenized;
}
/**
* @deprecated As of 7.0.0, replaced by {@link Query#setBoost(float)}
*/
@Deprecated
public void setBoost(float boost) {
_boost = boost;
}
public void setDates(Date[] dates) {
_dates = dates;
}
public void setGeoLocationPoint(GeoLocationPoint geoLocationPoint) {
_geoLocationPoint = geoLocationPoint;
if (geoLocationPoint == null) {
_values = null;
}
else {
setValue(
"lat: " + geoLocationPoint.getLatitude() + ", lon: " +
geoLocationPoint.getLongitude());
}
}
public void setLocalizedValues(Map<Locale, String> localizedValues) {
_localizedValues = localizedValues;
}
public void setName(String name) {
_name = name;
}
public void setNumeric(boolean numeric) {
_numeric = numeric;
}
public void setNumericClass(Class<? extends Number> numericClass) {
_numericClass = numericClass;
}
public void setParentField(Field parentField) {
_parentField = parentField;
}
public void setSortable(boolean sortable) {
_sortable = sortable;
}
public void setTokenized(boolean tokenized) {
_tokenized = tokenized;
}
public void setValue(String value) {
setValues(new String[] {value});
}
public void setValues(String[] values) {
_values = values;
}
public static class NestedFieldBuilder {
public NestedFieldBuilder addNestedField(
String name, String... values) {
Field field = new Field(name);
field.addField(new Field("value", values));
_addField(field);
return this;
}
public NestedFieldBuilder endArray() {
return endField();
}
public NestedFieldBuilder endField() {
if (_nestedFieldsBuilderFields.size() > 1) {
_nestedFieldsBuilderFields.removeLast();
}
return this;
}
public Field getField() {
if (!_nestedFieldsBuilderFields.isEmpty()) {
return _nestedFieldsBuilderFields.getLast();
}
return null;
}
public NestedFieldBuilder startArray(String name) {
FieldArray fieldArray = new FieldArray(name);
return _startField(fieldArray);
}
public NestedFieldBuilder startField() {
return startField(null);
}
public NestedFieldBuilder startField(String name) {
Field field = new Field(name);
return _startField(field);
}
private void _addField(Field field) {
Field lastField = _nestedFieldsBuilderFields.getLast();
lastField.addField(field);
}
private NestedFieldBuilder _startField(Field field) {
if (!_nestedFieldsBuilderFields.isEmpty()) {
_addField(field);
}
_nestedFieldsBuilderFields.add(field);
return this;
}
private final LinkedList<Field> _nestedFieldsBuilderFields =
new LinkedList<>();
}
protected void validate(String name) {
if (name.contains(StringPool.COMMA)) {
throw new IllegalArgumentException(
"Name must not contain " + StringPool.COMMA + ": " + name);
}
if (name.contains(StringPool.PERIOD)) {
throw new IllegalArgumentException(
"Name must not contain " + StringPool.PERIOD + ": " + name);
}
if (name.contains(StringPool.POUND)) {
throw new IllegalArgumentException(
"Name must not contain " + StringPool.POUND + ": " + name);
}
if (name.contains(StringPool.SLASH)) {
throw new IllegalArgumentException(
"Name must not contain " + StringPool.SLASH + ": " + name);
}
if (name.contains(StringPool.STAR)) {
throw new IllegalArgumentException(
"Name must not contain " + StringPool.STAR + ": " + name);
}
if (name.startsWith(StringPool.UNDERLINE)) {
throw new IllegalArgumentException(
"Name must not start with " + StringPool.UNDERLINE + ": " +
name);
}
}
private float _boost = 1;
private Date[] _dates;
private final List<Field> _fields = new ArrayList<>();
private GeoLocationPoint _geoLocationPoint;
private Map<Locale, String> _localizedValues;
private String _name;
private boolean _numeric;
private Class<? extends Number> _numericClass;
private Field _parentField;
private boolean _sortable;
private boolean _tokenized;
private String[] _values;
}