/*
* 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;
import java.util.List;
import org.hibernate.search.elasticsearch.client.impl.URLEncodedString;
import org.hibernate.search.exception.AssertionFailure;
import com.google.gson.JsonObject;
/**
* @author Yoann Rodiere
*/
public abstract class SimpleBulkableElasticsearchWork<R>
extends SimpleElasticsearchWork<R>
implements BulkableElasticsearchWork<R> {
private final JsonObject bulkableActionMetadata;
protected SimpleBulkableElasticsearchWork(Builder<?> builder) {
super( builder );
this.bulkableActionMetadata = builder.buildBulkableActionMetadata();
}
@Override
public void aggregate(ElasticsearchWorkAggregator aggregator) {
aggregator.addBulkable( this );
}
@Override
public JsonObject getBulkableActionMetadata() {
return bulkableActionMetadata;
}
@Override
public JsonObject getBulkableActionBody() {
List<JsonObject> bodyParts = request.getBodyParts();
if ( !bodyParts.isEmpty() ) {
if ( bodyParts.size() > 1 ) {
throw new AssertionFailure( "Found a bulkable action with multiple body parts: " + bodyParts );
}
return bodyParts.get( 0 );
}
else {
return null;
}
}
@Override
public boolean handleBulkResult(ElasticsearchWorkExecutionContext context, JsonObject bulkResponseItem) {
if ( resultAssessor.isSuccess( context, bulkResponseItem ) ) {
afterSuccess( context );
if ( markIndexDirty ) {
context.setIndexDirty( dirtiedIndexName );
}
return true;
}
else {
return false;
}
}
protected abstract static class Builder<B>
extends SimpleElasticsearchWork.Builder<B> {
public Builder(URLEncodedString dirtiedIndexName, ElasticsearchRequestSuccessAssessor resultAssessor) {
super( dirtiedIndexName, resultAssessor );
}
protected abstract JsonObject buildBulkableActionMetadata();
}
}