Skip to content

Commit 3eff2e6

Browse files
committed
feat(tree-builder): add utils for building and printing the tree
1 parent 0ab4973 commit 3eff2e6

File tree

2 files changed

+81
-8
lines changed

2 files changed

+81
-8
lines changed

Diff for: internal/db/explainTreeBuilder.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package db
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
type QueryPlanNode struct {
8+
ID string
9+
ParentID string
10+
NotUsed string
11+
Detail string
12+
Children []*QueryPlanNode
13+
}
14+
15+
func BuildQueryPlanTree(rows [][]string) (*QueryPlanNode, error) {
16+
var nodes []*QueryPlanNode
17+
nodeMap := make(map[string]*QueryPlanNode)
18+
19+
for _, row := range rows {
20+
id := row[0]
21+
parentId := row[1]
22+
notUsed := row[2]
23+
detail := row[3]
24+
25+
node := &QueryPlanNode{
26+
ID: id,
27+
ParentID: parentId,
28+
NotUsed: notUsed,
29+
Detail: detail,
30+
}
31+
32+
nodes = append(nodes, node)
33+
nodeMap[id] = node
34+
}
35+
36+
root := &QueryPlanNode{}
37+
for _, node := range nodes {
38+
if node.ParentID == "0" {
39+
root = node
40+
} else {
41+
parent := nodeMap[node.ParentID]
42+
parent.Children = append(parent.Children, node)
43+
}
44+
}
45+
46+
return root, nil
47+
}
48+
49+
func PrintQueryPlanTree(node *QueryPlanNode, indent string) {
50+
fmt.Printf("%s%s\n", indent, node.Detail)
51+
for _, child := range node.Children {
52+
PrintQueryPlanTree(child, indent+" ")
53+
}
54+
}

Diff for: internal/db/output.go

+27-8
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,33 @@ type Printer interface {
1414
print(statementResult StatementResult, outF io.Writer) error
1515
}
1616

17+
type ExplainQueryPrinter struct{}
18+
19+
func (eqp ExplainQueryPrinter) print(statementResult StatementResult, outF io.Writer) error {
20+
data := [][]string{}
21+
22+
tableData, err := appendData(statementResult, data, TABLE)
23+
if err != nil {
24+
return err
25+
}
26+
27+
root, err := BuildQueryPlanTree(tableData)
28+
if err != nil {
29+
return err
30+
}
31+
PrintQueryPlanTree(root, "")
32+
33+
return nil
34+
}
35+
1736
type TablePrinter struct {
1837
withoutHeader bool
1938
}
2039

2140
func (t TablePrinter) print(statementResult StatementResult, outF io.Writer) error {
2241
data := [][]string{}
2342
table := createTable(outF)
24-
showHeader := !IsResultComingFromExplainQueryPlan(statementResult) && !t.withoutHeader
25-
if showHeader {
43+
if !t.withoutHeader {
2644
table.SetHeader(statementResult.ColumnNames)
2745
}
2846

@@ -33,6 +51,7 @@ func (t TablePrinter) print(statementResult StatementResult, outF io.Writer) err
3351

3452
table.AppendBulk(tableData)
3553
table.Render()
54+
3655
return nil
3756
}
3857

@@ -102,14 +121,13 @@ func appendData(statementResult StatementResult, data [][]string, mode FormatTyp
102121
data = append(data, formattedRow)
103122
}
104123

105-
if IsResultComingFromExplainQueryPlan(statementResult) {
106-
data = [][]string{{"Tree goes here!"}}
107-
}
108-
109124
return data, nil
110125
}
111126

112-
func getPrinter(mode enums.PrintMode, withoutHeader bool) (Printer, error) {
127+
func getPrinter(mode enums.PrintMode, withoutHeader bool, isExplainQueryPlan bool) (Printer, error) {
128+
if isExplainQueryPlan {
129+
return &ExplainQueryPrinter{}, nil
130+
}
113131
switch mode {
114132
case enums.TABLE_MODE:
115133
return &TablePrinter{
@@ -149,7 +167,8 @@ func PrintStatementResult(statementResult StatementResult, outF io.Writer, witho
149167
return &UnableToPrintStatementResult{}
150168
}
151169

152-
printer, err := getPrinter(mode, withoutHeader)
170+
isExplainQueryPlan := IsResultComingFromExplainQueryPlan(statementResult)
171+
printer, err := getPrinter(mode, withoutHeader, isExplainQueryPlan)
153172
if err != nil {
154173
return err
155174
}

0 commit comments

Comments
 (0)