package ch.x42.terye; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.query.InvalidQueryException; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import org.junit.Before; import org.junit.Test; import ch.x42.terye.utils.DateUtils; public class QueryTest extends BaseTest { private QueryManager qm; private Node post1; private Node post2; private Node post3; @Override @Before public void setUp() throws Exception { super.setUp(); qm = session.getWorkspace().getQueryManager(); // add some items using the API (so that they are indexed) post1 = root.addNode("post1"); post1.setProperty("content", "This is a blog post"); post1.setProperty("published", true); post1.setProperty("comments", 10); Calendar cal1 = new GregorianCalendar(2012, Calendar.OCTOBER, 11); post1.setProperty("date", cal1); post1.setProperty("rating", 4.5); post2 = root.addNode("post2"); post2.setProperty("content", "The quick brown fox jumps over the lazy dog"); post2.setProperty("published", true); post2.setProperty("comments", 3); Calendar cal2 = new GregorianCalendar(2012, Calendar.OCTOBER, 15); post2.setProperty("date", cal2); post2.setProperty("rating", 3.9); post3 = root.addNode("post3"); post3.setProperty("content", "A draft for another blog post"); post3.setProperty("published", false); post3.setProperty("comments", 0); Calendar cal3 = new GregorianCalendar(2012, Calendar.OCTOBER, 19); post3.setProperty("date", cal3); post3.setProperty("rating", 0.0); post3.setProperty("description", "hot dog"); session.save(); } @Test public void testStringQuery() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("content:dog"); assertEquals(1, iterator.getSize()); assertNodesEqual(post2, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testStringQuery2() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("content:(blog post)"); assertEquals(2, iterator.getSize()); assertNodesEqual(post1, iterator.nextNode()); assertNodesEqual(post3, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testStringQuery3() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("content:\"a blog\""); assertEquals(1, iterator.getSize()); assertNodesEqual(post1, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testStringQuery4() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("content:*row*"); assertEquals(1, iterator.getSize()); assertNodesEqual(post2, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testLongQuery() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("comments:10"); assertEquals(1, iterator.getSize()); assertNodesEqual(post1, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testDoubleQuery() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("rating:3.9"); assertEquals(1, iterator.getSize()); assertNodesEqual(post2, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testBooleanQuery() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("published:false"); assertEquals(1, iterator.getSize()); assertNodesEqual(post3, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testBooleanQuery2() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("published:True"); assertEquals(2, iterator.getSize()); assertNodesEqual(post1, iterator.nextNode()); assertNodesEqual(post2, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testDateQuery() throws InvalidQueryException, RepositoryException { Calendar cal = new GregorianCalendar(2012, Calendar.OCTOBER, 11); DateFormat format = new SimpleDateFormat(DateUtils.FORMAT); // Solr stores dates in UTC format.setTimeZone(TimeZone.getTimeZone("UTC")); String dateStr = format.format(cal.getTime()); NodeIterator iterator = executeQuery("date:\"" + dateStr + "\""); assertEquals(1, iterator.getSize()); assertNodesEqual(post1, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testAny() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("any:dog"); assertEquals(2, iterator.getSize()); assertNodesEqual(post2, iterator.nextNode()); assertNodesEqual(post3, iterator.nextNode()); assertFalse(iterator.hasNext()); } @Test public void testNegated() throws InvalidQueryException, RepositoryException { NodeIterator iterator = executeQuery("-content:post"); assertEquals(1, iterator.getSize()); assertNodesEqual(post2, iterator.nextNode()); assertFalse(iterator.hasNext()); } private NodeIterator executeQuery(String statement) throws InvalidQueryException, RepositoryException { Query query = qm.createQuery(statement, null); return query.execute().getNodes(); } private void assertNodesEqual(Node expected, Node actual) throws RepositoryException { assertEquals(expected.getPath(), actual.getPath()); assertEquals(expected.getName(), actual.getName()); } }