Esempio n. 1
0
void Cql2Dnf::_buildEvalHeap()
{
	PEG_METHOD_ENTER(TRC_CQL, "Cql2Dnf::_buildEvalHeap");

    Stack<stack_el> stack;

    // Counter for Operands
    Uint32 j = 0;

    for (Uint32 i = 0, n = _operations.size(); i < n; i++)
    {
        OperationType op = _operations[i];

        switch (op)
        {
            case CQL_OR:
            case CQL_AND:
            {
                PEGASUS_ASSERT(stack.size() >= 2);

                stack_el op1 = stack.top();
                stack.pop();

                stack_el op2 = stack.top();

                // generate Eval expression
                eval_heap.append(eval_el(0, op , op1.opn, op1.is_terminal,
                                 op2.opn , op2.is_terminal));

                stack.top() = stack_el(eval_heap.size()-1, false);

                break;
            }

            case CQL_NOT:
            {
                PEGASUS_ASSERT(stack.size() >= 1);

                stack_el op1 = stack.top();

                // generate Eval expression
                eval_heap.append(eval_el(0, op , op1.opn, op1.is_terminal,
                                 -1, true));

                stack.top() = stack_el(eval_heap.size()-1, false);

                break;
            }

            case CQL_EQ: 
            case CQL_NE:
            case CQL_LT:
            case CQL_LE:
            case CQL_GT:
            case CQL_GE:
				case CQL_ISA:
				case CQL_LIKE:
            {
                PEGASUS_ASSERT(_operands.size() >= 2);

                CQLExpression lhs = _operands[j++];

                CQLExpression rhs = _operands[j++];

		CQLSimplePredicate sp(lhs,rhs,_convertOpType(op));
                terminal_heap.push(term_el(false, sp));

                stack.push(stack_el(terminal_heap.size()-1, true));

                break;
            }

            case CQL_IS_NULL:
            {
                PEGASUS_ASSERT(_operands.size() >= 1);
                CQLExpression expression = _operands[j++];
		CQLSimplePredicate dummy(expression,IS_NULL);
                terminal_heap.push(term_el(false, dummy));

                stack.push(stack_el(terminal_heap.size()-1, true));

                break;
            }

            case CQL_IS_NOT_NULL:
            {
                PEGASUS_ASSERT(_operands.size() >= 1);
                CQLExpression expression = _operands[j++];
                CQLSimplePredicate dummy(expression,IS_NOT_NULL);
                terminal_heap.push(term_el(false, dummy));

                stack.push(stack_el(terminal_heap.size()-1, true));

                break;
            }
	    case CQL_NOOP:
	    default: break;
        }
    }

    PEGASUS_ASSERT(stack.size() == 1);

    PEG_METHOD_EXIT();
}
Esempio n. 2
0
void WQLCompile::_buildEvalHeap(const WQLSelectStatement * wqs)
{
	Stack<stack_el> stack;
	for (UInt32 i = 0, n = wqs->_operStack.size(); i < n; i++)
	{
		const WQLSelectStatement::OperandOrOperation& curItem = wqs->_operStack[i];
		if (curItem.m_type == WQLSelectStatement::OperandOrOperation::OPERAND)
		{
			// put pointer to it onto the stack
			stack.push(stack_el(i, OPERAND));
		}
		else
		{
			WQLOperation op = curItem.m_operation;
	
			switch (op)
			{
				// unary
				case WQL_NOT:
					{
						OW_ASSERT(stack.size() >= 1);
	
						stack_el op1 = stack.top();
	
						// generate Eval expression
						eval_heap.append(eval_el(false, op, op1.opn, op1.type,
							-1, TERMINAL_HEAP));
	
						stack.top() = stack_el(eval_heap.size()-1, EVAL_HEAP);
	
						break;
					}
	
				// binary
				case WQL_OR:
				case WQL_AND:
				case WQL_EQ:
				case WQL_NE:
				case WQL_LT:
				case WQL_LE:
				case WQL_GT:
				case WQL_GE:
				case WQL_ISA:
					{
						OW_ASSERT(stack.size() >= 2);
	
						stack_el op2 = stack.top();
						stack.pop();
	
						stack_el op1 = stack.top();
						if (op1.type == OPERAND && op2.type == OPERAND)
						{
							OW_ASSERT(op1.type == OPERAND);
							OW_ASSERT(wqs->_operStack[op1.opn].m_type == WQLSelectStatement::OperandOrOperation::OPERAND);
							WQLOperand lhs = wqs->_operStack[op1.opn].m_operand;
							OW_ASSERT(op2.type == OPERAND);
							OW_ASSERT(wqs->_operStack[op2.opn].m_type == WQLSelectStatement::OperandOrOperation::OPERAND);
							WQLOperand rhs = wqs->_operStack[op2.opn].m_operand;
							terminal_heap.push_back(term_el(false, op, lhs, rhs));
							stack.top() = stack_el(terminal_heap.size()-1, TERMINAL_HEAP);
						}
						else
						{
							// generate Eval expression
							eval_heap.append(eval_el(false, op, op1.opn, op1.type,
								op2.opn , op2.type));
							stack.top() = stack_el(eval_heap.size()-1, EVAL_HEAP);
						}
	
						break;
					}
				case WQL_DO_NOTHING:
					{
						OW_ASSERT(0); // this should never happen
						break;
					}
			}
		}
	}
	OW_ASSERT(stack.size() == 1);
}