Skip to content

Commit

Permalink
Merge 891391b into b5c55a4
Browse files Browse the repository at this point in the history
  • Loading branch information
jepett0 authored Aug 6, 2024
2 parents b5c55a4 + 891391b commit 9e84639
Show file tree
Hide file tree
Showing 19 changed files with 194 additions and 6 deletions.
10 changes: 6 additions & 4 deletions ydb/core/kqp/provider/rewrite_io_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ NSQLTranslation::TTranslationSettings CreateViewTranslationSettings(const TStrin
TExprNode::TPtr CompileViewQuery(
const TString& query,
TExprContext& ctx,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
) {
TAstParseResult queryAst;
queryAst = NSQLTranslation::SqlToYql(query, CreateViewTranslationSettings(cluster));
Expand All @@ -39,7 +40,7 @@ TExprNode::TPtr CompileViewQuery(
}

TExprNode::TPtr queryGraph;
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, nullptr, nullptr)) {
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, moduleResolver.get(), nullptr)) {
return nullptr;
}

Expand Down Expand Up @@ -123,14 +124,15 @@ TExprNode::TPtr RewriteReadFromView(
const TExprNode::TPtr& node,
TExprContext& ctx,
const TString& query,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
) {
const TCoRead readNode(node->ChildPtr(0));
const auto worldBeforeThisRead = readNode.World().Ptr();

TExprNode::TPtr queryGraph = FindSavedQueryGraph(readNode.Ptr());
if (!queryGraph) {
queryGraph = CompileViewQuery(query, ctx, cluster);
queryGraph = CompileViewQuery(query, ctx, cluster, moduleResolver);
if (!queryGraph) {
ctx.AddError(TIssue(ctx.GetPosition(readNode.Pos()),
"The query stored in the view cannot be compiled."));
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/kqp/provider/rewrite_io_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ TExprNode::TPtr RewriteReadFromView(
const TExprNode::TPtr& node,
TExprContext& ctx,
const TString& query,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
);

}
3 changes: 2 additions & 1 deletion ydb/core/kqp/provider/yql_kikimr_datasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,7 @@ class TKikimrDataSource : public TDataProviderBase {
}

ctx.Step
.Repeat(TExprStep::ExpandApplyForLambdas)
.Repeat(TExprStep::ExprEval)
.Repeat(TExprStep::DiscoveryIO)
.Repeat(TExprStep::Epochs)
Expand All @@ -762,7 +763,7 @@ class TKikimrDataSource : public TDataProviderBase {
.Repeat(TExprStep::RewriteIO);

const auto& query = tableDesc.Metadata->ViewPersistedData.QueryText;
return RewriteReadFromView(node, ctx, query, cluster);
return RewriteReadFromView(node, ctx, query, cluster, Types.Modules);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
CREATE VIEW `/Root/aggregates_and_window` WITH (security_invoker = TRUE) AS
SELECT
series.title AS series,
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
SUM(
CASE
WHEN episode_count > average_episodes_in_season
THEN 1
ELSE 0
END
) AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
season_id,
episode_count,
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
WINDOW
average_episodes_in_season_window AS (
PARTITION BY
series_id
)
)
GROUP BY
series_id
)
AS series_stats
JOIN `/Root/series`
AS series
USING (series_id);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/aggregates_and_window`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
SELECT
*
FROM (
SELECT
series.title AS series,
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
SUM(
CASE
WHEN episode_count > average_episodes_in_season
THEN 1
ELSE 0
END
) AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
season_id,
episode_count,
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
WINDOW
average_episodes_in_season_window AS (
PARTITION BY
series_id
)
)
GROUP BY
series_id
)
AS series_stats
JOIN `/Root/series`
AS series
USING (series_id)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/aggregates_and_window`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CREATE VIEW `/Root/count_episodes` WITH (security_invoker = TRUE) AS
SELECT
series_id,
season_id,
COUNT(*)
FROM `/Root/episodes`
GROUP BY
series_id,
season_id;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_episodes`;
12 changes: 12 additions & 0 deletions ydb/core/kqp/ut/view/input/cases/count_episodes/etalon_query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SELECT
*
FROM (
SELECT
series_id,
season_id,
COUNT(*)
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_episodes`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
CREATE VIEW `/Root/count_episodes_with_titles` WITH (security_invoker = TRUE) AS
SELECT
series.title AS series,
seasons.title AS season,
episodes.episode_count AS episode_count
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
AS episodes
JOIN `/Root/series`
AS series
ON episodes.series_id == series.series_id
JOIN `/Root/seasons`
AS seasons
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_episodes_with_titles`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
SELECT
*
FROM (
SELECT
series.title AS series,
seasons.title AS season,
episodes.episode_count AS episode_count
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
AS episodes
JOIN `/Root/series`
AS series
ON episodes.series_id == series.series_id
JOIN `/Root/seasons`
AS seasons
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_episodes_with_titles`;
4 changes: 4 additions & 0 deletions ydb/core/kqp/ut/view/input/cases/count_rows/create_view.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CREATE VIEW `/Root/count_rows` WITH (security_invoker = TRUE) AS
SELECT
COUNT(*)
FROM `/Root/episodes`;
1 change: 1 addition & 0 deletions ydb/core/kqp/ut/view/input/cases/count_rows/drop_view.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_rows`;
7 changes: 7 additions & 0 deletions ydb/core/kqp/ut/view/input/cases/count_rows/etalon_query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
SELECT
*
FROM (
SELECT
COUNT(*)
FROM `/Root/episodes`
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_rows`;

0 comments on commit 9e84639

Please sign in to comment.