Просмотр исходного кода

add CnMerge info to query plan

refactor(kqp_query_plan): add sort columns to query plan for merge connection
ulya-sidorina 2 лет назад
Родитель
Сommit
1ebea3a426

+ 11 - 0
ydb/core/kqp/prepare/kqp_query_plan.cpp

@@ -696,6 +696,16 @@ private:
                     for (const auto& column : hashShuffle.Cast().KeyColumns()) {
                         keyColumns.AppendValue(TString(column.Value()));
                     }
+                } else if (auto merge = inputCn.Maybe<TDqCnMerge>()) {
+                    inputPlanNode.TypeName = "Merge";
+                    auto& sortColumns = inputPlanNode.NodeInfo["SortColumns"];
+                    for (const auto& sortColumn : merge.Cast().SortColumns()) {
+                        TStringBuilder sortColumnDesc;
+                        sortColumnDesc << sortColumn.Column().Value() << " ("
+                            << sortColumn.SortDirection().Value() << ")";
+
+                        sortColumns.AppendValue(sortColumnDesc);
+                    }
                 } else {
                     inputPlanNode.TypeName = inputCn.Ref().Content();
                 }
@@ -1557,6 +1567,7 @@ TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString co
     writer.WriteKey("Plan");
     writer.BeginObject();
     writer.WriteKey("Node Type").WriteString("Query");
+    writer.WriteKey("PlanNodeType").WriteString("Query");
     writer.WriteKey("Plans");
     writer.BeginList();
 

+ 31 - 0
ydb/core/kqp/ut/kqp_explain_ut.cpp

@@ -712,6 +712,37 @@ Y_UNIT_TEST_SUITE(KqpExplain) {
                           << " but received: " << filter.GetMapSafe().at("Predicate"));
         }
     }
+
+    Y_UNIT_TEST_TWIN(MergeConnection, UseSessionActor) {
+        auto kikimr = KikimrRunnerEnableSessionActor(UseSessionActor);
+        TStreamExecScanQuerySettings settings;
+        settings.Explain(true);
+
+        auto db = kikimr.GetTableClient();
+
+        auto it = db.StreamExecuteScanQuery(R"(
+            SELECT * FROM `/Root/KeyValue` ORDER BY Key;
+        )", settings).GetValueSync();
+
+        auto res = CollectStreamResult(it);
+        UNIT_ASSERT_C(it.IsSuccess(), it.GetIssues().ToString());
+        UNIT_ASSERT(res.PlanJson);
+
+        Cerr << res.PlanJson << Endl;
+
+        NJson::TJsonValue plan;
+        NJson::ReadJsonTree(*res.PlanJson, &plan, true);
+
+        auto merge = FindPlanNodeByKv(
+            plan,
+            "Node Type",
+            "Merge"
+        );
+        UNIT_ASSERT(merge.IsDefined());
+        const auto& sortColumns = merge.GetMapSafe().at("SortColumns").GetArraySafe();
+        UNIT_ASSERT(sortColumns.size() == 1);
+        UNIT_ASSERT(sortColumns.at(0) == "Key (Asc)");
+    }
 }
 
 } // namespace NKqp

+ 2 - 2
ydb/core/kqp/ut/kqp_merge_connection_ut.cpp

@@ -77,7 +77,7 @@ void CheckPlanForMergeCn(const TMaybe<TString>& planJson, bool hasChildSort, con
     NJson::TJsonValue plan;
     NJson::ReadJsonTree(*planJson, &plan, /* throwOnError */ true);
 
-    auto mergeCn = FindPlanNodeByKv(plan, "Node Type", "DqCnMerge");
+    auto mergeCn = FindPlanNodeByKv(plan, "Node Type", "Merge");
     UNIT_ASSERT(mergeCn.IsDefined());
 
     auto childSort = FindPlanNodeByKv(mergeCn, "Name", sortOp);
@@ -90,7 +90,7 @@ void CheckPlanForMergeCn(const TMaybe<TString>& planJson, bool hasChildSort, con
     // Check that TopSort has no Merge Connection in children
     auto topSort = FindPlanNodeByKv(plan, "Name", sortOp);
     if (topSort.IsDefined()) {
-        mergeCn = FindPlanNodeByKv(topSort, "Node Type", "DqCnMerge");
+        mergeCn = FindPlanNodeByKv(topSort, "Node Type", "Merge");
         UNIT_ASSERT(!mergeCn.IsDefined());
     }
 }

+ 6 - 3
ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_explain.script-script_/explain.script.plan

@@ -137,7 +137,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         },
         {
@@ -252,7 +253,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         },
         {
@@ -296,7 +298,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         },
         {

+ 2 - 1
ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_table_types.script-script_/table_types.script.plan

@@ -144,7 +144,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         }
     ]

+ 6 - 2
ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage_key.script-script_/write_multi_usage_key.script.plan

@@ -92,7 +92,10 @@
                                                 "Node Type": "Limit-TableFullScan"
                                             }
                                         ],
-                                        "Node Type": "DqCnMerge",
+                                        "Node Type": "Merge",
+                                        "SortColumns": [
+                                            "Name (Asc)"
+                                        ],
                                         "PlanNodeType": "Connection"
                                     }
                                 ],
@@ -109,7 +112,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         }
     ]

+ 6 - 2
ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_write_group_by.script-script_/write_write_group_by.script.plan

@@ -95,7 +95,10 @@
                                                 "Node Type": "Limit-TableFullScan"
                                             }
                                         ],
-                                        "Node Type": "DqCnMerge",
+                                        "Node Type": "Merge",
+                                        "SortColumns": [
+                                            "Group (Asc)"
+                                        ],
                                         "PlanNodeType": "Connection"
                                     }
                                 ],
@@ -112,7 +115,8 @@
                         "PlanNodeType": "ResultSet"
                     }
                 ],
-                "Node Type": "Query"
+                "Node Type": "Query",
+                "PlanNodeType": "Query"
             }
         }
     ]