From 7f0f5c4a975abe59e99b547aec62ef7d431a7a83 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Wed, 30 Sep 2015 13:00:51 -0500 Subject: [PATCH] Took out unncessary comments in code. --- DBEngine.cpp | 59 +---- DBEngine.h | 1 - Parser.cpp | 626 ++++++++++++++++++--------------------------------- Parser.h | 489 ---------------------------------------- test | Bin 212489 -> 204297 bytes test.cpp | 40 ---- 6 files changed, 223 insertions(+), 992 deletions(-) diff --git a/DBEngine.cpp b/DBEngine.cpp index 32a06ef..417c7bf 100755 --- a/DBEngine.cpp +++ b/DBEngine.cpp @@ -94,7 +94,7 @@ void DBEngine::save(string n){ } } - //file.close(); + file.close(); } vector DBEngine::getRelations(){ @@ -167,18 +167,6 @@ Relation DBEngine::rename(vector newnames, Relation &r) } return r; } - /* - else if (oldnames != r.getAttributeNames()) { - cout << "FAILURE TO RENAME: the attributes to be renamed do not exist in the relation.\n"; - return; - } - - else { - for(int i = 0; i < oldnames.size(); ++i){ - r.renameAttribute(oldnames[i], newnames[i]); - } - } - */ } @@ -229,83 +217,38 @@ Relation DBEngine::setDiff(Relation r1, Relation r2){ vector temp; //bool duplicate = false; - /* - for (int i = 0; i < r1.getAttributes()[0].getSize(); ++i) - { - new_r.removeTuple(0); - } - */ int size = 0; - //cout << "test1" << endl; for(int x = 0; x < r2.getAttributes().size(); ++x) { - //cout << "test2" << endl; for (int i = 0; i < r2.getAttributes()[x].getSize(); ++i) { - //cout << "test3" << endl; temp = r2.getTuple(i); for(int y = 0; y < new_r.getAttributes().size(); ++y) { size = new_r.getAttributes()[y].getSize(); - //cout << "test4" << endl; new_r.getAttributes()[y].getSize(); for (int j = 0; j < size; ++j) { - //cout << "test5" << endl; for(int a = 0; a < temp.size(); ++a) { - //cout << "test6" << endl; for(int b = 0; b < new_r.getTuple(j).size(); ++b) { - //cout << "test7" << endl; - //cout << temp[a] << " " << new_r.getTuple(j)[b] << " " << b << endl; if (temp[a] == new_r.getTuple(j)[b]) { new_r.removeFromTuple(b, j); - //cout << "test" << endl; - //duplicate = true; - //break; } } } size = new_r.getAttributes()[y].getSize(); } - /* - if (!duplicate) - { - new_r.insertTuple(temp); - } - */ - //duplicate = false; } } } - - //make this one for loop later! - /* - for (int i = 0; i < r2.getAttributes()[0].getSize(); ++i) { - temp = r2.getTuple(i); - - for (int j = 0; j < r1.getAttributes()[0].getSize(); ++j){ - if (temp == r1.getTuple(j)){ - duplicate = true; - break; - } - } - - if (!duplicate){ - new_r.insertTuple(temp); - } - - duplicate = false; - } - */ - return new_r; } } diff --git a/DBEngine.h b/DBEngine.h index 81009d3..ddbdd13 100755 --- a/DBEngine.h +++ b/DBEngine.h @@ -18,7 +18,6 @@ public: void insertValues(string r, vector v); vector getRelations(); bool isRelation(string n); - //void showTable(Relation r); Relation& getTableFromName(string n); void saveToFile(vector cmds); Relation selection(string attName, string s, Relation r); diff --git a/Parser.cpp b/Parser.cpp index d665816..1c19bfa 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -45,197 +45,167 @@ void displayTokenList(vector input) Relation condition(vector input, Relation &r, DBEngine &engine) { Relation rfinal = r; - - //UNTESTED - //testing to see if there is an && or || present - /* - if (input.size() > 3) { - //test print - for (int i = 0; i < input.size(); ++i) - cout << "input[i]: " << input[i] << "\n"; - - - //this is probably wrong, added a cout for testing - string bin_op = input[3]; - cout << "bin_op, should be && or ||: " << bin_op << "\n"; - - //making each half a new vector, probably a better way to do this - vector firsthalf; - vector secondhalf; - - //again, all untested. it's weird to not test this stuff - for (int i = 0; i < input.size(); ++i){ - if (i < 3) - firsthalf.push_back(input[i]); - else - secondhalf.push_back(input[i]); - + + Attribute a1 = r.getAttributeByName(input[0]); + input.erase(input.begin()); + string op = input[0]; + input.erase(input.begin()); + Attribute a2; + string c; + if(r.isAttribute(input[0])) + { + a2 = r.getAttributeByName(input[0]); + input.erase(input.begin()); + for(int i = 0; i < r.getAttributes().size(); ++i) + { + if(r.getAttributes()[i].getName() == a1.getName()) + { + int offset = 0; + if(op == "==") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(r.getAttributeByName(a1.getName()).getValues()[x] != r.getAttributeByName(a2.getName()).getValues()[x]) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else if(op == "!=") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(r.getAttributeByName(a1.getName()).getValues()[x] == r.getAttributeByName(a2.getName()).getValues()[x]) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else if(op == ">=") + { + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) < stoi(r.getAttributeByName(a2.getName()).getValues()[x])) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } + } + else if(op == "<=") + { + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) > stoi(r.getAttributeByName(a2.getName()).getValues()[x])) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } + } + else if(op == ">") + { + + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) <= stoi(r.getAttributeByName(a2.getName()).getValues()[x])) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } + } + else if(op == "<") + { + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") + { + for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) >= stoi(r.getAttributeByName(a2.getName()).getValues()[x])) + { + rfinal.removeTuple(x - offset); + offset += 1; + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } + } + } } - - //calling condition again with each half - Relation r1 = condition(firsthalf, rfinal); - Relation r2 = condition(secondhalf, rfinal); - - //NO IDEA IF THIS ACTUALLY WORKS - //HOORAY - //HOW THE FUCK DO PEOPLE CODE LIKE THIS - if (bin_op == "&&"){ - //with engine as the DBEngine object that maybe exists - return engine.crossProduct(r1, r2); - } - - else if (bin_op == "||"){ - //with engine as the DBEngine object that maybe exists - return engine.setUnion(r1, r2); - } - - else { - cout << "Something strange happened. bin_op: " << bin_op << "\n"; - cout << "Returning the initial relation."; - return rfinal; - } - } - - else { - */ - Attribute a1 = r.getAttributeByName(input[0]); + else if(input[0].at(0) == '\"') + { + c = input[0].substr(1, input[0].find_last_of("\"") - 1); input.erase(input.begin()); - string op = input[0]; - input.erase(input.begin()); - Attribute a2; - string c; - //cout << input[0] << endl; - for(int x = 0; x < input.size(); ++x) + int offset = 0; + //input.erase(input.begin()); + if(op == "==") { - cout << input[x] << endl; - } - if(r.isAttribute(input[0])) - { - a2 = r.getAttributeByName(input[0]); - input.erase(input.begin()); for(int i = 0; i < r.getAttributes().size(); ++i) { if(r.getAttributes()[i].getName() == a1.getName()) { - /* - for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size; ++j) + for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) { - if(r.getAttributeByName(a1.getName()).getValues()[j] == ) + if(r.getAttributeByName(a1.getName()).getValues()[j] != c) { - rfinal.insertTuple(r.getTuple(j)); - } - }*/ - int offset = 0; - if(op == "==") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(r.getAttributeByName(a1.getName()).getValues()[x] != r.getAttributeByName(a2.getName()).getValues()[x]) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else if(op == "!=") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(r.getAttributeByName(a1.getName()).getValues()[x] == r.getAttributeByName(a2.getName()).getValues()[x]) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else if(op == ">=") - { - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) < stoi(r.getAttributeByName(a2.getName()).getValues()[x])) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == "<=") - { - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) > stoi(r.getAttributeByName(a2.getName()).getValues()[x])) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == ">") - { - - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) <= stoi(r.getAttributeByName(a2.getName()).getValues()[x])) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == "<") - { - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER" && r.getAttributeByName(a2.getName()).getType() == "INTEGER") - { - for(int x = 0; x < r.getAttributeByName(a1.getName()).getSize(); ++x) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[x]) >= stoi(r.getAttributeByName(a2.getName()).getValues()[x])) - { - rfinal.removeTuple(x - offset); - offset += 1; - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); + rfinal.removeTuple(j - offset); + offset += 1; } } } } } - else if(input[0].at(0) == '\"') + else if(op == "!=") { - c = input[0].substr(1, input[0].find_last_of("\"") - 1); - input.erase(input.begin()); - int offset = 0; - //input.erase(input.begin()); - if(op == "==") + for(int i = 0; i < r.getAttributes().size(); ++i) + { + if(r.getAttributes()[i].getName() == a1.getName()) + { + for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) + { + if(r.getAttributeByName(a1.getName()).getValues()[j] == c) + { + rfinal.removeTuple(j - offset); + offset += 1; + } + } + } + } + } + else if(op == ">=") + { + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") { for(int i = 0; i < r.getAttributes().size(); ++i) { @@ -243,7 +213,7 @@ Relation condition(vector input, Relation &r, DBEngine &engine) { for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) { - if(r.getAttributeByName(a1.getName()).getValues()[j] != c) + if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) < stoi(c)) { rfinal.removeTuple(j - offset); offset += 1; @@ -252,7 +222,15 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } - else if(op == "!=") + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } + } + else if(op == "<=") + { + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") { for(int i = 0; i < r.getAttributes().size(); ++i) { @@ -260,7 +238,7 @@ Relation condition(vector input, Relation &r, DBEngine &engine) { for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) { - if(r.getAttributeByName(a1.getName()).getValues()[j] == c) + if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) > stoi(c)) { rfinal.removeTuple(j - offset); offset += 1; @@ -269,124 +247,79 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } - else if(op == ">=") + else { - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") - { - for(int i = 0; i < r.getAttributes().size(); ++i) - { - if(r.getAttributes()[i].getName() == a1.getName()) - { - for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) < stoi(c)) - { - rfinal.removeTuple(j - offset); - offset += 1; - } - } - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == "<=") - { - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") - { - for(int i = 0; i < r.getAttributes().size(); ++i) - { - if(r.getAttributes()[i].getName() == a1.getName()) - { - for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) > stoi(c)) - { - rfinal.removeTuple(j - offset); - offset += 1; - } - } - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == ">") - { - - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") - { - for(int i = 0; i < r.getAttributes().size(); ++i) - { - if(r.getAttributes()[i].getName() == a1.getName()) - { - for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) <= stoi(c)) - { - rfinal.removeTuple(j - offset); - offset += 1; - } - } - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } - } - else if(op == "<") - { - - if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") - { - for(int i = 0; i < r.getAttributes().size(); ++i) - { - if(r.getAttributes()[i].getName() == a1.getName()) - { - for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) - { - if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) >= stoi(c)) - { - rfinal.removeTuple(j - offset); - offset += 1; - } - } - } - } - } - else - { - cout << "Attribute type is not an INTEGER." << endl; - exit(1); - } + cout << "Attribute type is not an INTEGER." << endl; + exit(1); } } - if(input[0] == "&&") + else if(op == ">") { - input.erase(input.begin()); - Relation rtemp = rfinal; - rfinal = condition(input, rtemp, engine); + + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") + { + for(int i = 0; i < r.getAttributes().size(); ++i) + { + if(r.getAttributes()[i].getName() == a1.getName()) + { + for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) <= stoi(c)) + { + rfinal.removeTuple(j - offset); + offset += 1; + } + } + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } } - else if(input[0] == "||") + else if(op == "<") { - input.erase(input.begin()); - Relation rtemp = rfinal; - Relation rtemp2 = condition(input, r, engine); - rfinal = engine.setUnion(rtemp, rtemp2); + + if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") + { + for(int i = 0; i < r.getAttributes().size(); ++i) + { + if(r.getAttributes()[i].getName() == a1.getName()) + { + for(int j = 0; j < r.getAttributeByName(a1.getName()).getValues().size(); ++j) + { + if(stoi(r.getAttributeByName(a1.getName()).getValues()[j]) >= stoi(c)) + { + rfinal.removeTuple(j - offset); + offset += 1; + } + } + } + } + } + else + { + cout << "Attribute type is not an INTEGER." << endl; + exit(1); + } } - return rfinal; - //} + } + if(input[0] == "&&") + { + input.erase(input.begin()); + Relation rtemp = rfinal; + rfinal = condition(input, rtemp, engine); + } + else if(input[0] == "||") + { + input.erase(input.begin()); + Relation rtemp = rfinal; + Relation rtemp2 = condition(input, r, engine); + rfinal = engine.setUnion(rtemp, rtemp2); + } + return rfinal; } tuple, Relation> expression(vector input, DBEngine &engine) @@ -395,10 +328,6 @@ tuple, Relation> expression(vector input, DBEngine &engin tuple, Relation> t(input, rfinal); if(input[0] == "select") { - /* - cout << "Not yet implemented." << endl; - exit(1); - */ input.erase(input.begin()); vector s; Relation r("TEMP"); @@ -448,16 +377,13 @@ tuple, Relation> expression(vector input, DBEngine &engin input.erase(input.begin()); get<0>(t) = input; get<1>(t) = rfinal; - //cout << rfinal.getSize() << endl; return t; } else if(input[0] == "(") { t = expression(input, engine); rfinal = engine.projection(temp, get<1>(t)); - //get<0>(t) = input; get<1>(t) = rfinal; - //cout << rfinal.getSize() << endl; return t; } } @@ -665,12 +591,6 @@ tuple, Relation> expression(vector input, DBEngine &engin vector showCMD(vector input, DBEngine &engine) { - /* - if (input.size() > 3) - { - cout<<"Syntax error!"< saveCMD(vector input, DBEngine &engine) { cout<<"Syntax error!"< att = r.getAttributes(); - for (int i = 0; i < att.size(); ++i) - { - output << "-------------\n"; - output << att[i].getName() << "\n" << att[i].getType(); - if(att[i].getType() == "VARCHAR") - { - output << "(" << att[i].getSize() << ")"; - } - output << "\n\n"; - - vector values = att[i].getValues(); - vector::iterator it = values.begin(); - while (it != values.end()) - { - output << *it << "\n"; - it++; - } - output << "-------------\n"; - } - output << "\n--------------------------"; - */ input.erase(input.begin()); return input; @@ -739,10 +625,6 @@ vector closeCMD(vector input, DBEngine &engine) { cout<<"Syntax error!"< openCMD(vector input, DBEngine &engine) { cout<<"Syntax error!"< exitCMD(vector input, DBEngine &engine) vector createCMD(vector input, DBEngine &engine) { - //relation name will be the first element of the vector of data returned by this function if (input[0] == "TABLE") { @@ -798,8 +675,6 @@ vector createCMD(vector input, DBEngine &engine) { input.erase(input.begin()); - //vector e1; - vector a; while(input[0] != ")") //inserting all values to relation @@ -830,8 +705,6 @@ vector createCMD(vector input, DBEngine &engine) a.push_back(temp); } - //vector apk; //save primary keys temp storage - if(input[0] == "PRIMARY" && input[1] == "KEY") { input.erase(input.begin()); @@ -842,17 +715,12 @@ vector createCMD(vector input, DBEngine &engine) while(input[0] != ")") //inserting all values to relation { - //PAttribute temp; if (input[0] == ",") { input.erase(input.begin()); } - //temp.setPAttributeName(input[0]); - - //apk.push_back(temp); - for(int i = 0; i < a.size(); ++i) { if(input[0] == a[i].getPAttribute()) @@ -940,7 +808,6 @@ vector insertCMD(vector input, DBEngine &engine) if(input[0].at(0) == '\"') { s.push_back(input[0].substr(1,input[0].find_last_of("\"") - 1 )); - //engine.getTableFromName(pr.getName()).getAttributes()[i].display(); input.erase(input.begin()); } else @@ -1087,27 +954,6 @@ vector updateCMD(vector input, DBEngine &engine) vector s; if(input[0] == "(") { - //PCondition c; - /* - PComparison c; - POperand oops1; - POperand oops2; - POp op; - - while(input[0] != ")") - { - oops1.setPOperand(input[0]); - input.erase(input.begin()); - - oops2.setPOperand(input[0]); - input.erase(input.begin()); - - op.setPOp(input[0]); - input.erase(input.begin()); - - c.setPComparison(oops1.getPOperand(), op.getPOp(), oops2.getPOperand()); - } - */ input.erase(input.begin()); while(input[0] != ")") { @@ -1176,7 +1022,6 @@ vector query(vector input, DBEngine &engine) tuple, Relation> t = expression(input, engine); Relation r = get<1>(t); r.setTableName(pr.getName()); - //r.display(); input = get<0>(t); engine.createTable(r); @@ -1205,8 +1050,6 @@ void par_line(vector input, DBEngine &engine) //calls par_command() or p cout<<"\nPassing the following arguments to dbEngine: \nCommand: "< insertInput = insertCMD(input, engine); - //cout<<"arguments: "< input, DBEngine &engine) //calls par_command() or p input.erase(input.begin()); vector insertInput = createCMD(input, engine); - //cout<<"arguments: "< input, DBEngine &engine) //calls par_command() or p input.erase(input.begin()); vector insertInput = deleteCMD(input, engine); - //cout<<"arguments: "< input, DBEngine &engine) //calls par_command() or p input.erase(input.begin()); vector insertInput = updateCMD(input, engine); - //cout<<"arguments: "< listOfTokens = tokenize(input); par_line(listOfTokens, engine); } -/* -int main () { - - - string ss = "INSERT INTO animals VALUES FROM ( Joe , cat , 4 ) ;"; - string ss2 = "SHOW Dogs ;"; - string ss3 = "EXIT ; "; - - vector listOfTokens = tokenize(ss); - vector listOfTokens2 = tokenize(ss2); - vector listOfTokens3 = tokenize(ss3); - - par_line(listOfTokens); - par_line(listOfTokens2); - par_line(listOfTokens3); - - -} -*/ diff --git a/Parser.h b/Parser.h index e6422ca..08f37da 100644 --- a/Parser.h +++ b/Parser.h @@ -416,493 +416,4 @@ class PExpression } }; -/* -vector tokenize(string ss) -{ - - string tempString; - stringstream lineStream(ss); - vector output; - - while (lineStream >> tempString) - { - output.push_back(tempString); - } - - //testing--------------- - cout<<"TokenList: "; - - for (int i = 0; i input) -{ - cout<<"TokenList: "< showCMD(vector input) -{ - if (input.size() > 3) - { - cout<<"Syntax error!"< saveCMD(vector input) -{ - if (input.size() > 3) - { - cout<<"Syntax error!"< closeCMD(vector input) -{ - if (input.size() > 3) - { - cout<<"Syntax error!"< openCMD(vector input) -{ - if (input.size() > 2) - { - cout<<"Syntax error!"< exitCMD(vector input) -{ - if (input[1] != ";") - { - cout<<"ERROR: missing semicolon!"< createCMD(vector input) -{ - //relation name will be the first element of the vector of data returned by this function - - if (input[0] == "CREATE" && input[1] == "TABLE") - { - input.erase(input.begin()); - input.erase(input.begin()); - - PRelation r; - r.setPRelation(input[0]); - - input.erase(input.begin()); - - if(input[0] == "(") - { - input.erase(input.begin()); - - //vector e1; - - vector a; - - while(input[0] != ")") //inserting all values to relation - { - PAttribute temp; - - if (input[0] == ",") - { - input.erase(input.begin()); - } - - temp.setPAttributeName(input[0]); - - input.erase(input.begin()); - - if(input[0] == "INTEGER") - { - temp.setPAttributeType(input[0]); - input.erase(input.begin()); - } - else - { - temp.setPAttributeType(input[0].substr(0,input[0].find("("))); - temp.setPAttributeSize(stoi(input[0].substr(input[0].find("("), input[0].find(")")))); - input.erase(input.begin()); - } - - a.push_back(temp); - } - - vector apk; //save primary keys temp storage - - if(input[0] == "PRIMARY" && input[1] == "KEY") - { - input.erase(input.begin()); - input.erase(input.begin()); - - if(input[0] == "(") - { - - while(input[0] != ")") //inserting all values to relation - { - PAttribute temp; - - if (input[0] == ",") - { - input.erase(input.begin()); - } - - temp.setPAttributeName(input[0]); - - apk.push_back(temp); - - input.erase(input.begin()); - } - - - - return input; - } - } - } - - else cout<<"Syntax error!"< insertCMD(vector input) -{ - //relation name will be the first element of the vector of data returned by this function - - if (input[0] == "INTO") - { - input.erase(input.begin()); - - PRelation r(input[0]); - - input.erase(input.begin()); - - vector s; - - if (input[0] == "VALUES" && input[1] == "FROM") - { - input.erase(input.begin()); - input.erase(input.begin()); - - - if(input[0] == "(") - { - if(input[0].at(0) == '\"') - { - s.push_back(input[0].substr(1,input[0].find_last_of("\""))); - } - vector e; - input.erase(input.begin()); - - while(input[0] != ")") //inserting all values to relation - //for (int i = 0; i < 2; ++i) - { - if (input[0] == ",") input.erase(input.begin()); - - e.push_back(input[0]); - - input.erase(input.begin()); - } - - cout << "Inserting: "; - while(!e.empty()) - { - cout << e[0].getPExpression() << " "; - e.erase(e.begin()); - } - cout << "into " << r.getName() << ".\n"; - - return input; - - } - - else if (input[0] == "RELATION") - { - input.erase(input.begin()); - - PExpression e; - - while(input[0] != ";") - { - e.setPExpression(e.getPExpression() + input[0]); - } - - cout << "Inserting: " << e.getPExpression() << " into " << r.getName() << ".\n"; - - return input; - } - - else cout<<"Syntax error!"< updateCMD(vector input) -{ - PRelation r(input[0]); - - input.erase(input.begin()); - - if(input[0] == "SET") - { - input.erase(input.begin()); - - //parse out ( and send everything until ) into an Expression vector - if(input[0] == "(") - { - - vector a; - PAttribute temp; - - vector s; - - //vector e; - - input.erase(input.begin()); - - while(input[0] != ")") - { - temp.setPAttributeName(input[0]); - a.push_back(temp); - temp.setPAttributeName("~"); - - input.erase(input.begin()); - - if(input[0] == "=") - { - input.erase(input.begin()); - - s.push_back(input[0]); - } - - else - { - cout<<"Syntax error!"< deleteCMD(vector input) -{ - if (input[0] == "DELETE" && input[1] == "FROM") - { - input.erase(input.begin()); - input.erase(input.begin()); - - PRelation r(input[0]); - - if(input[0] == "WHERE") - { - if(input[0] == "(") - { - //PCondition c; - - PComparison c; - POperand oops1; - POperand oops2; - POp op; - - while(input[0] != ")") - { - oops1.setPOperand(input[0]); - input.erase(input.begin()); - - oops2.setPOperand(input[0]); - input.erase(input.begin()); - - op.setPOp(input[0]); - input.erase(input.begin()); - - c.setPComparison(oops1.getPOperand(), op.getPOp(), oops2.getPOperand()); - } - } - } - - // send delete command to DBEngine - } - else cout<<"Syntax error!"< input) //calls par_command() or par_query() depending on first item from token list -{ -/* -• Match the first item in the token list and determine weather this is a command or a query. -• Call functions par_command() or par_query(); -• After either par_command() or par_query() returns, make sure the line ends properly with “;” token - - string tempChar = input.back(); - - if (tempChar != ";") - { - cout<<"ERROR! missing semicolon "< insertInput = insertCMD(input); - cout<<"arguments: "< insertInput = createCMD(input); - cout<<"arguments: "< insertInput = deleteCMD(input); - cout<<"arguments: "< insertInput = updateCMD(input); - cout<<"arguments: "< listOfTokens = tokenize(input); - par_line(listOfTokens); -} -*/ - void parse(string s, DBEngine &e); \ No newline at end of file diff --git a/test b/test index 8833e9b6fec9a24bf4de26d5bef7e7d913b6c5fd..c4326f6aae22b4f460b47b1240cee392e6c6881a 100755 GIT binary patch delta 65270 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 z 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 delta 70124 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 GKl*=uYE*^* diff --git a/test.cpp b/test.cpp index 1f34d4c..ff4d2cf 100755 --- a/test.cpp +++ b/test.cpp @@ -8,46 +8,6 @@ using namespace std; int main () { DBEngine engine; - - Attribute att1("Breakfast", "VARCHAR(20)", true); - Attribute att2("Lunch", "VARCHAR(20)", false); - Attribute att3("Dinner", "VARCHAR(20)", false); - - att1.addCell("Pancakes"); - att1.addCell("Waffles"); - att1.addCell("Biscuits"); - att2.addCell("Turkey Sandwich"); - att2.addCell("Caesar Salad"); - att2.addCell("Pizza"); - att3.addCell("Steak"); - att3.addCell("Shrimp"); - att3.addCell("Ribs"); - - vector v; - v.push_back(att1); - v.push_back(att2); - v.push_back(att3); - - engine.createTable("Food", v); - - Attribute att4("Dessert", "VARCHAR(20)", true); - Attribute att5("MidnightSnack", "VARCHAR(20)", false); - - att4.addCell("IceCreamSundae"); - att4.addCell("ChocolateBar"); - att5.addCell("HummusandCarrots"); - att5.addCell("PotatoChips"); - - vector v2; - v2.push_back(att4); - v2.push_back(att5); - - engine.createTable("MoarFood", v2); - - //engine.getTableFromName("Food").display(); - //engine.getTableFromName("MoarFood").display(); - - engine.crossProduct(engine.getTableFromName("Food"), engine.getTableFromName("MoarFood")).display(); string x; cout << "Enter DBMS Commands: "; while(getline(cin, x))