/* *************************************************************************************** * 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.pointregion.PointRegionQuadTree; import com.espertech.esper.spatial.quadtree.pointregion.PointRegionQuadTreeFactory; import com.espertech.esper.spatial.quadtree.pointregion.XYPoint; import com.espertech.esper.spatial.quadtree.prqdfilterindex.*; import java.util.Collection; import java.util.concurrent.locks.ReadWriteLock; public class FilterParamIndexQuadTreePointRegion extends FilterParamIndexLookupableBase { private final ReadWriteLock readWriteLock; private final PointRegionQuadTree<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 FilterParamIndexQuadTreePointRegion(ReadWriteLock readWriteLock, FilterSpecLookupable lookupable) { super(FilterOperator.ADVANCED_INDEX, lookupable); this.readWriteLock = readWriteLock; this.advancedIndex = (FilterSpecLookupableAdvancedIndex) lookupable; AdvancedIndexConfigContextPartitionQuadTree quadTreeConfig = advancedIndex.getQuadTreeConfig(); quadTree = PointRegionQuadTreeFactory.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(); PointRegionQuadTreeFilterIndexCollect.collectRange(quadTree, x, y, width, height, theEvent, matches, COLLECTOR); } public EventEvaluator get(Object filterConstant) { XYPoint point = (XYPoint) filterConstant; return PointRegionQuadTreeFilterIndexGet.get(point.getX(), point.getY(), quadTree); } public void put(Object filterConstant, EventEvaluator evaluator) { XYPoint point = (XYPoint) filterConstant; PointRegionQuadTreeFilterIndexSet.set(point.getX(), point.getY(), evaluator, quadTree); } public void remove(Object filterConstant) { XYPoint point = (XYPoint) filterConstant; PointRegionQuadTreeFilterIndexDelete.delete(point.getX(), point.getY(), quadTree); } public int sizeExpensive() { return PointRegionQuadTreeFilterIndexCount.count(quadTree); } public boolean isEmpty() { return PointRegionQuadTreeFilterIndexEmpty.isEmpty(quadTree); } public ReadWriteLock getReadWriteLock() { return readWriteLock; } }