Exemplo n.º 1
0
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;
    }
  }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
int PtrPredicate::Consistent (const GiSTentry& entry) const
{
	return !entry.IsLeaf() || entry.Ptr()==page;
}