package org.infinispan.query.api;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
import org.apache.lucene.search.Query;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.Index;
import org.infinispan.configuration.cache.StorageType;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.query.CacheQuery;
import org.infinispan.query.Search;
import org.infinispan.query.SearchManager;
import org.infinispan.query.helper.StaticTestingErrorHandler;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.fwk.CleanupAfterMethod;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "query.api.PutAllTest")
@CleanupAfterMethod
public class PutAllTest extends SingleCacheManagerTest {
private StorageType storageType;
@Factory
public Object[] factory() {
return new Object[] {
new PutAllTest().storageType(StorageType.OFF_HEAP),
new PutAllTest().storageType(StorageType.BINARY),
new PutAllTest().storageType(StorageType.OBJECT),
};
}
PutAllTest storageType(StorageType storageType) {
this.storageType = storageType;
return this;
}
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(true);
cfg.indexing()
.index(Index.ALL)
.addIndexedEntity(TestEntity.class)
.addIndexedEntity(AnotherTestEntity.class)
.addProperty("default.directory_provider", "ram")
.addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler")
.addProperty("lucene_version", "LUCENE_CURRENT");
cfg.memory()
.storageType(storageType);
return TestCacheManagerFactory.createCacheManager(cfg);
}
public void testOverwriteNotIndexedValue() {
final long id = 10;
cache.put(id, new NotIndexedType("name1"));
Map<Object, Object> map = new HashMap<>();
map.put(id, new TestEntity("name2", "surname2", id, "note"));
cache.putAll(map);
CacheQuery<?> q1 = queryByNameField("name2", AnotherTestEntity.class);
assertEquals(1, q1.getResultSize());
assertEquals(TestEntity.class, q1.list().get(0).getClass());
StaticTestingErrorHandler.assertAllGood(cache);
}
public void testAsyncOverwriteNotIndexedValue() throws Exception {
final long id = 10;
cache.put(id, new NotIndexedType("name1"));
Map<Object, Object> map = new HashMap<>();
map.put(id, new TestEntity("name2", "surname2", id, "note"));
Future futureTask = cache.putAllAsync(map);
futureTask.get();
assertTrue(futureTask.isDone());
CacheQuery<?> q1 = queryByNameField("name2", AnotherTestEntity.class);
assertEquals(1, q1.getResultSize());
assertEquals(TestEntity.class, q1.list().get(0).getClass());
StaticTestingErrorHandler.assertAllGood(cache);
}
public void testOverwriteWithNonIndexedValue() {
final long id = 10;
cache.put(id, new TestEntity("name1", "surname1", id, "note"));
CacheQuery<?> q1 = queryByNameField("name1", TestEntity.class);
assertEquals(1, q1.getResultSize());
assertEquals(TestEntity.class, q1.list().get(0).getClass());
Map<Object, Object> map = new HashMap<>();
map.put(id, new NotIndexedType("name2"));
cache.putAll(map);
CacheQuery<?> q2 = queryByNameField("name1", TestEntity.class);
assertEquals(0, q2.getResultSize());
CacheQuery<?> q3 = queryByNameField("name2", TestEntity.class);
assertEquals(0, q3.getResultSize());
StaticTestingErrorHandler.assertAllGood(cache);
}
public void testAsyncOverwriteWithNonIndexedValue() throws Exception {
final long id = 10;
cache.put(id, new TestEntity("name1", "surname1", id, "note"));
CacheQuery<?> q1 = queryByNameField("name1", TestEntity.class);
assertEquals(1, q1.getResultSize());
assertEquals(TestEntity.class, q1.list().get(0).getClass());
Map<Object, Object> map = new HashMap<>();
map.put(id, new NotIndexedType("name2"));
Future futureTask = cache.putAllAsync(map);
futureTask.get();
assertTrue(futureTask.isDone());
CacheQuery<?> q2 = queryByNameField("name1", TestEntity.class);
assertEquals(0, q2.getResultSize());
CacheQuery<?> q3 = queryByNameField("name2", TestEntity.class);
assertEquals(0, q3.getResultSize());
StaticTestingErrorHandler.assertAllGood(cache);
}
public void testOverwriteIndexedValue() {
final long id = 10;
cache.put(id, new TestEntity("name1", "surname1", id, "note"));
CacheQuery<?> q1 = queryByNameField("name1", TestEntity.class);
assertEquals(1, q1.getResultSize());
assertEquals(TestEntity.class, q1.list().get(0).getClass());
Map<Object, Object> map = new HashMap<>();
map.put(id, new AnotherTestEntity("name2"));
cache.putAll(map);
CacheQuery<?> q2 = queryByNameField("name1", TestEntity.class);
assertEquals(0, q2.getResultSize());
CacheQuery<?> q3 = queryByNameField("name2", AnotherTestEntity.class);
assertEquals(1, q3.getResultSize());
assertEquals(AnotherTestEntity.class, q3.list().get(0).getClass());
StaticTestingErrorHandler.assertAllGood(cache);
}
private <T> CacheQuery<T> queryByNameField(String name, Class<T> entity) {
SearchManager sm = Search.getSearchManager(cache);
Query query = sm.buildQueryBuilderForClass(entity)
.get().keyword().onField("name").matching(name).createQuery();
return sm.getQuery(query);
}
}