/*
* 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.test;
import static org.hibernate.search.test.util.impl.ExceptionMatcherBuilder.isException;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.apache.lucene.document.Document;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.FieldBridge;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.NumericField;
import org.hibernate.search.bridge.LuceneOptions;
import org.hibernate.search.bridge.MetadataProvidingFieldBridge;
import org.hibernate.search.bridge.spi.FieldMetadataBuilder;
import org.hibernate.search.bridge.spi.FieldType;
import org.hibernate.search.elasticsearch.cfg.ElasticsearchEnvironment;
import org.hibernate.search.elasticsearch.cfg.IndexSchemaManagementStrategy;
import org.hibernate.search.elasticsearch.testutil.TestElasticsearchClient;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.test.SearchInitializationTestBase;
import org.hibernate.search.test.util.ImmutableTestConfiguration;
import org.hibernate.testing.TestForIssue;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for detection of errors in the metadata when generating the Elasticsearch schema.
*
* @author Yoann Rodiere
*/
@RunWith(Parameterized.class)
public class ElasticsearchSchemaMetadataErrorsIT extends SearchInitializationTestBase {
@Parameters(name = "With strategy {0}")
public static EnumSet<IndexSchemaManagementStrategy> strategies() {
return EnumSet.complementOf( EnumSet.of( IndexSchemaManagementStrategy.NONE ) );
}
@Rule
public ExpectedException thrown = ExpectedException.none();
@Rule
public TestElasticsearchClient elasticSearchClient = new TestElasticsearchClient();
private IndexSchemaManagementStrategy strategy;
public ElasticsearchSchemaMetadataErrorsIT(IndexSchemaManagementStrategy strategy) {
super();
this.strategy = strategy;
}
@Test
@TestForIssue(jiraKey = "HSEARCH-2458")
public void detectIncompleteNumericType() throws Exception {
thrown.expect(
isException( SearchException.class )
.withMessage( "HSEARCH400018" )
.withMessage( "Unexpected numeric encoding type for field" )
.withMessage( "'" + EntityWithIncompleteNumericTypeField.class.getName() + "'" )
.withMessage( "'numericField'" )
.build()
);
elasticSearchClient.index( EntityWithIncompleteNumericTypeField.class ).registerForCleanup();
init( strategy, EntityWithIncompleteNumericTypeField.class );
}
private void init(IndexSchemaManagementStrategy strategy, Class<?> ... entityClasses) {
Map<String, Object> settings = new HashMap<>();
settings.put(
"hibernate.search.default." + ElasticsearchEnvironment.INDEX_SCHEMA_MANAGEMENT_STRATEGY,
strategy.getExternalName()
);
init( new ImmutableTestConfiguration( settings, entityClasses ) );
}
@Entity
@Indexed
private static class EntityWithIncompleteNumericTypeField {
@Id
@GeneratedValue
Long id;
@Field(bridge = @FieldBridge(impl = FieldBridgeNotUsingDefaultField.class))
@NumericField // We provide incomplete metadata about the default field: it is numeric, but the exact numeric type is not provided.
String numericField;
}
public static class FieldBridgeNotUsingDefaultField implements MetadataProvidingFieldBridge {
@Override
public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
// We don't provide metadata for the default field (whose name is in the variable "name")
builder.field( name + "_string", FieldType.STRING );
}
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
luceneOptions.addFieldToDocument( name, (String) value, document );
}
}
}