/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.elasticsearch.schema.impl.model;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonPrimitive;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
/**
* An object representing Elasticsearch property mappings, i.e. the mappings of properties inside a type mapping.
*
* See https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#mapping-type
* @author Yoann Rodiere
*/
public class PropertyMapping extends TypeMapping {
private DataType type;
/*
* Attributes common to multiple datatypes
*/
private Float boost;
private IndexType index;
private NormsType norms;
@SerializedName("doc_values")
private Boolean docValues;
private Boolean store;
/**
* The null-value replacement, which can be a string (real string or formatted date), a boolean
* or a numeric value, depending on the data type.
*
* <p>Using JsonPrimitive here instead of Object allows us to take advantage of lazily parsed numbers,
* so that long values are not arbitrarily parsed as doubles, which would involve losing some
* information. See the difference in behavior between those adapters when parsing numbers:
* <ul>
* <li>com.google.gson.internal.bind.TypeAdapters.JSON_ELEMENT
* <li> and com.google.gson.internal.bind.ObjectTypeAdapter
* </ul>
*/
@SerializedName("null_value")
private JsonPrimitive nullValue;
/**
* Must be null when we don't want to include it in JSON serialization.
*/
private Map<String, PropertyMapping> fields;
/*
* Text datatype
* https://www.elastic.co/guide/en/elasticsearch/reference/current/string.html
*/
private String analyzer;
@SerializedName("fielddata")
private FieldDataType fieldData;
/*
* Date datatype
* https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
*/
@JsonAdapter(ElasticsearchFormatJsonAdapter.class)
private List<String> format;
public DataType getType() {
return type;
}
public void setType(DataType type) {
this.type = type;
}
public List<String> getFormat() {
return format;
}
public void setFormat(List<String> format) {
this.format = format;
}
public Float getBoost() {
return boost;
}
public void setBoost(Float boost) {
this.boost = boost;
}
public IndexType getIndex() {
return index;
}
public void setIndex(IndexType index) {
this.index = index;
}
public NormsType getNorms() {
return norms;
}
public void setNorms(NormsType norms) {
this.norms = norms;
}
public Boolean getDocValues() {
return docValues;
}
public void setDocValues(Boolean docValues) {
this.docValues = docValues;
}
public Boolean getStore() {
return store;
}
public void setStore(Boolean store) {
this.store = store;
}
public JsonPrimitive getNullValue() {
return nullValue;
}
public void setNullValue(JsonPrimitive nullValue) {
this.nullValue = nullValue;
}
public Map<String, PropertyMapping> getFields() {
return fields;
}
private Map<String, PropertyMapping> getInitializedFields() {
if ( fields == null ) {
fields = new TreeMap<>();
}
return fields;
}
public void addField(String name, PropertyMapping mapping) {
getInitializedFields().put(name, mapping);
}
public void removeField(String name) {
getInitializedFields().remove( name );
}
public String getAnalyzer() {
return analyzer;
}
public void setAnalyzer(String analyzer) {
this.analyzer = analyzer;
}
public FieldDataType getFieldData() {
return fieldData;
}
public void setFieldData(FieldDataType fieldData) {
this.fieldData = fieldData;
}
@Override
public String toString() {
return new GsonBuilder().setPrettyPrinting().create().toJson( this );
}
}