Skip to content

Commit 66fcd7d

Browse files
committed
refactor: printColumns
Signed-off-by: chengqinglin <[email protected]>
1 parent 2e41da3 commit 66fcd7d

File tree

9 files changed

+114
-73
lines changed

9 files changed

+114
-73
lines changed

pkg/compiler/compiler.go

+4-47
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,20 @@
11
package compiler
22

33
import (
4-
lop "github.com/samber/lo/parallel"
5-
64
"k8s.io/client-go/rest"
75

8-
"github.com/imuxin/ksql/pkg/common"
96
"github.com/imuxin/ksql/pkg/parser"
10-
"github.com/imuxin/ksql/pkg/pretty"
117
"github.com/imuxin/ksql/pkg/runtime"
128
)
139

14-
func Compile[T any](sql string, restConfig *rest.Config) (runtime.Runnable[T], []pretty.PrintColumn, error) {
10+
func Compile[T any](sql string, restConfig *rest.Config) (runtime.Runnable[T], error) {
1511
ksql, err := parser.Parse(sql)
1612
if err != nil {
17-
return nil, nil, err
13+
return nil, err
1814
}
1915
if ksql == nil {
20-
return nil, nil, nil
16+
return nil, nil
2117
}
2218

23-
r := runtime.NewDefaultRunnable[T](ksql, restConfig)
24-
var printColumns []pretty.PrintColumn
25-
switch {
26-
case ksql.Use != nil:
27-
return nil, nil, common.Unsupported()
28-
case ksql.Select != nil:
29-
printColumns = compilePrintColumns(ksql)
30-
case ksql.Delete != nil:
31-
case ksql.Desc != nil:
32-
printColumns = []pretty.PrintColumn{
33-
{
34-
Name: "SCHEMA",
35-
JSONPath: "{ .spec }",
36-
},
37-
{
38-
Name: "VERSION",
39-
JSONPath: "{ .version }",
40-
},
41-
}
42-
default: // TODO: support update
43-
return nil, nil, common.Unsupported()
44-
}
45-
return r, printColumns, err
46-
}
47-
48-
func compilePrintColumns(ksql *parser.KSQL) []pretty.PrintColumn {
49-
s := ksql.Select.Select
50-
if !s.ALL {
51-
return lop.Map(s.Columns, func(item *parser.Column, index int) pretty.PrintColumn {
52-
name := item.Alias
53-
if name == "" {
54-
name = item.Name
55-
}
56-
return pretty.PrintColumn{
57-
Name: name,
58-
JSONPath: item.Name,
59-
}
60-
})
61-
}
62-
return nil
19+
return runtime.NewDefaultRunnable[T](ksql, restConfig), nil
6320
}

pkg/executor/executor.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,18 @@ import (
77
"github.com/imuxin/ksql/pkg/pretty"
88
)
99

10-
func ExecuteLikeSQL[T any](sql string, restConfig *rest.Config) ([]pretty.PrintColumn, []T, error) {
11-
runnable, printColumns, err := compiler.Compile[T](sql, restConfig)
10+
func ExecuteLikeSQL[T any](sql string, restConfig *rest.Config) ([]T, []pretty.PrintColumn, error) {
11+
runnable, err := compiler.Compile[T](sql, restConfig)
1212
if err != nil {
1313
return nil, nil, err
1414
}
1515
if runnable == nil {
16-
return nil, []T{}, nil
16+
return []T{}, nil, nil
1717
}
18-
r, err := runnable.Run()
19-
return printColumns, r, err
18+
return runnable.Run()
2019
}
2120

2221
func Execute[T any](sql string, restConfig *rest.Config) ([]T, error) {
23-
_, r, err := ExecuteLikeSQL[T](sql, restConfig)
22+
r, _, err := ExecuteLikeSQL[T](sql, restConfig)
2423
return r, err
2524
}

pkg/ext/abs/interface.go

+6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package abs
22

3+
import (
4+
"github.com/imuxin/ksql/pkg/parser"
5+
"github.com/imuxin/ksql/pkg/pretty"
6+
)
7+
38
type Object = map[string]interface{}
49

510
type Plugin interface {
611
Download() ([]Object, error)
712
Delete([]Object) ([]Object, error)
13+
Columns(*parser.KSQL) []pretty.PrintColumn
814
}
915

1016
type Describer interface {

pkg/ext/istio/istio_config.go

+27
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414

1515
"github.com/imuxin/ksql/pkg/ext/abs"
1616
"github.com/imuxin/ksql/pkg/ext/kube"
17+
"github.com/imuxin/ksql/pkg/parser"
18+
"github.com/imuxin/ksql/pkg/pretty"
1719
utilkube "github.com/imuxin/ksql/pkg/util/kube"
1820
)
1921

@@ -94,3 +96,28 @@ func (t IstioConfig) Download() ([]abs.Object, error) {
9496
}
9597

9698
func (t IstioConfig) Delete(list []abs.Object) ([]abs.Object, error) { return nil, nil } //nolint
99+
100+
func (t IstioConfig) Columns(ksql *parser.KSQL) []pretty.PrintColumn {
101+
prettyColumns := ksql.CompilePrintColumns()
102+
if prettyColumns == nil {
103+
prettyColumns = []pretty.PrintColumn{
104+
{
105+
Name: "kind",
106+
JSONPath: "{ .kind }",
107+
},
108+
{
109+
Name: "apiVersion",
110+
JSONPath: "{ .apiVersion }",
111+
},
112+
{
113+
Name: "namespace",
114+
JSONPath: "{ .metadata.namespace }",
115+
},
116+
{
117+
Name: "name",
118+
JSONPath: "{ .metadata.name }",
119+
},
120+
}
121+
}
122+
return prettyColumns
123+
}

pkg/ext/kube/download.go

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import (
1515
"k8s.io/client-go/rest"
1616

1717
"github.com/imuxin/ksql/pkg/ext/abs"
18+
"github.com/imuxin/ksql/pkg/parser"
19+
"github.com/imuxin/ksql/pkg/pretty"
1820
"github.com/imuxin/ksql/pkg/util/jsonpath"
1921
)
2022

@@ -171,3 +173,7 @@ func (d APIServerPlugin) Delete(list []abs.Object) ([]abs.Object, error) {
171173
}
172174
return result, nil
173175
}
176+
177+
func (d APIServerPlugin) Columns(ksql *parser.KSQL) []pretty.PrintColumn {
178+
return ksql.CompilePrintColumns()
179+
}

pkg/parser/conversion.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package parser
2+
3+
import (
4+
lop "github.com/samber/lo/parallel"
5+
6+
"github.com/imuxin/ksql/pkg/pretty"
7+
)
8+
9+
func (ksql *KSQL) CompilePrintColumns() []pretty.PrintColumn {
10+
if ksql.Select == nil {
11+
return nil
12+
}
13+
14+
s := ksql.Select.Select
15+
if !s.ALL {
16+
return lop.Map(s.Columns, func(item *Column, index int) pretty.PrintColumn {
17+
name := item.Alias
18+
if name == "" {
19+
name = item.Name
20+
}
21+
return pretty.PrintColumn{
22+
Name: name,
23+
JSONPath: item.Name,
24+
}
25+
})
26+
}
27+
return nil
28+
}

pkg/repl/exec.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
)
1010

