@@ -75,7 +75,11 @@ static TKikimrRunner GetKikimrWithJoinSettings(bool useStreamLookupJoin = false,
75
75
return TKikimrRunner (serverSettings);
76
76
}
77
77
78
- class TChainConstructor {
78
+ void PrintPlan (const TString& plan) {
79
+ Cout << plan << Endl;
80
+ }
81
+
82
+ class TChainTester {
79
83
public:
80
84
TChainTester (size_t chainSize)
81
85
: Kikimr(GetKikimrWithJoinSettings(false , GetStats(chainSize)))
@@ -107,22 +111,17 @@ class TChainConstructor {
107
111
108
112
private:
109
113
void CreateTables () {
110
- for (size_t i = 0 ; i < ChainSize_; ++i) {
111
- TString tableName;
112
-
113
- tableName
114
- .append (" /Root/table_" ).append (ToString (i));;
115
-
116
- TString createTable;
117
- createTable
118
- += " CREATE TABLE `" + tableName + " ` (id"
119
- + ToString (i) + " Int32, "
120
- + " PRIMARY KEY (id" + ToString (i) + " ));" ;
121
-
122
- std::cout << createTable << std::endl;
123
- auto res = Session_.ExecuteSchemeQuery (createTable).GetValueSync ();
124
- std::cout << res.GetIssues ().ToString () << std::endl;
125
- UNIT_ASSERT (res.IsSuccess ());
114
+ for (size_t i = 0 ; i < ChainSize; ++i) {
115
+ TString tableName = Sprintf (" /Root/table_%ld" , i);
116
+
117
+ TString createTable = Sprintf (
118
+ " CREATE TABLE `%s` (id%ld Int32, PRIMARY KEY (id%ld));" ,
119
+ tableName.c_str (), i, i
120
+ );
121
+
122
+ auto result = Session.ExecuteSchemeQuery (createTable).GetValueSync ();
123
+ result.GetIssues ().PrintTo (Cerr);
124
+ UNIT_ASSERT_VALUES_EQUAL (result.GetStatus (), EStatus::SUCCESS);
126
125
}
127
126
}
128
127
@@ -131,30 +130,29 @@ class TChainConstructor {
131
130
132
131
joinRequest.append (" SELECT * FROM `/Root/table_0` as t0 " );
133
132
134
- for (size_t i = 1 ; i < ChainSize_ ; ++i) {
135
- TString table = " /Root/table_" + ToString ( i);
133
+ for (size_t i = 1 ; i < ChainSize ; ++i) {
134
+ TString table = Sprintf ( " /Root/table_%ld " , i);
136
135
137
- TString prevAliasTable = " t " + ToString ( i - 1 );
138
- TString aliasTable = " t " + ToString ( i);
136
+ TString prevAliasTable = Sprintf ( " t%ld " , i - 1 );
137
+ TString aliasTable = Sprintf ( " t%ld " , i);
139
138
140
- joinRequest
141
- += " INNER JOIN `" + table + " `" + " AS " + aliasTable + " ON "
142
- + aliasTable + " .id" + ToString (i) + " =" + prevAliasTable + " .id"
143
- + ToString (i-1 ) + " " ;
139
+ joinRequest +=
140
+ Sprintf (
141
+ " INNER JOIN `%s` AS %s ON %s.id%ld = %s.id%ld " ,
142
+ table.c_str (), aliasTable.c_str (), aliasTable.c_str (), i, prevAliasTable.c_str (), i - 1
143
+ );
144
144
}
145
145
146
- auto result = Session_.ExecuteDataQuery (joinRequest, TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ();
147
-
148
- std::cout << result.GetIssues ().ToString () << std::endl;
149
- std::cout << joinRequest << std::endl;
146
+ auto result = Session.ExplainDataQuery (joinRequest).ExtractValueSync ();
147
+ result.GetIssues ().PrintTo (Cerr);
150
148
UNIT_ASSERT_VALUES_EQUAL (result.GetStatus (), EStatus::SUCCESS);
149
+ PrintPlan (result.GetPlan ());
151
150
}
152
151
153
- private:
154
- TKikimrRunner Kikimr_;
155
- NYdb::NTable::TTableClient TableClient_;
156
- TSession Session_;
157
- size_t ChainSize_;
152
+ TKikimrRunner Kikimr;
153
+ NYdb::NTable::TTableClient TableClient;
154
+ TSession Session;
155
+ size_t ChainSize;
158
156
};
159
157
160
158
void ExplainJoinOrderTestDataQuery (const TString& queryPath, bool useStreamLookupJoin) {
@@ -197,9 +195,7 @@ void ExecuteJoinOrderTestDataQuery(const TString& queryPath, bool useStreamLooku
197
195
198
196
Y_UNIT_TEST_SUITE (KqpJoinOrder) {
199
197
Y_UNIT_TEST (Chain65Nodes) {
200
- TChainConstructor chain (65 );
201
- chain.CreateTables ();
202
- chain.JoinTables ();
198
+ TChainTester (65 ).Test ();
203
199
}
204
200
205
201
Y_UNIT_TEST_TWIN (FiveWayJoin, StreamLookupJoin) {
0 commit comments