package kr.debop4j.search.hibernate.field;
import kr.debop4j.search.hibernate.model.Employee;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Version;
import org.hibernate.ScrollableResults;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;
/**
* ProjectionQueryTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 4. 25. 오후 2:51
*/
public class ProjectionQueryTest extends LuceneTestBase {
@Test
public void testLuceneObjectsProjectionWithScroll() throws Exception {
buildIndex(fts);
Transaction tx = fts.beginTransaction();
QueryParser parser = new QueryParser(Version.LUCENE_36, "dept", new StandardAnalyzer(Version.LUCENE_36));
Query query = parser.parse("dept:ITech");
FullTextQuery ftq = fts.createFullTextQuery(query, Employee.class);
ftq.setProjection("id", "lastname", "dept",
FullTextQuery.THIS,
FullTextQuery.SCORE,
FullTextQuery.DOCUMENT,
FullTextQuery.ID);
ScrollableResults projections = ftq.scroll();
projections.beforeFirst();
projections.next();
Object[] projection = projections.get();
assertThat(projection[0]).isEqualTo(1000);
assertThat(projection[1]).isEqualTo("Griffin");
assertThat(projection[2]).isEqualTo("ITech");
assertThat(projection[3].hashCode()).isEqualTo(fts.get(Employee.class, 1000).hashCode());
assertThat(projection[4]).isEqualTo(1.0F);
assertThat(projection[5]).isInstanceOf(Document.class);
assertThat(projection[6]).isEqualTo(1000);
assertThat(projections.isFirst()).isTrue();
assertThat(((Employee) projection[3]).getId()).isEqualTo(1000);
for (Object element : fts.createQuery("from " + Employee.class.getName()).list())
fts.delete(element);
tx.commit();
}
private void buildIndex(FullTextSession fts) {
Transaction tx = fts.beginTransaction();
Employee e1 = new Employee(1000, "Griffin", "ITech");
fts.save(e1);
Employee e2 = new Employee(1001, "Jackson", "Accounting");
fts.save(e2);
tx.commit();
fts.clear();
}
}