diff --git a/Parser.cpp b/Parser.cpp index 2812ea0..02d4475 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -5,6 +5,7 @@ #include #include #include "Parser.h" +#include using namespace std; @@ -41,6 +42,176 @@ void displayTokenList(vector input) } } +tuple, Relation> expression(vector input, DBEngine &engine) +{ + Relation rfinal("TEMP"); + tuple, Relation> t(input, rfinal); + if(input[0] == "select") + { + + } + + else if(input[0] == "project") + { + + } + + else if(input[0] == "rename") + { + + } + + else if(engine.isRelation(input[0])) + { + Relation r1(engine.getTableFromName(input[0])); + input.erase(input.begin()); + + if(input[0] == "+") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.setUnion(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.setUnion(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + + else if(input[0] == "-") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.setDiff(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.setDiff(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + + else if(input[0] == "*") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.crossProduct(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.crossProduct(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + } + + else if(input[0] == "(") + { + input.erase(input.begin()); + + Relation r1(engine.getTableFromName(input[0])); + input.erase(input.begin()); + + if(input[0] == "+") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.setUnion(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.setUnion(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + + else if(input[0] == "-") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.setDiff(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.setDiff(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + + else if(input[0] == "*") + { + input.erase(input.begin()); + if(engine.isRelation(input[0])) + { + Relation r2(engine.getTableFromName(input[0])); + rfinal = engine.crossProduct(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + else if(input[0] == "(") + { + tuple, Relation> t = expression(input, engine); + Relation r2 = get<1>(t); + rfinal = engine.crossProduct(r1, r2); + get<0>(t) = input; + get<1>(t) = rfinal; + return t; + } + } + } + + get<0>(t) = input; + get<1>(t) = rfinal; + return t; +} + vector showCMD(vector input, DBEngine &engine) { if (input.size() > 3) @@ -358,16 +529,11 @@ vector insertCMD(vector input, DBEngine &engine) { input.erase(input.begin()); - //PExpression e; + tuple, Relation> t = expression(input, engine); - // while(input[0] != ";") - // { - // e.setPExpression(e.getPExpression() + input[0]); - // } + engine.createTable(get<1>(t)); - //cout << "Inserting: " << e.getPExpression() << " into " << r.getName() << ".\n"; - - cout << "Not yet implemented." << endl; + input = get<0>(t); return input; } @@ -507,104 +673,6 @@ vector deleteCMD(vector input, DBEngine &engine) else cout<<"Syntax error!"< input, DBEngine &engine) -{ - Relation rfinal("TEMP"); - if(input[0] == "select") - { - - } - - else if(input[0] == "project") - { - - } - - else if(input[0] == "rename") - { - - } - - else if(engine.isRelation(input[0])) - { - Relation r1(engine.getTableFromName(input[0])); - input.erase(input.begin()); - - if(input[0] == "+") - { - input.erase(input.begin()); - if(engine.isRelation(input[0])) - { - Relation r2(engine.getTableFromName(input[0])); - rfinal = engine.setUnion(r1, r2); - return rfinal; - } - else if(input[0] == "(") - { - Relation r2 = expression(input, engine); - rfinal = engine.setUnion(r1, r2); - return rfinal; - } - } - - else if(input[0] == "-") - { - input.erase(input.begin()); - if(engine.isRelation(input[0])) - { - Relation r2(engine.getTableFromName(input[0])); - rfinal = engine.setDiff(r1, r2); - return rfinal; - } - else if(input[0] == "(") - { - Relation r2 = expression(input, engine); - rfinal = engine.setDiff(r1, r2); - return rfinal; - } - } - - else if(input[0] == "*") - { - input.erase(input.begin()); - if(engine.isRelation(input[0])) - { - Relation r2(engine.getTableFromName(input[0])); - rfinal = engine.crossProduct(r1, r2); - return rfinal; - } - else if(input[0] == "(") - { - Relation r2 = expression(input, engine); - rfinal = engine.crossProduct(r1, r2); - return rfinal; - } - } - } - - else if(input[0] == "(") - { - input.erase(input.begin()); - - if(input[0] == "+") - { - - } - - else if(input[0] == "-") - { - - } - - else if(input[0] == "*") - { - - } - } - - return rfinal; -} - vector query(vector input, DBEngine &engine) { PRelation pr(input[0]); @@ -612,66 +680,11 @@ vector query(vector input, DBEngine &engine) input.erase(input.begin()); input.erase(input.begin()); - Relation r = expression(input, engine); + tuple, Relation> t = expression(input, engine); + Relation r = get<1>(t); r.setTableName(pr.getName()); //r.display(); - - //temporary fix - while(input[0] != ";") - { - input.erase(input.begin()); - } - - /* - if(input[0] == "select") - { - - } - - else if(input[0] == "project") - { - - } - - else if(input[0] == "rename") - { - - } - - else if(engine.isRelation()) - { - Relation r(engine.getTableFromName(input[0])); - input.erase(input.begin()); - - if(input[0] == "+") - { - - } - - else if(input[0] == "-") - { - - } - - else if(input[0] == "*") - { - - } - } - - else - { - cout << "Invalid query request." << endl; - } - */ - - //testing - /* - for(int x = 0; x < input.size(); ++x) - { - cout << input[x] << endl; - } - */ + input = get<0>(t); engine.createTable(r); diff --git a/test b/test index eca42fd..786e618 100755 Binary files a/test and b/test differ