1111
func Exec(in string, restConfig *rest.Config) (string, error) {
12-
columns, result, err := executor.ExecuteLikeSQL[abs.Object](in, restConfig)
12+
result, columns, err := executor.ExecuteLikeSQL[abs.Object](in, restConfig)
1313
if err != nil {
1414
return "", err
1515
}

pkg/runtime/runtime.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ package runtime
33
import (
44
"k8s.io/client-go/rest"
55

6+
"github.com/imuxin/ksql/pkg/common"
67
"github.com/imuxin/ksql/pkg/ext/abs"
78
"github.com/imuxin/ksql/pkg/parser"
9+
"github.com/imuxin/ksql/pkg/pretty"
810
)
911

1012
var (
1113
DefaultDatabase = ""
1214
)
1315

1416
type Runnable[T any] interface {
15-
Run() ([]T, error)
17+
Run() ([]T, []pretty.PrintColumn, error)
1618
}
1719

1820
var _ Runnable[any] = &RunnableImpl[any]{}
@@ -31,7 +33,7 @@ func NewDefaultRunnable[T any](ksql *parser.KSQL, restConfig *rest.Config) Runna
3133
}
3234
}
3335

34-
func (r RunnableImpl[T]) Run() ([]T, error) {
36+
func (r RunnableImpl[T]) Run() (results []T, columns []pretty.PrintColumn, err error) {
3537
// TODO: 支持自定义 Table 拓展
3638
switch {
3739
case r.ksql.Desc != nil:
@@ -40,6 +42,7 @@ func (r RunnableImpl[T]) Run() ([]T, error) {
4042
return r.List()
4143
case r.ksql.Delete != nil:
4244
return r.Delete()
45+
default:
46+
return nil, nil, common.Unsupported()
4347
}
44-
return nil, nil
4548
}

pkg/runtime/sql.go

+31-16
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/imuxin/ksql/pkg/ext/abs"
1616
"github.com/imuxin/ksql/pkg/ext/kube"
1717
"github.com/imuxin/ksql/pkg/parser"
18+
"github.com/imuxin/ksql/pkg/pretty"
1819
)
1920

2021
func convert[T any](list []abs.Object) ([]T, error) {
@@ -69,61 +70,75 @@ func (r *RunnableImpl[T]) list(table, namespace string, k8sFilters []*parser.Kub
6970
}), nil
7071
}
7172

