Skip to content

Commit

Permalink
HSEARCH-2434 Introduce an Elasticsearch 5 dialect and dialect autodet…
Browse files Browse the repository at this point in the history
…ection
  • Loading branch information
yrodiere committed Mar 21, 2017
1 parent 273299a commit c2b9690
Show file tree
Hide file tree
Showing 7 changed files with 203 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,51 @@
*/
package org.hibernate.search.elasticsearch.dialect.impl;

import java.io.IOException;
import java.util.Properties;

import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.hibernate.search.elasticsearch.dialect.impl.es2.Elasticsearch2Dialect;
import org.hibernate.search.elasticsearch.dialect.impl.es5.Elasticsearch5Dialect;
import org.hibernate.search.elasticsearch.gson.impl.JsonAccessor;
import org.hibernate.search.elasticsearch.logging.impl.Log;
import org.hibernate.search.elasticsearch.util.impl.ElasticsearchClientUtils;
import org.hibernate.search.util.logging.impl.LoggerFactory;

import com.google.gson.JsonObject;

/**
* @author Yoann Rodiere
*/
public class DefaultElasticsearchDialectFactory implements ElasticsearchDialectFactory {

private static final Log log = LoggerFactory.make( Log.class );

private static final JsonAccessor VERSION_ACCESSOR = JsonAccessor.root().property( "version" ).property( "number" );

@Override
public ElasticsearchDialect createDialect(RestClient client, Properties properties) {
return new Elasticsearch2Dialect();
JsonObject responseAsJsonObject;
try {
Response response = client.performRequest( "GET", "/" );
responseAsJsonObject = ElasticsearchClientUtils.parseJsonResponse(
DialectIndependentGsonProvider.INSTANCE, response );
}
catch (IOException | RuntimeException e) {
throw log.failedToDetectElasticsearchVersion( e );
}

String version = VERSION_ACCESSOR.get( responseAsJsonObject ).getAsString();

if ( version.startsWith( "2." ) ) {
return new Elasticsearch2Dialect();
}
else if ( version.startsWith( "5." ) ) {
return new Elasticsearch5Dialect();
}
else {
throw log.unexpectedElasticsearchVersion( version );
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* 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.dialect.impl.es5;

import org.hibernate.search.elasticsearch.dialect.impl.DialectIndependentGsonProvider;
import org.hibernate.search.elasticsearch.dialect.impl.ElasticsearchDialect;
import org.hibernate.search.elasticsearch.gson.impl.GsonProvider;
import org.hibernate.search.elasticsearch.nulls.impl.Elasticsearch5MissingValueStrategy;
import org.hibernate.search.elasticsearch.schema.impl.Elasticsearch5SchemaTranslator;
import org.hibernate.search.elasticsearch.schema.impl.Elasticsearch5SchemaValidator;
import org.hibernate.search.elasticsearch.schema.impl.ElasticsearchSchemaAccessor;
import org.hibernate.search.elasticsearch.schema.impl.ElasticsearchSchemaTranslator;
import org.hibernate.search.elasticsearch.schema.impl.ElasticsearchSchemaValidator;
import org.hibernate.search.elasticsearch.work.impl.factory.Elasticsearch5WorkFactory;
import org.hibernate.search.elasticsearch.work.impl.factory.ElasticsearchWorkFactory;
import org.hibernate.search.engine.nulls.impl.MissingValueStrategy;

/**
* @author Yoann Rodiere
*/
public class Elasticsearch5Dialect implements ElasticsearchDialect {

@Override
public GsonProvider createGsonProvider() {
return DialectIndependentGsonProvider.INSTANCE;
}

@Override
public ElasticsearchWorkFactory createWorkFactory(GsonProvider gsonProvider) {
return new Elasticsearch5WorkFactory( gsonProvider );
}

@Override
public ElasticsearchSchemaTranslator createSchemaTranslator() {
return new Elasticsearch5SchemaTranslator();
}

@Override
public ElasticsearchSchemaValidator createSchemaValidator(ElasticsearchSchemaAccessor schemaAccessor) {
return new Elasticsearch5SchemaValidator( schemaAccessor );
}

@Override
public MissingValueStrategy createMissingValueStrategy() {
return Elasticsearch5MissingValueStrategy.INSTANCE;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -435,4 +435,13 @@ BulkRequestFailedException elasticsearchBulkRequestFailed(String request, String
value = "Invalid token filter definition for name '%1$s'. Token filter definitions must at least define the token filter type." )
SearchException invalidElasticsearchTokenFilterDefinition(String name);

@Message(id = ES_BACKEND_MESSAGES_START_ID + 80,
value = "Failed to detect the Elasticsearch version running on the cluster." )
SearchException failedToDetectElasticsearchVersion(@Cause Exception e);

@Message(id = ES_BACKEND_MESSAGES_START_ID + 81,
value = "An unexpected Elasticsearch version runs on the Elasticsearch cluster: '%s'."
+ " Please refer to the documentation to know which versions are supported." )
SearchException unexpectedElasticsearchVersion(String name);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* 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.nulls.impl;

import org.hibernate.search.bridge.spi.NullMarker;
import org.hibernate.search.elasticsearch.logging.impl.Log;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchBooleanNullMarkerCodec;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchDoubleNullMarkerCodec;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchFloatNullMarkerCodec;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchIntegerNullMarkerCodec;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchLongNullMarkerCodec;
import org.hibernate.search.elasticsearch.nulls.codec.impl.ElasticsearchStringNullMarkerCodec;
import org.hibernate.search.engine.metadata.impl.DocumentFieldPath;
import org.hibernate.search.engine.nulls.codec.impl.NullMarkerCodec;
import org.hibernate.search.engine.nulls.impl.MissingValueStrategy;
import org.hibernate.search.util.logging.impl.LoggerFactory;

public final class Elasticsearch5MissingValueStrategy implements MissingValueStrategy {
private static final Log LOG = LoggerFactory.make( Log.class );

public static final Elasticsearch5MissingValueStrategy INSTANCE = new Elasticsearch5MissingValueStrategy();

@Override
public NullMarkerCodec createNullMarkerCodec(Class<?> entityType, DocumentFieldPath path, NullMarker nullMarker) {
Object nullEncoded = nullMarker.nullEncoded();
if ( nullEncoded instanceof String ) {
return new ElasticsearchStringNullMarkerCodec( nullMarker );
}
else if ( nullEncoded instanceof Integer ) {
return new ElasticsearchIntegerNullMarkerCodec( nullMarker );
}
else if ( nullEncoded instanceof Long ) {
return new ElasticsearchLongNullMarkerCodec( nullMarker );
}
else if ( nullEncoded instanceof Float ) {
return new ElasticsearchFloatNullMarkerCodec( nullMarker );
}
else if ( nullEncoded instanceof Double ) {
return new ElasticsearchDoubleNullMarkerCodec( nullMarker );
}
else if ( nullEncoded instanceof Boolean ) {
return new ElasticsearchBooleanNullMarkerCodec( nullMarker );
}
else {
throw LOG.unsupportedNullTokenType( entityType, path.getAbsoluteName(), nullEncoded.getClass() );
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* 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;

/**
* An {@link ElasticsearchSchemaTranslator} implementation for Elasticsearch 5.
*
* @author Yoann Rodiere
*/
public class Elasticsearch5SchemaTranslator extends Elasticsearch2SchemaTranslator {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* 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;

/**
* An {@link ElasticsearchSchemaValidator} implementation for Elasticsearch 5.
*
* @author Yoann Rodiere
*/
public class Elasticsearch5SchemaValidator extends Elasticsearch2SchemaValidator {

public Elasticsearch5SchemaValidator(ElasticsearchSchemaAccessor schemaAccessor) {
super( schemaAccessor );
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* 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.work.impl.factory;

import org.hibernate.search.elasticsearch.gson.impl.GsonProvider;

/**
* @author Yoann Rodiere
*/
public class Elasticsearch5WorkFactory extends Elasticsearch2WorkFactory {

public Elasticsearch5WorkFactory(GsonProvider gsonProvider) {
super( gsonProvider );
}

}

0 comments on commit c2b9690

Please sign in to comment.