package org.infinispan.query.dsl.embedded;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import java.util.List;
import java.util.Random;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.SortableField;
import org.hibernate.search.annotations.Store;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.Index;
import org.infinispan.query.dsl.Expression;
import org.infinispan.query.dsl.Query;
import org.infinispan.query.dsl.QueryFactory;
import org.infinispan.query.dsl.embedded.impl.QueryCache;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.transaction.TransactionMode;
import org.testng.annotations.Test;
/**
* @author Matej Cimbora
* @author anistor@gmail.com
* @since 9.0
*/
@Test(groups = "profiling", testName = "query.dsl.embedded.NamedParamsPerfTest")
public class NamedParamsPerfTest extends AbstractQueryDslTest {
@Indexed
public static class Person {
@Field(store = Store.YES, analyze = Analyze.NO)
@SortableField
final int id;
@Field(store = Store.YES, analyze = Analyze.NO, indexNullAs = Field.DEFAULT_NULL_TOKEN)
@SortableField
final String firstName;
@Field(store = Store.YES, analyze = Analyze.NO, indexNullAs = Field.DEFAULT_NULL_TOKEN)
@SortableField
final String lastName;
public Person(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder cfg = TestCacheManagerFactory.getDefaultCacheConfiguration(true);
cfg.transaction()
.transactionMode(TransactionMode.TRANSACTIONAL)
.indexing().index(Index.ALL)
.addIndexedEntity(Person.class)
.addProperty("default.directory_provider", "ram")
.addProperty("lucene_version", "LUCENE_CURRENT");
createClusteredCaches(1, cfg);
}
public void testNamedParamPerfComparison() throws Exception {
QueryFactory factory = getQueryFactory();
String[] fnames = {"Matej", "Roman", "Jakub", "Jiri", "Anna", "Martin", "Vojta", "Alan"};
String[] lnames = {"Cimbora", "Macor", "Markos", "Holusa", "Manukyan", "Gencur", "Vrabel", "Juranek", "Field"};
Random random = new Random(3);
for (int i = 0; i < 999; i++) {
cache(0).put(i, new Person(i, fnames[random.nextInt(fnames.length)], lnames[random.nextInt(lnames.length)]));
}
cache(0).put(1000, new Person(999, "Unnamed", "Unnamed"));
QueryCache queryCache = manager(0).getGlobalComponentRegistry().getComponent(QueryCache.class);
assertNotNull(queryCache);
Query query = factory.from(Person.class)
.having("firstName").eq(Expression.param("nameParam1"))
.or()
.having("lastName").eq(Expression.param("nameParam2"))
.or()
.having("id").gte(Expression.param("idParam1"))
.or()
.having("id").lt(Expression.param("idParam2"))
.build();
final int iterations = 1000;
long t1 = 0;
long t2 = 0;
long t3 = 0;
for (int i = 0; i < iterations; i++) {
queryCache.clear();
long start = System.nanoTime();
query.setParameter("nameParam1", "Unnamed")
.setParameter("nameParam2", "ww")
.setParameter("idParam1", 1000)
.setParameter("idParam2", 0);
List<Object> list = query.list();
long duration = System.nanoTime() - start; // first run is expected to take much longer than subsequent runs
assertEquals(1, list.size());
t1 += duration;
start = System.nanoTime();
query.setParameter("nameParam1", "Unnamed")
.setParameter("nameParam2", "zz")
.setParameter("idParam1", 2000)
.setParameter("idParam2", -1000);
list = query.list();
duration = System.nanoTime() - start;
assertEquals(1, list.size());
t2 += duration;
start = System.nanoTime();
query.setParameter("nameParam1", "Unnamed")
.setParameter("nameParam2", "bb")
.setParameter("idParam1", 5000)
.setParameter("idParam2", -3000);
list = query.list();
duration = System.nanoTime() - start;
assertEquals(1, list.size());
t3 += duration;
}
System.out.println("NamedParamsPerfTest.testNamedParamPerfComparison t1 (avg, us) = " + (t1 / 1000.0 / iterations));
System.out.println("NamedParamsPerfTest.testNamedParamPerfComparison t2 (avg, us) = " + (t2 / 1000.0 / iterations));
System.out.println("NamedParamsPerfTest.testNamedParamPerfComparison t3 (avg, us) = " + (t3 / 1000.0 / iterations));
}
}