/*
***************************************************************************************
* 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.mxcifrowindex;
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.mxcifrowindex.SupportMXCIFQuadTreeRowIndexUtil.*;
public class TestMXCIFQuadTreeRowIndexScenarios extends TestCase {
public void testSubdivideAdd() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 2, 3);
addNonUnique(tree, 0, 0, 10, 10, "R1");
addNonUnique(tree, 0, 0, 10, 10, "R2");
addNonUnique(tree, 0, 0, 10, 10, "R3");
assertEquals(3, navigateLeaf(tree, "nw,nw").getCount());
}
public void testDimension() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(1000, 100000, 9000, 900000);
assertFalse(addNonUnique(tree, 10, 90, 1, 1, "R1"));
assertFalse(addNonUnique(tree, 10999999, 90, 1, 1, "R2"));
assertTrue(addNonUnique(tree, 5000, 800000, 1, 1, "R3"));
assertFound(tree, 0, 0, 10000000, 10000000, "R3");
assertFound(tree, 4000, 790000, 1200, 11000, "R3");
assertFound(tree, 4000, 790000, 900, 9000, "");
}
public void testSuperslim() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 1, 100);
addNonUnique(tree, 10, 90, 1, 1, "R1");
addNonUnique(tree, 10, 95, 1, 1, "R2");
MXCIFQuadTreeNodeLeaf<Object> ne = navigateLeaf(tree, "sw,sw,sw,ne");
compare(10, 90, 1, 1, "R1", (XYWHRectangleMultiType) ne.getData());
MXCIFQuadTreeNodeLeaf<Object> se = navigateLeaf(tree, "sw,sw,sw,se");
compare(10, 95, 1, 1, "R2", (XYWHRectangleMultiType) se.getData());
}
public void testSubdivideMultiChild() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 4, 3);
addNonUnique(tree, 60, 10, 1, 1, "R1");
addNonUnique(tree, 60, 40, 1, 1, "R2");
addNonUnique(tree, 70, 30, 1, 1, "R3");
addNonUnique(tree, 60, 10, 1, 1, "R4");
addNonUnique(tree, 90, 45, 1, 1, "R5");
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");
compare(60, 10, 1, 1, "[R1, R4]", (XYWHRectangleMultiType) nw.getData());
assertEquals(2, nw.getCount());
MXCIFQuadTreeNodeLeaf<Object> se = navigateLeaf(ne, "se");
compare(90, 45, 1, 1, "R5", (XYWHRectangleMultiType) se.getData());
assertEquals(1, se.getCount());
MXCIFQuadTreeNodeLeaf<Object> sw = navigateLeaf(ne, "sw");
List<XYWHRectangleMultiType> collection = (List<XYWHRectangleMultiType>) sw.getData();
compare(60, 40, 1, 1, "R2", collection.get(0));
compare(70, 30, 1, 1, "R3", collection.get(1));
assertEquals(2, sw.getCount());
remove(tree, 60, 10, 1, 1, "R1");
remove(tree, 60, 40, 1, 1, "R2");
MXCIFQuadTreeNodeLeaf<Object> root = navigateLeaf(tree, "");
collection = (List<XYWHRectangleMultiType>) 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);
remove(tree, 10, 61, 1, 1, "R1");
addNonUnique(tree, 10, 60, 1, 1, "R1");
remove(tree, 10, 61, 1, 1, "R1");
remove(tree, 10, 60, 2, 1, "R1");
remove(tree, 10, 60, 1, 2, "R1");
remove(tree, 11, 60, 1, 1, "R1");
addNonUnique(tree, 10, 80, 1, 1, "R2");
addNonUnique(tree, 20, 70, 1, 1, "R3");
addNonUnique(tree, 10, 80, 1, 1, "R4");
assertEquals(4, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3,R4");
remove(tree, 10, 61, 1, 1, "R1");
remove(tree, 9, 60, 1, 1, "R1");
remove(tree, 10, 60, 1, 1, "R2");
remove(tree, 10, 80, 1, 1, "R1");
assertEquals(4, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3,R4");
remove(tree, 10, 80, 1, 1, "R4");
assertEquals(3, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3");
remove(tree, 10, 80, 1, 1, "R2");
assertEquals(2, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "R1,R3");
remove(tree, 10, 60, 1, 1, "R1");
assertEquals(1, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "R3");
remove(tree, 20, 70, 1, 1, "R3");
assertEquals(0, navigateLeaf(tree, "").getCount());
assertFound(tree, 10, 60, 10000, 10000, "");
}
public void testSubdivideSingleMerge() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 3, 2);
addNonUnique(tree, 65, 75, 1, 1, "P1");
addNonUnique(tree, 80, 75, 1, 1, "P2");
addNonUnique(tree, 80, 60, 1, 1, "P3");
addNonUnique(tree, 80, 60, 1, 1, "P4");
assertFound(tree, 60, 60, 21, 21, "P1,P2,P3,P4");
assertFalse(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf);
assertEquals(4, navigateLeaf(tree, "se").getCount());
List<XYWHRectangleMultiType> collection = (List<XYWHRectangleMultiType>) navigateLeaf(tree, "se").getData();
assertEquals(3, collection.size());
compare(65, 75, 1, 1, "P1", collection.get(0));
compare(80, 75, 1, 1, "P2", collection.get(1));
compare(80, 60, 1, 1, "[P3, P4]", collection.get(2));
addNonUnique(tree, 66, 78, 1, 1, "P5");
remove(tree, 65, 75, 1, 1, "P1");
remove(tree, 80, 60, 1, 1, "P3");
assertEquals(3, navigateLeaf(tree, "se").getCount());
assertFound(tree, 60, 60, 21, 21, "P2,P4,P5");
assertEquals(3, collection.size());
compare(80, 75, 1, 1, "P2", collection.get(0));
compare(80, 60, 1, 1, "[P4]", collection.get(1));
compare(66, 78, 1, 1, "P5", collection.get(2));
remove(tree, 66, 78, 1, 1, "P5");
assertFound(tree, 60, 60, 21, 21, "P2,P4");
assertEquals(2, navigateLeaf(tree, "").getCount());
collection = (List<XYWHRectangleMultiType>) navigateLeaf(tree, "").getData();
assertEquals(2, collection.size());
compare(80, 75, 1, 1, "P2", collection.get(0));
compare(80, 60, 1, 1, "[P4]", collection.get(1));
}
public void testSubdivideMultitypeMerge() {
MXCIFQuadTree<Object> tree = MXCIFQuadTreeFactory.make(0, 0, 100, 100, 6, 2);
assertEquals(1, tree.getRoot().getLevel());
addNonUnique(tree, 10, 10, 0, 0,"P1");
addNonUnique(tree, 9.9, 10, 0, 0,"P2");
addNonUnique(tree, 10, 9.9, 0, 0,"P3");
addNonUnique(tree, 10, 10, 0, 0,"P4");
addNonUnique(tree, 10, 9.9, 0, 0,"P5");
addNonUnique(tree, 9.9, 10, 0, 0,"P6");
assertTrue(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf);
assertFound(tree, 9, 10, 0.99, 0.99, "P2,P6");
assertFound(tree, 10, 9, 0.99, 0.99, "P3,P5");
assertFound(tree, 10, 10, 0, 0,"P1,P4");
assertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6");
addNonUnique(tree, 10, 10, 0, 0,"P7");
assertFalse(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf);
assertEquals(1, tree.getRoot().getLevel());
assertEquals(7, navigateLeaf(tree, "nw").getCount());
List<XYWHRectangleMultiType> collection = (List<XYWHRectangleMultiType>) navigateLeaf(tree, "nw").getData();
assertEquals(3, collection.size());
compare(10, 10, 0, 0,"[P1, P4, P7]", collection.get(0));
compare(9.9, 10, 0, 0,"[P2, P6]", collection.get(1));
compare(10, 9.9, 0, 0,"[P3, P5]", collection.get(2));
assertFound(tree, 9, 10, 0.99, 0.99,"P2,P6");
assertFound(tree, 10, 9, 0.99, 0.99,"P3,P5");
assertFound(tree, 10, 10, 0, 0,"P1,P4,P7");
assertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6,P7");
addNonUnique(tree, 9.9, 10, 0, 0,"P8");
addNonUnique(tree, 10, 9.9, 0, 0,"P9");
addNonUnique(tree, 10, 10, 0, 0,"P10");
addNonUnique(tree, 10, 10, 0, 0,"P11");
addNonUnique(tree, 10, 10, 0, 0,"P12");
assertEquals(12, navigateLeaf(tree, "nw").getCount());
assertEquals(2, navigateLeaf(tree, "nw").getLevel());
assertEquals(3, collection.size());
compare(10, 10, 0, 0,"[P1, P4, P7, P10, P11, P12]", collection.get(0));
compare(9.9, 10, 0, 0,"[P2, P6, P8]", collection.get(1));
compare(10, 9.9, 0, 0,"[P3, P5, P9]", collection.get(2));
assertFound(tree, 9, 10, 0.99, 0.99,"P2,P6,P8");
assertFound(tree, 10, 9, 0.99, 0.99,"P3,P5,P9");
assertFound(tree, 10, 10, 1, 1,"P1,P4,P7,P10,P11,P12");
assertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12");
remove(tree, 9.9, 10, 0, 0,"P8");
remove(tree, 10, 9.9, 0, 0,"P3");
remove(tree, 10, 9.9, 0, 0,"P5");
remove(tree, 10, 9.9, 0, 0,"P9");
assertFound(tree, 9, 10, 0.99, 0.99,"P2,P6");
assertFound(tree, 10, 9, 0.99, 0.99,"");
assertFound(tree, 10, 10, 1, 1,"P1,P4,P7,P10,P11,P12");
assertFound(tree, 9, 9, 2, 2, "P1,P2,P4,P6,P7,P10,P11,P12");
assertEquals(8, navigateLeaf(tree, "nw").getCount());
assertEquals(2, collection.size());
compare(10, 10, 0, 0,"[P1, P4, P7, P10, P11, P12]", collection.get(0));
compare(9.9, 10, 0, 0,"[P2, P6]", collection.get(1));
assertFalse(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf);
remove(tree, 9.9, 10, 0, 0,"P2");
remove(tree, 10, 10, 0, 0,"P1");
remove(tree, 10, 10, 0, 0,"P10");
assertTrue(tree.getRoot() instanceof MXCIFQuadTreeNodeLeaf);
assertEquals(5, navigateLeaf(tree, "").getCount());
collection = (List<XYWHRectangleMultiType>) navigateLeaf(tree, "").getData();
assertEquals(2, collection.size());
compare(10, 10, 0, 0,"[P4, P7, P11, P12]", collection.get(0));
compare(9.9, 10, 0, 0,"[P6]", collection.get(1));
assertFound(tree, 9, 10, 0.99, 0.99,"P6");
assertFound(tree, 10, 9, 0.99, 0.99,"");
assertFound(tree, 10, 10, 1, 1,"P4,P7,P11,P12");
assertFound(tree, 9, 9, 2, 2, "P4,P6,P7,P11,P12");
}
}