in src/core/storage/sframe_interface/unity_sarray_binary_operations.cpp [84:148]
flex_type_enum get_output_type(flex_type_enum left,
flex_type_enum right,
std::string op) {
if (op == "+" || op == "-" || op == "*") {
if (left == flex_type_enum::INTEGER && right == flex_type_enum::FLOAT) {
// operations against float always returns float
return flex_type_enum::FLOAT;
} else if (left == flex_type_enum::DATETIME && right == flex_type_enum::DATETIME && op == "-") {
return flex_type_enum::FLOAT;
} else if (left == flex_type_enum::ND_VECTOR || right == flex_type_enum::ND_VECTOR) {
// vector operations always return vector
return flex_type_enum::ND_VECTOR;
} else if (left == flex_type_enum::VECTOR || right == flex_type_enum::VECTOR) {
// vector operations always return vector
return flex_type_enum::VECTOR;
} else {
// otherwise we take the type on the left hand side
return left;
}
} else if (op == "**") {
if (left == flex_type_enum::VECTOR || right == flex_type_enum::VECTOR) {
// vector operations always return vector
return flex_type_enum::VECTOR;
} else {
return flex_type_enum::FLOAT;
}
} else if (op == "//") {
if (left == flex_type_enum::VECTOR || right == flex_type_enum::VECTOR) {
// vector operations always return vector
return flex_type_enum::VECTOR;
} else if (left == flex_type_enum::FLOAT || right == flex_type_enum::FLOAT) {
return flex_type_enum::FLOAT;
} else {
return flex_type_enum::INTEGER;
}
} else if (op == "%") {
if (left == flex_type_enum::VECTOR || left == flex_type_enum::ND_VECTOR) {
return left;
}
return flex_type_enum::INTEGER;
} else if (op == "/") {
if (left == flex_type_enum::ND_VECTOR || right == flex_type_enum::ND_VECTOR) {
// vector operations always return vector
return flex_type_enum::ND_VECTOR;
} else if (left == flex_type_enum::VECTOR || right == flex_type_enum::VECTOR) {
// vector operations always return vector
return flex_type_enum::VECTOR;
} else {
return flex_type_enum::FLOAT;
}
} else if (op == "<" || op == ">" || op == "<=" ||
op == ">=" || op == "==" || op == "!=") {
// comparison always returns integer
return flex_type_enum::INTEGER;
} else if (op == "&" || op == "|") {
// boolean operations always returns integer
return flex_type_enum::INTEGER;
} else if (op == "in") {
return flex_type_enum::INTEGER;
} else if (op == "left_abs") {
return left;
} else {
throw std::string("Invalid Operation Type");
}
}