/*
* Copyright 2011-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package kr.debop4j.data.mongodb.dao;
import kr.debop4j.core.Action1;
import kr.debop4j.data.mongodb.MongoGridDatastoreTestBase;
import kr.debop4j.data.mongodb.model.Voc;
import kr.debop4j.data.ogm.dao.IHibernateOgmDao;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.search.Query;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static org.fest.assertions.Assertions.assertThat;
/**
* 대량의 Voc 데이터에 대해 검색 수행 테스트
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 4. 29. 오후 9:39
*/
@Slf4j
public class VocSearchTest extends MongoGridDatastoreTestBase {
private static final Random rnd = new Random();
private static final int REPEAT_COUNT = 100;
private static final int VOC_COUNT = 100;
@Autowired
MongoOgmDao dao;
public Voc createVoc() {
Voc voc = new Voc("배성혁-" + rnd.nextInt());
voc.addAttr("담당", "송길주");
voc.addAttr("상태", "처리중");
return voc;
}
public List<Voc> createVocs(int count) {
List<Voc> vocs = new ArrayList<Voc>(count);
for (int i = 0; i < count; i++) {
Voc voc = new Voc("이름-" + i);
voc.addAttr("담당", "송길주");
voc.addAttr("상태", "처리중");
vocs.add(voc);
}
return vocs;
}
@Test
public void crud() throws Exception {
Voc voc = new Voc("배성혁");
voc.addAttr("담당", "송길주");
voc.addAttr("상태", "처리중");
dao.saveOrUpdate(voc);
dao.getSession().flush();
dao.getSession().clear();
Voc loaded = dao.get(Voc.class, voc.getId());
assertThat(loaded).isNotNull();
assertThat(loaded.getSrtype()).isEqualTo(voc.getSrtype());
dao.delete(loaded);
dao.getSession().flush();
dao.getSession().clear();
loaded = dao.get(Voc.class, voc.getId());
assertThat(loaded).isNull();
}
@Test
public void searchQueryTest() throws Exception {
daoInSerial(new Action1<IHibernateOgmDao>() {
@Override
public void perform(IHibernateOgmDao dao) {
// findAll
List<Voc> loadedVocs = dao.find(Voc.class);
assertThat(loadedVocs).isNotNull();
assertThat(loadedVocs.size()).isGreaterThan(0);
log.debug("findAll seach result = [{}]", loadedVocs.size());
QueryBuilder builder = dao.getQueryBuilder(Voc.class);
Query query =
builder.bool()
.must(builder.keyword().onField("attrs.name").matching("담당").createQuery())
.must(builder.keyword().onField("attrs.value").matching("송길주").createQuery())
.must(builder.keyword().wildcard().onField("memo").matching("백두*").createQuery())
.createQuery();
loadedVocs = (List<Voc>) dao.find(Voc.class, query);
assertThat(loadedVocs).isNotNull();
assertThat(loadedVocs.size()).isGreaterThan(0);
builder = dao.getQueryBuilder(Voc.class);
query =
builder.bool()
.must(builder.keyword().onField("attrs.name").matching("담당").createQuery())
.must(builder.keyword().onField("attrs.value").matching("송길").createQuery())
.must(builder.keyword().wildcard().onField("memo").matching("나눔*").createQuery())
.createQuery();
loadedVocs = (List<Voc>) dao.find(Voc.class, query);
assertThat(loadedVocs).isNotNull();
assertThat(loadedVocs.size()).isEqualTo(0);
}
});
}
public void daoInSerial(Action1<IHibernateOgmDao> action) throws Exception {
for (int i = 0; i < REPEAT_COUNT; i++) {
List<Voc> vocs = createVocs(VOC_COUNT);
for (Voc voc : vocs) {
dao.persist(voc);
}
dao.getSession().flush();
Thread.sleep(10);
dao.flushToIndexes();
Thread.sleep(10);
dao.getSession().clear();
}
log.debug("Voc [{}]개를 추가했습니다.", REPEAT_COUNT * VOC_COUNT);
try {
action.perform(dao);
} finally {
log.debug("Voc 엔티티를 삭제합니다...");
List<Voc> vocs = dao.find(Voc.class);
assertThat(vocs.size()).isGreaterThan(0);
dao.deleteAll(vocs);
dao.getFullTextSession().flush();
dao.flushToIndexes();
dao.getFullTextSession().close();
}
assertThat(dao.count(Voc.class)).isEqualTo(0);
}
}