package org.infinispan.objectfilter.test.perf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.Arrays;
import org.infinispan.commons.test.annotations.Profiling;
import org.infinispan.objectfilter.Matcher;
import org.infinispan.objectfilter.ObjectFilter;
import org.infinispan.objectfilter.impl.ReflectionMatcher;
import org.infinispan.objectfilter.test.model.Address;
import org.infinispan.objectfilter.test.model.Person;
import org.infinispan.objectfilter.test.model.PhoneNumber;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* @author anistor@redhat.com
* @since 7.0
*/
@Category(Profiling.class)
@Ignore
public class PerfTest {
private final int ITERATIONS = 10000000;
private final int NUM_FILTERS = 1;
@Test
public void testLikeMatchPerf() throws Exception {
long time = measureMatch("from org.infinispan.objectfilter.test.model.Person p where p.name like 'Jo%'");
printTime("testLikeMatchPerf", time);
}
@Test
public void testIsNullMatchPerf() throws Exception {
long time = measureMatch("from org.infinispan.objectfilter.test.model.Person p where p.name is not null");
printTime("testIsNullMatchPerf", time);
}
@Test
public void testComplexMatchPerf() throws Exception {
long time = measureMatch("from org.infinispan.objectfilter.test.model.Person p where p.surname = 'Batman' and p.age > 30 and p.name > 'A' and p.address.postCode = 'SW12345'");
printTime("testComplexMatchPerf", time);
}
protected long measureMatch(String query) throws Exception {
Matcher matcher = createMatcher();
Object obj = createPerson1();
int[] matchCount = new int[1];
for (int k = 0; k < NUM_FILTERS; k++) {
matcher.registerFilter(query, (userContext, eventType, instance, projection, sortProjection) -> matchCount[0]++);
}
long stime = System.nanoTime();
for (int i = 0; i < ITERATIONS; i++) {
matchCount[0] = 0;
matcher.match(null, null, obj);
assertEquals(NUM_FILTERS, matchCount[0]);
}
return System.nanoTime() - stime;
}
@Test
public void testSimpleObjectFilterPerf() throws Exception {
long time = measureFilter("from org.infinispan.objectfilter.test.model.Person p where p.name is not null");
printTime("testSimpleObjectFilterPerf", time);
}
@Test
public void testComplexObjectFilterPerf() throws Exception {
long time = measureFilter("from org.infinispan.objectfilter.test.model.Person p where p.surname = 'Batman' and p.age > 30 and p.name > 'A' and p.address.postCode = 'SW12345'");
printTime("testComplexObjectFilterPerf", time);
}
protected long measureFilter(String query) throws Exception {
Matcher matcher = createMatcher();
Object obj = createPerson1();
ObjectFilter objectFilter = matcher.getObjectFilter(query);
long stime = System.nanoTime();
for (int i = 0; i < ITERATIONS; i++) {
ObjectFilter.FilterResult result = objectFilter.filter(obj);
assertNotNull(result);
}
return System.nanoTime() - stime;
}
protected void printTime(String text, long totalTime) {
double iterationTime = totalTime / 1000;
iterationTime /= ITERATIONS;
System.out.println(getClass().getSimpleName() + "." + text + " " + iterationTime + "us");
}
protected Matcher createMatcher() throws Exception {
return new ReflectionMatcher((ClassLoader) null);
}
protected Object createPerson1() throws Exception {
Person person = new Person();
person.setName("John");
person.setSurname("Batman");
person.setAge(40);
person.setGender(Person.Gender.MALE);
Address address = new Address();
address.setStreet("Old Street");
address.setPostCode("SW12345");
person.setAddress(address);
PhoneNumber phoneNumber1 = new PhoneNumber();
phoneNumber1.setNumber("0040888888");
PhoneNumber phoneNumber2 = new PhoneNumber();
phoneNumber2.setNumber("004012345");
person.setPhoneNumbers(Arrays.asList(phoneNumber1, phoneNumber2));
return person;
}
}