#pragma once #include "exception.h" #include "parser.h" #include "settings.h" #include #include namespace usql { struct ColValue { virtual bool isNull() const { return false; }; virtual ColumnType getColType() const = 0; virtual long getIntegerValue() const = 0; virtual double getDoubleValue() const = 0; virtual std::string getStringValue() const = 0; virtual std::string getCsvStringValue() const { return getStringValue(); }; virtual long getDateValue() const = 0; virtual bool getBoolValue() const = 0; virtual int compare(ColValue &other) const = 0; virtual ~ColValue() = default; }; struct ColNullValue : ColValue { bool isNull() const override { return true; }; ColumnType getColType() const override { throw Exception("getColType not supported on ColNullValue"); } long getIntegerValue() const override { throw Exception("getIntegerValue not supported on ColNullValue"); }; double getDoubleValue() const override { throw Exception("getDoubleValue not supported on ColNullValue"); }; std::string getStringValue() const override { return "null"; }; long getDateValue() const override { throw Exception("getDateValue not supported on ColNullValue"); }; bool getBoolValue() const override { throw Exception("getDateValue not supported on ColNullValue"); }; int compare(ColValue &other) const override; ~ColNullValue() override = default; }; struct ColIntegerValue : ColValue { explicit ColIntegerValue(long value) : m_integer(value) {}; ColIntegerValue(const ColIntegerValue &other) : m_integer(other.m_integer) {}; ColumnType getColType() const override { return ColumnType::integer_type; }; long getIntegerValue() const override { return m_integer; }; double getDoubleValue() const override { return (double) m_integer; }; std::string getStringValue() const override { return std::to_string(m_integer); }; long getDateValue() const override { return m_integer; }; bool getBoolValue() const override { throw Exception("Not supported on ColIntegerValue"); }; int compare(ColValue &other) const override; ~ColIntegerValue() override = default; long m_integer; }; struct ColDoubleValue : ColValue { explicit ColDoubleValue(double value) : m_double(value) {}; ColDoubleValue(const ColDoubleValue &other) : m_double(other.m_double) {} ColumnType getColType() const override { return ColumnType::float_type; }; long getIntegerValue() const override { return (long) m_double; }; double getDoubleValue() const override { return m_double; }; std::string getStringValue() const override { return Settings::double_to_string(m_double); }; long getDateValue() const override { return (long) m_double; }; bool getBoolValue() const override { throw Exception("Not supported on ColDoubleValue"); }; int compare(ColValue &other) const override; ~ColDoubleValue() override = default; double m_double; }; struct ColStringValue : ColValue { explicit ColStringValue(const std::string &value) : m_string(std::make_unique(value)) {}; ColStringValue(const ColStringValue &other) : m_string(std::make_unique(*other.m_string)) {}; ColStringValue & operator=(ColStringValue other); ColumnType getColType() const override { return ColumnType::varchar_type; }; long getIntegerValue() const override { return std::stoi(*m_string); }; double getDoubleValue() const override { return std::stod(*m_string); }; std::string getStringValue() const override { return *m_string; }; std::string getCsvStringValue() const override;; long getDateValue() const override { return std::stoi(*m_string); }; bool getBoolValue() const override { throw Exception("Not supported on ColStringValue"); }; int compare(ColValue &other) const override; std::unique_ptr m_string; }; struct ColDateValue : ColValue { explicit ColDateValue(long value) : m_date(value) {}; ColDateValue(const ColDateValue &other) : m_date(other.m_date) {}; ColumnType getColType() const override { return ColumnType::date_type; }; long getIntegerValue() const override { return m_date; }; double getDoubleValue() const override { return (double) m_date; }; std::string getStringValue() const override { return Settings::date_to_string(m_date); }; long getDateValue() const override { return m_date; }; bool getBoolValue() const override { throw Exception("Not supported on ColDateValue"); }; int compare(ColValue &other) const override; ~ColDateValue() override = default; long m_date; // seconds since epoch for now }; struct ColBooleanValue : ColValue { explicit ColBooleanValue(bool value) : m_bool(value) {}; ColBooleanValue(const ColBooleanValue &other) : m_bool(other.m_bool) {}; ColumnType getColType() const override { return ColumnType::bool_type; }; long getIntegerValue() const override { return (long) m_bool; }; double getDoubleValue() const override { return (double) m_bool; }; std::string getStringValue() const override { return m_bool ? "Y" : "N"; }; long getDateValue() const override { throw Exception("Not supported on ColBooleanValue"); }; bool getBoolValue() const override { return m_bool; }; int compare(ColValue &other) const override; ~ColBooleanValue() override = default; bool m_bool; }; class Row { public: explicit Row(int cols_count, bool visible) : m_columns(cols_count), m_visible(visible) {}; Row(const Row &other); Row &operator=(Row other); bool operator==(const Row &other) const {return this->compare(other) == 0; }; void setColumnNull(int col_index); void setIntColumnValue(int col_index, long value); void setFloatColumnValue(int col_index, double value); void setStringColumnValue(int col_index, const std::string &value); void setDateColumnValue(int col_index, long value); void setDateColumnValue(int col_index, const std::string &value); void setBoolColumnValue(int col_index, bool value); void setBoolColumnValue(int col_index, const std::string &value); void setColumnValue(ColDefNode *col_def, ColValue &col_value); void setColumnValue(ColDefNode *col_def, ValueNode *col_value); ColValue &operator[](int i) const { auto type_index = m_columns[i].index(); switch (type_index) { case 0: return (ColValue &) *std::get_if(&m_columns[i]); case 1: return (ColValue &) *std::get_if(&m_columns[i]); case 2: return (ColValue &) *std::get_if(&m_columns[i]); case 3: return (ColValue &) *std::get_if(&m_columns[i]); case 4: return (ColValue &) *std::get_if(&m_columns[i]); case 5: return (ColValue &) *std::get_if(&m_columns[i]); default: throw Exception("should not happen"); } } [[nodiscard]] int compare(const Row &other) const; void print(const std::vector &col_defs); static int print_get_column_size(const ColDefNode &col_def); [[nodiscard]] bool is_visible() const { return m_visible; }; void set_visible() { m_visible = true; }; void set_deleted() { m_visible = true; }; private: bool m_visible; std::vector> m_columns; }; } // namespace