/*
* 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;
import org.hibernate.search.elasticsearch.schema.impl.model.DataType;
import org.hibernate.search.elasticsearch.schema.impl.model.FieldDataType;
import org.hibernate.search.elasticsearch.schema.impl.model.IndexType;
import org.hibernate.search.elasticsearch.schema.impl.model.NormsType;
import org.hibernate.search.elasticsearch.schema.impl.model.PropertyMapping;
import com.google.gson.JsonPrimitive;
/**
* An {@link ElasticsearchSchemaValidator} implementation for Elasticsearch 5.
*
* @author Yoann Rodiere
*/
public class Elasticsearch5SchemaValidator extends Elasticsearch2SchemaValidator {
public Elasticsearch5SchemaValidator(ElasticsearchSchemaAccessor schemaAccessor) {
super( schemaAccessor );
}
@Override
protected void doValidateJsonPrimitive(ValidationErrorCollector errorCollector,
DataType type, String attributeName, JsonPrimitive expectedValue, JsonPrimitive actualValue) {
switch ( type ) {
case TEXT:
case KEYWORD:
validateEqualWithDefault( errorCollector, attributeName, expectedValue, actualValue, null );
break;
default:
super.doValidateJsonPrimitive( errorCollector, type, attributeName, expectedValue, actualValue );
break;
}
}
@Override
protected void validateIndexOptions(ValidationErrorCollector errorCollector, PropertyMapping expectedMapping, PropertyMapping actualMapping) {
IndexType expectedIndex = expectedMapping.getIndex();
if ( IndexType.TRUE.equals( expectedIndex ) ) { // If we don't need an index, we don't care
// From ES 5.0 on, all indexable fields are indexed by default
IndexType indexDefault = IndexType.TRUE;
validateEqualWithDefault( errorCollector, "index", expectedIndex, actualMapping.getIndex(), indexDefault );
}
NormsType expectedNorms = expectedMapping.getNorms();
if ( NormsType.TRUE.equals( expectedNorms ) ) { // If we don't need norms, we don't care
// From ES 5.0 on, norms are enabled by default on text fields only
NormsType normsDefault = DataType.TEXT.equals( expectedMapping.getType() ) ? NormsType.TRUE : NormsType.FALSE;
validateEqualWithDefault( errorCollector, "norms", expectedNorms, actualMapping.getNorms(), normsDefault );
}
FieldDataType expectedFieldData = expectedMapping.getFieldData();
if ( FieldDataType.TRUE.equals( expectedFieldData ) ) { // If we don't need an index, we don't care
validateEqualWithDefault( errorCollector, "fielddata", expectedFieldData, actualMapping.getFieldData(), FieldDataType.FALSE );
}
Boolean expectedDocValues = expectedMapping.getDocValues();
if ( Boolean.TRUE.equals( expectedDocValues ) ) { // If we don't need doc_values, we don't care
/*
* Elasticsearch documentation (2.3) says doc_values is true by default on fields
* supporting it, but tests show it's wrong.
*/
validateEqualWithDefault( errorCollector, "doc_values", expectedDocValues, actualMapping.getDocValues(), false );
}
}
}