/* ---- This file is part of SECONDO. Copyright (C) 2004, University in Hagen, Department of Computer Science, Database Systems for New Applications. SECONDO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. SECONDO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with SECONDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---- //paragraph [1] Title: [{\Large \bf \begin{center}] [\end{center}}] //paragraph [10] Footnote: [{\footnote{] [}}] //[->] [$\rightarrow$] //[TOC] [\tableofcontents] //[_] [\_] RTree-Class Implementation */ #include #include #include #include #include #include #include #include #include #include #include #include "Algebra.h" #include "SecondoSystem.h" #include "SecondoCatalog.h" #include "NestedList.h" #include "NList.h" #include "QueryProcessor.h" #include "AlgebraManager.h" #include "StandardTypes.h" #include "Algebras/Relation-C++/RelationAlgebra.h" #include "DateTime.h" #include "Algebras/TupleIdentifier/TupleIdentifier.h" #include "Progress.h" #include "Algebras/FText/FTextAlgebra.h" #include "ListUtils.h" #include "NList.h" #include "Algebras/Standard-C++/LongInt.h" #include "Algebras/Rectangle/RectangleAlgebra.h" #include "RTreeIterator.h" #include "BPTree/BPTree.h" #include "WinUnix.h" #include #include #include using namespace std; extern NestedList* nl; extern QueryProcessor *qp; extern AlgebraManager *am; //Implementation of R-Tree for portable Index namespace fialgebra{ template RTreeIterator::RTreeIterator(RTree* rtree, Rectangle rectArg){ rt = rtree; rect = rectArg; pathStack.clear(); } template RTreeIterator::~RTreeIterator(){ if (rt) delete rt; pathStack.clear(); } template size_t RTreeIterator::Search(){ RTreeNode *actualNode; unsigned int sonPos; size_t id; actualNode = NULL; //fangen am Wurzel des Baums an if(pathStack.empty()){ actualNode = rt->ReadNode(rt->GetHeader()->GetRoot()); sonPos = 0; } //oder am letzten Element in Stack else{ //hole den Element und die Position des zuletz betrachteten Sohnes id = pathStack.back().first; actualNode = rt->ReadNode(id); sonPos = pathStack.back().second; //löschen Eintrag aus dem Stack pathStack.pop_back(); //schauen den nächsten Eintrag an sonPos++; } //Suchen, bis der letzte Sohn des Wurzels erreicht wird while(true){ if(sonPos < actualNode->GetNumberOfEntries()){ //falls eine Schneidung gibt's if(actualNode->GetValueAt(sonPos).Intersects(rect)){ //speichere die Knote und Position des Sohnes im Stack id = actualNode->GetNodeID(); pathStack.push_back(std::make_pair(id, sonPos)); id = actualNode->GetIDAt(sonPos); bool isLeaf = actualNode->IsLeaf(); delete actualNode; if(isLeaf){ //Falls es ein Blatt ist, gebe TID zurück return id; } else{ //gehe ein Level runter actualNode = rt->ReadNode(id); sonPos = 0; } } else{ //es gibt keine Schneidung sonPos++; } } //Falls alle Einträge in Knote untersucht wurden else{ if(pathStack.empty()){ //Falls es ein Wurzel war, Suche ist beendet delete actualNode; return 0; } else{ //Sonst gehe Level höher und suche weiter //hole den Element und die Position des Sohnes von Elternknote delete actualNode; id = pathStack.back().first; actualNode = rt->ReadNode(id); sonPos = pathStack.back().second; //löschen Eintrag aus dem Stack pathStack.pop_back(); //schauen den nächsten Eintrag an sonPos++; } } } delete actualNode; return 0; } template class RTreeIterator<1>; template class RTreeIterator<2>; template class RTreeIterator<3>; template class RTreeIterator<4>; template class RTreeIterator<8>; }//end of namespace fialgebra