/*
* *************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
* *************************************************************************************
*/
package com.espertech.esper.filter;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.EventType;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.event.SupportEventBeanFactory;
import com.espertech.esper.support.filter.SupportEventEvaluator;
import junit.framework.TestCase;
import java.util.LinkedList;
import java.util.List;
public class TestFilterParamIndexRange extends TestCase
{
private SupportEventEvaluator testEvaluator;
private SupportBean testBean;
private EventBean testEventBean;
private EventType testEventType;
private List<FilterHandle> matchesList;
private DoubleRange testRange;
public void setUp()
{
testEvaluator = new SupportEventEvaluator();
testBean = new SupportBean();
testEventBean = SupportEventBeanFactory.createObject(testBean);
testEventType = testEventBean.getEventType();
matchesList = new LinkedList<FilterHandle>();
testRange = new DoubleRange(10d, 20d);
}
public void testLongBothEndpointsIncluded()
{
FilterParamIndexDoubleRange index = this.getLongDataset(FilterOperator.RANGE_CLOSED);
verifyLongPrimitive(index, -1, 0);
verifyLongPrimitive(index, 0, 2);
verifyLongPrimitive(index, 1, 5);
verifyLongPrimitive(index, 2, 5);
verifyLongPrimitive(index, 3, 7);
verifyLongPrimitive(index, 4, 6);
verifyLongPrimitive(index, 5, 6);
verifyLongPrimitive(index, 6, 6);
verifyLongPrimitive(index, 7, 6);
verifyLongPrimitive(index, 8, 6);
verifyLongPrimitive(index, 9, 5);
verifyLongPrimitive(index, 10, 3);
verifyLongPrimitive(index, 11, 1);
index.put(testRange, testEvaluator);
assertEquals(testEvaluator, index.get(testRange));
assertTrue(index.getReadWriteLock() != null);
assertTrue(index.remove(testRange));
assertFalse(index.remove(testRange));
assertEquals(null, index.get(testRange));
try
{
index.put("a", testEvaluator);
assertTrue(false);
}
catch (IllegalArgumentException ex)
{
// Expected
}
}
public void testLongLowEndpointIncluded()
{
FilterParamIndexDoubleRange index = this.getLongDataset(FilterOperator.RANGE_HALF_OPEN);
verifyLongPrimitive(index, -1, 0);
verifyLongPrimitive(index, 0, 2);
verifyLongPrimitive(index, 1, 5);
verifyLongPrimitive(index, 2, 5);
verifyLongPrimitive(index, 3, 6);
verifyLongPrimitive(index, 4, 6);
verifyLongPrimitive(index, 5, 3);
verifyLongPrimitive(index, 6, 5);
verifyLongPrimitive(index, 7, 4);
verifyLongPrimitive(index, 8, 5);
verifyLongPrimitive(index, 9, 3);
verifyLongPrimitive(index, 10, 1);
verifyLongPrimitive(index, 11, 1);
}
public void testLongHighEndpointIncluded()
{
FilterParamIndexDoubleRange index = this.getLongDataset(FilterOperator.RANGE_HALF_CLOSED);
verifyLongPrimitive(index, -1, 0);
verifyLongPrimitive(index, 0, 0);
verifyLongPrimitive(index, 1, 2);
verifyLongPrimitive(index, 2, 5);
verifyLongPrimitive(index, 3, 5);
verifyLongPrimitive(index, 4, 6);
verifyLongPrimitive(index, 5, 6);
verifyLongPrimitive(index, 6, 3);
verifyLongPrimitive(index, 7, 5);
verifyLongPrimitive(index, 8, 4);
verifyLongPrimitive(index, 9, 5);
verifyLongPrimitive(index, 10, 3);
verifyLongPrimitive(index, 11, 1);
}
public void testLongNeitherEndpointIncluded()
{
FilterParamIndexDoubleRange index = this.getLongDataset(FilterOperator.RANGE_OPEN);
verifyLongPrimitive(index, -1, 0);
verifyLongPrimitive(index, 0, 0);
verifyLongPrimitive(index, 1, 2);
verifyLongPrimitive(index, 2, 5);
verifyLongPrimitive(index, 3, 4);
verifyLongPrimitive(index, 4, 6);
verifyLongPrimitive(index, 5, 3);
verifyLongPrimitive(index, 6, 2);
verifyLongPrimitive(index, 7, 3);
verifyLongPrimitive(index, 8, 3);
verifyLongPrimitive(index, 9, 3);
verifyLongPrimitive(index, 10, 1);
verifyLongPrimitive(index, 11, 1);
}
public void testDoubleBothEndpointsIncluded()
{
FilterParamIndexDoubleRange index = this.getDoubleDataset(FilterOperator.RANGE_CLOSED);
verifyDoublePrimitive(index, 1.49, 0);
verifyDoublePrimitive(index, 1.5, 1);
verifyDoublePrimitive(index, 2.5, 1);
verifyDoublePrimitive(index, 2.51, 0);
verifyDoublePrimitive(index, 3.5, 2);
verifyDoublePrimitive(index, 4.4, 2);
verifyDoublePrimitive(index, 4.5, 2);
verifyDoublePrimitive(index, 4.5001, 1);
verifyDoublePrimitive(index, 5.1, 1);
verifyDoublePrimitive(index, 5.8, 2);
verifyDoublePrimitive(index, 6.7, 2);
verifyDoublePrimitive(index, 6.8, 1);
verifyDoublePrimitive(index, 9.5, 1);
verifyDoublePrimitive(index, 10.1, 0);
}
public void testDoubleFixedRangeSize()
{
FilterParamIndexDoubleRange index = makeOne("doublePrimitive", FilterOperator.RANGE_OPEN, testEventType);
for (int i = 0; i < 10000; i++)
{
DoubleRange range = new DoubleRange(new Double(i), new Double(i+1));
index.put(range, testEvaluator);
}
verifyDoublePrimitive(index, 5000, 0);
verifyDoublePrimitive(index, 5000.5, 1);
verifyDoublePrimitive(index, 5001, 0);
}
public void testDoubleVariableRangeSize()
{
FilterParamIndexDoubleRange index = makeOne("doublePrimitive", FilterOperator.RANGE_CLOSED, testEventType);
for (int i = 0; i < 100; i++)
{
DoubleRange range = new DoubleRange(new Double(i), new Double(2 * i));
index.put(range, testEvaluator);
}
// 1 to 2
// 2 to 4
// 3 to 6
// and so on
verifyDoublePrimitive(index, 1, 1);
verifyDoublePrimitive(index, 2, 2);
verifyDoublePrimitive(index, 2.001, 1);
verifyDoublePrimitive(index, 3, 2);
verifyDoublePrimitive(index, 4, 3);
verifyDoublePrimitive(index, 4.5, 2);
verifyDoublePrimitive(index, 50, 26);
}
private FilterParamIndexDoubleRange getLongDataset(FilterOperator operatorType)
{
FilterParamIndexDoubleRange index = makeOne("longPrimitive", operatorType, testEventType);
addToIndex(index,0,5);
addToIndex(index,0,6);
addToIndex(index,1,3);
addToIndex(index,1,5);
addToIndex(index,1,7);
addToIndex(index,3,5);
addToIndex(index,3,7);
addToIndex(index,6,9);
addToIndex(index,6,10);
addToIndex(index,6,Integer.MAX_VALUE - 1);
addToIndex(index,7,8);
addToIndex(index,8,9);
addToIndex(index,8,10);
return index;
}
private FilterParamIndexDoubleRange getDoubleDataset(FilterOperator operatorType)
{
FilterParamIndexDoubleRange index = makeOne("doublePrimitive", operatorType, testEventType);
addToIndex(index, 1.5, 2.5);
addToIndex(index, 3.5, 4.5 );
addToIndex(index, 3.5, 9.5);
addToIndex(index, 5.6, 6.7);
return index;
}
private FilterParamIndexDoubleRange makeOne(String fieldName, FilterOperator operatorType, EventType testEventType) {
return new FilterParamIndexDoubleRange(makeLookupable(fieldName), operatorType);
}
private void verifyDoublePrimitive(FilterParamIndexBase index, double testValue, int numExpected)
{
testBean.setDoublePrimitive(testValue);
index.matchEvent(testEventBean, matchesList);
assertEquals(numExpected, testEvaluator.getAndResetCountInvoked());
}
private void verifyLongPrimitive(FilterParamIndexBase index, long testValue, int numExpected)
{
testBean.setLongPrimitive(testValue);
index.matchEvent(testEventBean, matchesList);
assertEquals(numExpected, testEvaluator.getAndResetCountInvoked());
}
private void addToIndex(FilterParamIndexDoubleRange index, double min, double max)
{
DoubleRange r = new DoubleRange(min,max);
index.put(r, testEvaluator);
}
private FilterSpecLookupable makeLookupable(String fieldName) {
return new FilterSpecLookupable(fieldName, testEventType.getGetter(fieldName), testEventType.getPropertyType(fieldName));
}
}