Beispiel #1
0
// 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;
}
Beispiel #2
0
// 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;
}
Beispiel #3
0
// 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;
}