diff --git a/PHelpers.cpp b/PHelpers.cpp new file mode 100755 index 0000000..ad215fc --- /dev/null +++ b/PHelpers.cpp @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include "PHelpers.h" + +using namespace std; + +PAttribute::PAttribute(){ + name = "~"; + type = "~"; + key = false; + size = 0; +} + +PAttribute::PAttribute(string str, string t){ + name = str; + type = t; + key = false; + size = 0; +} + +PAttribute::PAttribute(string str, string t, int s){ + name = str; + type = t; + key = false; + size = s; +} + +PUnion::PUnion(){ + Un1 = "~"; + Un2 = "~"; +} + +PUnion::PUnion(string s1, string s2){ + Un1 = s1; + Un2 = s2; +} + +string PUnion::getPUnion(){ + return "Union of " + Un1 + " and " + Un2; +} + +PProduct::PProduct(){ + Pr1 = "~"; + Pr2 = "~"; +} + +PProduct::PProduct(string s1, string s2){ + Pr1 = s1; + Pr2 = s2; +} + +string PProduct::getPProduct(){ + return "Product of " + Pr1 + " and " + Pr2; +} + +PDifference::PDifference(){ + D1 = "~"; + D2 = "~"; +} + +PDifference::PDifference(string s1, string s2){ + D1 = s1; + D2 = s2; +} + +string PDifference::getPDifference(){ + return "Difference of " + D1 + " and " + D2; +} + +PRenaming::PRenaming(){ + newName = "~"; + oldName = "~"; +} + +PRenaming::PRenaming(string s1, string s2){ + newName = s1; + oldName = s2; +} + +string PRenaming::doRename(){ + return "Renaming " + oldName + " to " + newName; +} + +PProjection::PProjection(){ + newName = "~"; + oldName = "~"; +} + +PProjection::PProjection(string s1, string s2){ + newName = s1; + oldName = s2; +} + +string PProjection::doPProjection(){ + return "Projecting " + oldName + " onto " + newName; +} + +PComparison::PComparison(){ + op.setPOp("~"); + operand1.setPOperand("~"); + operand2.setPOperand("~"); +} + +PComparison::PComparison(string str1, string str2, string str3){ + operand1.setPOperand(str1); + op.setPOp(str2); + operand2.setPOperand(str3); +} + +void PComparison::setPComparison(string str1, string str2, string str3){ + operand1.setPOperand(str1); + op.setPOp(str2); + operand2.setPOperand(str3); +} + +string PComparison::getPComparison(){ + return operand1.getPOperand() + " " + op.getPOp() + " " + operand2.getPOperand(); +} \ No newline at end of file diff --git a/PHelpers.h b/PHelpers.h new file mode 100755 index 0000000..a86f47b --- /dev/null +++ b/PHelpers.h @@ -0,0 +1,165 @@ +#include +#include +#include +#include +#include "DBEngine.h" + +using namespace std; + +class PRelation{ + string name; + + public: + PRelation(){ name = "~"; } + PRelation(string str){ name = str; } + void setPRelation(string str){ name = str; } + string getName(){ return name; } +}; + +class PAttribute{ + string name; + string type; + bool key; + int size; + + public: + PAttribute(); + PAttribute(string str, string t); + PAttribute(string str, string t, int s); + void setPAttributeName(string str){ name = str; } + void setPAttributeType(string t){ type = t; } + void setPAttributeKey(){ key = true; } + void setPAttributeSize(int s){ size = s; } + string getPAttribute(){ return name; } + string getPAttributeType(){ return type; } + bool getPAttributeKey(){ return key; } + int getPAttributeSize(){ return size; } +}; + +class PUnion{ + string Un1; + string Un2; + + public: + PUnion(); + PUnion(string s1, string s2); + string getPUnion(); +}; + +class PProduct{ + string Pr1; + string Pr2; + + public: + PProduct(); + PProduct(string s1, string s2); + string getPProduct(); +}; + +class PDifference{ + string D1; + string D2; + + public: + PDifference(); + PDifference(string s1, string s2); + string getPDifference(); +}; + +class PRenaming{ + string newName; + string oldName; + + public: + PRenaming(); + PRenaming(string s1, string s2); + string doRename(); +}; + +class PProjection{ + string newName; + string oldName; + + public: + PProjection(); + PProjection(string s1, string s2); + string doPProjection(); +}; + +class POperand{ + string op; + + public: + POperand(){ op = "~"; } + POperand(string str){ op = str; } + void setPOperand(string str){ op = str; } + string getPOperand(){ return op; } +}; + +class POp{ + string op; + + public: + POp(){ op = "~"; } + POp(string str){ op = str; } + void setPOp(string str){ op = str; } + string getPOp(){ return op; } +}; + +class PComparison{ + POp op; + POperand operand1; + POperand operand2; + + public: + PComparison(); + PComparison(string str1, string str2, string str3); + void setPComparison(string str1, string str2, string str3); + string getPComparison(); +}; + +class PConjunction{ + string conj; + + public: + PConjunction(){ conj = "~"; } + PConjunction(string str){ conj = str; } + void setPConjunction(string str){ conj = str; } + string getPConjunction(){ return conj; } +}; + +class PCondition{ + string cond; + + public: + PCondition(){ cond = "~"; } + PCondition(string str){ cond = str; } + void setPCondition(string str){ cond = str; } + string getPCondition(){ return cond; } +}; + +class PSelection{ + string select; + + public: + PSelection(){ select = "~"; } + PSelection(string str){ select = str; } + string getPSelection(){ return select; } +}; + +class PExpression{ + PRelation rel; + PSelection sel; + PProjection proj; + PRenaming ren; + PUnion un; + PDifference diff; + PProduct prod; + string temp; + + public: + PExpression(); + PExpression(string str){ temp = str; } + void setPExpression(string str){ temp = str; } + string getPExpression(){ return temp; } +}; \ No newline at end of file diff --git a/Parser.cpp b/Parser.cpp index 86ac480..4b7035e 100755 --- a/Parser.cpp +++ b/Parser.cpp @@ -1,16 +1,15 @@ -#include // std::string -#include // std::cout -#include // std::ofstream -#include // std::stringstream -#include +#include +#include +#include #include -#include "Parser.h" #include +#include +#include "Parser.h" +#include "PHelpers.h" using namespace std; -vector tokenize(string ss) -{ +vector tokenize(string ss){ string tempString; stringstream lineStream(ss); vector output; @@ -22,8 +21,7 @@ vector tokenize(string ss) return output; } -void displayTokenList(vector input) -{ +void displayTokenList(vector input){ cout<<"TokenList: "< input) } } -Relation condition(vector input, Relation &r, DBEngine &engine) -{ +Relation condition(vector input, Relation &r, DBEngine &engine){ Relation rfinal = r; Attribute a1 = r.getAttributeByName(input[0]); @@ -41,19 +38,16 @@ Relation condition(vector input, Relation &r, DBEngine &engine) input.erase(input.begin()); Attribute a2; string c; - if(r.isAttribute(input[0])) - { + 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 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(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); @@ -61,90 +55,76 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } - 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]) - { + + 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])) - { + + 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 - { + 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])) - { + + 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 - { + + 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); } @@ -152,22 +132,17 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } - else if(input[0].at(0) == '\"') - { + + else if(input[0].at(0) == '\"'){ 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) - { + 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; } @@ -175,6 +150,9 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } + + //continue stylistic homogenization here + else if(op == "!=") { for(int i = 0; i < r.getAttributes().size(); ++i) @@ -192,6 +170,7 @@ Relation condition(vector input, Relation &r, DBEngine &engine) } } } + else if(op == ">=") { if(r.getAttributeByName(a1.getName()).getType() == "INTEGER") @@ -733,10 +712,9 @@ vector createCMD(vector input, DBEngine &engine) return input; } - else cout<<"Syntax error! 2"< insertCMD(vector input, DBEngine &engine) diff --git a/Parser.h b/Parser.h index 8418339..94611a0 100755 --- a/Parser.h +++ b/Parser.h @@ -1,267 +1,23 @@ -#include // std::string -#include // std::cout -#include // std::stringstream -#include -#include -#include "DBEngine.h" - -using namespace std; - -class PRelation -{ - string name; - - public: - PRelation() { name = "~"; } - PRelation(string str) { name = str; } - void setPRelation(string str) { name = str; } - string getName() { return name; } -}; - -class PAttribute -{ - string name; - string type; - bool key; - int size; - - public: - PAttribute() { - name = "~"; - type = "~"; - key = false; - size = 0; - } - - PAttribute(string str, string t) { - name = str; - type = t; - key = false; - size = 0; - } - - PAttribute(string str, string t, int s) { - name = str; - type = t; - key = false; - size = s; - } - - void setPAttributeName(string str) { name = str; } - void setPAttributeType(string t) { type = t; } - void setPAttributeKey() { key = true; } - void setPAttributeSize(int s) { size = s; } - string getPAttribute() { return name; } - string getPAttributeType() { return type; } - bool getPAttributeKey() { return key; } - int getPAttributeSize() { return size; } -}; - -class PUnion -{ - string Un1; - string Un2; - - public: - PUnion() { - Un1 = "~"; - Un2 = "~"; - } - - PUnion(string s1, string s2) { - Un1 = s1; - Un2 = s2; - } - - string getPUnion() { - return "Union of " + Un1 + " and " + Un2; - } -}; - -class PProduct -{ - string Pr1; - string Pr2; - - public: - PProduct() { - Pr1 = "~"; - Pr2 = "~"; - } - - PProduct(string s1, string s2) { - Pr1 = s1; - Pr2 = s2; - } - - string getPProduct() { - return "Product of " + Pr1 + " and " + Pr2; - } -}; - -class PDifference -{ - string D1; - string D2; - - public: - PDifference() { - D1 = "~"; - D2 = "~"; - } - - PDifference(string s1, string s2) { - D1 = s1; - D2 = s2; - } - - string getPDifference() { - return "Difference of " + D1 + " and " + D2; - } -}; - -class PRenaming -{ - string newName; - string oldName; - - public: - PRenaming() { - newName = "~"; - oldName = "~"; - } - - PRenaming(string s1, string s2) { - newName = s1; - oldName = s2; - } - - string doRename() { - return "Renaming " + oldName + " to " + newName; - } -}; - -class PProjection -{ - string newName; - string oldName; - - public: - PProjection() { - newName = "~"; - oldName = "~"; - } - - PProjection(string s1, string s2) { - newName = s1; - oldName = s2; - } - - string doPProjection() { - return "Projecting " + oldName + " onto " + newName; - } -}; - -class POperand -{ - string op; - - public: - POperand() { op = "~"; } - POperand(string str) { op = str; } - void setPOperand(string str) { op = str; } - string getPOperand() { return op; } -}; - -class POp -{ - string op; - - public: - POp() { op = "~"; } - POp(string str) { op = str; } - void setPOp(string str) { op = str; } - string getPOp() { return op; } -}; - -class PComparison -{ - POp op; - POperand operand1; - POperand operand2; - - public: - PComparison() { - op.setPOp("~"); - operand1.setPOperand("~"); - operand2.setPOperand("~"); - } - - PComparison(string str1, string str2, string str3) { - operand1.setPOperand(str1); - op.setPOp(str2); - operand2.setPOperand(str3); - } - - void setPComparison(string str1, string str2, string str3) { - operand1.setPOperand(str1); - op.setPOp(str2); - operand2.setPOperand(str3); - } - - string getPComparison() { - return operand1.getPOperand() + " " + op.getPOp() + " " + operand2.getPOperand(); - } -}; - -class PConjunction -{ - string conj; - public: - PConjunction() { conj = "~"; } - PConjunction(string str) { conj = str; } - void setPConjunction(string str) { conj = str; } - string getPConjunction() { return conj; } -}; - -class PCondition -{ - string cond; - public: - - PCondition() { cond = "~"; } - PCondition(string str) { cond = str; } - void setPCondition(string str) { cond = str; } - string getPCondition() { return cond; } -}; - -class PSelection -{ - string select; - public: - PSelection() { select = "~"; } - PSelection(string str) { select = str; } - string getPSelection() { return select; } -}; - -class PExpression -{ - PRelation rel; - PSelection sel; - PProjection proj; - PRenaming ren; - PUnion un; - PDifference diff; - PProduct prod; - string temp; - - public: - - PExpression(); - PExpression(string str) { temp = str; } - void setPExpression(string str) { temp = str; } - string getPExpression() { return temp; } -}; - -void parse(string s, DBEngine &e); -void parseList(vector input, DBEngine &engine); \ No newline at end of file +#include +#include +#include +#include +#include "DBEngine.h" + +std::vector tokenize(std::string ss); +void displayTokenList(std::vector input); +Relation condition(std::vector input, Relation &r, DBEngine &engine); +tuple, Relation> expression(std::vector input, DBEngine &engine); +std::vector showCMD(std::vector input, DBEngine &engine); +std::vector saveCMD(std::vector input, DBEngine &engine); +std::vector closeCMD(std::vector input, DBEngine &engine); +std::vector openCMD(std::vector input, DBEngine &engine); +std::vector exitCMD(std::vector input, DBEngine &engine); +std::vector createCMD(std::vector input, DBEngine &engine); +std::vector insertCMD(std::vector input, DBEngine &engine); +std::vector updateCMD(std::vector input, DBEngine &engine); +std::vector deleteCMD(std::vector input, DBEngine &engine); +std::vector query(std::vector input, DBEngine &engine); +void par_line(std::vector input, DBEngine &engine); +void parse(std::string s, DBEngine &e); +void parseList(std::vector input, DBEngine &engine); \ No newline at end of file diff --git a/a.out b/a.out index 4753e8d..b210e4a 100755 Binary files a/a.out and b/a.out differ