ClickHouse/dbms/src/Interpreters/RowRefs.h

85 lines
1.8 KiB
C++
Raw Normal View History

2019-03-30 21:30:21 +00:00
#pragma once
#include <Columns/IColumn.h>
#include <Common/SortedLookupPODArray.h>
#include <optional>
2019-04-01 16:44:15 +00:00
#include <variant>
2019-04-02 18:50:35 +00:00
#include <list>
#include <mutex>
2019-03-30 21:30:21 +00:00
namespace DB
{
class Block;
/// Reference to the row in block.
struct RowRef
{
const Block * block = nullptr;
size_t row_num = 0;
RowRef() {}
RowRef(const Block * block_, size_t row_num_) : block(block_), row_num(row_num_) {}
};
/// Single linked list of references to rows. Used for ALL JOINs (non-unique JOINs)
struct RowRefList : RowRef
{
RowRefList * next = nullptr;
RowRefList() {}
RowRefList(const Block * block_, size_t row_num_) : RowRef(block_, row_num_) {}
};
class AsofRowRefs
{
public:
template <typename T>
2019-03-30 21:30:21 +00:00
struct Entry
{
using LookupType = SortedLookupPODArray<Entry<T>>;
2019-03-30 21:30:21 +00:00
T asof_value;
RowRef row_ref;
Entry(T v) : asof_value(v) {}
Entry(T v, RowRef rr) : asof_value(v), row_ref(rr) {}
bool operator < (const Entry & o) const
2019-03-30 21:30:21 +00:00
{
return asof_value < o.asof_value;
}
};
2019-04-01 16:44:15 +00:00
using Lookups = std::variant<
2019-04-02 18:50:35 +00:00
Entry<UInt32>::LookupType,
Entry<UInt64>::LookupType,
Entry<Float32>::LookupType,
Entry<Float64>::LookupType>;
struct LookupLists
{
mutable std::mutex mutex;
std::list<Lookups> lookups;
};
2019-03-30 21:30:21 +00:00
2019-04-01 16:44:15 +00:00
enum class Type
{
key32,
key64,
keyf32,
keyf64,
2019-03-30 21:30:21 +00:00
};
2019-04-01 16:44:15 +00:00
static std::optional<Type> getTypeSize(const IColumn * asof_column, size_t & type_size);
2019-04-02 18:50:35 +00:00
void insert(Type type, LookupLists &, const IColumn * asof_column, const Block * block, size_t row_num);
const RowRef * findAsof(Type type, const LookupLists &, const IColumn * asof_column, size_t row_num) const;
2019-03-30 21:30:21 +00:00
private:
2019-04-02 18:50:35 +00:00
Lookups * lookups = nullptr;
2019-03-30 21:30:21 +00:00
};
2019-03-31 10:56:54 +00:00
}