// Return a relation of tuples that satisfy the conditions. The new relation // is stored in the result data member. Relation Database::selection( vector<Condition> conditions, Relation* targetRelation ) { result.clear( ); // Set up the list of conditions. ConditionList cl = ConditionList( conditions, targetRelation ); // Find the tuples in the relation that satisfy the conditions and add // them to the new relation. for ( int i = 0; i < targetRelation->getNumTuples( ); i++ ){ if ( cl.evalOnTuple( i ) ){ vector<Entry*> newRow; // Find the columns that satify the conditions and create // a tuple out of them for ( int j = 0; j < targetRelation->attributeSize( ); j++ ){ newRow.push_back( new Entry( *targetRelation->getRow( i ).at( j ) ) ); } // Add the newly created tuple to the new relation. result.addRow( newRow ); } } result.setAttributes( targetRelation->getAttributes( ) ); result.setKeys( targetRelation->getKeys() ); return result; }
// Updates all of the entries in a relation that meet the specified condition Relation* Database::update( string relationName, vector<string> attributeNames, vector<Entry> newVals, vector<Condition> conditions ) { Relation* targetRelation = findRelation( relationName ); vector<string> targetAttNames = targetRelation->getAttributeNames( ); vector<int> targetIndeces; for ( unsigned i = 0; i < attributeNames.size( ); i++ ){ for ( unsigned j = 0; j < targetAttNames.size( ); j++ ){ if ( attributeNames.at( i ) == targetAttNames.at( j ) ){ targetIndeces.push_back( j ); } } } ConditionList cl = ConditionList( conditions, targetRelation ); for ( int i = 0; i < targetRelation->getNumTuples( ); i++ ){ if ( cl.evalOnTuple( i ) ){ vector<Entry*> targetRow = targetRelation->getRow( i ); for ( unsigned j = 0; j < targetIndeces.size( ); j++ ){ delete targetRow.at( targetIndeces.at( j ) ); targetRow.at( targetIndeces.at( j ) ) = new Entry( newVals.at( j ) ); } targetRelation->updateRow( targetRow, i ); } } return targetRelation; }
// Delete from a relation based on the specified conditions Relation Database::deleteFromRelation( Relation* targetRelation, vector<Condition> conditions ){ ConditionList cl = ConditionList( conditions, targetRelation ); //WE CANT DELETE THESE RIGHT AWAY OR ELSE WE MESS UP OUR DATA STRUCTURES vector<int> toBeDeleted; for ( int i = 0; i < targetRelation->getNumTuples( ); ++i ){ if ( cl.evalOnTuple( i ) ){ toBeDeleted.push_back( i ); } } for ( unsigned i = 0; i < toBeDeleted.size( ); i++ ){ //the index decreases as we delete rows targetRelation->deleteRow( toBeDeleted.at( i ) - i ); } return targetRelation; }