MyItr * Table::index_find(int op, string key_to_btree, Tuple to_find ) { //cout << op << endl; map<string, BTree*>::iterator map_itr = keys.find( key_to_btree ); MyItr * itr = NULL; //tuples.push_back( myItr->first() ); // get the headers // if there is not index for the column, should never happen if ( map_itr == keys.end() ) { return NULL; } BTree * btree = map_itr->second; if ( op == OP_EQUAL ) { //cout << "euql " << endl; BTreeNode * node = btree->find( to_find ); if ( node == NULL ) return NULL; for ( int i = 0; i < node->getCount(); i++ ) { if ( to_find == ( (LeafNode *) node )->get_values()[i] ) { vector<streampos> offset = ( (LeafNode *) node )->get_values()[i].offset; //cout << offset.size() << endl; itr = index_fetch( offset ); } } } else if ( op == OP_LEQ ) { BTreeNode * node = btree->find_leq( to_find ); if ( node == NULL ) return NULL; BTreeNode * cur_node = node; vector<string> tuples; myItr->open(); tuples.push_back( myItr->first() ); myItr->close(); itr = new MyItr( name, tuples ); while( node ) { for ( int i = node->getCount() - 1; i >= 0; i-- ) { if ( ( (LeafNode *) node )->get_values()[i] <= to_find) { vector<streampos> offset = ( (LeafNode *) node )->get_values()[i].offset; *itr += *( index_fetch( offset ) ); } } node = node->getLeftSibling(); } } else if ( op == OP_LT ) { BTreeNode * node = btree->find_leq( to_find ); if ( node == NULL ) return NULL; BTreeNode * cur_node = node; vector<string> tuples; myItr->open(); tuples.push_back( myItr->first() ); myItr->close(); itr = new MyItr( name, tuples ); //cout << " at least here" << endl; while( node ) { for ( int i = node->getCount() - 1; i >= 0; i-- ) { if ( ( (LeafNode *) node )->get_values()[i] < to_find) { vector<streampos> offset = ( (LeafNode *) node )->get_values()[i].offset; *itr += *( index_fetch( offset ) ); } } node = node->getLeftSibling(); } } else if ( op == OP_GEQ ) { BTreeNode * node = btree->find_geq( to_find ); if ( node == NULL ) return NULL; BTreeNode * cur_node = node; vector<string> tuples; myItr->open(); tuples.push_back( myItr->first() ); myItr->close(); itr = new MyItr( name, tuples ); //cout << " at least here" << endl; while( node ) { for ( int i = 0; i < node->getCount(); i++ ) { if ( ( (LeafNode *) node )->get_values()[i] >= to_find) { vector<streampos> offset = ( (LeafNode *) node )->get_values()[i].offset; *itr += *( index_fetch( offset ) ); } } node = node->getRightSibling(); } } else if ( op == OP_GT ) { //cout << "GT" << endl; BTreeNode * node = btree->find_geq( to_find ); if ( node == NULL ) return NULL; BTreeNode * cur_node = node; vector<string> tuples; myItr->open(); tuples.push_back( myItr->first() ); myItr->close(); itr = new MyItr( name, tuples ); //cout << " at least here" << endl; //cout << node << endl; while( node ) { for ( int i = 0; i < node->getCount(); i++ ) { if ( ( (LeafNode *) node )->get_values()[i] > to_find) { vector<streampos> offset = ( (LeafNode *) node )->get_values()[i].offset; *itr += *( index_fetch( offset ) ); } } node = node->getRightSibling(); } } else { cerr << "Error in Table::index_find(): should never be here." << endl; return NULL; } return itr; }
BTreeNode* InternalNode::remove(int value) { // to be written by students BTreeNode* ptr; // int pos = Position(value); int pos; for(pos = count -1; pos > 0 && keys[pos] > value; pos--); BTreeNode* random = children[pos]->remove(value); if(random != NULL) { BTreeNode* hey = random; if (hey->getCount() == internalSize) return hey; delete random; int temp_zero_location; for (int i = 0; i < count; i++) { if (keys[i] == 0) { temp_zero_location = i; } } for (int j = temp_zero_location; j < count; j++) { keys[j] = keys[j+1]; children[j] = children[j+1]; } count--; if(parent) { parent->resetMinimum(this); } if (count < (internalSize+1)/2)// && parent != NULL) { //borrow from left sibling // ((InternalNode*)leftSibling); if(((InternalNode*)leftSibling)) { //If Left sibling is there if(((InternalNode*)leftSibling)->getCount()-1 < (internalSize+1)/2) { for (int i = (count -1); i >= 0; i--) { ((InternalNode*)leftSibling)->insert(children[i]); } ((InternalNode*)leftSibling)->setRightSibling(((InternalNode*)rightSibling)); return ((InternalNode*)leftSibling); } } // else{ // } // ((InternalNode*)rightSibling); else if(((InternalNode*)rightSibling)) { if((((InternalNode*)rightSibling)->getCount()-1) < (internalSize+1)/2) { for (int i = (count - 1); i >= 0; i--) { ((InternalNode*)rightSibling)->insert(children[i]); } BTreeNode* temp = this->getRightSibling(); temp->setLeftSibling(((InternalNode*)leftSibling)); return temp; // else{ } } } } if (count == 1) { children[0]->setParent(NULL); return children[0]; } return NULL; }