type::Value ComparisonExpression::Evaluate( const AbstractTuple *tuple1, const AbstractTuple *tuple2, executor::ExecutorContext *context) const { PELOTON_ASSERT(children_.size() == 2); auto vl = children_[0]->Evaluate(tuple1, tuple2, context); auto vr = children_[1]->Evaluate(tuple1, tuple2, context); switch (exp_type_) { case (ExpressionType::COMPARE_EQUAL): return type::ValueFactory::GetBooleanValue(vl.CompareEquals(vr)); case (ExpressionType::COMPARE_NOTEQUAL): return type::ValueFactory::GetBooleanValue(vl.CompareNotEquals(vr)); case (ExpressionType::COMPARE_LESSTHAN): return type::ValueFactory::GetBooleanValue(vl.CompareLessThan(vr)); case (ExpressionType::COMPARE_GREATERTHAN): return type::ValueFactory::GetBooleanValue(vl.CompareGreaterThan(vr)); case (ExpressionType::COMPARE_LESSTHANOREQUALTO): return type::ValueFactory::GetBooleanValue(vl.CompareLessThanEquals(vr)); case (ExpressionType::COMPARE_GREATERTHANOREQUALTO): return type::ValueFactory::GetBooleanValue( vl.CompareGreaterThanEquals(vr)); case (ExpressionType::COMPARE_DISTINCT_FROM): { if (vl.IsNull() && vr.IsNull()) { return type::ValueFactory::GetBooleanValue(false); } else if (!vl.IsNull() && !vr.IsNull()) { return type::ValueFactory::GetBooleanValue(vl.CompareNotEquals(vr)); } return type::ValueFactory::GetBooleanValue(true); } default: throw Exception("Invalid comparison expression type."); } }
Value *IntegerValue::Max(const Value &o) const { CheckInteger(); CheckComparable(o); if (IsNull() || o.IsNull()) return OperateNull(o); std::unique_ptr<Value> cmp(CompareGreaterThanEquals(o)); if (cmp->IsTrue()) return Copy(); return o.Copy(); }