package org.infinispan.query.dsl.embedded; import static org.infinispan.query.dsl.Expression.avg; import static org.infinispan.query.dsl.Expression.count; import static org.infinispan.query.dsl.Expression.max; import static org.infinispan.query.dsl.Expression.min; import static org.infinispan.query.dsl.Expression.param; import static org.infinispan.query.dsl.Expression.property; import static org.infinispan.query.dsl.Expression.sum; import static org.testng.Assert.assertNotEquals; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.hibernate.search.spi.SearchIntegrator; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.objectfilter.ParsingException; import org.infinispan.query.Search; import org.infinispan.query.dsl.FilterConditionEndContext; import org.infinispan.query.dsl.Query; import org.infinispan.query.dsl.QueryBuilder; import org.infinispan.query.dsl.QueryFactory; import org.infinispan.query.dsl.SortOrder; import org.infinispan.query.dsl.embedded.impl.EmbeddedQueryFactory; import org.infinispan.query.dsl.embedded.testdomain.Account; import org.infinispan.query.dsl.embedded.testdomain.Address; import org.infinispan.query.dsl.embedded.testdomain.NotIndexed; import org.infinispan.query.dsl.embedded.testdomain.Transaction; import org.infinispan.query.dsl.embedded.testdomain.User; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.transaction.TransactionMode; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Test for query conditions (filtering). Exercises the whole query DSL on the sample domain model. Uses indexing, * although some fields are not indexed in order to test hybrid queries too. * * @author anistor@redhat.com * @author rvansa@redhat.com * @author jmarkos@redhat.com * @since 6.0 */ @Test(groups = {"functional", "smoke"}, testName = "query.dsl.embedded.QueryDslConditionsTest") public class QueryDslConditionsTest extends AbstractQueryDslTest { @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder cfg = TestCacheManagerFactory.getDefaultCacheConfiguration(true); cfg.transaction() .transactionMode(TransactionMode.TRANSACTIONAL) .indexing().index(Index.ALL) .addIndexedEntity(getModelFactory().getUserImplClass()) .addIndexedEntity(getModelFactory().getAccountImplClass()) .addIndexedEntity(getModelFactory().getTransactionImplClass()) .addProperty("default.directory_provider", "ram") .addProperty("lucene_version", "LUCENE_CURRENT"); createClusteredCaches(1, cfg); } protected boolean testNullCollections() { return true; } @BeforeClass(alwaysRun = true) protected void populateCache() throws Exception { // create the test objects User user1 = getModelFactory().makeUser(); user1.setId(1); user1.setName("John"); user1.setSurname("Doe"); user1.setGender(User.Gender.MALE); user1.setAge(22); user1.setAccountIds(new HashSet<>(Arrays.asList(1, 2))); user1.setNotes("Lorem ipsum dolor sit amet"); Address address1 = getModelFactory().makeAddress(); address1.setStreet("Main Street"); address1.setPostCode("X1234"); address1.setNumber(156); user1.setAddresses(Collections.singletonList(address1)); User user2 = getModelFactory().makeUser(); user2.setId(2); user2.setName("Spider"); user2.setSurname("Man"); user2.setGender(User.Gender.MALE); user2.setAccountIds(Collections.singleton(3)); Address address2 = getModelFactory().makeAddress(); address2.setStreet("Old Street"); address2.setPostCode("Y12"); address2.setNumber(-12); Address address3 = getModelFactory().makeAddress(); address3.setStreet("Bond Street"); address3.setPostCode("ZZ"); address3.setNumber(312); user2.setAddresses(Arrays.asList(address2, address3)); User user3 = getModelFactory().makeUser(); user3.setId(3); user3.setName("Spider"); user3.setSurname("Woman"); user3.setGender(User.Gender.FEMALE); user3.setAccountIds(Collections.emptySet()); if(!testNullCollections()) { user3.setAddresses(new ArrayList<>()); } Account account1 = getModelFactory().makeAccount(); account1.setId(1); account1.setDescription("John Doe's first bank account"); account1.setCreationDate(makeDate("2013-01-03")); Account account2 = getModelFactory().makeAccount(); account2.setId(2); account2.setDescription("John Doe's second bank account"); account2.setCreationDate(makeDate("2013-01-04")); Account account3 = getModelFactory().makeAccount(); account3.setId(3); account3.setCreationDate(makeDate("2013-01-20")); Transaction transaction0 = getModelFactory().makeTransaction(); transaction0.setId(0); transaction0.setDescription("Birthday present"); transaction0.setAccountId(1); transaction0.setAmount(1800); transaction0.setDate(makeDate("2012-09-07")); transaction0.setDebit(false); transaction0.setValid(true); Transaction transaction1 = getModelFactory().makeTransaction(); transaction1.setId(1); transaction1.setDescription("Feb. rent payment"); transaction1.setLongDescription("Feb. rent payment"); transaction1.setAccountId(1); transaction1.setAmount(1500); transaction1.setDate(makeDate("2013-01-05")); transaction1.setDebit(true); transaction1.setValid(true); Transaction transaction2 = getModelFactory().makeTransaction(); transaction2.setId(2); transaction2.setDescription("Starbucks"); transaction2.setLongDescription("Starbucks"); transaction2.setAccountId(1); transaction2.setAmount(23); transaction2.setDate(makeDate("2013-01-09")); transaction2.setDebit(true); transaction2.setValid(true); Transaction transaction3 = getModelFactory().makeTransaction(); transaction3.setId(3); transaction3.setDescription("Hotel"); transaction3.setAccountId(2); transaction3.setAmount(45); transaction3.setDate(makeDate("2013-02-27")); transaction3.setDebit(true); transaction3.setValid(true); Transaction transaction4 = getModelFactory().makeTransaction(); transaction4.setId(4); transaction4.setDescription("Last january"); transaction4.setLongDescription("Last january"); transaction4.setAccountId(2); transaction4.setAmount(95); transaction4.setDate(makeDate("2013-01-31")); transaction4.setDebit(true); transaction4.setValid(true); Transaction transaction5 = getModelFactory().makeTransaction(); transaction5.setId(5); transaction5.setDescription("-Popcorn"); transaction5.setLongDescription("-Popcorn"); transaction5.setAccountId(2); transaction5.setAmount(5); transaction5.setDate(makeDate("2013-01-01")); transaction5.setDebit(true); transaction5.setValid(true); // persist and index the test objects // we put all of them in the same cache for the sake of simplicity getCacheForWrite().put("user_" + user1.getId(), user1); getCacheForWrite().put("user_" + user2.getId(), user2); getCacheForWrite().put("user_" + user3.getId(), user3); getCacheForWrite().put("account_" + account1.getId(), account1); getCacheForWrite().put("account_" + account2.getId(), account2); getCacheForWrite().put("account_" + account3.getId(), account3); getCacheForWrite().put("transaction_" + transaction0.getId(), transaction0); getCacheForWrite().put("transaction_" + transaction1.getId(), transaction1); getCacheForWrite().put("transaction_" + transaction2.getId(), transaction2); getCacheForWrite().put("transaction_" + transaction3.getId(), transaction3); getCacheForWrite().put("transaction_" + transaction4.getId(), transaction4); getCacheForWrite().put("transaction_" + transaction5.getId(), transaction5); for (int i = 0; i < 50; i++) { Transaction transaction = getModelFactory().makeTransaction(); transaction.setId(50 + i); transaction.setDescription("Expensive shoes " + i); transaction.setLongDescription("Expensive shoes " + i); transaction.setAccountId(2); transaction.setAmount(100 + i); transaction.setDate(makeDate("2013-08-20")); transaction.setDebit(true); transaction.setValid(true); getCacheForWrite().put("transaction_" + transaction.getId(), transaction); } // this value should be ignored gracefully for indexing and querying because primitives are not currently supported getCacheForWrite().put("dummy", "a primitive value cannot be queried"); getCacheForWrite().put("notIndexed1", new NotIndexed("testing 123")); getCacheForWrite().put("notIndexed2", new NotIndexed("xyz")); } public void testIndexPresence() { SearchIntegrator searchIntegrator = Search.getSearchManager((Cache) getCacheForQuery()).unwrap(SearchIntegrator.class); assertTrue(searchIntegrator.getIndexedTypes().contains(getModelFactory().getUserImplClass())); assertNotNull(searchIntegrator.getIndexManager(getModelFactory().getUserImplClass().getName())); assertTrue(searchIntegrator.getIndexedTypes().contains(getModelFactory().getAccountImplClass())); assertNotNull(searchIntegrator.getIndexManager(getModelFactory().getAccountImplClass().getName())); assertTrue(searchIntegrator.getIndexedTypes().contains(getModelFactory().getTransactionImplClass())); assertNotNull(searchIntegrator.getIndexManager(getModelFactory().getTransactionImplClass().getName())); assertFalse(searchIntegrator.getIndexedTypes().contains(getModelFactory().getAddressImplClass())); assertNull(searchIntegrator.getIndexManager(getModelFactory().getAddressImplClass().getName())); } public void testQueryFactoryType() { assertEquals(EmbeddedQueryFactory.class, getQueryFactory().getClass()); } public void testEq1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Doe", list.get(0).getSurname()); } public void testEqEmptyString() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("") .build(); List<User> list = q.list(); assertTrue(list.isEmpty()); } public void testEqSentence() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .having("description").eq("John Doe's first bank account") .build(); List<Account> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testEq() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("Jacob") .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testEqNonIndexedType() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(NotIndexed.class) .having("notIndexedField").eq("testing 123") .build(); List<NotIndexed> list = q.list(); assertEquals(1, list.size()); assertEquals("testing 123", list.get(0).notIndexedField); } public void testEqNonIndexedField() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("notes").eq("Lorem ipsum dolor sit amet") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testEqHybridQuery() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("notes").eq("Lorem ipsum dolor sit amet") .and().having("surname").eq("Doe") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testEqHybridQueryWithParam() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("notes").eq("Lorem ipsum dolor sit amet") .and().having("surname").eq(param("surnameParam")) .build(); q.setParameter("surnameParam", "Doe"); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testEqHybridQueryWithPredicateOptimisation() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("notes").like("%ipsum%") .and(qf.having("name").eq("John").or().having("name").eq("Jane")) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Lorem ipsum dolor sit amet", list.get(0).getNotes()); } public void testEqInNested1() throws Exception { QueryFactory qf = getQueryFactory(); // all users in a given post code Query q = qf.from(getModelFactory().getUserImplClass()) .having("addresses.postCode").eq("X1234") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("X1234", list.get(0).getAddresses().get(0).getPostCode()); } public void testEqInNested2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("addresses.postCode").eq("Y12") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).getAddresses().size()); } public void testLike() throws Exception { QueryFactory qf = getQueryFactory(); // all rent payments made from a given account Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("description").like("%rent%") .build(); List<Transaction> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getAccountId()); assertEquals(1500, list.get(0).getAmount(), 0); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014802: 'from' must be an instance of java.lang.Comparable") public void testBetweenArgsAreComparable() throws Exception { QueryFactory qf = getQueryFactory(); qf.from(getModelFactory().getTransactionImplClass()) .having("date").between(new Object(), new Object()) .build(); } public void testBetween1() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013 Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("date").between(makeDate("2013-01-01"), makeDate("2013-01-31")) .build(); List<Transaction> list = q.list(); assertEquals(4, list.size()); for (Transaction t : list) { assertTrue(t.getDate().compareTo(makeDate("2013-01-31")) <= 0); assertTrue(t.getDate().compareTo(makeDate("2013-01-01")) >= 0); } } public void testBetween2() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013 Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("date").between(makeDate("2013-01-01"), makeDate("2013-01-31")).includeUpper(false) .build(); List<Transaction> list = q.list(); assertEquals(3, list.size()); for (Transaction t : list) { assertTrue(t.getDate().compareTo(makeDate("2013-01-31")) < 0); assertTrue(t.getDate().compareTo(makeDate("2013-01-01")) >= 0); } } public void testBetween3() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013 Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("date").between(makeDate("2013-01-01"), makeDate("2013-01-31")).includeLower(false) .build(); List<Transaction> list = q.list(); assertEquals(3, list.size()); for (Transaction t : list) { assertTrue(t.getDate().compareTo(makeDate("2013-01-31")) <= 0); assertTrue(t.getDate().compareTo(makeDate("2013-01-01")) > 0); } } public void testGt() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions greater than a given amount Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("amount").gt(1500) .build(); List<Transaction> list = q.list(); assertEquals(1, list.size()); assertTrue(list.get(0).getAmount() > 1500); } public void testGte() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("amount").gte(1500) .build(); List<Transaction> list = q.list(); assertEquals(2, list.size()); for (Transaction t : list) { assertTrue(t.getAmount() >= 1500); } } public void testLt() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("amount").lt(1500) .build(); List<Transaction> list = q.list(); assertEquals(54, list.size()); for (Transaction t : list) { assertTrue(t.getAmount() < 1500); } } public void testLte() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("amount").lte(1500) .build(); List<Transaction> list = q.list(); assertEquals(55, list.size()); for (Transaction t : list) { assertTrue(t.getAmount() <= 1500); } } // This tests against https://hibernate.atlassian.net/browse/HSEARCH-2030 public void testLteOnFieldWithNullToken() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013 Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("description").lte("-Popcorn") .build(); List<Transaction> list = q.list(); assertEquals(1, list.size()); assertEquals("-Popcorn", list.get(0).getDescription()); } public void testAnd1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("Spider") .and().having("surname").eq("Man") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).getId()); } public void testAnd2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("Spider") .and(qf.having("surname").eq("Man")) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).getId()); } public void testAnd3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(User.Gender.MALE) .and().having("gender").eq(User.Gender.FEMALE) .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testAnd4() throws Exception { QueryFactory qf = getQueryFactory(); //test for parenthesis, "and" should have higher priority Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("Spider") .or(qf.having("name").eq("John")) .and(qf.having("surname").eq("Man")) .build(); List<User> list = q.list(); assertEquals(2, list.size()); } public void testOr1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("surname").eq("Man") .or().having("surname").eq("Woman") .build(); List<User> list = q.list(); assertEquals(2, list.size()); for (User u : list) { assertEquals("Spider", u.getName()); } } public void testOr2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("surname").eq("Man") .or(qf.having("surname").eq("Woman")) .build(); List<User> list = q.list(); assertEquals(2, list.size()); for (User u : list) { assertEquals("Spider", u.getName()); } } public void testOr3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(User.Gender.MALE) .or().having("gender").eq(User.Gender.FEMALE) .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testOr4() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("surname", SortOrder.DESC) .having("gender").eq(User.Gender.MALE) .or().having("name").eq("Spider") .and().having("gender").eq(User.Gender.FEMALE) .or().having("surname").like("%oe%") .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals("Woman", list.get(0).getSurname()); assertEquals("Doe", list.get(1).getSurname()); } public void testOr5() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(User.Gender.MALE) .or().having("name").eq("Spider") .or().having("gender").eq(User.Gender.FEMALE) .and().having("surname").like("%oe%") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); } public void testNot1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("name").eq("Spider") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); } public void testNot2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().not().having("surname").eq("Doe") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); } public void testNot3() throws Exception { QueryFactory qf = getQueryFactory(); // NOT should have higher priority than AND Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("name").eq("John") .and().having("surname").eq("Man") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Spider", list.get(0).getName()); } public void testNot4() throws Exception { QueryFactory qf = getQueryFactory(); // NOT should have higher priority than AND Query q = qf.from(getModelFactory().getUserImplClass()) .having("surname").eq("Man") .and().not().having("name").eq("John") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Spider", list.get(0).getName()); } public void testNot5() throws Exception { QueryFactory qf = getQueryFactory(); // NOT should have higher priority than OR Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("name").eq("Spider") .or().having("surname").eq("Man") .build(); List<User> list = q.list(); assertEquals(2, list.size()); for (User u : list) { assertFalse("Woman".equals(u.getSurname())); } } public void testNot6() throws Exception { QueryFactory qf = getQueryFactory(); // QueryFactory.not() test Query q = qf.from(getModelFactory().getUserImplClass()) .not(qf.not(qf.having("gender").eq(User.Gender.FEMALE))) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Woman", list.get(0).getSurname()); } public void testNot7() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(User.Gender.FEMALE) .and().not(qf.having("name").eq("Spider")) .build(); List<User> list = q.list(); assertTrue(list.isEmpty()); } public void testNot8() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not( qf.having("name").eq("John") .or(qf.having("surname").eq("Man"))) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Spider", list.get(0).getName()); assertEquals("Woman", list.get(0).getSurname()); } public void testNot9() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not( qf.having("name").eq("John") .and(qf.having("surname").eq("Doe"))) .orderBy("id", SortOrder.ASC) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals("Spider", list.get(0).getName()); assertEquals("Man", list.get(0).getSurname()); assertEquals("Spider", list.get(1).getName()); assertEquals("Woman", list.get(1).getSurname()); } public void testNot10() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().not( qf.having("name").eq("John") .or(qf.having("surname").eq("Man"))) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertNotEquals("Woman", list.get(0).getSurname()); } public void testNot11() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not(qf.not( qf.having("name").eq("John") .or(qf.having("surname").eq("Man")))) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertNotEquals("Woman", list.get(0).getSurname()); } public void testEmptyQuery() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()).build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testTautology() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").gt("A").or().having("name").lte("A") .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testContradiction() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").gt("A").and().having("name").lte("A") .build(); List<User> list = q.list(); assertTrue(list.isEmpty()); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN028503:.*") public void testInvalidEmbeddedAttributeQuery() throws Exception { QueryFactory qf = getQueryFactory(); QueryBuilder queryBuilder = qf.from(getModelFactory().getUserImplClass()) .select("addresses"); Query q = queryBuilder.build(); q.list(); // exception expected } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN014027: The property path 'addresses.postCode' cannot be projected because it is multi-valued") public void testRejectProjectionOfRepeatedProperty() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("addresses.postCode") .build(); q.list(); } public void testIsNull1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("surname").isNull() .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testIsNull2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("surname").isNull() .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testIsNull3() throws Exception { if(testNullCollections()) { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("addresses").isNull() .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).getId()); } } public void testIsNullNumericWithProjection1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name", "surname", "age") .orderBy("name", SortOrder.ASC) .orderBy("surname", SortOrder.ASC) .orderBy("age", SortOrder.ASC) .having("age").isNull() .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals("Spider", list.get(0)[0]); assertEquals("Man", list.get(0)[1]); assertNull(list.get(0)[2]); assertEquals("Spider", list.get(1)[0]); assertEquals("Woman", list.get(1)[1]); assertNull(list.get(1)[2]); } public void testIsNullNumericWithProjection2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name", "age") .not().having("age").isNull() .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0)[0]); assertEquals(22, list.get(0)[1]); } public void testContains1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").contains(2) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testContains2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").contains(42) .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testContainsAll1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAll(1, 2) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testContainsAll2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAll(Collections.singleton(1)) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testContainsAll3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAll(1, 2, 3) .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testContainsAll4() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAll(Collections.emptySet()) .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testContainsAny1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .having("accountIds").containsAny(2, 3) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).getId()); assertEquals(2, list.get(1).getId()); } public void testContainsAny2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAny(4, 5) .build(); List<User> list = q.list(); assertEquals(0, list.size()); } public void testContainsAny3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAny(Collections.emptySet()) .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testIn1() throws Exception { QueryFactory qf = getQueryFactory(); List<Integer> ids = Arrays.asList(1, 3); Query q = qf.from(getModelFactory().getUserImplClass()) .having("id").in(ids) .build(); List<User> list = q.list(); assertEquals(2, list.size()); for (User u : list) { assertTrue(ids.contains(u.getId())); } } public void testIn2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("id").in(4) .build(); List<User> list = q.list(); assertEquals(0, list.size()); } @Test(expectedExceptions = IllegalArgumentException.class) public void testIn3() throws Exception { QueryFactory qf = getQueryFactory(); qf.from(getModelFactory().getUserImplClass()).having("id").in(Collections.emptySet()); } @Test(expectedExceptions = IllegalArgumentException.class) public void testIn4() throws Exception { QueryFactory qf = getQueryFactory(); Collection collection = null; qf.from(getModelFactory().getUserImplClass()).having("id").in(collection); } @Test(expectedExceptions = IllegalArgumentException.class) public void testIn5() throws Exception { QueryFactory qf = getQueryFactory(); Object[] array = null; qf.from(getModelFactory().getUserImplClass()).having("id").in(array); } @Test(expectedExceptions = IllegalArgumentException.class) public void testIn6() throws Exception { QueryFactory qf = getQueryFactory(); Object[] array = new Object[0]; qf.from(getModelFactory().getUserImplClass()).having("id").in(array); } public void testSampleDomainQuery1() throws Exception { QueryFactory qf = getQueryFactory(); // all male users Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.ASC) .having("gender").eq(User.Gender.MALE) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Spider", list.get(1).getName()); } public void testSampleDomainQuery2() throws Exception { QueryFactory qf = getQueryFactory(); // all male users, but this time retrieved in a twisted manner Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.ASC) .not(qf.having("gender").eq(User.Gender.FEMALE)) .and(qf.not().not(qf.having("gender").eq(User.Gender.MALE))) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Spider", list.get(1).getName()); } public void testStringLiteralEscape() throws Exception { QueryFactory qf = getQueryFactory(); // all transactions that have a given description. the description contains characters that need to be escaped. Query q = qf.from(getModelFactory().getAccountImplClass()) .having("description").eq("John Doe's first bank account") .build(); List<Account> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testSortByDate() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .orderBy("creationDate", SortOrder.DESC) .build(); List<Account> list = q.list(); assertEquals(3, list.size()); assertEquals(3, list.get(0).getId()); assertEquals(2, list.get(1).getId()); assertEquals(1, list.get(2).getId()); } public void testSampleDomainQuery3() throws Exception { QueryFactory qf = getQueryFactory(); // all male users Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.ASC) .having("gender").eq(User.Gender.MALE) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Spider", list.get(1).getName()); } public void testSampleDomainQuery4() throws Exception { QueryFactory qf = getQueryFactory(); // all users ordered descendingly by name Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.DESC) .build(); List<User> list = q.list(); assertEquals(3, list.size()); assertEquals("Spider", list.get(0).getName()); assertEquals("Spider", list.get(1).getName()); assertEquals("John", list.get(2).getName()); } public void testSampleDomainQuery4With2SortingOptions() throws Exception { QueryFactory qf = getQueryFactory(); // all users ordered descendingly by name Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.DESC) .orderBy("surname", SortOrder.ASC) .build(); List<User> list = q.list(); assertEquals(3, list.size()); assertEquals("Spider", list.get(0).getName()); assertEquals("Spider", list.get(1).getName()); assertEquals("John", list.get(2).getName()); assertEquals("Man", list.get(0).getSurname()); assertEquals("Woman", list.get(1).getSurname()); assertEquals("Doe", list.get(2).getSurname()); } public void testSampleDomainQuery5() throws Exception { QueryFactory qf = getQueryFactory(); // name projection of all users ordered descendingly by name Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("name", SortOrder.DESC) .select("name") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(1, list.get(0).length); assertEquals(1, list.get(1).length); assertEquals(1, list.get(2).length); assertEquals("Spider", list.get(0)[0]); assertEquals("Spider", list.get(1)[0]); assertEquals("John", list.get(2)[0]); } public void testSampleDomainQuery6() throws Exception { QueryFactory qf = getQueryFactory(); // all users with a given name and surname Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .and().having("surname").eq("Doe") .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Doe", list.get(0).getSurname()); } public void testSampleDomainQuery7() throws Exception { QueryFactory qf = getQueryFactory(); // all rent payments made from a given account Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("accountId").eq(1) .and().having("description").like("%rent%") .build(); List<Transaction> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); assertEquals(1, list.get(0).getAccountId()); assertTrue(list.get(0).getDescription().contains("rent")); } public void testSampleDomainQuery8() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013 Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("date").between(makeDate("2013-01-01"), makeDate("2013-01-31")) .build(); List<Transaction> list = q.list(); assertEquals(4, list.size()); for (Transaction t : list) { assertTrue(t.getDate().compareTo(makeDate("2013-01-31")) <= 0); assertTrue(t.getDate().compareTo(makeDate("2013-01-01")) >= 0); } } public void testSampleDomainQuery9() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that happened in January 2013, projected by date field only Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("date") .having("date").between(makeDate("2013-01-01"), makeDate("2013-01-31")) .build(); List<Object[]> list = q.list(); assertEquals(4, list.size()); assertEquals(1, list.get(0).length); assertEquals(1, list.get(1).length); assertEquals(1, list.get(2).length); assertEquals(1, list.get(3).length); for (int i = 0; i < 4; i++) { Date d = (Date) list.get(i)[0]; assertTrue(d.compareTo(makeDate("2013-01-31")) <= 0); assertTrue(d.compareTo(makeDate("2013-01-01")) >= 0); } } public void testSampleDomainQuery10() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions for a an account having amount greater than a given amount Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("accountId").eq(2) .and().having("amount").gt(40) .build(); List<Transaction> list = q.list(); assertEquals(52, list.size()); assertTrue(list.get(0).getAmount() > 40); assertTrue(list.get(1).getAmount() > 40); } public void testSampleDomainQuery11() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .and().having("addresses.postCode").eq("X1234") .and(qf.having("accountIds").eq(1)) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("Doe", list.get(0).getSurname()); } public void testSampleDomainQuery12() throws Exception { QueryFactory qf = getQueryFactory(); // all the transactions that represents credits to the account Query q = qf.from(getModelFactory().getTransactionImplClass()) .having("accountId").eq(1) .and() .not().having("isDebit").eq(true).build(); List<Transaction> list = q.list(); assertEquals(1, list.size()); assertFalse(list.get(0).isDebit()); } public void testSampleDomainQuery13() throws Exception { QueryFactory qf = getQueryFactory(); // the user that has the bank account with id 3 Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").contains(3).build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).getId()); assertTrue(list.get(0).getAccountIds().contains(3)); } public void testSampleDomainQuery14() throws Exception { QueryFactory qf = getQueryFactory(); // the user that has all the specified bank accounts Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAll(2, 1).build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); assertTrue(list.get(0).getAccountIds().contains(1)); assertTrue(list.get(0).getAccountIds().contains(2)); } public void testSampleDomainQuery15() throws Exception { QueryFactory qf = getQueryFactory(); // the user that has at least one of the specified accounts Query q = qf.from(getModelFactory().getUserImplClass()) .having("accountIds").containsAny(1, 3).build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(1, 2).contains(list.get(0).getId())); assertTrue(Arrays.asList(1, 2).contains(list.get(1).getId())); } public void testSampleDomainQuery16() throws Exception { QueryFactory qf = getQueryFactory(); // third batch of 10 transactions for a given account Query q = qf.from(getModelFactory().getTransactionImplClass()) .startOffset(20).maxResults(10) .orderBy("id", SortOrder.ASC) .having("accountId").eq(2).and().having("description").like("Expensive%") .build(); List<Transaction> list = q.list(); assertEquals(50, q.getResultSize()); assertEquals(10, list.size()); for (int i = 0; i < 10; i++) { assertEquals("Expensive shoes " + (20 + i), list.get(i).getDescription()); } } public void testSampleDomainQuery17() throws Exception { QueryFactory qf = getQueryFactory(); // all accounts for a user. first get the user by id and then get his account. Query q1 = qf.from(getModelFactory().getUserImplClass()) .having("id").eq(1).build(); List<User> users = q1.list(); Query q2 = qf.from(getModelFactory().getAccountImplClass()) .orderBy("description", SortOrder.ASC) .having("id").in(users.get(0).getAccountIds()).build(); List<Account> list = q2.list(); assertEquals(2, list.size()); assertEquals("John Doe's first bank account", list.get(0).getDescription()); assertEquals("John Doe's second bank account", list.get(1).getDescription()); } public void testSampleDomainQuery18() throws Exception { QueryFactory qf = getQueryFactory(); // all transactions of account with id 2 which have an amount larger than 1600 or their description contains the word 'rent' Query q = qf.from(getModelFactory().getTransactionImplClass()) .orderBy("description", SortOrder.ASC) .having("accountId").eq(1) .and(qf.having("amount").gt(1600) .or().having("description").like("%rent%")).build(); List<Transaction> list = q.list(); assertEquals(2, list.size()); assertEquals("Birthday present", list.get(0).getDescription()); assertEquals("Feb. rent payment", list.get(1).getDescription()); } public void testProjectionOnOptionalField() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("id", "age") .orderBy("id", SortOrder.ASC) .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(1, list.get(0)[0]); assertEquals(2, list.get(1)[0]); assertEquals(3, list.get(2)[0]); assertEquals(22, list.get(0)[1]); assertNull(list.get(1)[1]); assertNull(list.get(2)[1]); } public void testNullOnIntegerField() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("age").isNull() .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertNull(list.get(0).getAge()); assertNull(list.get(1).getAge()); } public void testIsNotNullOnIntegerField() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("age").isNull() .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals("John", list.get(0).getName()); assertEquals("Doe", list.get(0).getSurname()); assertNotNull(list.get(0).getAge()); } public void testSampleDomainQuery19() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("addresses.postCode").in("ZZ", "X1234").build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(1, 2).contains(list.get(0).getId())); assertTrue(Arrays.asList(1, 2).contains(list.get(1).getId())); } public void testSampleDomainQuery20() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("addresses.postCode").in("X1234").build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(2, 3).contains(list.get(0).getId())); assertTrue(Arrays.asList(2, 3).contains(list.get(1).getId())); } public void testSampleDomainQuery21() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("addresses").isNull().build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(1, 2).contains(list.get(0).getId())); assertTrue(Arrays.asList(1, 2).contains(list.get(1).getId())); } public void testSampleDomainQuery22() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("addresses.postCode").like("%123%").build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(2, 3).contains(list.get(0).getId())); assertTrue(Arrays.asList(2, 3).contains(list.get(1).getId())); } public void testSampleDomainQuery23() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("id").between(1, 2) .build(); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).getId()); } public void testSampleDomainQuery24() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("id").between(1, 2).includeLower(false) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(1, 3).contains(list.get(0).getId())); assertTrue(Arrays.asList(1, 3).contains(list.get(1).getId())); } public void testSampleDomainQuery25() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("id").between(1, 2).includeUpper(false) .build(); List<User> list = q.list(); assertEquals(2, list.size()); assertTrue(Arrays.asList(2, 3).contains(list.get(0).getId())); assertTrue(Arrays.asList(2, 3).contains(list.get(1).getId())); } public void testSampleDomainQuery26() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .having("creationDate").eq(makeDate("2013-01-20")) .build(); List<Account> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).getId()); } public void testSampleDomainQuery27() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .orderBy("id", SortOrder.ASC) .having("creationDate").lt(makeDate("2013-01-20")) .build(); List<Account> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).getId()); assertEquals(2, list.get(1).getId()); } public void testSampleDomainQuery28() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .orderBy("id", SortOrder.ASC) .having("creationDate").lte(makeDate("2013-01-20")) .build(); List<Account> list = q.list(); assertEquals(3, list.size()); assertEquals(1, list.get(0).getId()); assertEquals(2, list.get(1).getId()); assertEquals(3, list.get(2).getId()); } public void testSampleDomainQuery29() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .having("creationDate").gt(makeDate("2013-01-04")) .build(); List<Account> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).getId()); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.not().having("name").eq("John").build(); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .having("surname").eq("Man") .build(); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not().having("name").eq("John") .not().having("surname").eq("Man") .build(); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding4() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not(qf.having("name").eq("John")) .not(qf.having("surname").eq("Man")) .build(); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding5() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .not(qf.having("name").eq("John")) .not(qf.having("surname").eq("Man")) .build(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testWrongQueryBuilding6() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(null) .build(); } @Test(expectedExceptions = IllegalStateException.class) public void testWrongQueryBuilding7() throws Exception { QueryFactory qf = getQueryFactory(); FilterConditionEndContext q1 = qf.from(getModelFactory().getUserImplClass()) .having("gender"); q1.eq(User.Gender.MALE); q1.eq(User.Gender.FEMALE); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014823: maxResults must be greater than 0") public void testPagination1() throws Exception { QueryFactory qf = getQueryFactory(); qf.from(getModelFactory().getUserImplClass()) .maxResults(0); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014823: maxResults must be greater than 0") public void testPagination2() throws Exception { QueryFactory qf = getQueryFactory(); qf.from(getModelFactory().getUserImplClass()) .maxResults(-4); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014824: startOffset cannot be less than 0") public void testPagination3() throws Exception { QueryFactory qf = getQueryFactory(); qf.from(getModelFactory().getUserImplClass()) .startOffset(-3); } public void testOrderedPagination4() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .maxResults(5) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(3, list.size()); } public void testUnorderedPagination4() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .maxResults(5) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(3, list.size()); } public void testOrderedPagination5() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .startOffset(20) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(0, list.size()); } public void testUnorderedPagination5() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .startOffset(20) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(0, list.size()); } public void testOrderedPagination6() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .startOffset(20).maxResults(10) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(0, list.size()); } public void testUnorderedPagination6() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .startOffset(20).maxResults(10) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(0, list.size()); } public void testOrderedPagination7() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .startOffset(1).maxResults(10) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(2, list.size()); } public void testUnorderedPagination7() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .startOffset(1).maxResults(10) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(2, list.size()); } public void testOrderedPagination8() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .orderBy("id", SortOrder.ASC) .startOffset(0).maxResults(2) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(2, list.size()); } public void testUnorderedPagination8() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .startOffset(0).maxResults(2) .build(); List<User> list = q.list(); assertEquals(3, q.getResultSize()); assertEquals(2, list.size()); } public void testGroupBy1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name") .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals("John", list.get(0)[0]); assertEquals(1, list.get(1).length); assertEquals("Spider", list.get(1)[0]); } public void testGroupBy2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("age")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals(22L, list.get(0)[0]); assertEquals(1, list.get(1).length); assertEquals(null, list.get(1)[0]); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN014026: The expression 'surname' must be part of an aggregate function or it should be included in the GROUP BY clause") public void testGroupBy3() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name") .groupBy("name") .orderBy("surname") .build(); q.list(); } public void testGroupBy4() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(max("addresses.postCode")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals("X1234", list.get(0)[0]); assertEquals(1, list.get(1).length); assertEquals("ZZ", list.get(1)[0]); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN014021: Queries containing grouping and aggregation functions must use projections.") public void testGroupBy5() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .groupBy("name") .build(); q.list(); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "Aggregation SUM cannot be applied to property of type java.lang.String") public void testGroupBy6() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("name")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(2, list.get(0)[0]); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN028515: Cannot have aggregate functions in the WHERE clause : SUM.") public void testGroupBy7() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("age")) .having(sum("age")).gt(10) .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(3, list.get(0).length); assertEquals(3, list.get(1).length); assertEquals(1500d, (Double) list.get(0)[2], 0.0001d); assertEquals(45d, (Double) list.get(1)[2], 0.0001d); } public void testHavingWithSum() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), sum("amount")) .groupBy("accountId") .having(sum("amount")).gt(3324) .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0)[0]); assertEquals(6370.0d, (Double) list.get(0)[1], 0.0001d); } public void testHavingWithAvg() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), avg("amount")) .groupBy("accountId") .having(avg("amount")).lt(130.0) .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0)[0]); assertEquals(120.188679d, (Double) list.get(0)[1], 0.0001d); } public void testHavingWithMin() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), min("amount")) .groupBy("accountId") .having(min("amount")).lt(10) .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0)[0]); assertEquals(5.0d, (Double) list.get(0)[1], 0.0001d); } public void testHavingWithMax() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), max("amount")) .groupBy("accountId") .having(avg("amount")).lt(150) .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0)[0]); assertEquals(149.0d, (Double) list.get(0)[1], 0.0001d); } public void testSum() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("age")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals(22L, list.get(0)[0]); assertEquals(1, list.get(1).length); assertEquals(null, list.get(1)[0]); } public void testEmbeddedSum() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), sum("addresses.number")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(156L, list.get(0)[1]); assertEquals(300L, list.get(1)[1]); assertNull(list.get(2)[1]); } public void testGlobalSum() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(sum("amount")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(9693d, (Double) list.get(0)[0], 0.0001d); } public void testEmbeddedGlobalSum() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("addresses.number")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(456L, list.get(0)[0]); } public void testCount() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), count("age")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(1L, list.get(0)[1]); assertEquals(0L, list.get(1)[1]); assertEquals(0L, list.get(2)[1]); } public void testEmbeddedCount1() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), count("accountIds")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(2L, list.get(0)[1]); assertEquals(1L, list.get(1)[1]); assertEquals(0L, list.get(2)[1]); } public void testEmbeddedCount2() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), count("addresses.street")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(1L, list.get(0)[1]); assertEquals(2L, list.get(1)[1]); assertEquals(0L, list.get(2)[1]); } public void testGlobalCount() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .select(count("creationDate")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(3L, list.get(0)[0]); } public void testEmbeddedGlobalCount() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(count("accountIds")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(3L, list.get(0)[0]); } public void testAvg() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), avg("amount")) .groupBy("accountId") .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(1107.6666d, (Double) list.get(0)[1], 0.0001d); assertEquals(120.18867d, (Double) list.get(1)[1], 0.0001d); } public void testEmbeddedAvg() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), avg("addresses.number")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(156d, (Double) list.get(0)[1], 0.0001d); assertEquals(150d, (Double) list.get(1)[1], 0.0001d); assertEquals(null, list.get(2)[1]); } public void testGlobalAvg() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(avg("amount")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(173.0892d, (Double) list.get(0)[0], 0.0001d); } public void testEmbeddedGlobalAvg() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(avg("addresses.number")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(152d, (Double) list.get(0)[0], 0.0001d); } public void testMin() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), min("amount")) .groupBy("accountId") .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(23d, list.get(0)[1]); assertEquals(5d, list.get(1)[1]); } public void testMinString() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(min("surname")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals(1, list.get(1).length); assertEquals("Doe", list.get(0)[0]); assertEquals("Man", list.get(1)[0]); } public void testEmbeddedMin() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), min("addresses.number")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(156, list.get(0)[1]); assertEquals(-12, list.get(1)[1]); assertEquals(null, list.get(2)[1]); } public void testGlobalMinDouble() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(min("amount")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(5d, list.get(0)[0]); } public void testGlobalMinString() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(min("name")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals("John", list.get(0)[0]); } public void testEmbeddedGlobalMin() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(min("addresses.number")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(-12, list.get(0)[0]); } public void testMax() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), max("amount")) .groupBy("accountId") .orderBy("accountId") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(1800d, list.get(0)[1]); assertEquals(149d, list.get(1)[1]); } public void testMaxString() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(max("surname")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals(1, list.get(1).length); assertEquals("Doe", list.get(0)[0]); assertEquals("Woman", list.get(1)[0]); } public void testEmbeddedMax() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(property("surname"), max("addresses.number")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(2, list.get(1).length); assertEquals(2, list.get(2).length); assertEquals(156, list.get(0)[1]); assertEquals(312, list.get(1)[1]); assertEquals(null, list.get(2)[1]); } public void testEmbeddedMaxString() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(max("addresses.postCode")) .groupBy("name") .orderBy("name") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(1, list.get(0).length); assertEquals("X1234", list.get(0)[0]); assertEquals(1, list.get(1).length); assertEquals("ZZ", list.get(1)[0]); } public void testGlobalMaxDouble() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(max("amount")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(1800d, list.get(0)[0]); } public void testGlobalMaxString() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(max("name")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals("Spider", list.get(0)[0]); } public void testEmbeddedGlobalMax() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(max("addresses.number")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(312, list.get(0)[0]); } public void testOrderBySum() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("age")) .orderBy(sum("age")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(22L, list.get(0)[0]); } public void testGroupingWithFilter() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name") .having("name").eq("John") .groupBy("name") .having("name").eq("John") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals("John", list.get(0)[0]); } public void testCountNull() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(count("age")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(1L, list.get(0)[0]); // only non-null "age"s were counted } public void testAvgNull() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(avg("age")) .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(22.0, list.get(0)[0]); // only non-null "age"s were counted } public void testDateGrouping1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("date") .having("date").between(makeDate("2013-02-15"), makeDate("2013-03-15")) .groupBy("date") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(makeDate("2013-02-27"), list.get(0)[0]); } public void testDateGrouping2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(count("date"), min("date")) .having("description").eq("Hotel") .groupBy("id") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).length); assertEquals(1L, list.get(0)[0]); assertEquals(makeDate("2013-02-27"), list.get(0)[1]); } public void testDateGrouping3() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(min("date"), count("date")) .having("description").eq("Hotel") .groupBy("id") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).length); assertEquals(makeDate("2013-02-27"), list.get(0)[0]); assertEquals(1L, list.get(0)[1]); } public void testParam() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(param("param2")) .build(); q.setParameter("param2", User.Gender.MALE); List<User> list = q.list(); assertEquals(2, list.size()); assertEquals(User.Gender.MALE, list.get(0).getGender()); assertEquals(User.Gender.MALE, list.get(1).getGender()); q.setParameter("param2", User.Gender.FEMALE); list = q.list(); assertEquals(1, list.size()); assertEquals(User.Gender.FEMALE, list.get(0).getGender()); } public void testWithParameterMap() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("gender").eq(param("param1")) .and() .having("name").eq(param("param2")) .build(); Map<String, Object> parameterMap = new HashMap<>(2); parameterMap.put("param1", User.Gender.MALE); parameterMap.put("param2", "John"); q.setParameters(parameterMap); List<User> list = q.list(); assertEquals(1, list.size()); assertEquals(User.Gender.MALE, list.get(0).getGender()); assertEquals("John", list.get(0).getName()); parameterMap = new HashMap<>(2); parameterMap.put("param1", User.Gender.MALE); parameterMap.put("param2", "Spider"); q.setParameters(parameterMap); list = q.list(); assertEquals(1, list.size()); assertEquals(User.Gender.MALE, list.get(0).getGender()); assertEquals("Spider", list.get(0).getName()); } public void testDateParam() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getAccountImplClass()) .having("creationDate").eq(param("param1")) .build().setParameter("param1", makeDate("2013-01-03")); List<Account> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).getId()); } public void testParamWithGroupBy() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(property("accountId"), property("date"), sum("amount")) .groupBy("accountId", "date") .having(sum("amount")).gt(param("param")) .build(); q.setParameter("param", 1801); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).length); assertEquals(6225d, list.get(0)[2]); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014805: No parameter named 'param2' was found") public void testUnknownParam() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param("param1")) .build(); q.setParameter("param2", "John"); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014806: No parameters named '\\[param2\\]' were found") public void testUnknownParamWithParameterMap() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param("param1")) .build(); Map<String, Object> parameterMap = new HashMap<>(1); parameterMap.put("param2", User.Gender.MALE); q.setParameters(parameterMap); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "ISPN014804: Query does not have parameters") public void testQueryWithNoParams() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .build() .setParameter("param1", "John"); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "ISPN014804: Query does not have parameters") public void testQueryWithNoParamsWithParameterMap() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .build(); Map<String, Object> parameterMap = new HashMap<>(1); parameterMap.put("param1", User.Gender.MALE); q.setParameters(parameterMap); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014803: Parameter name cannot be null or empty") public void testNullParamName() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param(null)) .build(); q.setParameter(null, "John"); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014803: Parameter name cannot be null or empty") public void testEmptyParamName() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param("")) .build(); q.setParameter("", "John"); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "ISPN014825: Query parameter 'param2' was not set") public void testMissingParam() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param("param1")) .and().having("gender").eq(param("param2")) .build(); q.setParameter("param1", "John"); q.list(); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "ISPN014825: Query parameter 'param2' was not set") public void testMissingParamWithParameterMap() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq(param("param1")) .and().having("gender").eq(param("param2")) .build(); Map<String, Object> parameterMap = new HashMap<>(1); parameterMap.put("param1", "John"); q.setParameters(parameterMap); q.list(); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "ISPN014812: paramValues cannot be null") public void testQueryWithNoParamsWithNullParameterMap() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("name").eq("John") .build(); q.setParameters(null); } @Test public void testComplexQuery() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(avg("amount"), sum("amount"), count("date"), min("date"), max("accountId")) .having("isDebit").eq(param("param")) .orderBy(avg("amount"), SortOrder.DESC).orderBy(count("date"), SortOrder.DESC) .orderBy(max("amount"), SortOrder.ASC) .build(); q.setParameter("param", true); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(5, list.get(0).length); assertEquals(143.50909d, (Double) list.get(0)[0], 0.0001d); assertEquals(7893d, (Double) list.get(0)[1], 0.0001d); assertEquals(55L, list.get(0)[2]); assertEquals(java.util.Date.class, list.get(0)[3].getClass()); assertTrue(((Date) list.get(0)[3]).compareTo(makeDate("2013-01-01")) == 0); assertEquals(2, list.get(0)[4]); } public void testDateFilteringWithGroupBy() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("date") .having("date").between(makeDate("2013-02-15"), makeDate("2013-03-15")) .groupBy("date") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(1, list.get(0).length); assertEquals(java.util.Date.class, list.get(0)[0].getClass()); assertTrue(((Date) list.get(0)[0]).compareTo(makeDate("2013-02-27")) == 0); } public void testAggregateDate() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(count("date"), min("date")) .having("description").eq("Hotel") .groupBy("id") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(2, list.get(0).length); assertEquals(1L, list.get(0)[0]); assertEquals(java.util.Date.class, list.get(0)[1].getClass()); assertTrue(((Date) list.get(0)[1]).compareTo(makeDate("2013-02-27")) == 0); } public void testNotIndexedProjection() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "isValid") .having("id").gte(98) .orderBy("id") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(98, list.get(0)[0]); assertEquals(true, list.get(0)[1]); assertEquals(2, list.get(1).length); assertEquals(99, list.get(1)[0]); assertEquals(true, list.get(1)[1]); } public void testNotStoredProjection() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "description") .having("id").gte(98) .orderBy("id") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(98, list.get(0)[0]); assertEquals("Expensive shoes 48", list.get(0)[1]); assertEquals(2, list.get(1).length); assertEquals(99, list.get(1)[0]); assertEquals("Expensive shoes 49", list.get(1)[1]); } public void testNotIndexedOrderBy() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "isValid") .having("id").gte(98) .orderBy("isValid") .orderBy("id") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(98, list.get(0)[0]); assertEquals(true, list.get(0)[1]); assertEquals(2, list.get(1).length); assertEquals(99, list.get(1)[0]); assertEquals(true, list.get(1)[1]); } public void testNotStoredOrderBy() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "description") .having("id").gte(98) .orderBy("description") .orderBy("id") .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertEquals(98, list.get(0)[0]); assertEquals("Expensive shoes 48", list.get(0)[1]); assertEquals(2, list.get(1).length); assertEquals(99, list.get(1)[0]); assertEquals("Expensive shoes 49", list.get(1)[1]); } public void testDuplicateDateProjection() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "date", "date") .having("description").eq("Hotel") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).length); assertEquals(3, list.get(0)[0]); assertEquals(makeDate("2013-02-27"), list.get(0)[1]); assertEquals(makeDate("2013-02-27"), list.get(0)[2]); } public void testDuplicateBooleanProjection() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select("id", "isDebit", "isDebit") .having("description").eq("Hotel") .build(); List<Object[]> list = q.list(); assertEquals(1, list.size()); assertEquals(3, list.get(0).length); assertEquals(3, list.get(0)[0]); assertEquals(true, list.get(0)[1]); assertEquals(true, list.get(0)[2]); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN014023: Using the multi-valued property path 'addresses.street' in the GROUP BY clause is not currently supported") public void testGroupByMustNotAcceptRepeatedProperty() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(min("name")) .groupBy("addresses.street") .build(); q.list(); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN014024: The property path 'addresses.street' cannot be used in the ORDER BY clause because it is multi-valued") public void testOrderByMustNotAcceptRepeatedProperty() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name") .orderBy("addresses.street") .build(); q.list(); } public void testOrderByInAggregationQueryMustAcceptRepeatedProperty() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(avg("age"), property("name")) .having("name").gt("A") .groupBy("name") .having(max("addresses.street")).gt("A") .orderBy(min("addresses.street")) .build(); List<Object[]> list = q.list(); assertEquals(2, list.size()); assertEquals(2, list.get(0).length); assertNull(list.get(0)[0]); assertEquals("Spider", list.get(0)[1]); assertEquals(22.0, list.get(1)[0]); assertEquals("John", list.get(1)[1]); } @Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN028515: Cannot have aggregate functions in the WHERE clause : MIN.") public void testRejectAggregationsInWhereClause() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select("name") .having("name").eq(min("addresses.street")) .build(); q.list(); } public void testAggregateRepeatedField() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(min("addresses.street")) .having("name").eq("Spider") .build(); List<Object[]> list = q.list(); assertEquals("Bond Street", list.get(0)[0]); } public void testGroupingAndAggregationOnSameField() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(count("surname")) .groupBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(1, list.get(0).length); assertEquals(1L, list.get(0)[0]); assertEquals(1L, list.get(1)[0]); assertEquals(1L, list.get(2)[0]); } public void testTwoPhaseGroupingAndAggregationOnSameField() { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(count("surname"), sum("addresses.number")) .groupBy("surname") .orderBy("surname") .build(); List<Object[]> list = q.list(); assertEquals(3, list.size()); assertEquals(2, list.get(0).length); assertEquals(1L, list.get(0)[0]); assertEquals(156L, list.get(0)[1]); assertEquals(1L, list.get(1)[0]); assertEquals(300L, list.get(1)[1]); assertEquals(1L, list.get(2)[0]); assertNull(list.get(2)[1]); } /** * Test that 'like' accepts only % and _ as wildcards. */ public void testLuceneWildcardsAreEscaped() { QueryFactory qf = getQueryFactory(); // use a true wildcard Query q1 = qf.from(getModelFactory().getUserImplClass()) .having("name").like("J%n") .build(); assertEquals(1, q1.list().size()); // use an improper wildcard Query q2 = qf.from(getModelFactory().getUserImplClass()) .having("name").like("J*n") .build(); assertEquals(0, q2.list().size()); // use a true wildcard Query q3 = qf.from(getModelFactory().getUserImplClass()) .having("name").like("Jo_n") .build(); assertEquals(1, q3.list().size()); // use an improper wildcard Query q4 = qf.from(getModelFactory().getUserImplClass()) .having("name").like("Jo?n") .build(); assertEquals(0, q4.list().size()); } public void testCompareLongWithInt() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .select(sum("age")) .groupBy("name") .having(sum("age")).gt(50000) .build(); List<Object[]> list = q.list(); assertEquals(0, list.size()); } public void testCompareDoubleWithInt() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getTransactionImplClass()) .select(sum("amount")) .groupBy("accountId") .having(sum("amount")).gt(50000) .build(); List<Object[]> list = q.list(); assertEquals(0, list.size()); } public void testFullTextTerm() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.create("from " + getModelFactory().getTransactionTypeName() + " where longDescription:'rent'"); List<Transaction> list = q.list(); assertEquals(1, list.size()); } public void testFullTextPhrase() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.create("from " + getModelFactory().getTransactionTypeName() + " where longDescription:'expensive shoes'"); List<Transaction> list = q.list(); assertEquals(50, list.size()); } public void testInstant1() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("creationDate").eq(Instant.parse("2011-12-03T10:15:30Z")) .build(); List<User> list = q.list(); assertEquals(3, list.size()); } public void testInstant2() throws Exception { QueryFactory qf = getQueryFactory(); Query q = qf.from(getModelFactory().getUserImplClass()) .having("passwordExpirationDate").eq(Instant.parse("2011-12-03T10:15:30Z")) .build(); List<User> list = q.list(); assertEquals(3, list.size()); } }