Reviewers: mferencevic, ipaljak Reviewed By: mferencevic Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D2203
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
#include "query/common.hpp"
|
|
|
|
namespace query {
|
|
|
|
namespace impl {
|
|
|
|
bool TypedValueCompare(const TypedValue &a, const TypedValue &b) {
|
|
// in ordering null comes after everything else
|
|
// at the same time Null is not less that null
|
|
// first deal with Null < Whatever case
|
|
if (a.IsNull()) return false;
|
|
// now deal with NotNull < Null case
|
|
if (b.IsNull()) return true;
|
|
|
|
// comparisons are from this point legal only between values of
|
|
// the same type, or int+float combinations
|
|
if ((a.type() != b.type() && !(a.IsNumeric() && b.IsNumeric())))
|
|
throw QueryRuntimeException(
|
|
"Can't compare value of type {} to value of type {}.", a.type(),
|
|
b.type());
|
|
|
|
switch (a.type()) {
|
|
case TypedValue::Type::Bool:
|
|
return !a.ValueBool() && b.ValueBool();
|
|
case TypedValue::Type::Int:
|
|
if (b.type() == TypedValue::Type::Double)
|
|
return a.ValueInt() < b.ValueDouble();
|
|
else
|
|
return a.ValueInt() < b.ValueInt();
|
|
case TypedValue::Type::Double:
|
|
if (b.type() == TypedValue::Type::Int)
|
|
return a.ValueDouble() < b.ValueInt();
|
|
else
|
|
return a.ValueDouble() < b.ValueDouble();
|
|
case TypedValue::Type::String:
|
|
return a.ValueString() < b.ValueString();
|
|
case TypedValue::Type::List:
|
|
case TypedValue::Type::Map:
|
|
case TypedValue::Type::Vertex:
|
|
case TypedValue::Type::Edge:
|
|
case TypedValue::Type::Path:
|
|
throw QueryRuntimeException(
|
|
"Comparison is not defined for values of type {}.", a.type());
|
|
default:
|
|
LOG(FATAL) << "Unhandled comparison for types";
|
|
}
|
|
}
|
|
|
|
} // namespace impl
|
|
|
|
} // namespace query
|