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:
|
2019-04-02 16:22:14 +00:00
|
|
|
template <typename T>
|
2019-03-30 21:30:21 +00:00
|
|
|
struct Entry
|
|
|
|
{
|
2019-04-02 16:22:14 +00:00
|
|
|
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) {}
|
|
|
|
|
2019-04-02 16:22:14 +00:00
|
|
|
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
|
|
|
}
|