2015-09-17 18:30:45 -05:00
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
#include <vector>
|
2015-09-24 20:02:57 -05:00
|
|
|
#include "Condition.h"
|
2015-09-17 18:30:45 -05:00
|
|
|
#include "DBEngine.h"
|
|
|
|
|
|
|
|
DBEngine::DBEngine(){
|
|
|
|
size = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DBEngine::createTable(string n){
|
|
|
|
Relation r(n);
|
|
|
|
tables.push_back(r);
|
|
|
|
size++;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DBEngine::createTable(string n, vector<Attribute> a){
|
|
|
|
Relation r(n, a);
|
|
|
|
tables.push_back(r);
|
|
|
|
size++;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DBEngine::createTable(Relation r){
|
|
|
|
tables.push_back(r);
|
|
|
|
size++;
|
|
|
|
}
|
|
|
|
|
|
|
|
vector<Relation> DBEngine::getRelations(){
|
|
|
|
return tables;
|
|
|
|
}
|
2015-09-23 17:34:36 -05:00
|
|
|
|
2015-09-17 18:30:45 -05:00
|
|
|
|
2015-09-22 09:03:42 -05:00
|
|
|
Relation& DBEngine::getTableFromName(string n){
|
2015-09-17 18:30:45 -05:00
|
|
|
for(int i = 0; i < tables.size(); i++){
|
|
|
|
if (tables[i].getTableName() == n){
|
|
|
|
return tables[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-22 18:42:50 -05:00
|
|
|
//currently writes nothing meaningful
|
2015-09-17 18:30:45 -05:00
|
|
|
void DBEngine::saveToFile(vector<string> cmds){
|
|
|
|
ofstream file;
|
|
|
|
file.open("savefile.db");
|
|
|
|
|
|
|
|
for(int i = 0; i < cmds.size(); ++i){
|
|
|
|
file << cmds[i] << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
|
2015-09-24 20:02:57 -05:00
|
|
|
|
|
|
|
Relation DBEngine::selection(string attName, string s, Relation r){
|
|
|
|
equality(attName, s, r);
|
|
|
|
}
|
|
|
|
|
2015-09-17 18:30:45 -05:00
|
|
|
//assumes that all attribute titles are unique
|
|
|
|
Relation DBEngine::projection(vector<string> input, Relation r){
|
|
|
|
|
2015-09-22 00:03:53 -05:00
|
|
|
|
2015-09-17 18:30:45 -05:00
|
|
|
// for(int i = 0; i < input.size(); i++) {
|
|
|
|
// it = find(r.getAttributes().begin(), r.getAttributes().end(), input[i])
|
|
|
|
|
|
|
|
//if(r[i].getName == input[])
|
|
|
|
// }
|
|
|
|
}
|
2015-09-21 16:27:23 -05:00
|
|
|
|
2015-09-22 21:17:45 -05:00
|
|
|
//test error matching
|
2015-09-22 09:03:42 -05:00
|
|
|
void DBEngine::rename(Relation& r, vector<string> oldnames, vector<string> newnames){
|
2015-09-21 16:27:23 -05:00
|
|
|
if (oldnames.size() != newnames.size()) {
|
2015-09-23 16:34:15 -05:00
|
|
|
cout << "FAILURE TO RENAME: number of attributes do not match.\n";
|
2015-09-21 16:27:23 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (oldnames != r.getAttributeNames()) {
|
2015-09-23 16:34:15 -05:00
|
|
|
cout << "FAILURE TO RENAME: the attributes to be renamed do not exist in the relation.\n";
|
2015-09-21 16:27:23 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
for(int i = 0; i < oldnames.size(); ++i){
|
2015-09-22 09:03:42 -05:00
|
|
|
r.renameAttribute(oldnames[i], newnames[i]);
|
2015-09-17 18:30:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-09-21 16:27:23 -05:00
|
|
|
|
2015-09-24 21:00:31 -05:00
|
|
|
Relation DBEngine::setUnion(Relation r1, Relation r2){
|
2015-09-24 20:42:59 -05:00
|
|
|
if (r1.getAttributeNames() != r2.getAttributeNames()){
|
2015-09-24 21:33:25 -05:00
|
|
|
cout << "Failure to union: the relations are not union-compatible.\nreturning the first relation.\n";
|
|
|
|
return r1;
|
|
|
|
}
|
2015-09-24 21:15:12 -05:00
|
|
|
|
2015-09-24 21:33:25 -05:00
|
|
|
else {
|
|
|
|
//currently all returned relations are called TEMP
|
|
|
|
Relation new_r = r1;
|
|
|
|
vector<string> temp;
|
|
|
|
bool duplicate = false;
|
|
|
|
|
|
|
|
for (int i = 0; i < r2.getAttributes()[0].getSize(); ++i) {
|
|
|
|
temp = r2.getTuple(i);
|
|
|
|
|
|
|
|
for (int j = 0; j < new_r.getAttributes()[0].getSize(); ++j){
|
|
|
|
if (temp == new_r.getTuple(j)){
|
|
|
|
duplicate = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!duplicate) {
|
|
|
|
new_r.insertTuple(temp);
|
|
|
|
}
|
2015-09-24 21:15:12 -05:00
|
|
|
|
2015-09-24 21:33:25 -05:00
|
|
|
duplicate = false;
|
2015-09-24 21:15:12 -05:00
|
|
|
}
|
|
|
|
|
2015-09-24 21:33:25 -05:00
|
|
|
return new_r;
|
2015-09-24 21:15:12 -05:00
|
|
|
|
2015-09-24 20:02:57 -05:00
|
|
|
|
2015-09-24 21:33:25 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*vector<Attribute> r1_atts = r1.getAttributes();
|
2015-09-24 20:42:59 -05:00
|
|
|
vector<Attribute> r2_atts = r2.getAttributes();
|
|
|
|
vector<Attribute> new_atts = r1_atts;
|
|
|
|
|
|
|
|
for (int i = 0; i < r2_atts.size(); ++i) {
|
|
|
|
for (int j = 0; j < r2_atts[i].getSize(); ++j){
|
|
|
|
new_atts[i].addCell(r2_atts[i][j]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-24 21:33:25 -05:00
|
|
|
for (int i = 0; i < new_atts.size(); ++i) {
|
2015-09-24 20:42:59 -05:00
|
|
|
for (int j = 0; j < new_atts.size(); ++j){
|
|
|
|
if (new_atts[i] == new_atts[j]){
|
|
|
|
new_atts.erase(new_atts.begin() + i);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
2015-09-24 21:33:25 -05:00
|
|
|
}
|
2015-09-24 20:02:57 -05:00
|
|
|
|
2015-09-24 20:42:59 -05:00
|
|
|
//currently all returned relations are called TEMP
|
|
|
|
Relation new_r("TEMP", new_atts);
|
2015-09-24 21:33:25 -05:00
|
|
|
return new_r;*/
|
2015-09-24 20:02:57 -05:00
|
|
|
}
|
2015-09-24 21:00:31 -05:00
|
|
|
}
|