/* *************************************************************************************** * 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.spatial.quadtree.mxciffilterindex; import com.espertech.esper.client.EPException; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTree; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeFactory; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeNodeBranch; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeNodeLeaf; import junit.framework.TestCase; import java.util.List; import static com.espertech.esper.spatial.quadtree.mxcif.SupportMXCIFQuadTreeUtil.navigateBranch; import static com.espertech.esper.spatial.quadtree.mxcif.SupportMXCIFQuadTreeUtil.navigateLeaf; import static com.espertech.esper.spatial.quadtree.mxciffilterindex.MXCIFQuadTreeFilterIndexDelete.delete; import static com.espertech.esper.spatial.quadtree.mxciffilterindex.MXCIFQuadTreeFilterIndexSet.set; import static com.espertech.esper.spatial.quadtree.mxciffilterindex.SupportMXCIFQuadTreeFilterIndexUtil.assertCollect; import static com.espertech.esper.spatial.quadtree.mxciffilterindex.SupportMXCIFQuadTreeFilterIndexUtil.assertCollectAll; import static com.espertech.esper.spatial.quadtree.mxciffilterindex.SupportMXCIFQuadTreeFilterIndexUtil.compare; public class TestMXCIFQuadTreeFilterIndexScenarios extends TestCase { public void testSubdivideAddMany() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 2, 3); set(0, 0, 1, 1, "R1", tree); set(1, 2, 1, 1, "R2", tree); set(3, 2, 1, 1, "R3", tree); assertEquals(3, navigateLeaf(tree, "nw,nw").getCount()); delete(1, 2, 1, 1, tree); delete(0, 0, 1, 1, tree); delete(3, 2, 1, 1, tree); assertCollectAll(tree, ""); } public void testDimension() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(1000, 100000, 9000, 900000); try { set(10, 90, 1, 1, "R1", tree); fail(); } catch (EPException ex) { assertEquals(ex.getMessage(), "Rectangle (10.0,90.0,1.0,1.0) not in {minX=1000.0, minY=100000.0, maxX=10000.0, maxY=1000000.0}"); } try { set(10999999, 90, 1, 1, "R2", tree); fail(); } catch (EPException ex) { // expected } set(5000, 800000, 1, 1, "R3", tree); assertCollect(tree, 0, 0, 10000000, 10000000, "R3"); assertCollect(tree, 4000, 790000, 1200, 11000, "R3"); assertCollect(tree, 4000, 790000, 900, 9000, ""); assertCollectAll(tree, "R3"); } public void testSuperslim() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 1, 100); set(10, 90, 0.1, 0.2, "R1", tree); set(10, 95, 0.3, 0.4, "R2", tree); MXCIFQuadTreeNodeLeaf<Object> ne = navigateLeaf(tree, "sw,sw,sw,ne"); compare(10, 90, 0.1, 0.2, "R1", (XYWHRectangleWValue) ne.getData()); MXCIFQuadTreeNodeLeaf<Object> se = navigateLeaf(tree, "sw,sw,sw,se"); compare(10, 95, 0.3, 0.4, "R2", (XYWHRectangleWValue) se.getData()); } public void testSubdivideMultiChild() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 4, 3); set(60, 11, 1, 1, "R1", tree); set(60, 40, 1, 1, "R2", tree); set(70, 30, 1, 1, "R3", tree); set(60, 10, 1, 1, "R4", tree); set(90, 45, 1, 1, "R5", tree); navigateLeaf(tree, "nw"); navigateLeaf(tree, "se"); navigateLeaf(tree, "sw"); MXCIFQuadTreeNodeBranch<Object> ne = navigateBranch(tree, "ne"); assertEquals(2, ne.getLevel()); MXCIFQuadTreeNodeLeaf<Object> nw = navigateLeaf(ne, "nw"); List<XYWHRectangleWValue> collection = (List<XYWHRectangleWValue>) nw.getData(); compare(60, 11, 1, 1, "R1", collection.get(0)); compare(60, 10, 1, 1, "R4", collection.get(1)); assertEquals(2, nw.getCount()); MXCIFQuadTreeNodeLeaf<Object> se = navigateLeaf(ne, "se"); compare(90, 45, 1, 1, "R5", (XYWHRectangleWValue) se.getData()); assertEquals(1, se.getCount()); MXCIFQuadTreeNodeLeaf<Object> sw = navigateLeaf(ne, "sw"); collection = (List<XYWHRectangleWValue>) sw.getData(); compare(60, 40, 1, 1, "R2", collection.get(0)); compare(70, 30, 1, 1, "R3", collection.get(1)); assertEquals(2, sw.getCount()); delete(60, 11, 1, 1, tree); delete(60, 40, 1, 1, tree); MXCIFQuadTreeNodeLeaf<Object> root = navigateLeaf(tree, ""); collection = (List<XYWHRectangleWValue>) root.getData(); assertEquals(3, root.getCount()); assertEquals(3, collection.size()); compare(60, 10, 1, 1, "R4", collection.get(0)); compare(70, 30, 1, 1, "R3", collection.get(1)); compare(90, 45, 1, 1, "R5", collection.get(2)); } public void testRemoveNonExistent() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 20, 20); delete(10, 61, 1, 1, tree); set(10, 60, 1, 1, "R1", tree); delete(10, 61, 1, 1, tree); set(10, 80, 1, 1, "R2", tree); set(20, 70, 1, 1, "R3", tree); set(10, 80, 1, 1, "R4", tree); assertCollectAll(tree, "R1,R3,R4"); assertEquals(3, navigateLeaf(tree, "").getCount()); assertEquals(3, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, "R1,R3,R4"); delete(10, 61, 1, 1, tree); assertEquals(3, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, "R1,R3,R4"); delete(9, 60, 1, 1, tree); delete(10, 80, 1, 1, tree); assertEquals(2, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, "R1,R3"); delete(9, 60, 1, 1, tree); delete(10, 80, 1, 1, tree); delete(10, 60, 1, 1, tree); assertEquals(1, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, "R3"); delete(20, 70, 1, 1, tree); assertEquals(0, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, ""); } public void testSubdivideSingleMerge() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 3, 2); set(65, 75, 1, 1, "R1", tree); set(81, 60, 1, 1, "R2", tree); set(80, 60, 1, 1, "R3", tree); set(80, 61, 1, 1, "R4", tree); assertCollect(tree, 60, 60, 20.5, 20.5, "R1,R3,R4"); assertCollectAll(tree, "R1,R2,R3,R4"); assertFalse(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf); assertEquals(4, navigateLeaf(tree, "se").getCount()); List<XYWHRectangleWValue> collection = (List<XYWHRectangleWValue>) navigateLeaf(tree, "se").getData(); assertEquals(4, collection.size()); compare(65, 75, 1, 1, "R1", collection.get(0)); compare(81, 60, 1, 1, "R2", collection.get(1)); compare(80, 60, 1, 1, "R3", collection.get(2)); compare(80, 61, 1, 1, "R4", collection.get(3)); set(66, 78, 1, 1, "R5", tree); delete(65, 75, 1, 1, tree); delete(80, 60, 1, 1, tree); assertEquals(3, navigateLeaf(tree, "se").getCount()); assertCollectAll(tree, "R2,R4,R5"); assertEquals(3, collection.size()); compare(81, 60, 1, 1, "R2", collection.get(0)); compare(80, 61, 1, 1, "R4", collection.get(1)); compare(66, 78, 1, 1, "R5", collection.get(2)); delete(66, 78, 1, 1, tree); assertCollectAll(tree, "R2,R4"); assertEquals(2, navigateLeaf(tree, "").getCount()); collection = (List<XYWHRectangleWValue>) navigateLeaf(tree, "").getData(); assertEquals(2, collection.size()); compare(81, 60, 1, 1, "R2", collection.get(0)); compare(80, 61, 1, 1, "R4", collection.get(1)); } public void testSubdivideMerge() { MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 3, 2); assertEquals(1, tree.getRoot().getLevel()); set(10, 10, 0.01, 0.01, "R1", tree); set(9.9, 10, 0.01, 0.01,"R2", tree); set(10, 9.9, 0.01, 0.01,"R3", tree); set(10, 10, 0.01, 0.01,"R4", tree); set(10, 9.9, 0.01, 0.01,"R5", tree); set(9.9, 10, 0.01, 0.01,"R6", tree); assertTrue(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf); assertCollect(tree, 9, 10, 1, 1, "R4,R6"); assertCollect(tree, 10, 9, 1, 1, "R4,R5"); assertCollect(tree, 10, 10, 1, 1, "R4"); assertCollect(tree, 9, 9, 2, 2, "R4,R5,R6"); assertCollectAll(tree, "R4,R5,R6"); set(10, 10, 0.01, 0.01,"R7", tree); assertTrue(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf); set(9.9, 9.9, 0.01, 0.01,"R8", tree); assertFalse(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf); assertEquals(1, tree.getRoot().getLevel()); assertEquals(4, navigateLeaf(tree, "nw").getCount()); List<XYWHRectangleWValue> collection = (List<XYWHRectangleWValue>) navigateLeaf(tree, "nw").getData(); assertEquals(4, collection.size()); compare(10, 10, 0.01, 0.01, "R7", collection.get(0)); compare(9.9, 10, 0.01, 0.01, "R6", collection.get(1)); compare(10, 9.9, 0.01, 0.01, "R5", collection.get(2)); compare(9.9, 9.9, 0.01, 0.01, "R8", collection.get(3)); assertCollect(tree, 9, 10, 1, 1, "R6,R7"); assertCollect(tree, 10, 9, 1, 1, "R5,R7"); assertCollect(tree, 10, 10, 1, 1, "R7"); assertCollect(tree, 9, 9, 2, 2, "R5,R6,R7,R8"); assertCollectAll(tree, "R5,R6,R7,R8"); set(9.9, 10, 0.01, 0.01, "R9", tree); set(10, 9.9, 0.01, 0.01, "R10", tree); set(10, 10, 0.01, 0.01, "R11", tree); set(10, 10, 0.01, 0.01, "R12", tree); set(10, 10, 0.01, 0.01, "R13", tree); assertEquals(4, navigateLeaf(tree, "nw").getCount()); assertEquals(2, navigateLeaf(tree, "nw").getLevel()); assertEquals(4, collection.size()); compare(10, 10, 0.01, 0.01, "R13", collection.get(0)); compare(9.9, 10, 0.01, 0.01, "R9", collection.get(1)); compare(10, 9.9, 0.01, 0.01, "R10", collection.get(2)); compare(9.9, 9.9, 0.01, 0.01, "R8", collection.get(3)); assertCollect(tree, 9, 10, 1, 1, "R9,R13"); assertCollect(tree, 10, 9, 1, 1, "R10,R13"); assertCollect(tree, 10, 10, 1, 1, "R13"); assertCollect(tree, 9, 9, 2, 2, "R8,R9,R10,R13"); delete(9.9, 10, 0.01, 0.01, tree); delete(10, 9.9, 0.01, 0.01, tree); delete(10, 9.9, 0.01, 0.01, tree); delete(10, 9.9, 0.01, 0.01, tree); assertCollect(tree, 9, 10, 1, 1, "R13"); assertCollect(tree, 10, 9, 1, 1, "R13"); assertCollect(tree, 10, 10, 1, 1, "R13"); assertCollect(tree, 9, 9, 2, 2, "R8,R13"); assertCollectAll(tree, "R8,R13"); assertEquals(2, navigateLeaf(tree, "").getCount()); collection = (List<XYWHRectangleWValue>) navigateLeaf(tree, "").getData(); assertEquals(2, collection.size()); compare(10, 10, 0.01, 0.01, "R13", collection.get(0)); compare(9.9, 9.9, 0.01, 0.01, "R8", collection.get(1)); delete(9.9, 9.9, 0.01, 0.01, tree); delete(10, 10, 0.01, 0.01, tree); assertTrue(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf); assertEquals(0, navigateLeaf(tree, "").getCount()); assertCollectAll(tree, ""); } }