diff --git a/DBEngine.cpp b/DBEngine.cpp index 1819cf0..32a06ef 100755 --- a/DBEngine.cpp +++ b/DBEngine.cpp @@ -151,12 +151,23 @@ Relation DBEngine::projection(vector input, Relation r){ } //test error matching -void DBEngine::rename(Relation& r, vector oldnames, vector newnames){ - if (oldnames.size() != newnames.size()) { +Relation DBEngine::rename(vector newnames, Relation &r) +{ + vector temp; + if (r.getSize() != newnames.size()) { cout << "FAILURE TO RENAME: number of attributes do not match.\n"; - return; + exit(1); } - + else + { + temp = r.getAttributeNames(); + for(int i = 0; i < temp.size(); ++i) + { + r.renameAttribute(temp[i], newnames[i]); + } + return r; + } + /* else if (oldnames != r.getAttributeNames()) { cout << "FAILURE TO RENAME: the attributes to be renamed do not exist in the relation.\n"; return; @@ -167,6 +178,8 @@ void DBEngine::rename(Relation& r, vector oldnames, vector newna r.renameAttribute(oldnames[i], newnames[i]); } } + */ + } Relation DBEngine::setUnion(Relation r1, Relation r2){ diff --git a/DBEngine.h b/DBEngine.h index e02e5c7..81009d3 100755 --- a/DBEngine.h +++ b/DBEngine.h @@ -28,7 +28,7 @@ public: void save(); void save(string n); void storeCommands(string s); - void rename(Relation& r, vector oldnames, vector newnames); + Relation rename(vector newnames, Relation &r); Relation setUnion(Relation r1, Relation r2); Relation setDiff(Relation r1, Relation r2); Relation crossProduct(Relation r1, Relation r2); diff --git a/Parser.cpp b/Parser.cpp index 75c988f..ab5965a 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -91,7 +91,46 @@ tuple, Relation> expression(vector input, DBEngine &engin else if(input[0] == "rename") { - + input.erase(input.begin()); + if(input[0] == "(") + { + input.erase(input.begin()); + vector temp; + while(input[0] != ")") + { + if(input[0] == ",") + { + input.erase(input.begin()); + } + temp.push_back(input[0]); + input.erase(input.begin()); + } + input.erase(input.begin()); + Relation rfinal("TEMP"); + if(engine.isRelation(input[0])) + { + rfinal = engine.rename(temp, engine.getTableFromName(input[0])); + input.erase(input.begin()); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + input.erase(input.begin()); + t = expression(input, engine); + input.erase(input.begin()); + rfinal = engine.rename(temp, get<1>(t)); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + else + { + cout << "Rename syntax incorrect." << endl; + exit(1); + } } else if(engine.isRelation(input[0])) diff --git a/test b/test index 76fc12b..fc260be 100755 Binary files a/test and b/test differ