/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.springframework.stereotype.Component;
import com.enonic.cms.core.search.builder.ContentIndexData;
/**
* Created by IntelliJ IDEA.
* User: rmh
* Date: 11/28/11
* Time: 10:00 AM
*/
@Component
final class ContentIndexRequestCreator
{
private final IndexRequestComparator comparator = new IndexRequestComparator();
public Set<IndexRequest> createIndexRequests( String indexName, ContentIndexData contentIndexData )
{
Set<IndexRequest> indexRequests = new TreeSet<IndexRequest>( comparator );
addRequestsForContentData( indexName, contentIndexData, indexRequests );
addRequestsForBinaryData( indexName, contentIndexData, indexRequests );
return indexRequests;
}
private void addRequestsForContentData( final String indexName, final ContentIndexData contentIndexData,
final Set<IndexRequest> indexRequests )
{
final String id = contentIndexData.getKey().toString();
doAddRequests( indexName, contentIndexData.buildContentDataJson(), indexRequests, id, null, IndexType.Content );
}
private void addRequestsForBinaryData( final String indexName, final ContentIndexData contentIndexData,
final Set<IndexRequest> indexRequests )
{
if ( !contentIndexData.hasBinaryData() )
{
return;
}
final String parentId = contentIndexData.getKey().toString();
doAddRequests( indexName, contentIndexData.buildBinaryDataJson(), indexRequests, parentId, parentId, IndexType.Binaries );
}
private void doAddRequests( final String indexName, final XContentBuilder xContentBuilder, final Set<IndexRequest> indexRequests,
final String id, final String parentId, IndexType indexType )
{
if ( xContentBuilder != null )
{
final IndexRequest indexRequest = createIndexRequest( indexName, id, xContentBuilder, indexType, parentId );
indexRequests.add( indexRequest );
}
}
private IndexRequest createIndexRequest( String indexName, String id, XContentBuilder data, IndexType indexType, String parent )
{
IndexRequest request = new IndexRequest( indexName ).type( indexType.toString() ).id( id ).source( data );
if ( parent != null )
{
request.parent( parent );
}
return request;
}
private class IndexRequestComparator
implements Comparator<IndexRequest>
{
public int compare( IndexRequest indexRequest, IndexRequest indexRequest1 )
{
if ( indexRequest.equals( indexRequest1 ) )
{
return 0;
}
if ( indexRequest.type().equals( IndexType.Content.toString() ) )
{
return -1;
}
return 1;
}
}
}