flex_type_enum get_output_type()

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");
  }
}