#include
#include
#include "Relation.h"
using namespace std;
void Relation::select(int position, string& ID){
set temp;
for (Tuple curr : tuples){
if (curr[position] == ID) temp.insert(curr);
}
tuples = temp;
}
void Relation::select(const vector& positions){
bool valid = true;
set::iterator itr = tuples.begin();
while (itr != tuples.end()){
for (unsigned int i = 0; i < positions.size() - 1; i++) {
if ((*itr)[positions[i]] != (*itr)[positions[i + 1]]) {
valid = false;
break;
}
}
set::iterator temp = itr;
itr++;
if (!valid) {
tuples.erase(*(temp));
valid = true;
}
}
}
Relation Relation::project(const vector& positions) {
if (positions.size() == 0){
return Relation();
} else {
Scheme newScheme;
set newTuples;
for (unsigned int i = 0; i < positions.size(); i++) {
newScheme.push_back(scheme[positions[i]]);
}
for (Tuple tuple : tuples) {
Tuple newTuple;
for (unsigned int i = 0; i < positions.size(); i++) {
newTuple.push_back(tuple[positions[i]]);
}
newTuples.insert(newTuple);
}
Relation newRelation(name, newScheme);
newRelation.tuples = newTuples;
return newRelation;
}
}
Relation Relation::rename(const Scheme& actual){
Scheme newScheme;
Relation newRelation;
newRelation.name = this->name;
newRelation.tuples = this->tuples;
newRelation.scheme = this->scheme;
for (unsigned int i = 0; i < actual.size(); i++) newRelation.scheme[i] = actual[i];
return newRelation;
}
string Relation::toString(){
if (tuples.size() == 0) return "";
else {
stringstream output;
for (Tuple tuple : tuples){
output