Skip to content

Commit 85daa8e

Browse files
authored
Merge fee0d0d into 7d65202
2 parents 7d65202 + fee0d0d commit 85daa8e

23 files changed

+223
-24
lines changed

ydb/core/kqp/host/kqp_host.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1775,7 +1775,7 @@ class TKqpHost : public IKqpHost {
17751775

17761776
auto queryExecutor = MakeIntrusive<TKqpQueryExecutor>(Gateway, Cluster, SessionCtx, KqpRunner);
17771777
auto kikimrDataSource = CreateKikimrDataSource(*FuncRegistry, *TypesCtx, gatewayProxy, SessionCtx,
1778-
ExternalSourceFactory, IsInternalCall);
1778+
ExternalSourceFactory, IsInternalCall, GUCSettings);
17791779
auto kikimrDataSink = CreateKikimrDataSink(*FuncRegistry, *TypesCtx, gatewayProxy, SessionCtx, ExternalSourceFactory, queryExecutor);
17801780

17811781
FillSettings.AllResultsBytesLimit = Nothing();

ydb/core/kqp/host/kqp_translate.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "kqp_translate.h"
22

3+
#include <ydb/core/kqp/provider/yql_kikimr_results.h>
34
#include <ydb/library/yql/sql/sql.h>
5+
#include <ydb/public/api/protos/ydb_query.pb.h>
46

57

68
namespace NKikimr {

ydb/core/kqp/host/kqp_translate.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#pragma once
22

3-
#include <ydb/core/kqp/provider/yql_kikimr_results.h>
4-
#include <ydb/core/kqp/common/kqp.h>
3+
#include <ydb/core/kqp/common/simple/query_ast.h>
4+
#include <ydb/core/kqp/provider/yql_kikimr_provider.h>
5+
#include <ydb/core/protos/table_service_config.pb.h>
56
#include <ydb/library/yql/core/pg_settings/guc_settings.h>
67

78
namespace NKikimr {

ydb/core/kqp/provider/rewrite_io_utils.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,25 @@ using namespace NNodes;
1515

1616
constexpr const char* QueryGraphNodeSignature = "SavedQueryGraph";
1717

18-
NSQLTranslation::TTranslationSettings CreateViewTranslationSettings(const TString& cluster) {
19-
NSQLTranslation::TTranslationSettings settings;
20-
21-
settings.DefaultCluster = cluster;
22-
settings.ClusterMapping[cluster] = TString(NYql::KikimrProviderName);
23-
settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
24-
25-
return settings;
26-
}
27-
2818
TExprNode::TPtr CompileViewQuery(
2919
const TString& query,
3020
TExprContext& ctx,
31-
const TString& cluster
21+
NKikimr::NKqp::TKqpTranslationSettingsBuilder& settingsBuilder,
22+
IModuleResolver::TPtr moduleResolver
3223
) {
24+
auto translationSettings = settingsBuilder.Build(ctx);
25+
translationSettings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
26+
3327
TAstParseResult queryAst;
34-
queryAst = NSQLTranslation::SqlToYql(query, CreateViewTranslationSettings(cluster));
28+
queryAst = NSQLTranslation::SqlToYql(query, translationSettings);
3529

3630
ctx.IssueManager.AddIssues(queryAst.Issues);
3731
if (!queryAst.IsOk()) {
3832
return nullptr;
3933
}
4034

4135
TExprNode::TPtr queryGraph;
42-
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, nullptr, nullptr)) {
36+
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, moduleResolver.get(), nullptr)) {
4337
return nullptr;
4438
}
4539

