package marubinotto.h2.fulltext.function;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Set;
import java.util.TreeSet;
import marubinotto.h2.fulltext.FullTextSearch;
import marubinotto.h2.fulltext.TestWithDataSource;
import org.apache.commons.lang.ArrayUtils;
import org.junit.Before;
import org.junit.Test;
public class SearchDataTest extends TestWithDataSource {
@Before
public void given() throws Exception {
super.given();
FullTextSearch.init(this.dataSource.getConnection());
createTestTable();
FullTextSearch.createIndex(getConnection(), "PUBLIC", "TEST", "COLUMN1,COLUMN2");
}
@Test
public void empty() throws Exception {
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "knowledge", 0, 0);
assertFalse(rs.next());
}
@Test
public void zeroOutOfOne() throws Exception {
insertTestRow(1, "knowledge", null);
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "fragment", 0, 0);
assertFalse(rs.next());
}
@Test
public void oneOutOfOne() throws Exception {
insertTestRow(1, "knowledge", null);
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "knowledge", 0, 0);
assertResultSetHasOneResult(rs, 1);
}
@Test
public void japanese() throws Exception {
insertTestRow(1, "Piggydbは新感覚の情報管理ツールです。", null);
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "情報", 0, 0);
assertResultSetHasOneResult(rs, 1);
}
@Test
public void multipleWords() throws Exception {
insertTestRow(1, "knowledge", null);
insertTestRow(2, "knowledge fragment", null);
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "fragment knowledge", 0, 0);
assertResultSetHasOneResult(rs, 2);
}
@Test
public void twoOutOfTwo() throws Exception {
insertTestRow(1, "knowledge", null);
insertTestRow(2, "knowledge fragment", null);
ResultSet rs = FullTextSearch.searchData(getJdbcConnection(), "knowledge", 0, 0);
Set<String> keyValues = new TreeSet<String>();
assertTrue(rs.next());
keyValues.add(ArrayUtils.toString(rs.getArray("KEYS").getArray()));
assertTrue(rs.next());
keyValues.add(ArrayUtils.toString(rs.getArray("KEYS").getArray()));
assertFalse(rs.next());
assertEquals("[{1}, {2}]", keyValues.toString());
}
// Internals
private void assertResultSetHasOneResult(ResultSet rs, int id) throws SQLException {
assertTrue(rs.next());
assertEquals("PUBLIC", rs.getString("SCHEMA"));
assertEquals("TEST", rs.getString("TABLE"));
assertEquals("{ID}", ArrayUtils.toString(rs.getArray("COLUMNS").getArray()));
assertEquals("{" + id + "}", ArrayUtils.toString(rs.getArray("KEYS").getArray()));
assertFalse(rs.next());
}
}