package org.infinispan.query.dsl.embedded;
import static org.infinispan.test.TestingUtil.withTx;
import static org.testng.AssertJUnit.assertEquals;
import java.util.List;
import java.util.concurrent.Callable;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.objectfilter.ParsingException;
import org.infinispan.query.Search;
import org.infinispan.query.dsl.Query;
import org.infinispan.query.dsl.QueryFactory;
import org.infinispan.query.dsl.embedded.testdomain.User;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
/**
* Test for query conditions (filtering) on cache without indexing. Exercises the whole query DSL on the sample domain
* model.
*
* @author anistor@redhat.com
* @since 7.0
*/
@Test(groups = "functional", testName = "query.dsl.embedded.NonIndexedQueryDslConditionsTest")
public class NonIndexedQueryDslConditionsTest extends QueryDslConditionsTest {
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder cfg = TestCacheManagerFactory.getDefaultCacheConfiguration(true);
createClusteredCaches(1, cfg);
}
public void testInsertAndIterateInTx() throws Exception {
final User newUser = getModelFactory().makeUser();
newUser.setId(15);
newUser.setName("Test");
newUser.setSurname("User");
newUser.setGender(User.Gender.MALE);
newUser.setAge(20);
List results = withTx(tm(0), new Callable<List>() {
@Override
public List call() throws Exception {
Query q = getQueryFactory().from(getModelFactory().getUserImplClass())
.not().having("age").eq(20)
.build();
cache(0).put("new_user_" + newUser.getId(), newUser);
return q.list();
}
});
cache(0).remove("new_user_" + newUser.getId());
assertEquals(3, results.size());
}
@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Indexing was not enabled on this cache.*")
@Override
public void testIndexPresence() {
// this is expected to throw an exception
Search.getSearchManager((Cache) getCacheForQuery());
}
/**
* This test uses fields that are not marked as @NumericField so it cannot work correctly with Lucene but should work
* correctly for non-indexed.
*/
public void testAnd5() throws Exception {
QueryFactory qf = getQueryFactory();
Query q = qf.from(getModelFactory().getUserImplClass())
.having("id").lt(1000)
.and().having("age").lt(1000)
.build();
List<User> list = q.list();
assertEquals(1, list.size());
assertEquals(1, list.get(0).getId());
}
@Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN028521: Full-text queries cannot be applied to property 'longDescription' in type org.infinispan.query.dsl.embedded.testdomain.hsearch.TransactionHS unless the property is indexed and analyzed.")
@Override
public void testFullTextTerm() throws Exception {
super.testFullTextTerm();
}
@Test(expectedExceptions = ParsingException.class, expectedExceptionsMessageRegExp = "ISPN028521: Full-text queries cannot be applied to property 'longDescription' in type org.infinispan.query.dsl.embedded.testdomain.hsearch.TransactionHS unless the property is indexed and analyzed.")
@Override
public void testFullTextPhrase() throws Exception {
super.testFullTextPhrase();
}
}