int condition() { Token op; int changeSpot = 0; if(token.sym == oddsym) { getToken(); expression(); //odd command emit(2, 0, 6); } else { expression(); if(!isRelation()) getError(8); op = token; getToken(); expression(); changeSpot = writeRelation(op.sym); } return changeSpot; }
bool QueryEvaluator::evaluateSTClause(TNode * ST_node, vector<int> row, vector<vector<int>> * new_rows, ResultTable * temp_result) { TNode * rlt_node = ST_node->getChildAtIndex(0); TNode * arg1_node = rlt_node->getChildAtIndex(0); TNode * arg2_node = rlt_node->getChildAtIndex(1); Symbol rlt = rlt_node->getType(); Symbol arg1_type = arg1_node->getType(); Symbol arg2_type = arg2_node->getType(); string type1 = table.getType(arg1_node->getValue()); string type2 = table.getType(arg2_node->getValue()); int arg1_index = temp_result->getSymbolIndex(arg1_node->getValue()); int arg2_index = temp_result->getSymbolIndex(arg2_node->getValue()); int arg1_val; int arg2_val; switch (arg1_type) { case Underline: { switch (arg2_type) { case Underline: return true; case Const: { arg2_val = getIndexOfConst(arg2_node, rlt, ARG2); vector<int> arg1_vals = getArgInRelation(rlt, arg2_val, ARG1); if (!arg1_vals.empty()) return true; break; } case QuerySymbol: { // get stored value of arg2 in row arg2_val = row[arg2_index]; if (arg2_val!=-1) { vector<int> arg1_vals = getArgInRelation(rlt, arg2_val, ARG1); if (!arg1_vals.empty()) { new_rows->push_back(row); return true; } break; } vector<int> arg2_vals = getAllPKBValues(arg2_node->getValue()); for (size_t i=0; i<arg2_vals.size(); i++) { vector<int> arg1_vals = getArgInRelation(rlt, arg2_vals[i], ARG1); if (!arg1_vals.empty()) { row[arg2_index] = arg2_vals[i]; new_rows->push_back(row); } } break; } default: break; } break; } case Const: { arg1_val = getIndexOfConst(arg1_node, rlt, ARG1); switch (arg2_type) { case Underline: { vector<int> arg2_vals = getArgInRelation(rlt, arg1_val, ARG2); if (!arg2_vals.empty()) return true; break; } case Const: { arg2_val = getIndexOfConst(arg2_node, rlt, ARG2); return isRelation(rlt, arg1_val, arg2_val); } case QuerySymbol: { // get value of arg2 in row arg2_val = row[arg2_index]; if (arg2_val!=-1) { if (isRelation(rlt, arg1_val, arg2_val)) { new_rows->push_back(row); return true; } } vector<int> arg2_vals = getArgInRelation(rlt, arg1_val, ARG2); arg2_vals = removeInvalidValues(arg2_vals, arg2_node->getValue()); // save new values of arg2 to new_rows for (size_t i=0; i<arg2_vals.size(); i++) { row[arg2_index] = arg2_vals[i]; new_rows->push_back(row); } break; } default: break; } break; } case QuerySymbol: { arg1_val = row[arg1_index]; switch (arg2_type) { case Underline: { if (arg1_val!=-1) { vector<int> arg2_vals = getArgInRelation(rlt, arg1_val, ARG2); if (!arg2_vals.empty()) { new_rows->push_back(row); return true; } } vector<int> arg1_vals = getAllPKBValues(arg1_node->getValue()); for (size_t i=0; i<arg1_vals.size(); i++) { vector<int> arg2_vals = getArgInRelation(rlt, arg1_vals[i], ARG2); if (!arg2_vals.empty()) { row[arg1_index] = arg1_vals[i]; new_rows->push_back(row); } } break; } case Const: { arg2_val = getIndexOfConst(arg2_node, rlt, ARG2); if (arg1_val!=-1) { if (isRelation(rlt, arg1_val, arg2_val)) { new_rows->push_back(row); return true; } } vector<int> arg1_vals = getArgInRelation(rlt, arg2_val, ARG1); arg1_vals = removeInvalidValues(arg1_vals, arg1_node->getValue()); //save arg1_vals to new_rows for (size_t i=0; i<arg1_vals.size(); i++) { row[arg1_index] = arg1_vals[i]; new_rows->push_back(row); } break; } case QuerySymbol: { // get value of arg2 in row arg2_val = row[arg2_index]; if (arg1_val!=-1 && arg2_val!=-1) { if (isRelation(rlt, arg1_val, arg2_val)) { new_rows->push_back(row); return true; } } else if (arg1_val!=-1 && arg2_val==-1) { vector<int> arg2_vals = getArgInRelation(rlt, arg1_val, ARG2); arg2_vals = removeInvalidValues(arg2_vals, arg2_node->getValue()); for (size_t i=0; i<arg2_vals.size(); i++) { row[arg2_index] = arg2_vals[i]; new_rows->push_back(row); } } else if (arg1_val==-1 && arg2_val!=-1) { vector<int> arg1_vals = getArgInRelation(rlt, arg2_val, ARG1); arg1_vals = removeInvalidValues(arg1_vals, arg1_node->getValue()); for (size_t i=0; i<arg1_vals.size(); i++) { row[arg1_index] = arg1_vals[i]; new_rows->push_back(row); } } else { vector<int> arg1_vals = getAllPKBValues(arg1_node->getValue()); for (size_t i=0; i<arg1_vals.size(); i++) { if (arg1_index==arg2_index) { if (isRelation(rlt, arg1_vals[i], arg1_vals[i])) { row[arg1_index] = arg1_vals[i]; new_rows->push_back(row); } } else { vector<int> arg2_vals = getArgInRelation(rlt, arg1_vals[i], ARG2); arg2_vals = removeInvalidValues(arg2_vals, arg2_node->getValue()); for (size_t j=0; j<arg2_vals.size(); j++) { row[arg1_index] = arg1_vals[i]; row[arg2_index] = arg2_vals[j]; new_rows->push_back(row); } } } } break; } default: break; } break; } default: break; } if (!new_rows->empty()) return true; return false; }