Beispiel #1
0
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;
}