int RTpredicate::Consistent(const GiSTentry& entry) const { RTentry &rtentry = (RTentry &)entry; if (entry.IsLeaf()) { switch (oper) { case RToverlap: return(rtentry.Key().overlap((RTkey)value)); break; case RTcontains: return(rtentry.Key().contain((RTkey)value)); break; case RTcontained: return(rtentry.Key().contained((RTkey)value)); break; case RTEqual: return(rtentry.Key() == ((RTkey)value)); break; case RTNotDisjoint: return(!rtentry.Key().disjoint((RTkey)value)); break; default: assert(0); return (0); break; } } else { switch (oper) { case RToverlap: case RTcontained: return(rtentry.Key().overlap((RTkey)value)); break; case RTcontains: case RTEqual: return(rtentry.Key().contain(((RTkey)value))); break; case RTNotDisjoint: return(!rtentry.Key().disjoint((RTkey)value)); break; default: assert(0); return (0); break; } } }
GiSTentry* GiSTcursor::Next() { GiSTpage page; while (first || !stack.IsEmpty()) { if (first) { page = GiSTRootPage; first = 0; } else { assert(lastlevel >= 0); GiSTentry *entry = stack.RemoveFront(); if (entry->IsLeaf()) return entry; // Pop off the stack for (int i=0; i < entry->Level() - lastlevel; i++) path.MakeParent(); page = entry->Ptr(); delete entry; } // Entry was a pointer to another node path.MakeChild(page); GiSTnode *node = gist.ReadNode(path); lastlevel = node->Level(); GiSTlist<GiSTentry*> list = node->Search(*query); while (!list.IsEmpty()) { GiSTentry *entry = list.RemoveRear(); stack.Prepend(entry); } delete node; } // The search is over... return NULL; }
int PtrPredicate::Consistent (const GiSTentry& entry) const { return !entry.IsLeaf() || entry.Ptr()==page; }