beedb/include/parser/node.h

291 lines
8.8 KiB
C++

/*------------------------------------------------------------------------------*
* Architecture & Implementation of DBMS *
*------------------------------------------------------------------------------*
* Copyright 2022 Databases and Information Systems Group TU Dortmund *
* Visit us at *
* http://dbis.cs.tu-dortmund.de/cms/en/home/ *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
* *
* Authors: *
* Maximilian Berens <maximilian.berens@tu-dortmund.de> *
* Roland Kühn <roland.kuehn@cs.tu-dortmund.de> *
* Jan Mühlig <jan.muehlig@tu-dortmund.de> *
*------------------------------------------------------------------------------*
*/
#pragma once
#include <expression/operation.h>
#include <expression/term.h>
#include <memory>
#include <optional>
#include <string>
#include <table/schema.h>
#include <table/value.h>
#include <vector>
namespace beedb::parser
{
using Alias = std::optional<std::string>;
using TableDescr = std::pair<std::string, Alias>;
using JoinDescr = std::pair<TableDescr, std::unique_ptr<expression::Operation>>;
using WhereExpression = std::unique_ptr<expression::Operation>;
using GroupByExpression = std::vector<expression::Term>;
using OrderByItem = std::pair<std::unique_ptr<expression::Operation>, bool>;
using OrderByExpression = std::vector<OrderByItem>;
struct LimitExpression
{
std::uint64_t limit;
std::uint64_t offset;
};
class NodeInterface
{
public:
NodeInterface() noexcept = default;
virtual ~NodeInterface() noexcept = default;
};
class CreateTableStatement final : public NodeInterface
{
public:
CreateTableStatement(std::string &&table_name, const bool if_not_exists, table::Schema &&schema) noexcept
: _table_name(std::move(table_name)), _if_not_exists(if_not_exists), _schema(std::move(schema))
{
}
~CreateTableStatement() noexcept override = default;
[[nodiscard]] std::string &table_name() noexcept
{
return _table_name;
}
[[nodiscard]] bool if_not_exists() const noexcept
{
return _if_not_exists;
}
[[nodiscard]] table::Schema &schema()
{
return _schema;
}
private:
std::string _table_name;
bool _if_not_exists;
table::Schema _schema;
};
class CreateIndexStatement final : public NodeInterface
{
public:
CreateIndexStatement(std::string &&index_name, std::string &&table_name, std::string &&column_name,
const bool is_unique) noexcept
: _index_name(std::move(index_name)), _table_name(std::move(table_name)), _column_name(std::move(column_name)),
_is_unique(is_unique)
{
}
~CreateIndexStatement() noexcept override = default;
[[nodiscard]] std::string &index_name() noexcept
{
return _index_name;
}
[[nodiscard]] std::string &table_name() noexcept
{
return _table_name;
}
[[nodiscard]] std::string &column_name() noexcept
{
return _column_name;
}
[[nodiscard]] bool is_unique() const noexcept
{
return _is_unique;
}
private:
std::string _index_name;
std::string _table_name;
std::string _column_name;
bool _is_unique;
};
class InsertStatement final : public NodeInterface
{
public:
InsertStatement(std::string &&table_name, std::vector<std::string> &&column_names,
std::vector<std::vector<table::Value>> &&values) noexcept
: _table_name(std::move(table_name)), _column_names(std::move(column_names)), _values(std::move(values))
{
}
~InsertStatement() noexcept override = default;
[[nodiscard]] std::string &table_name() noexcept
{
return _table_name;
}
[[nodiscard]] std::vector<std::string> &column_names() noexcept
{
return _column_names;
}
[[nodiscard]] std::vector<std::vector<table::Value>> &values() noexcept
{
return _values;
}
private:
std::string _table_name;
std::vector<std::string> _column_names;
std::vector<std::vector<table::Value>> _values;
};
class UpdateStatement final : public NodeInterface
{
public:
UpdateStatement(std::string &&table_name,
std::vector<std::pair<expression::Attribute, std::unique_ptr<expression::Operation>>> &&updates,
WhereExpression &&where) noexcept
: _table_name(std::move(table_name)), _updates(std::move(updates)), _where(std::move(where))
{
}
~UpdateStatement() noexcept override = default;
[[nodiscard]] std::string &table_name() noexcept
{
return _table_name;
}
[[nodiscard]] std::vector<std::pair<expression::Attribute, std::unique_ptr<expression::Operation>>>
&updates() noexcept
{
return _updates;
}
[[nodiscard]] WhereExpression &where() noexcept
{
return _where;
}
private:
std::string _table_name;
std::vector<std::pair<expression::Attribute, std::unique_ptr<expression::Operation>>> _updates;
WhereExpression _where;
};
class DeleteStatement final : public NodeInterface
{
public:
DeleteStatement(std::string &&table_name, WhereExpression &&where) noexcept
: _table_name(std::move(table_name)), _where(std::move(where))
{
}
~DeleteStatement() noexcept override = default;
[[nodiscard]] std::string &table_name() noexcept
{
return _table_name;
}
[[nodiscard]] WhereExpression &where() noexcept
{
return _where;
}
private:
std::string _table_name;
WhereExpression _where;
};
class TransactionStatement final : public NodeInterface
{
public:
enum Type
{
BeginTransaction,
CommitTransaction,
AbortTransaction
};
explicit TransactionStatement(const Type type) : _type(type)
{
}
~TransactionStatement() override = default;
[[nodiscard]] bool is_begin() const noexcept
{
return _type == Type::BeginTransaction;
}
[[nodiscard]] bool is_commit() const noexcept
{
return _type == Type::CommitTransaction;
}
[[nodiscard]] bool is_abort() const noexcept
{
return _type == Type::AbortTransaction;
}
private:
const Type _type;
};
class SelectQuery final : public NodeInterface
{
public:
SelectQuery(std::vector<std::unique_ptr<expression::Operation>> &&attributes, std::vector<TableDescr> &&from,
std::optional<std::vector<JoinDescr>> &&join, WhereExpression &&where,
std::optional<GroupByExpression> &&group_by, std::optional<OrderByExpression> &&order_by,
std::optional<LimitExpression> &&limit) noexcept
: _attributes(std::move(attributes)), _from(std::move(from)), _join(std::move(join)), _where(std::move(where)),
_group_by(std::move(group_by)), _order_by(std::move(order_by)), _limit(limit)
{
}
~SelectQuery() noexcept override = default;
[[nodiscard]] std::vector<std::unique_ptr<expression::Operation>> &attributes() noexcept
{
return _attributes;
}
[[nodiscard]] std::vector<TableDescr> &from() noexcept
{
return _from;
}
[[nodiscard]] std::optional<std::vector<JoinDescr>> &join() noexcept
{
return _join;
}
[[nodiscard]] WhereExpression &where() noexcept
{
return _where;
}
[[nodiscard]] std::optional<GroupByExpression> &group_by() noexcept
{
return _group_by;
}
[[nodiscard]] std::optional<OrderByExpression> &order_by() noexcept
{
return _order_by;
}
[[nodiscard]] std::optional<LimitExpression> &limit() noexcept
{
return _limit;
}
private:
std::vector<std::unique_ptr<expression::Operation>> _attributes;
std::vector<TableDescr> _from;
std::optional<std::vector<JoinDescr>> _join;
WhereExpression _where;
std::optional<GroupByExpression> _group_by;
std::optional<OrderByExpression> _order_by;
std::optional<LimitExpression> _limit;
};
} // namespace beedb::parser