package org.infinispan.query.continuous; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.query.Search; import org.infinispan.query.api.continuous.ContinuousQuery; import org.infinispan.query.api.continuous.ContinuousQueryListener; import org.infinispan.query.dsl.Query; import org.infinispan.query.dsl.QueryFactory; import org.infinispan.query.test.Person; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.Test; /** * @author anistor@redhat.com * @since 8.2 */ @Test(groups = "profiling", testName = "query.continuous.ContinuousQueryProfilingTest") public class ContinuousQueryProfilingTest extends MultipleCacheManagersTest { private final int NUM_NODES = 10; private final int NUM_OWNERS = 3; @Override protected void createCacheManagers() { ConfigurationBuilder c = buildConfiguration(); createCluster(c, NUM_NODES); waitForClusterToForm(); } private ConfigurationBuilder buildConfiguration() { ConfigurationBuilder c = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false); c.clustering().hash().numOwners(NUM_OWNERS); return c; } public void testContinuousQueryPerformance() { long t1 = testContinuousQueryPerformance(false); long t2 = testContinuousQueryPerformance(true); log.infof("ContinuousQueryProfilingTest.testContinuousQueryPerformance doRegisterListener=false took %d ms\n", t1 / 1000000); log.infof("ContinuousQueryProfilingTest.testContinuousQueryPerformance doRegisterListener=true took %d ms\n", t2 / 1000000); } private long testContinuousQueryPerformance(boolean doRegisterListener) { final int numEntries = 100000; final int numListeners = 1000; ContinuousQuery<Object, Object> cq = Search.getContinuousQuery(cache(0)); if (doRegisterListener) { Query query = makeQuery(cache(0)); for (int i = 0; i < numListeners; i++) { cq.addContinuousQueryListener(query, new ContinuousQueryListener<Object, Object>() { }); } } long startTs = System.nanoTime(); // create entries for (int i = 0; i < numEntries; ++i) { Person value = new Person(); value.setName("John"); value.setAge(i + 25); Cache<Object, Person> cache = cache(i % NUM_NODES); cache.put(value.getName(), value); } // update entries (with same value) for (int i = 0; i < numEntries; ++i) { Person value = new Person(); value.setName("John"); value.setAge(i + 25); Cache<Object, Person> cache = cache(i % NUM_NODES); cache.put(value.getName(), value); } long endTs = System.nanoTime(); cq.removeAllListeners(); return endTs - startTs; } private Query makeQuery(Cache c) { QueryFactory qf = Search.getQueryFactory(c); return qf.from(Person.class) .having("age").gte(18) .build(); } }