2022-07-29 16:30:50 +00:00
|
|
|
#pragma once
|
|
|
|
|
2022-07-29 21:34:25 +00:00
|
|
|
#include <string_view>
|
|
|
|
|
2022-07-29 16:30:50 +00:00
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
/// Join method.
|
|
|
|
enum class JoinKind
|
|
|
|
{
|
|
|
|
Inner, /// Leave only rows that was JOINed.
|
|
|
|
Left, /// If in "right" table there is no corresponding rows, use default values instead.
|
|
|
|
Right,
|
|
|
|
Full,
|
|
|
|
Cross, /// Direct product. Strictness and condition doesn't matter.
|
|
|
|
Comma /// Same as direct product. Intended to be converted to INNER JOIN with conditions from WHERE.
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(JoinKind kind);
|
|
|
|
|
|
|
|
inline constexpr bool isLeft(JoinKind kind) { return kind == JoinKind::Left; }
|
|
|
|
inline constexpr bool isRight(JoinKind kind) { return kind == JoinKind::Right; }
|
|
|
|
inline constexpr bool isInner(JoinKind kind) { return kind == JoinKind::Inner; }
|
|
|
|
inline constexpr bool isFull(JoinKind kind) { return kind == JoinKind::Full; }
|
|
|
|
inline constexpr bool isCrossOrComma(JoinKind kind) { return kind == JoinKind::Comma || kind == JoinKind::Cross; }
|
|
|
|
inline constexpr bool isRightOrFull(JoinKind kind) { return kind == JoinKind::Right || kind == JoinKind::Full; }
|
|
|
|
inline constexpr bool isLeftOrFull(JoinKind kind) { return kind == JoinKind::Left || kind == JoinKind::Full; }
|
|
|
|
inline constexpr bool isInnerOrRight(JoinKind kind) { return kind == JoinKind::Inner || kind == JoinKind::Right; }
|
|
|
|
inline constexpr bool isInnerOrLeft(JoinKind kind) { return kind == JoinKind::Inner || kind == JoinKind::Left; }
|
|
|
|
|
|
|
|
/// Allows more optimal JOIN for typical cases.
|
|
|
|
enum class JoinStrictness
|
|
|
|
{
|
|
|
|
Unspecified,
|
|
|
|
RightAny, /// Old ANY JOIN. If there are many suitable rows in right table, use any from them to join.
|
|
|
|
Any, /// Semi Join with any value from filtering table. For LEFT JOIN with Any and RightAny are the same.
|
|
|
|
All, /// If there are many suitable rows to join, use all of them and replicate rows of "left" table (usual semantic of JOIN).
|
|
|
|
Asof, /// For the last JOIN column, pick the latest value
|
|
|
|
Semi, /// LEFT or RIGHT. SEMI LEFT JOIN filters left table by values exists in right table. SEMI RIGHT - otherwise.
|
|
|
|
Anti, /// LEFT or RIGHT. Same as SEMI JOIN but filter values that are NOT exists in other table.
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(JoinStrictness strictness);
|
|
|
|
|
|
|
|
/// Algorithm for distributed query processing.
|
|
|
|
enum class JoinLocality
|
|
|
|
{
|
|
|
|
Unspecified,
|
|
|
|
Local, /// Perform JOIN, using only data available on same servers (co-located data).
|
|
|
|
Global /// Collect and merge data from remote servers, and broadcast it to each server.
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(JoinLocality locality);
|
|
|
|
|
|
|
|
/// ASOF JOIN inequality type
|
|
|
|
enum class ASOFJoinInequality
|
|
|
|
{
|
|
|
|
None,
|
|
|
|
Less,
|
|
|
|
Greater,
|
|
|
|
LessOrEquals,
|
|
|
|
GreaterOrEquals,
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(ASOFJoinInequality asof_join_inequality);
|
|
|
|
|
|
|
|
inline constexpr ASOFJoinInequality getASOFJoinInequality(std::string_view func_name)
|
|
|
|
{
|
|
|
|
ASOFJoinInequality inequality = ASOFJoinInequality::None;
|
|
|
|
|
|
|
|
if (func_name == "less")
|
|
|
|
inequality = ASOFJoinInequality::Less;
|
|
|
|
else if (func_name == "greater")
|
|
|
|
inequality = ASOFJoinInequality::Greater;
|
|
|
|
else if (func_name == "lessOrEquals")
|
|
|
|
inequality = ASOFJoinInequality::LessOrEquals;
|
|
|
|
else if (func_name == "greaterOrEquals")
|
|
|
|
inequality = ASOFJoinInequality::GreaterOrEquals;
|
|
|
|
|
|
|
|
return inequality;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline constexpr ASOFJoinInequality reverseASOFJoinInequality(ASOFJoinInequality inequality)
|
|
|
|
{
|
|
|
|
if (inequality == ASOFJoinInequality::Less)
|
|
|
|
return ASOFJoinInequality::Greater;
|
|
|
|
else if (inequality == ASOFJoinInequality::Greater)
|
|
|
|
return ASOFJoinInequality::Less;
|
|
|
|
else if (inequality == ASOFJoinInequality::LessOrEquals)
|
|
|
|
return ASOFJoinInequality::GreaterOrEquals;
|
|
|
|
else if (inequality == ASOFJoinInequality::GreaterOrEquals)
|
|
|
|
return ASOFJoinInequality::LessOrEquals;
|
|
|
|
|
|
|
|
return ASOFJoinInequality::None;
|
|
|
|
}
|
|
|
|
|
2022-07-29 17:35:15 +00:00
|
|
|
enum class JoinAlgorithm
|
|
|
|
{
|
|
|
|
DEFAULT = 0,
|
|
|
|
AUTO,
|
|
|
|
HASH,
|
|
|
|
PARTIAL_MERGE,
|
|
|
|
PREFER_PARTIAL_MERGE,
|
|
|
|
PARALLEL_HASH,
|
2022-09-07 08:00:14 +00:00
|
|
|
GRACE_HASH,
|
2022-07-29 17:35:15 +00:00
|
|
|
DIRECT,
|
|
|
|
FULL_SORTING_MERGE,
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(JoinAlgorithm join_algorithm);
|
|
|
|
|
|
|
|
enum class JoinTableSide
|
|
|
|
{
|
|
|
|
Left,
|
|
|
|
Right
|
|
|
|
};
|
|
|
|
|
|
|
|
const char * toString(JoinTableSide join_table_side);
|
|
|
|
|
2022-07-29 16:30:50 +00:00
|
|
|
}
|