72-
func (r *RunnableImpl[T]) List() ([]T, error) {
73+
func (r *RunnableImpl[T]) List() ([]T, []pretty.PrintColumn, error) {
7374
list, err := r.list(
7475
r.ksql.Select.From.Table,
7576
r.ksql.Select.Namespace,
7677
r.ksql.Select.KubernetesFilters,
7778
r.ksql.Select.Where,
7879
)
7980
if err != nil {
80-
return nil, err
81+
return nil, nil, err
8182
}
82-
83-
return convert[T](list)
83+
printColumns := r.plugin.Columns(r.ksql)
84+
rr, err := convert[T](list)
85+
return rr, printColumns, err
8486
}
8587

86-
func (r *RunnableImpl[T]) Delete() ([]T, error) {
88+
func (r *RunnableImpl[T]) Delete() ([]T, []pretty.PrintColumn, error) {
8789
list, err := r.list(
8890
r.ksql.Delete.From.Table,
8991
r.ksql.Delete.Namespace,
9092
r.ksql.Delete.KubernetesFilters,
9193
r.ksql.Delete.Where,
9294
)
9395
if err != nil {
94-
return nil, err
96+
return nil, nil, err
9597
}
9698
results, err := r.plugin.Delete(list)
9799
if err != nil {
98-
return nil, err
100+
return nil, nil, err
99101
}
100-
return convert[T](results)
102+
printColumns := r.plugin.Columns(r.ksql)
103+
rr, err := convert[T](results)
104+
return rr, printColumns, err
101105
}
102106

103-
func (r *RunnableImpl[T]) Desc() ([]T, error) {
107+
func (r *RunnableImpl[T]) Desc() ([]T, []pretty.PrintColumn, error) {
108+
printColumns := []pretty.PrintColumn{
109+
{
110+
Name: "SCHEMA",
111+
JSONPath: "{ .spec }",
112+
},
113+
{
114+
Name: "VERSION",
115+
JSONPath: "{ .version }",
116+
},
117+
}
118+
104119
sql := fmt.Sprintf("SELECT * FROM crd NAME %s", r.ksql.Desc.Table)
105120
ksql, err := parser.Parse(sql)
106121
if err != nil {
107-
return nil, err
122+
return nil, printColumns, err
108123
}
109124
rr := RunnableImpl[apiextensionsv1.CustomResourceDefinition]{
110125
ksql: ksql,
111126
restConfig: r.restConfig,
112127
}
113128

114-
tables, err := rr.List()
129+
tables, _, err := rr.List()
115130
if err != nil {
116-
return nil, err
131+
return nil, printColumns, err
117132
}
118133
if len(tables) == 0 {
119-
return nil, nil
134+
return nil, printColumns, nil
120135
}
121136

122137
list, err := kube.Describer{
123138
Tables: tables,
124139
}.Desc()
125140
if err != nil {
126-
return nil, err
141+
return nil, printColumns, err
127142
}
128143

129144
_r, err := rxgo.Just(list)().
@@ -135,13 +150,13 @@ func (r *RunnableImpl[T]) Desc() ([]T, error) {
135150
}).
136151
ToSlice(len(list))
137152
if err != nil {
138-
return nil, err
153+
return nil, printColumns, err
139154
}
140155

141156
result := make([]T, len(_r))
142157
for i, item := range _r {
143158
result[i] = *item.(*T)
144159
}
145160

146-
return result, nil
161+
return result, printColumns, nil
147162
}

0 commit comments

Comments
 (0)