package org.tynamo.hibernate.services.internal; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.util.Version; import org.apache.tapestry5.grid.GridDataSource; import org.apache.tapestry5.hibernate.HibernateGridDataSource; import org.hibernate.search.FullTextSession; import org.tynamo.descriptor.TynamoPropertyDescriptor; import org.tynamo.hibernate.SearchableHibernateGridDataSource; import org.tynamo.search.SearchFilterPredicate; import org.tynamo.services.SearchableGridDataSourceProvider; public class SearchableHibernateGridDataSourceProvider implements SearchableGridDataSourceProvider { private FullTextSession session; public SearchableHibernateGridDataSourceProvider(FullTextSession session) { this.session = session; } @Override public GridDataSource createGridDataSource(Class entityType) { return new HibernateGridDataSource(session, entityType); } @Override public GridDataSource createGridDataSource(Class entityType, Set includedIds, Map<TynamoPropertyDescriptor, SearchFilterPredicate> propertySearchFilterMap) { // FIXME ignoring included ids return new SearchableHibernateGridDataSource(session, entityType, propertySearchFilterMap); } @Override public GridDataSource createGridDataSource(Class entityType, Map<TynamoPropertyDescriptor, SearchFilterPredicate> propertySearchFilterMap, List<TynamoPropertyDescriptor> searchablePropertyDescriptors, String searchString) { java.util.List<String> fieldNames = new ArrayList<String>(); for (TynamoPropertyDescriptor propertyDescriptor : searchablePropertyDescriptors) { fieldNames.add(propertyDescriptor.getName()); } // don't bother with a text query if there are no @Fields if (fieldNames.size() <= 0) return createGridDataSource(entityType); MultiFieldQueryParser parser = new MultiFieldQueryParser(fieldNames.toArray(new String[fieldNames.size()]), new StandardAnalyzer(Version.LUCENE_4_10_2)); // parser.setDefaultOperator(QueryParser.AND_OPERATOR); // overrides the default OR_OPERATOR, so that all words in the search are // required try { return new SearchableHibernateGridDataSource(session, entityType, session.createFullTextQuery( parser.parse(searchString), entityType), propertySearchFilterMap); } catch (ParseException e) { throw new RuntimeException(e); } } }