package org.tynamo.model.jpa.components;
import java.util.HashSet;
import java.util.Set;
import org.apache.tapestry5.grid.GridDataSource;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.TypeCoercer;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.node.Node;
import org.elasticsearch.search.SearchHit;
import org.tynamo.base.GenericModelSearch;
import org.tynamo.descriptor.TynamoClassDescriptor;
import org.tynamo.descriptor.TynamoPropertyDescriptor;
import org.tynamo.internal.services.EmptyGridDataSource;
import org.tynamo.model.elasticsearch.descriptor.ElasticSearchExtension;
import org.tynamo.model.elasticsearch.descriptor.ElasticSearchFieldDescriptor;
import org.tynamo.services.DescriptorService;
public class ElasticModelSearch extends GenericModelSearch {
@Inject
private Node node;
@Inject
private DescriptorService descriptorService;
@Inject
TypeCoercer typeCoercer;
@SuppressWarnings("unchecked")
@Override
protected GridDataSource createGridDataSource() {
TynamoClassDescriptor classDescriptor = descriptorService.getClassDescriptor(getBeanType());
if (classDescriptor.supportsExtension(ElasticSearchExtension.class) && getSearchTerms() != null) {
Client client = node.client();
// We shouldn't invoke this GridDataSource unless MappingUtil.isSearchable(descriptor.getBeanType() is true
ElasticSearchExtension elasticDescriptor = classDescriptor.getExtension(ElasticSearchExtension.class);
// FIXME consider whether we should .setTypes("entityType")
SearchResponse searchResponse = client.prepareSearch(elasticDescriptor.getIndexName())
.setTypes(elasticDescriptor.getTypeName())
.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.queryStringQuery(getSearchTerms()))).execute()
.actionGet();
if (searchResponse.getHits().getTotalHits() <= 0) return new EmptyGridDataSource(getBeanType());
@SuppressWarnings("rawtypes")
Set resultIds = new HashSet();
@SuppressWarnings("rawtypes")
Class idType = classDescriptor.getIdentifierDescriptor().getPropertyType();
for (SearchHit h : searchResponse.getHits())
resultIds.add(typeCoercer.coerce(h.getId(), idType));
return getGridDataSourceProvider().createGridDataSource(getBeanType(), resultIds, getActiveFilterMap());
}
return super.createGridDataSource();
}
@Override
public boolean isUsedAsSearchFilter(TynamoClassDescriptor classDescriptor, TynamoPropertyDescriptor propertyDescriptor) {
if (classDescriptor.supportsExtension(ElasticSearchExtension.class) && propertyDescriptor.supportsExtension(ElasticSearchFieldDescriptor.class))
return false;
else
return super.isUsedAsSearchFilter(classDescriptor, propertyDescriptor);
}
}