@@ -123,7 +117,8 @@ TExprNode::TPtr RewriteReadFromView(
123117
const TExprNode::TPtr& node,
124118
TExprContext& ctx,
125119
const TString& query,
126-
const TString& cluster
120+
NKikimr::NKqp::TKqpTranslationSettingsBuilder& settingsBuilder,
121+
IModuleResolver::TPtr moduleResolver
127122
) {
128123
YQL_PROFILE_FUNC(DEBUG);
129124

@@ -132,7 +127,7 @@ TExprNode::TPtr RewriteReadFromView(
132127

133128
TExprNode::TPtr queryGraph = FindSavedQueryGraph(readNode.Ptr());
134129
if (!queryGraph) {
135-
queryGraph = CompileViewQuery(query, ctx, cluster);
130+
queryGraph = CompileViewQuery(query, ctx, settingsBuilder, moduleResolver);
136131
if (!queryGraph) {
137132
ctx.AddError(TIssue(ctx.GetPosition(readNode.Pos()),
138133
"The query stored in the view cannot be compiled."));

ydb/core/kqp/provider/rewrite_io_utils.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <ydb/core/kqp/host/kqp_translate.h>
34
#include <ydb/library/yql/ast/yql_expr.h>
45

56
namespace NYql {
@@ -10,7 +11,8 @@ TExprNode::TPtr RewriteReadFromView(
1011
const TExprNode::TPtr& node,
1112
TExprContext& ctx,
1213
const TString& query,
13-
const TString& cluster
14+
NKikimr::NKqp::TKqpTranslationSettingsBuilder& settingsBuilder,
15+
IModuleResolver::TPtr moduleResolver
1416
);
1517

1618
}

ydb/core/kqp/provider/yql_kikimr_datasource.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "yql_kikimr_provider_impl.h"
44

55
#include <ydb/core/kqp/common/simple/services.h>
6+
#include <ydb/core/kqp/host/kqp_translate.h>
67
#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
78
#include <ydb/library/yql/providers/common/config/yql_configuration_transformer.h>
89

@@ -472,12 +473,14 @@ class TKikimrDataSource : public TDataProviderBase {
472473
TIntrusivePtr<IKikimrGateway> gateway,
473474
TIntrusivePtr<TKikimrSessionContext> sessionCtx,
474475
const NExternalSource::IExternalSourceFactory::TPtr& externalSourceFactory,
475-
bool isInternalCall)
476+
bool isInternalCall,
477+
TGUCSettings::TPtr gucSettings)
476478
: FunctionRegistry(functionRegistry)
477479
, Types(types)
478480
, Gateway(gateway)
479481
, SessionCtx(sessionCtx)
480482
, ExternalSourceFactory(externalSourceFactory)
483+
, GUCSettings(gucSettings)
481484
, ConfigurationTransformer(new TKikimrConfigurationTransformer(sessionCtx, types))
482485
, IntentDeterminationTransformer(new TKiSourceIntentDeterminationTransformer(sessionCtx))
483486
, LoadTableMetadataTransformer(CreateKiSourceLoadTableMetadataTransformer(gateway, sessionCtx, types, externalSourceFactory, isInternalCall))
@@ -760,6 +763,7 @@ class TKikimrDataSource : public TDataProviderBase {
760763
}
761764

762765
ctx.Step
766+
.Repeat(TExprStep::ExpandApplyForLambdas)
763767
.Repeat(TExprStep::ExprEval)
764768
.Repeat(TExprStep::DiscoveryIO)
765769
.Repeat(TExprStep::Epochs)
@@ -768,7 +772,15 @@ class TKikimrDataSource : public TDataProviderBase {
768772
.Repeat(TExprStep::RewriteIO);
769773

770774
const auto& query = tableDesc.Metadata->ViewPersistedData.QueryText;
771-
return RewriteReadFromView(node, ctx, query, cluster);
775+
NKqp::TKqpTranslationSettingsBuilder settingsBuilder(
776+
SessionCtx->Query().Type,
777+
SessionCtx->Config()._KqpYqlSyntaxVersion.Get().GetRef(),
778+
cluster,
779+
query,
780+
SessionCtx->Config().BindingsMode,
781+
GUCSettings
782+
);
783+
return RewriteReadFromView(node, ctx, query, settingsBuilder, Types.Modules);
772784
}
773785
}
774786

@@ -881,6 +893,7 @@ class TKikimrDataSource : public TDataProviderBase {
881893
TIntrusivePtr<IKikimrGateway> Gateway;
882894
TIntrusivePtr<TKikimrSessionContext> SessionCtx;
883895
NExternalSource::IExternalSourceFactory::TPtr ExternalSourceFactory;
896+
TGUCSettings::TPtr GUCSettings;
884897

885898
TAutoPtr<IGraphTransformer> ConfigurationTransformer;
886899
TAutoPtr<IGraphTransformer> IntentDeterminationTransformer;
@@ -920,9 +933,10 @@ TIntrusivePtr<IDataProvider> CreateKikimrDataSource(
920933
TIntrusivePtr<IKikimrGateway> gateway,
921934
TIntrusivePtr<TKikimrSessionContext> sessionCtx,
922935
const NExternalSource::IExternalSourceFactory::TPtr& externalSourceFactory,
923-
bool isInternalCall)
936+
bool isInternalCall,
937+
TGUCSettings::TPtr gucSettings)
924938
{
925-
return new TKikimrDataSource(functionRegistry, types, gateway, sessionCtx, externalSourceFactory, isInternalCall);
939+
return new TKikimrDataSource(functionRegistry, types, gateway, sessionCtx, externalSourceFactory, isInternalCall, gucSettings);
926940
}
927941

928942
TAutoPtr<IGraphTransformer> CreateKiSourceLoadTableMetadataTransformer(TIntrusivePtr<IKikimrGateway> gateway,

ydb/core/kqp/provider/yql_kikimr_provider.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,8 @@ TIntrusivePtr<IDataProvider> CreateKikimrDataSource(
548548
TIntrusivePtr<IKikimrGateway> gateway,
549549
TIntrusivePtr<TKikimrSessionContext> sessionCtx,
550550
const NKikimr::NExternalSource::IExternalSourceFactory::TPtr& sourceFactory,
551-
bool isInternalCall);
551+
bool isInternalCall,
552+
TGUCSettings::TPtr gucSettings);
552553

553554
TIntrusivePtr<IDataProvider> CreateKikimrDataSink(
554555
const NKikimr::NMiniKQL::IFunctionRegistry& functionRegistry,
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
CREATE VIEW `/Root/aggregates_and_window` WITH (security_invoker = TRUE) AS
2+
SELECT
3+
series.title AS series,
4+
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
5+
FROM (
6+
SELECT
7+
series_id,
8+
SUM(
9+
CASE
10+
WHEN episode_count > average_episodes_in_season
11+
THEN 1
12+
ELSE 0
13+
END
14+
) AS seasons_with_episode_count_greater_than_average
15+
FROM (
16+
SELECT
17+
series_id,
18+
season_id,
19+
episode_count,
20+
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
21+
FROM (
22+
SELECT
23+
series_id,
24+
season_id,
25+
COUNT(*) AS episode_count
26+
FROM `/Root/episodes`
27+
GROUP BY
28+
series_id,
29+
season_id
30+
)
31+
WINDOW
32+
average_episodes_in_season_window AS (
33+
PARTITION BY
34+
series_id
35+
)
36+
)
37+
GROUP BY
38+
series_id
39+
)
40+
AS series_stats
41+
JOIN `/Root/series`
42+
AS series
43+
USING (series_id);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW `/Root/aggregates_and_window`;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
series.title AS series,
6+
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
7+
FROM (
8+
SELECT
9+
series_id,
10+
SUM(
11+
CASE
12+
WHEN episode_count > average_episodes_in_season
13+
THEN 1
14+
ELSE 0
15+
END
16+
) AS seasons_with_episode_count_greater_than_average
17+
FROM (
18+
SELECT
19+
series_id,
20+
season_id,
21+
episode_count,
22+
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
23+
FROM (
24+
SELECT
25+
series_id,
26+
season_id,
27+
COUNT(*) AS episode_count
28+
FROM `/Root/episodes`
29+
GROUP BY
30+
series_id,
31+
season_id
32+
)
33+
WINDOW
34+
average_episodes_in_season_window AS (
35+
PARTITION BY
36+
series_id
37+
)
38+
)
39+
GROUP BY
40+
series_id
41+
)
42+
AS series_stats
43+
JOIN `/Root/series`
44+
AS series
45+
USING (series_id)
46+
);

0 commit comments

Comments
 (0)