2021-01-12 18:34:35 +00:00
|
|
|
#include <Parsers/ASTWindowDefinition.h>
|
|
|
|
|
2021-01-13 19:29:52 +00:00
|
|
|
#include <Common/quoteString.h>
|
|
|
|
#include <IO/Operators.h>
|
|
|
|
|
2021-01-12 18:34:35 +00:00
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
ASTPtr ASTWindowDefinition::clone() const
|
|
|
|
{
|
|
|
|
auto result = std::make_shared<ASTWindowDefinition>();
|
|
|
|
|
|
|
|
if (partition_by)
|
|
|
|
{
|
|
|
|
result->partition_by = partition_by->clone();
|
|
|
|
result->children.push_back(result->partition_by);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (order_by)
|
|
|
|
{
|
|
|
|
result->order_by = order_by->clone();
|
|
|
|
result->children.push_back(result->order_by);
|
|
|
|
}
|
|
|
|
|
2021-01-19 01:00:39 +00:00
|
|
|
result->frame = frame;
|
|
|
|
|
2021-01-12 18:34:35 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
String ASTWindowDefinition::getID(char) const
|
|
|
|
{
|
|
|
|
return "WindowDefinition";
|
|
|
|
}
|
|
|
|
|
2021-01-13 19:29:52 +00:00
|
|
|
void ASTWindowDefinition::formatImpl(const FormatSettings & settings,
|
2021-01-19 01:00:39 +00:00
|
|
|
FormatState & state, FormatStateStacked format_frame) const
|
2021-01-13 19:29:52 +00:00
|
|
|
{
|
|
|
|
if (partition_by)
|
|
|
|
{
|
2021-03-23 22:40:27 +00:00
|
|
|
settings.ostr << "PARTITION BY";
|
2021-01-19 01:00:39 +00:00
|
|
|
partition_by->formatImpl(settings, state, format_frame);
|
2021-01-13 19:29:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (partition_by && order_by)
|
|
|
|
{
|
|
|
|
settings.ostr << " ";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (order_by)
|
|
|
|
{
|
2021-03-23 22:40:27 +00:00
|
|
|
settings.ostr << "ORDER BY";
|
2021-01-19 01:00:39 +00:00
|
|
|
order_by->formatImpl(settings, state, format_frame);
|
|
|
|
}
|
|
|
|
|
2021-01-27 00:08:15 +00:00
|
|
|
if ((partition_by || order_by) && !frame.is_default)
|
|
|
|
{
|
|
|
|
settings.ostr << " ";
|
|
|
|
}
|
|
|
|
|
2021-01-19 01:00:39 +00:00
|
|
|
if (!frame.is_default)
|
|
|
|
{
|
2021-01-30 01:16:44 +00:00
|
|
|
settings.ostr << WindowFrame::toString(frame.type) << " BETWEEN ";
|
|
|
|
if (frame.begin_type == WindowFrame::BoundaryType::Current)
|
|
|
|
{
|
|
|
|
settings.ostr << "CURRENT ROW";
|
|
|
|
}
|
|
|
|
else if (frame.begin_type == WindowFrame::BoundaryType::Unbounded)
|
|
|
|
{
|
|
|
|
settings.ostr << "UNBOUNDED PRECEDING";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-03-18 23:05:43 +00:00
|
|
|
settings.ostr << applyVisitor(FieldVisitorToString(),
|
|
|
|
frame.begin_offset);
|
2021-01-30 01:16:44 +00:00
|
|
|
settings.ostr << " "
|
2021-02-05 09:13:19 +00:00
|
|
|
<< (!frame.begin_preceding ? "FOLLOWING" : "PRECEDING");
|
2021-01-30 01:16:44 +00:00
|
|
|
}
|
|
|
|
settings.ostr << " AND ";
|
|
|
|
if (frame.end_type == WindowFrame::BoundaryType::Current)
|
|
|
|
{
|
|
|
|
settings.ostr << "CURRENT ROW";
|
|
|
|
}
|
|
|
|
else if (frame.end_type == WindowFrame::BoundaryType::Unbounded)
|
|
|
|
{
|
2021-03-05 03:15:20 +00:00
|
|
|
settings.ostr << "UNBOUNDED FOLLOWING";
|
2021-01-30 01:16:44 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-03-18 23:05:43 +00:00
|
|
|
settings.ostr << applyVisitor(FieldVisitorToString(),
|
|
|
|
frame.end_offset);
|
2021-01-30 01:16:44 +00:00
|
|
|
settings.ostr << " "
|
2021-02-05 09:13:19 +00:00
|
|
|
<< (!frame.end_preceding ? "FOLLOWING" : "PRECEDING");
|
2021-01-30 01:16:44 +00:00
|
|
|
}
|
2021-01-13 19:29:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string ASTWindowDefinition::getDefaultWindowName() const
|
|
|
|
{
|
|
|
|
WriteBufferFromOwnString ostr;
|
|
|
|
FormatSettings settings{ostr, true /* one_line */};
|
|
|
|
FormatState state;
|
2021-01-19 01:00:39 +00:00
|
|
|
FormatStateStacked format_frame;
|
|
|
|
formatImpl(settings, state, format_frame);
|
2021-01-13 19:29:52 +00:00
|
|
|
return ostr.str();
|
|
|
|
}
|
|
|
|
|
2021-01-12 18:34:35 +00:00
|
|
|
ASTPtr ASTWindowListElement::clone() const
|
|
|
|
{
|
|
|
|
auto result = std::make_shared<ASTWindowListElement>();
|
|
|
|
|
|
|
|
result->name = name;
|
|
|
|
result->definition = definition->clone();
|
|
|
|
result->children.push_back(result->definition);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
String ASTWindowListElement::getID(char) const
|
|
|
|
{
|
|
|
|
return "WindowListElement";
|
|
|
|
}
|
|
|
|
|
2021-01-13 19:29:52 +00:00
|
|
|
void ASTWindowListElement::formatImpl(const FormatSettings & settings,
|
|
|
|
FormatState & state, FormatStateStacked frame) const
|
|
|
|
{
|
|
|
|
settings.ostr << backQuoteIfNeed(name);
|
|
|
|
settings.ostr << " AS (";
|
|
|
|
definition->formatImpl(settings, state, frame);
|
|
|
|
settings.ostr << ")";
|
|
|
|
}
|
|
|
|
|
2021-01-12 18:34:35 +00:00
|
|
|
}
|