package org.infinispan.test.integration.as.wildfly.controller; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.ejb.Stateful; import javax.enterprise.inject.Model; import javax.enterprise.inject.Produces; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.Query; import org.hibernate.search.MassIndexer; import org.hibernate.search.SearchFactory; import org.hibernate.search.annotations.Spatial; import org.hibernate.search.jpa.FullTextQuery; import org.hibernate.search.jpa.Search; import org.hibernate.search.query.dsl.Unit; import org.infinispan.test.integration.as.wildfly.model.Member; @Stateful @Model public class MemberRegistration { @PersistenceContext private EntityManager em; private Member newMember; @Produces @Named public Member getNewMember() { return newMember; } public void register() throws Exception { register(newMember); } public void register(Member member) throws Exception { em.persist(member); initNewMember(); } @SuppressWarnings("unchecked") public List<Member> search(String name) { Query luceneQuery = Search.getFullTextEntityManager(em).getSearchFactory().buildQueryBuilder() .forEntity(Member.class).get().keyword().onField("name").matching(name).createQuery(); return Search.getFullTextEntityManager(em).createFullTextQuery(luceneQuery).getResultList(); } @SuppressWarnings("unchecked") public List<Member> spatialSearch(double latitude, double longitude, double distanceinKM) { Query spatialQuery = Search.getFullTextEntityManager(em).getSearchFactory() .buildQueryBuilder().forEntity( Member.class ).get().spatial() .within( distanceinKM, Unit.KM ) .ofLatitude( latitude ) .andLongitude( longitude ) .createQuery(); return Search.getFullTextEntityManager(em).createFullTextQuery(spatialQuery, Member.class).getResultList(); } @SuppressWarnings("unchecked") public List<Object[]> spatialSearchWithDistance(double latitude, double longitude, double distanceinKM) { Query spatialQuery = Search.getFullTextEntityManager(em).getSearchFactory() .buildQueryBuilder().forEntity(Member.class).get().spatial() .within(distanceinKM, Unit.KM) .ofLatitude(latitude) .andLongitude(longitude) .createQuery(); FullTextQuery hibQuery = Search.getFullTextEntityManager(em).createFullTextQuery(spatialQuery, Member.class); hibQuery.setProjection(FullTextQuery.SPATIAL_DISTANCE, FullTextQuery.THIS); hibQuery.setSpatialParameters(latitude, longitude, Spatial.COORDINATES_DEFAULT_FIELD); return hibQuery.getResultList(); } public List<Document> indexSearch(String name) throws IOException { ArrayList<Document> result = new ArrayList<Document>(); SearchFactory searchFactory = Search.getFullTextEntityManager(em).getSearchFactory(); IndexReader reader = searchFactory.getIndexReaderAccessor().open(Member.class); try { for (int i = 0; i < reader.maxDoc(); i++) { Document member = reader.document(i); if (member != null && member.get("name").contains(name)) { result.add(member); } } } finally { searchFactory.getIndexReaderAccessor().close(reader); } return result; } public int indexSize() { SearchFactory searchFactory = Search.getFullTextEntityManager(em).getSearchFactory(); IndexReader reader = searchFactory.getIndexReaderAccessor().open(Member.class); try { return reader.maxDoc(); } finally { searchFactory.getIndexReaderAccessor().close(reader); } } @SuppressWarnings("unchecked") public List<Member> luceneSearch(String name) throws ParseException { QueryParser parser = new QueryParser("name", new StandardAnalyzer()); org.apache.lucene.search.Query luceneQuery = parser.parse(name); return Search.getFullTextEntityManager(em).createFullTextQuery(luceneQuery).getResultList(); } public void purgeMemberIndex() { Search.getFullTextEntityManager(em).purgeAll(Member.class); } public void indexMembers() throws InterruptedException { MassIndexer mi = Search.getFullTextEntityManager(em).createIndexer(Member.class); mi.startAndWait(); } @PostConstruct public void initNewMember() { newMember = new Member(); } }