package test; import java.util.*; import pt.ist.fenixframework.Atomic; import pt.ist.fenixframework.DomainRoot; import pt.ist.fenixframework.FenixFramework; import pt.ist.fenixframework.hibernatesearch.HibernateSearchSupport; import org.apache.lucene.search.Query; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.query.engine.spi.EntityInfo; import org.hibernate.search.query.engine.spi.HSQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MainApp { private static final Logger logger = LoggerFactory.getLogger(MainApp.class); public static final int AUTH_COUNT = 1000; public static final int PUB_COUNT = 50; public static final int BOOK_COUNT = 1000; public static void main(String[] args) { try { initDomain(); doQueries(); modifyDomain(); doMoreQueries(); } finally { FenixFramework.shutdown(); } } @Atomic public static void initDomain() { logger.info("Populate domain"); DomainRoot domainRoot = FenixFramework.getDomainRoot(); // Authors logger.debug("Populate " + AUTH_COUNT + " authors"); for (int i = 0; i < AUTH_COUNT; i++) { domainRoot.addTheAuthors(new Author("Auth" + i)); } // Publishers logger.debug("Populate " + PUB_COUNT + " publishers"); for (int i = 0; i < PUB_COUNT; i++) { domainRoot.addThePublishers(new Publisher("Pub" + i)); } // Books logger.debug("Populate " + BOOK_COUNT + " books"); for (int i = 0; i < BOOK_COUNT; i++) { Book book = null; switch (i%3) { case 0: book = new Book("Book" + i); break; case 1: book = new ComicBook("Book" + i); break; case 2: book = new ScifiBook("Book" + i); break; } domainRoot.addTheBooks(book); } logger.info("Populate domain finished"); } @Atomic public static void doQueries() { logger.debug("Doing example queries. Configured " + AUTH_COUNT + " authors, " + PUB_COUNT + " publishers, and " + BOOK_COUNT + " books"); logger.debug("Find Book300: " + performQuery(Book.class, "bookName", "book300")); logger.debug("Find Book3*3: " + performWildcardQuery(Book.class, "bookName", "book3*3")); logger.debug("Find ScifiBook3*3: " + performWildcardQuery(ScifiBook.class, "bookName", "book3*3")); logger.debug("Find Scifi Books by Auth0: " + performQuery(ScifiBook.class, "authors.id", getAuthorByName("Auth0").getExternalId())); } @Atomic public static void modifyDomain() { logger.debug("Adding books to Auth0"); Author auth0 = getAuthorByName("Auth0"); for (int i = 0; i < 20; i++) { auth0.addBooks(getBookByName("Book" + i)); } } @Atomic public static void doMoreQueries() { logger.debug("Find Scifi Books by Auth0: " + performQuery(ScifiBook.class, "authors.id", getAuthorByName("Auth0").getExternalId())); } // See // https://docs.jboss.org/hibernate/search/4.2/reference/en-US/html_single/#section-building-lucene-queries // for more examples on how to build queries @SuppressWarnings("unchecked") public static <T> Collection<T> performQuery(Class<T> cls, String field, String queryString) { ArrayList<T> matchingObjects = new ArrayList<T>(); QueryBuilder qb = HibernateSearchSupport.getSearchFactory().buildQueryBuilder().forEntity(cls).get(); Query query = qb.keyword().onField(field).matching(queryString).createQuery(); HSQuery hsQuery = HibernateSearchSupport.getSearchFactory().createHSQuery().luceneQuery(query) .targetedEntities(Arrays.<Class<?>>asList(cls)); hsQuery.getTimeoutManager().start(); for (EntityInfo ei : hsQuery.queryEntityInfos()) { matchingObjects.add((T) FenixFramework.getDomainObject((String) ei.getId())); } hsQuery.getTimeoutManager().stop(); return matchingObjects; } @SuppressWarnings("unchecked") public static <T> Collection<T> performWildcardQuery(Class<T> cls, String field, String queryString) { ArrayList<T> matchingObjects = new ArrayList<T>(); QueryBuilder qb = HibernateSearchSupport.getSearchFactory().buildQueryBuilder().forEntity(cls).get(); Query query = qb.keyword().wildcard().onField(field).matching(queryString).createQuery(); HSQuery hsQuery = HibernateSearchSupport.getSearchFactory().createHSQuery().luceneQuery(query) .targetedEntities(Arrays.<Class<?>>asList(cls)); hsQuery.getTimeoutManager().start(); for (EntityInfo ei : hsQuery.queryEntityInfos()) { matchingObjects.add((T) FenixFramework.getDomainObject((String) ei.getId())); } hsQuery.getTimeoutManager().stop(); return matchingObjects; } @Atomic public static Author getAuthorByName(String authorName) { DomainRoot domainRoot = FenixFramework.getDomainRoot(); for (Author author : domainRoot.getTheAuthors()) { if (author.getName().equals(authorName)) { return author; } } return null; } @Atomic public static Book getBookByName(String bookName) { DomainRoot domainRoot = FenixFramework.getDomainRoot(); for (Book book : domainRoot.getTheBooks()) { if (book.getBookName().equals(bookName)) { return book; } } return null; } }