Skip to content

Commit f838b39

Browse files
authored
Merge pull request #1055 from ydb-platform/params-builder
params builder
2 parents d99feda + c460de0 commit f838b39

26 files changed

+2229
-323
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Added experimental query parameters builder `ydb.ParamsBuilder()`
2+
* Changed types of `table/table.{QueryParameters,ParameterOption}` to aliases on `internal/params.{Parameters,NamedValue}`
3+
* Fixed bug with optional decimal serialization
4+
15
## v3.56.2
26
* Fixed return private error for commit to stopped partition in topic reader.
37
* Stopped wrapping err error as transport error at topic streams (internals)

internal/bind/bind.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package bind
33
import (
44
"sort"
55

6+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/params"
67
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
78
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
8-
"github.com/ydb-platform/ydb-go-sdk/v3/table"
99
)
1010

1111
type blockID int
@@ -27,34 +27,34 @@ type Bind interface {
2727
type Bindings []Bind
2828

2929
func (bindings Bindings) RewriteQuery(query string, args ...interface{}) (
30-
yql string, _ *table.QueryParameters, err error,
30+
yql string, parameters []*params.Parameter, err error,
3131
) {
3232
if len(bindings) == 0 {
33-
var params []table.ParameterOption
34-
params, err = Params(args...)
33+
parameters, err = Params(args...)
3534
if err != nil {
3635
return "", nil, xerrors.WithStackTrace(err)
3736
}
3837

39-
return query, table.NewQueryParameters(params...), nil
38+
return query, parameters, nil
4039
}
4140

4241
buffer := xstring.Buffer()
4342
defer buffer.Free()
4443

4544
for i := range bindings {
46-
query, args, err = bindings[len(bindings)-1-i].RewriteQuery(query, args...)
47-
if err != nil {
48-
return "", nil, xerrors.WithStackTrace(err)
45+
var e error
46+
query, args, e = bindings[len(bindings)-1-i].RewriteQuery(query, args...)
47+
if e != nil {
48+
return "", nil, xerrors.WithStackTrace(e)
4949
}
5050
}
5151

52-
params, err := Params(args...)
52+
parameters, err = Params(args...)
5353
if err != nil {
5454
return "", nil, xerrors.WithStackTrace(err)
5555
}
5656

57-
return query, table.NewQueryParameters(params...), nil
57+
return query, parameters, nil
5858
}
5959

6060
func Sort(bindings []Bind) []Bind {

internal/bind/params.go

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
"sort"
1010
"time"
1111

12+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/params"
1213
"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
1314
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
14-
"github.com/ydb-platform/ydb-go-sdk/v3/table"
1515
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
1616
)
1717

@@ -142,7 +142,7 @@ func supportNewTypeLink(x interface{}) string {
142142
return "https://github.com/ydb-platform/ydb-go-sdk/issues/new?" + v.Encode()
143143
}
144144

145-
func toYdbParam(name string, value interface{}) (table.ParameterOption, error) {
145+
func toYdbParam(name string, value interface{}) (*params.Parameter, error) {
146146
if na, ok := value.(driver.NamedValue); ok {
147147
n, v := na.Name, na.Value
148148
if n != "" {
@@ -157,7 +157,7 @@ func toYdbParam(name string, value interface{}) (table.ParameterOption, error) {
157157
}
158158
value = v
159159
}
160-
if v, ok := value.(table.ParameterOption); ok {
160+
if v, ok := value.(*params.Parameter); ok {
161161
return v, nil
162162
}
163163
v, err := toValue(value)
@@ -171,39 +171,37 @@ func toYdbParam(name string, value interface{}) (table.ParameterOption, error) {
171171
name = "$" + name
172172
}
173173

174-
return table.ValueParam(name, v), nil
174+
return params.Named(name, v), nil
175175
}
176176

177-
func Params(args ...interface{}) (params []table.ParameterOption, _ error) {
178-
params = make([]table.ParameterOption, 0, len(args))
177+
func Params(args ...interface{}) (parameters []*params.Parameter, _ error) {
178+
parameters = make([]*params.Parameter, 0, len(args))
179179
for i, arg := range args {
180180
switch x := arg.(type) {
181181
case driver.NamedValue:
182182
if x.Name == "" {
183183
switch xx := x.Value.(type) {
184-
case *table.QueryParameters:
184+
case *params.Parameters:
185185
if len(args) > 1 {
186186
return nil, xerrors.WithStackTrace(errMultipleQueryParameters)
187187
}
188-
xx.Each(func(name string, v types.Value) {
189-
params = append(params, table.ValueParam(name, v))
190-
})
191-
case table.ParameterOption:
192-
params = append(params, xx)
188+
parameters = *xx
189+
case *params.Parameter:
190+
parameters = append(parameters, xx)
193191
default:
194192
x.Name = fmt.Sprintf("$p%d", i)
195193
param, err := toYdbParam(x.Name, x.Value)
196194
if err != nil {
197195
return nil, xerrors.WithStackTrace(err)
198196
}
199-
params = append(params, param)
197+
parameters = append(parameters, param)
200198
}
201199
} else {
202200
param, err := toYdbParam(x.Name, x.Value)
203201
if err != nil {
204202
return nil, xerrors.WithStackTrace(err)
205203
}
206-
params = append(params, param)
204+
parameters = append(parameters, param)
207205
}
208206
case sql.NamedArg:
209207
if x.Name == "" {
@@ -213,27 +211,25 @@ func Params(args ...interface{}) (params []table.ParameterOption, _ error) {
213211
if err != nil {
214212
return nil, xerrors.WithStackTrace(err)
215213
}
216-
params = append(params, param)
217-
case *table.QueryParameters:
214+
parameters = append(parameters, param)
215+
case *params.Parameters:
218216
if len(args) > 1 {
219217
return nil, xerrors.WithStackTrace(errMultipleQueryParameters)
220218
}
221-
x.Each(func(name string, v types.Value) {
222-
params = append(params, table.ValueParam(name, v))
223-
})
224-
case table.ParameterOption:
225-
params = append(params, x)
219+
parameters = *x
220+
case *params.Parameter:
221+
parameters = append(parameters, x)
226222
default:
227223
param, err := toYdbParam(fmt.Sprintf("$p%d", i), x)
228224
if err != nil {
229225
return nil, xerrors.WithStackTrace(err)
230226
}
231-
params = append(params, param)
227+
parameters = append(parameters, param)
232228
}
233229
}
234-
sort.Slice(params, func(i, j int) bool {
235-
return params[i].Name() < params[j].Name()
230+
sort.Slice(parameters, func(i, j int) bool {
231+
return parameters[i].Name() < parameters[j].Name()
236232
})
237233

238-
return params, nil
234+
return parameters, nil
239235
}

internal/bind/params_test.go

Lines changed: 57 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/stretchr/testify/require"
1111

12+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/params"
1213
"github.com/ydb-platform/ydb-go-sdk/v3/table"
1314
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
1415
)
@@ -346,27 +347,27 @@ func named(name string, value interface{}) driver.NamedValue {
346347
func TestYdbParam(t *testing.T) {
347348
for _, tt := range []struct {
348349
src interface{}
349-
dst table.ParameterOption
350+
dst *params.Parameter
350351
err error
351352
}{
352353
{
353-
src: table.ValueParam("$a", types.Int32Value(42)),
354-
dst: table.ValueParam("$a", types.Int32Value(42)),
354+
src: params.Named("$a", types.Int32Value(42)),
355+
dst: params.Named("$a", types.Int32Value(42)),
355356
err: nil,
356357
},
357358
{
358359
src: named("a", int(42)),
359-
dst: table.ValueParam("$a", types.Int32Value(42)),
360+
dst: params.Named("$a", types.Int32Value(42)),
360361
err: nil,
361362
},
362363
{
363364
src: named("$a", int(42)),
364-
dst: table.ValueParam("$a", types.Int32Value(42)),
365+
dst: params.Named("$a", types.Int32Value(42)),
365366
err: nil,
366367
},
367368
{
368369
src: named("a", uint(42)),
369-
dst: table.ValueParam("$a", types.Uint32Value(42)),
370+
dst: params.Named("$a", types.Uint32Value(42)),
370371
err: nil,
371372
},
372373
{
@@ -389,50 +390,50 @@ func TestYdbParam(t *testing.T) {
389390
func TestArgsToParams(t *testing.T) {
390391
for _, tt := range []struct {
391392
args []interface{}
392-
params []table.ParameterOption
393+
params []*params.Parameter
393394
err error
394395
}{
395396
{
396397
args: []interface{}{},
397-
params: []table.ParameterOption{},
398+
params: []*params.Parameter{},
398399
err: nil,
399400
},
400401
{
401402
args: []interface{}{
402403
1, uint64(2), "3",
403404
},
404-
params: []table.ParameterOption{
405-
table.ValueParam("$p0", types.Int32Value(1)),
406-
table.ValueParam("$p1", types.Uint64Value(2)),
407-
table.ValueParam("$p2", types.TextValue("3")),
405+
params: []*params.Parameter{
406+
params.Named("$p0", types.Int32Value(1)),
407+
params.Named("$p1", types.Uint64Value(2)),
408+
params.Named("$p2", types.TextValue("3")),
408409
},
409410
err: nil,
410411
},
411412
{
412413
args: []interface{}{
413414
table.NewQueryParameters(
414-
table.ValueParam("$p0", types.Int32Value(1)),
415-
table.ValueParam("$p1", types.Uint64Value(2)),
416-
table.ValueParam("$p2", types.TextValue("3")),
415+
params.Named("$p0", types.Int32Value(1)),
416+
params.Named("$p1", types.Uint64Value(2)),
417+
params.Named("$p2", types.TextValue("3")),
417418
),
418419
table.NewQueryParameters(
419-
table.ValueParam("$p0", types.Int32Value(1)),
420-
table.ValueParam("$p1", types.Uint64Value(2)),
421-
table.ValueParam("$p2", types.TextValue("3")),
420+
params.Named("$p0", types.Int32Value(1)),
421+
params.Named("$p1", types.Uint64Value(2)),
422+
params.Named("$p2", types.TextValue("3")),
422423
),
423424
},
424425
err: errMultipleQueryParameters,
425426
},
426427
{
427428
args: []interface{}{
428-
table.ValueParam("$p0", types.Int32Value(1)),
429-
table.ValueParam("$p1", types.Uint64Value(2)),
430-
table.ValueParam("$p2", types.TextValue("3")),
429+
params.Named("$p0", types.Int32Value(1)),
430+
params.Named("$p1", types.Uint64Value(2)),
431+
params.Named("$p2", types.TextValue("3")),
431432
},
432-
params: []table.ParameterOption{
433-
table.ValueParam("$p0", types.Int32Value(1)),
434-
table.ValueParam("$p1", types.Uint64Value(2)),
435-
table.ValueParam("$p2", types.TextValue("3")),
433+
params: []*params.Parameter{
434+
params.Named("$p0", types.Int32Value(1)),
435+
params.Named("$p1", types.Uint64Value(2)),
436+
params.Named("$p2", types.TextValue("3")),
436437
},
437438
err: nil,
438439
},
@@ -442,10 +443,10 @@ func TestArgsToParams(t *testing.T) {
442443
sql.Named("$p1", types.Uint64Value(2)),
443444
sql.Named("$p2", types.TextValue("3")),
444445
},
445-
params: []table.ParameterOption{
446-
table.ValueParam("$p0", types.Int32Value(1)),
447-
table.ValueParam("$p1", types.Uint64Value(2)),
448-
table.ValueParam("$p2", types.TextValue("3")),
446+
params: []*params.Parameter{
447+
params.Named("$p0", types.Int32Value(1)),
448+
params.Named("$p1", types.Uint64Value(2)),
449+
params.Named("$p2", types.TextValue("3")),
449450
},
450451
err: nil,
451452
},
@@ -455,23 +456,23 @@ func TestArgsToParams(t *testing.T) {
455456
driver.NamedValue{Name: "$p1", Value: types.Uint64Value(2)},
456457
driver.NamedValue{Name: "$p2", Value: types.TextValue("3")},
457458
},
458-
params: []table.ParameterOption{
459-
table.ValueParam("$p0", types.Int32Value(1)),
460-
table.ValueParam("$p1", types.Uint64Value(2)),
461-
table.ValueParam("$p2", types.TextValue("3")),
459+
params: []*params.Parameter{
460+
params.Named("$p0", types.Int32Value(1)),
461+
params.Named("$p1", types.Uint64Value(2)),
462+
params.Named("$p2", types.TextValue("3")),
462463
},
463464
err: nil,
464465
},
465466
{
466467
args: []interface{}{
467-
driver.NamedValue{Value: table.ValueParam("$p0", types.Int32Value(1))},
468-
driver.NamedValue{Value: table.ValueParam("$p1", types.Uint64Value(2))},
469-
driver.NamedValue{Value: table.ValueParam("$p2", types.TextValue("3"))},
468+
driver.NamedValue{Value: params.Named("$p0", types.Int32Value(1))},
469+
driver.NamedValue{Value: params.Named("$p1", types.Uint64Value(2))},
470+
driver.NamedValue{Value: params.Named("$p2", types.TextValue("3"))},
470471
},
471-
params: []table.ParameterOption{
472-
table.ValueParam("$p0", types.Int32Value(1)),
473-
table.ValueParam("$p1", types.Uint64Value(2)),
474-
table.ValueParam("$p2", types.TextValue("3")),
472+
params: []*params.Parameter{
473+
params.Named("$p0", types.Int32Value(1)),
474+
params.Named("$p1", types.Uint64Value(2)),
475+
params.Named("$p2", types.TextValue("3")),
475476
},
476477
err: nil,
477478
},
@@ -481,37 +482,37 @@ func TestArgsToParams(t *testing.T) {
481482
driver.NamedValue{Value: uint64(2)},
482483
driver.NamedValue{Value: "3"},
483484
},
484-
params: []table.ParameterOption{
485-
table.ValueParam("$p0", types.Int32Value(1)),
486-
table.ValueParam("$p1", types.Uint64Value(2)),
487-
table.ValueParam("$p2", types.TextValue("3")),
485+
params: []*params.Parameter{
486+
params.Named("$p0", types.Int32Value(1)),
487+
params.Named("$p1", types.Uint64Value(2)),
488+
params.Named("$p2", types.TextValue("3")),
488489
},
489490
err: nil,
490491
},
491492
{
492493
args: []interface{}{
493494
driver.NamedValue{Value: table.NewQueryParameters(
494-
table.ValueParam("$p0", types.Int32Value(1)),
495-
table.ValueParam("$p1", types.Uint64Value(2)),
496-
table.ValueParam("$p2", types.TextValue("3")),
495+
params.Named("$p0", types.Int32Value(1)),
496+
params.Named("$p1", types.Uint64Value(2)),
497+
params.Named("$p2", types.TextValue("3")),
497498
)},
498499
},
499-
params: []table.ParameterOption{
500-
table.ValueParam("$p0", types.Int32Value(1)),
501-
table.ValueParam("$p1", types.Uint64Value(2)),
502-
table.ValueParam("$p2", types.TextValue("3")),
500+
params: []*params.Parameter{
501+
params.Named("$p0", types.Int32Value(1)),
502+
params.Named("$p1", types.Uint64Value(2)),
503+
params.Named("$p2", types.TextValue("3")),
503504
},
504505
err: nil,
505506
},
506507
{
507508
args: []interface{}{
508509
driver.NamedValue{Value: table.NewQueryParameters(
509-
table.ValueParam("$p0", types.Int32Value(1)),
510-
table.ValueParam("$p1", types.Uint64Value(2)),
511-
table.ValueParam("$p2", types.TextValue("3")),
510+
params.Named("$p0", types.Int32Value(1)),
511+
params.Named("$p1", types.Uint64Value(2)),
512+
params.Named("$p2", types.TextValue("3")),
512513
)},
513-
driver.NamedValue{Value: table.ValueParam("$p1", types.Uint64Value(2))},
514-
driver.NamedValue{Value: table.ValueParam("$p2", types.TextValue("3"))},
514+
driver.NamedValue{Value: params.Named("$p1", types.Uint64Value(2))},
515+
driver.NamedValue{Value: params.Named("$p2", types.TextValue("3"))},
515516
},
516517
err: errMultipleQueryParameters,
517518
},

0 commit comments

Comments
 (0)