package kr.debop4j.search.hibernate;
import kr.debop4j.search.QueryMethod;
import kr.debop4j.search.SearchParameter;
import kr.debop4j.search.hibernate.model.SearchItem;
import kr.debop4j.search.tools.SearchTool;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.search.Query;
import org.junit.Test;
import java.util.List;
import static org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.search.hibernate.HibernateSearchTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 2. 28.
*/
@Slf4j
public class HibernateSearchTest extends SearchTestBase {
private static final String str = "ASP.NET 웹 어플리케이션은 어플리케이션 Lifecycle, Page의 Lifecycle 에 상세한 event 를 정의하고 있어, event handler를 정의하면, 여러가지 선처리나 후처리를 수행할 수 있습니다.\n" +
"Spring MVC 에서는 어떻게 하나 봤더니 Controller 에 Interceptor 를 등록하면 되더군요.\n" +
"단계를 요약하자면...\n" +
"org.springframework.web.servlet.HandlerInterceptor 또는 org.springframework.web.servlet.handler.HandlerInterceptorAdapter 를 상속받아 preHandler, postHandler, afterComletion 등에 원하는 작업을 구현합니다.\n" +
"servlet.xml 에 위에서 작성한 Interceptor 를 등록합니다.\n" +
"아주 쉽죠?\n" +
"그럼 실제 예제와 함께 보시죠. 예제는 Spring Framework 3.2.1.RELEASE 와 Hibernate 4.1.9 Final 로 제작했습니다.\n" +
"UnitOfWorkInterceptor 는 사용자 요청이 있으면 Start 하고, 요청 작업이 완료되면 Close 하도록 합니다. 이는 Hibernate 를 이용하여 Unit Of Work 패턴을 구현하여, 하나의 요청 중에 모든 작업을 하나의 Transaction으로 묶을 수 있고, 웹 개발자에게는 Unit Of Work 자체를 사용하기만 하면 되고, 실제 Lifecycle 은 Spring MVC 에서 관리하도록 하기 위해서입니다.";
@Test
@SuppressWarnings("unchecked")
public void firstSearch() throws Exception {
fts.purgeAll(SearchItem.class);
for (int i = 0; i < 100; i++) {
SearchItem item = new SearchItem();
item.setTitle("Spring MVC 전후 처리기 작성하기" + i);
item.setDescription(str);
item.setEan("USD");
item.setImageURL("http://debop.blogspot.com/id=" + i);
fts.save(item);
}
fts.flush();
fts.flushToIndexes();
fts.clear();
try {
// Query luceneQuery = parser.parse("description:어플");
// Query luceneQuery = new WildcardQuery(new Term("description", "어플*"));
SearchParameter searchParam = new SearchParameter("description", "app", QueryMethod.Wildcard);
Query luceneQuery = SearchTool.buildLuceneQuery(SearchItem.class, fts, searchParam).all().createQuery();
List<SearchItem> founds =
(List<SearchItem>) fts.createFullTextQuery(luceneQuery, SearchItem.class).list();
assertThat(founds).isNotNull();
assertThat(founds.size()).isGreaterThan(0);
for (SearchItem loaded : founds)
System.out.printf("Id=%d; Title: %s\n", loaded.getId(), loaded.getTitle());
} catch (Exception e) {
log.error("예외가 발생했습니다.", e);
}
for (Object element : fts.createQuery("from " + SearchItem.class.getName()).list()) {
fts.delete(element);
}
}
}