Exemple #1
0
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;
}
Exemple #2
0
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;
}