package org.infinispan.query.dsl.embedded; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; import org.infinispan.Cache; import org.infinispan.commons.util.CloseableIterator; import org.infinispan.commons.util.Closeables; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.container.entries.CacheEntry; import org.infinispan.distribution.MagicKey; import org.infinispan.filter.CacheFilters; import org.infinispan.objectfilter.ObjectFilter; import org.infinispan.objectfilter.impl.ReflectionMatcher; import org.infinispan.query.dsl.embedded.impl.IckleFilterAndConverter; import org.infinispan.query.test.Person; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.transaction.TransactionMode; import org.testng.annotations.Test; /** * @author anistor@redhat.com * @since 7.0 */ @Test(groups = "functional", testName = "query.dsl.embedded.IckleFilterAndConverterDistTest") public class IckleFilterAndConverterDistTest extends MultipleCacheManagersTest { protected final int numNodes; protected IckleFilterAndConverterDistTest(int numNodes) { this.numNodes = numNodes; } public IckleFilterAndConverterDistTest() { this(3); } @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder cfgBuilder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false); cfgBuilder.transaction().transactionMode(TransactionMode.NON_TRANSACTIONAL); createClusteredCaches(numNodes, cfgBuilder); } @Test public void testFilter() { final boolean isClustered = cache(0).getCacheConfiguration().clustering().cacheMode().isClustered(); for (int i = 0; i < 10; ++i) { Person value = new Person(); value.setName("John"); value.setAge(i + 30); Cache<Object, Person> cache = cache(i % numNodes); Object key = isClustered ? new MagicKey(cache) : i; cache.put(key, value); } IckleFilterAndConverter filterAndConverter = new IckleFilterAndConverter<Object, Person>("from org.infinispan.query.test.Person where blurb is null and age <= 31", null, ReflectionMatcher.class); Stream<CacheEntry<Object, Object>> stream = cache(0).getAdvancedCache().cacheEntrySet().stream(); CloseableIterator<Map.Entry<Object, ObjectFilter.FilterResult>> iterator = Closeables.iterator(CacheFilters.filterAndConvert(stream, filterAndConverter).iterator()); Map<Object, ObjectFilter.FilterResult> results = mapFromIterator(iterator); assertEquals(2, results.size()); for (ObjectFilter.FilterResult p : results.values()) { assertNull(((Person) p.getInstance()).getBlurb()); assertTrue(((Person) p.getInstance()).getAge() <= 31); } } /** * Iterates over all the entries provided by the iterator and puts them in a Map. */ private Map<Object, ObjectFilter.FilterResult> mapFromIterator(CloseableIterator<Map.Entry<Object, ObjectFilter.FilterResult>> iterator) { try { Map<Object, ObjectFilter.FilterResult> result = new HashMap<>(); while (iterator.hasNext()) { Map.Entry<Object, ObjectFilter.FilterResult> entry = iterator.next(); result.put(entry.getKey(), entry.getValue()); } return result; } finally { iterator.close(); } } }