bool Tuple::EqualsNoSchemaCheck(const AbstractTuple &other, const std::vector<oid_t> &columns) const { for (auto column_itr : columns) { type::Value lhs = (GetValue(column_itr)); type::Value rhs = (other.GetValue(column_itr)); if (lhs.CompareNotEquals(rhs) == CmpBool::TRUE) { return false; } } return true; }
bool Tuple::EqualsNoSchemaCheck(const AbstractTuple &other) const { const int column_count = tuple_schema_->GetColumnCount(); for (int column_itr = 0; column_itr < column_count; column_itr++) { type::Value lhs = (GetValue(column_itr)); type::Value rhs = (other.GetValue(column_itr)); if (lhs.CompareNotEquals(rhs) == CmpBool::TRUE) { return false; } } return true; }
bool Index::Compare(const AbstractTuple &index_key, const std::vector<oid_t> &key_column_ids, const std::vector<ExpressionType> &expr_types, const std::vector<Value> &values) { int diff; oid_t key_column_itr = -1; // Go over each attribute in the list of comparison columns // The key_columns_ids, as the name shows, saves the key column ids that // have values and expression needs to be compared. // Example: // 1. // key_column_ids { 0 } // expr_types { == } // values { 5 } // basically it's saying get the tuple whose 0 column, which is the key // column, // equals to 5 // // 2. // key_column_ids {0, 1} // expr_types { > , >= } // values {5, 10} // it's saysing col[0] > 5 && col[1] >= 10, where 0 and 1 are key columns. for (auto column_itr : key_column_ids) { key_column_itr++; const Value &rhs = values[key_column_itr]; const Value &lhs = index_key.GetValue(column_itr); const ExpressionType expr_type = expr_types[key_column_itr]; if (expr_type == EXPRESSION_TYPE_COMPARE_IN) { bool bret = lhs.InList(rhs); if (bret == true) { diff = VALUE_COMPARE_EQUAL; } else { diff = VALUE_COMPARE_NO_EQUAL; } } else { diff = lhs.Compare(rhs); } LOG_TRACE("Difference : %d ", diff); if (diff == VALUE_COMPARE_EQUAL) { switch (expr_type) { case EXPRESSION_TYPE_COMPARE_EQUAL: case EXPRESSION_TYPE_COMPARE_LESSTHANOREQUALTO: case EXPRESSION_TYPE_COMPARE_GREATERTHANOREQUALTO: case EXPRESSION_TYPE_COMPARE_IN: continue; case EXPRESSION_TYPE_COMPARE_NOTEQUAL: case EXPRESSION_TYPE_COMPARE_LESSTHAN: case EXPRESSION_TYPE_COMPARE_GREATERTHAN: return false; default: throw IndexException("Unsupported expression type : " + std::to_string(expr_type)); } } else if (diff == VALUE_COMPARE_LESSTHAN) { switch (expr_type) { case EXPRESSION_TYPE_COMPARE_NOTEQUAL: case EXPRESSION_TYPE_COMPARE_LESSTHAN: case EXPRESSION_TYPE_COMPARE_LESSTHANOREQUALTO: continue; case EXPRESSION_TYPE_COMPARE_EQUAL: case EXPRESSION_TYPE_COMPARE_GREATERTHAN: case EXPRESSION_TYPE_COMPARE_GREATERTHANOREQUALTO: case EXPRESSION_TYPE_COMPARE_IN: return false; default: throw IndexException("Unsupported expression type : " + std::to_string(expr_type)); } } else if (diff == VALUE_COMPARE_GREATERTHAN) { switch (expr_type) { case EXPRESSION_TYPE_COMPARE_NOTEQUAL: case EXPRESSION_TYPE_COMPARE_GREATERTHAN: case EXPRESSION_TYPE_COMPARE_GREATERTHANOREQUALTO: continue; case EXPRESSION_TYPE_COMPARE_EQUAL: case EXPRESSION_TYPE_COMPARE_LESSTHAN: case EXPRESSION_TYPE_COMPARE_LESSTHANOREQUALTO: case EXPRESSION_TYPE_COMPARE_IN: return false; default: throw IndexException("Unsupported expression type : " + std::to_string(expr_type)); } } else if (diff == VALUE_COMPARE_NO_EQUAL) { // problems here when there are multiple // conditions with OR in the query return false; } } return true; }