beedb/include/table/table.h

183 lines
5.3 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 "schema.h"
#include <cassert>
#include <mutex>
#include <ostream>
#include <storage/page.h>
#include <string>
#include <vector>
namespace beedb::table
{
/**
* Represents a table in the database.
*/
class Table
{
friend std::ostream &operator<<(std::ostream &stream, const Table &table);
public:
using id_t = std::int32_t;
Table(const id_t id, const storage::Page::id_t page_id, const storage::Page::id_t time_travel_page_id,
const Schema &schema)
: _id(id), _page_id(page_id), _time_travel_page_id(time_travel_page_id), _schema(schema)
{
}
Table(const id_t id, const storage::Page::id_t page_id, const storage::Page::id_t time_travel_page_id,
Schema &&schema)
: _id(id), _page_id(page_id), _time_travel_page_id(time_travel_page_id), _schema(std::move(schema))
{
}
~Table() = default;
/**
* @return Name of the table.
*/
[[nodiscard]] const std::string &name() const
{
return _schema.table_name();
}
/**
* @return Id of the table.
*/
[[nodiscard]] id_t id() const
{
return _id;
}
/**
* @return Id of the first data page.
*/
[[nodiscard]] storage::Page::id_t page_id() const
{
return _page_id;
}
/**
* @return Id of the first data page of the time travel storage.
*/
[[nodiscard]] storage::Page::id_t time_travel_page_id() const
{
return _time_travel_page_id;
}
/**
* @return Id of the last data page (pages are like a linked list).
*/
[[nodiscard]] storage::Page::id_t last_page_id() const
{
return _last_page_id;
}
/**
* Updates the last page of a table.
*
* @param page_id Id of the last page.
*/
void last_page_id(const storage::Page::id_t page_id)
{
_last_page_id = page_id;
}
/**
* Updates the first page of the time travel storage.
*
* @param page_id Id of the first page.
*/
void time_travel_page_id(const storage::Page::id_t page_id)
{
_time_travel_page_id = page_id;
}
void last_time_travel_page_id(const storage::Page::id_t page_id)
{
_last_time_travel_page_id = page_id;
}
[[nodiscard]] storage::Page::id_t last_time_travel_page_id() const
{
return _last_time_travel_page_id;
}
/**
* @return Schema of the table.
*/
[[nodiscard]] const Schema &schema() const
{
return _schema;
}
Column &operator[](const std::size_t index)
{
return _schema[index];
}
Column &operator[](const expression::Term &term)
{
const auto index = _schema.column_index(term);
assert(index.has_value());
return _schema[index.value()];
}
const Column &operator[](const std::size_t index) const
{
return _schema[index];
}
const Column &operator[](const expression::Term &term) const
{
const auto index = _schema.column_index(term);
assert(index.has_value());
return _schema[index.value()];
}
/**
* @return True, if the table is virtual aka not persisted.
*/
[[nodiscard]] bool is_virtual() const
{
return _id == -1;
}
[[nodiscard]] std::mutex &latch()
{
return _latch;
}
private:
const id_t _id;
const storage::Page::id_t _page_id;
storage::Page::id_t _time_travel_page_id;
storage::Page::id_t _last_page_id = storage::Page::INVALID_PAGE_ID; // Will not be persisted
storage::Page::id_t _last_time_travel_page_id = storage::Page::INVALID_PAGE_ID;
Schema _schema;
std::mutex _latch;
};
} // namespace beedb::table