/* Copyright (C) 2010 by The Regents of the University of California Redistribution of this file is permitted under the terms of the BSD license. Date: 11/01/2009 Author: Sattam Alsubaiee */ #include "storage.h" #include "util.h" #include #include #include #include namespace rstartree { typedef unsigned char byte; const unsigned BRANCH_FACTOR = 32; const double REINSERT_FACTOR = 0.3; const double SPLIT_FACTOR = 0.4; const unsigned NEAR_MINIMUM_OVERLAP_FACTOR = 32; class Node: public Buffer { public: // the node's level in the tree, level 0 is the leaf level unsigned level; // number of entries in the node unsigned numChildren; Rectangle mbr; // node's entries Object objects[BRANCH_FACTOR]; // check whether the node is a leaf node or not bool isLeaf() const { return level == 0; }; }; class RTree { protected: Storage *storage; size_t nodeSize; unsigned branchFactor; double fillFactor; // the implementation of the r*-tree insert function void insertData(const Object &obj, unsigned desiredLevel, byte *overflowArray); // the implementation of the r*-tree delete function bool deleteData(const Object &obj, stack &path, unsigned id); // r*-tree reinsert function void reinsert(Node *node, stack path, unsigned desiredLevel, unsigned position, byte *overflowArray); // r*-tree split function void split(Node *node, Object &a, Object &b); // delete an object from a node void deleteObject(Node *node, unsigned id); // condense the tree after a deletetion void condenseTree(Node* node, stack &path, stack &needReinsertion); // adjust the MBR for a node after r*-tree split void adjustNode(Node *node, Object &a, vector &entries, unsigned startIndex, unsigned endIndex); // adjust the MBR for a node after r*-tree split void adjustNode(Node *node); // the implementation of range query function for both r-tree and r*-tree void rangeQuery(vector &objects, const Rectangle &range, unsigned id); bool retrieve(unordered_set &ids, unsigned oid, unsigned id); public: unsigned nodeNum; RTree(Storage *storage); // create r*-tree void create(unsigned bf, double ff); // r*-tree insert function void insertData(const Object &obj); // r*-tree delete function void deleteData(const Object &obj); // range query function for both r-tree and r*-tree void rangeQuery(vector &objects, const Rectangle &range); // top k nearest neighbour function for both r-tree and r*-tree void kNNQuery(multimap &objects, const Point &point, unsigned k); void retrieve(unordered_set &ids, unsigned oid); }; } // end of namespace