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; }