/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* 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.epl.index.quadtree.AdvancedIndexConfigContextPartitionQuadTree;
import com.espertech.esper.spatial.quadtree.core.QuadTreeCollector;
import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTree;
import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeFactory;
import com.espertech.esper.spatial.quadtree.mxcif.XYWHRectangle;
import com.espertech.esper.spatial.quadtree.mxciffilterindex.*;
import java.util.Collection;
import java.util.concurrent.locks.ReadWriteLock;
public class FilterParamIndexQuadTreeMXCIF extends FilterParamIndexLookupableBase {
private final ReadWriteLock readWriteLock;
private final MXCIFQuadTree<Object> quadTree;
private final FilterSpecLookupableAdvancedIndex advancedIndex;
private final static QuadTreeCollector<EventEvaluator, Collection<FilterHandle>> COLLECTOR = new QuadTreeCollector<EventEvaluator, Collection<FilterHandle>>() {
public void collectInto(EventBean event, EventEvaluator eventEvaluator, Collection<FilterHandle> c) {
eventEvaluator.matchEvent(event, c);
}
};
public FilterParamIndexQuadTreeMXCIF(ReadWriteLock readWriteLock, FilterSpecLookupable lookupable) {
super(FilterOperator.ADVANCED_INDEX, lookupable);
this.readWriteLock = readWriteLock;
this.advancedIndex = (FilterSpecLookupableAdvancedIndex) lookupable;
AdvancedIndexConfigContextPartitionQuadTree quadTreeConfig = advancedIndex.getQuadTreeConfig();
quadTree = MXCIFQuadTreeFactory.make(quadTreeConfig.getX(), quadTreeConfig.getY(), quadTreeConfig.getWidth(), quadTreeConfig.getHeight());
}
public void matchEvent(EventBean theEvent, Collection<FilterHandle> matches) {
double x = ((Number) advancedIndex.getX().get(theEvent)).doubleValue();
double y = ((Number) advancedIndex.getY().get(theEvent)).doubleValue();
double width = ((Number) advancedIndex.getWidth().get(theEvent)).doubleValue();
double height = ((Number) advancedIndex.getHeight().get(theEvent)).doubleValue();
MXCIFQuadTreeFilterIndexCollect.collectRange(quadTree, x, y, width, height, theEvent, matches, COLLECTOR);
}
public EventEvaluator get(Object filterConstant) {
XYWHRectangle rect = (XYWHRectangle) filterConstant;
return MXCIFQuadTreeFilterIndexGet.get(rect.getX(), rect.getY(), rect.getW(), rect.getH(), quadTree);
}
public void put(Object filterConstant, EventEvaluator evaluator) {
XYWHRectangle rect = (XYWHRectangle) filterConstant;
MXCIFQuadTreeFilterIndexSet.set(rect.getX(), rect.getY(), rect.getW(), rect.getH(), evaluator, quadTree);
}
public void remove(Object filterConstant) {
XYWHRectangle rect = (XYWHRectangle) filterConstant;
MXCIFQuadTreeFilterIndexDelete.delete(rect.getX(), rect.getY(), rect.getW(), rect.getH(), quadTree);
}
public int sizeExpensive() {
return MXCIFQuadTreeFilterIndexCount.count(quadTree);
}
public boolean isEmpty() {
return MXCIFQuadTreeFilterIndexEmpty.isEmpty(quadTree);
}
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
}