GiSTentry * MTnode::Union () const { Object *objTemp = NULL; if (!obj) { // retrieve the node's parent object MTentry *parentEntry = ParentEntry (); ((MTnode *)this)->obj = (objTemp = new Object(parentEntry->object())); delete parentEntry; } GiSTpath path = ((MTnode *)this)->Path(); MTentry *unionEntry = new MTentry; unionEntry->InitKey(); if (path.Level() > 1) { // len>=3 MTentry *parentEntry = ParentEntry (); if (parentEntry) { // copy the entry unionEntry->Key()->distance = parentEntry->Key()->distance; if (parentEntry->Key()->splitted) { unionEntry->Key()->splitted = TRUE; } delete parentEntry; } if (unionEntry->Key()->distance == -MaxDist()) { // compute the distance from the parent MTnode *parentNode = ((MT *)Tree())->ParentNode((MTnode *)this); MTentry *grandEntry = parentNode->ParentEntry(); unionEntry->Key()->distance = obj->distance(grandEntry->object()); unionEntry->Key()->splitted = TRUE; delete grandEntry; delete parentNode; } } unionEntry->SetObject(*obj); unionEntry->SetMaxRadius(0); unionEntry->SetMinRadius(MAXDOUBLE); mMRadius (unionEntry); // compute the radii if (objTemp) { delete objTemp; } ((MTnode *)this)->obj = NULL; return unionEntry; }
GiSTentry * MTnode::Union() const { GiSTpath path=((MTnode *)this)->Path(); MTentry *u=new MTentry; Object *o=NULL; u->InitKey(); if(obj==NULL) { // retrieve the node's object MTentry *e=Entry(); ((MTnode *)this)->obj=(o=new Object(e->object())); delete e; } if(path.Level()>1) { // if we aren't in the root... MTnode *parent=((MT *)Tree())->ParentNode((MTnode *)this); MTentry *e=Entry(); if(e!=NULL) { // copy the entry u->Key()->distance=e->Key()->distance; if(e->Key()->splitted) u->Key()->recomp=TRUE; delete e; } if(u->Key()->distance<0) { // compute the distance from the parent MTentry *fe=parent->Entry(); if(u->Key()->distance==-maxDist()) u->Key()->distance=obj->distance(fe->object()); u->Key()->recomp=TRUE; delete fe; } delete parent; } u->setobject(*obj); u->setmaxradius(0); u->setminradius(MAXDOUBLE); mMRadius(u); // compute the radii if(o!=NULL) delete o; ((MTnode *)this)->obj=NULL; return u; }