in src/qmf/Expression.cpp [162:196]
bool Expression::boolEval(const Variant::Map& data) const
{
Variant val[2];
bool exists[2];
for (int idx = 0; idx < operandCount; idx++) {
if (quoted[idx]) {
exists[idx] = true;
val[idx] = operands[idx];
} else {
Variant::Map::const_iterator mIter(data.find(operands[idx].asString()));
if (mIter == data.end()) {
exists[idx] = false;
} else {
exists[idx] = true;
val[idx] = mIter->second;
}
}
}
switch (boolOp) {
case BOOL_EQ: return (exists[0] && exists[1] && (val[0].asString() == val[1].asString()));
case BOOL_NE: return (exists[0] && exists[1] && (val[0].asString() != val[1].asString()));
case BOOL_LT: return (exists[0] && exists[1] && lessThan(val[0], val[1]));
case BOOL_LE: return (exists[0] && exists[1] && lessEqual(val[0], val[1]));
case BOOL_GT: return (exists[0] && exists[1] && greaterThan(val[0], val[1]));
case BOOL_GE: return (exists[0] && exists[1] && greaterEqual(val[0], val[1]));
case BOOL_RE_MATCH: return false; // TODO
case BOOL_EXISTS: return exists[0];
case BOOL_TRUE: return true;
case BOOL_FALSE: return false;
}
return false;
}