Skip to content

Commit 3bb8fa8

Browse files
pieternnfx
authored andcommitted
Deal with parameters with multiple preset values
1 parent f316bb1 commit 3bb8fa8

File tree

3 files changed

+132
-17
lines changed

3 files changed

+132
-17
lines changed

sqlanalytics/api/query.go

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,34 +162,130 @@ type QueryParameterMultipleValuesOptions struct {
162162
type QueryParameterEnum struct {
163163
QueryParameter
164164

165-
Value string `json:"value"`
165+
Values []string `json:"-"`
166+
167+
Value json.RawMessage `json:"value"`
166168
Options string `json:"enumOptions"`
167169
Multi *QueryParameterMultipleValuesOptions `json:"multiValuesOptions,omitempty"`
168170
}
169171

170172
// MarshalJSON sets the type before marshaling.
171173
func (p QueryParameterEnum) MarshalJSON() ([]byte, error) {
172174
p.QueryParameter.Type = queryParameterEnumTypeName
175+
176+
// Set `Value` depending on multiple options being allowed or not.
177+
var err error
178+
if p.Multi == nil {
179+
// Set as single string.
180+
p.Value, err = json.Marshal(p.Values[0])
181+
if err != nil {
182+
return nil, err
183+
}
184+
} else {
185+
// Set as array of strings.
186+
p.Value, err = json.Marshal(p.Values)
187+
if err != nil {
188+
return nil, err
189+
}
190+
}
191+
173192
type localQueryParameter QueryParameterEnum
174193
return json.Marshal((localQueryParameter)(p))
175194
}
176195

196+
// UnmarshalJSON deals with polymorphism of the `value` field.
197+
func (p *QueryParameterEnum) UnmarshalJSON(b []byte) error {
198+
type localQueryParameter QueryParameterEnum
199+
err := json.Unmarshal(b, (*localQueryParameter)(p))
200+
if err != nil {
201+
return err
202+
}
203+
204+
// If multiple options aren't configured, assume `value` is a string.
205+
// Otherwise, it's an array of strings.
206+
if p.Multi == nil {
207+
var v string
208+
err = json.Unmarshal(p.Value, &v)
209+
if err != nil {
210+
return nil
211+
}
212+
p.Values = []string{v}
213+
} else {
214+
var vs []string
215+
err = json.Unmarshal(p.Value, &vs)
216+
if err != nil {
217+
return nil
218+
}
219+
p.Values = vs
220+
}
221+
222+
return nil
223+
}
224+
177225
// QueryParameterQuery ...
178226
type QueryParameterQuery struct {
179227
QueryParameter
180228

181-
Value string `json:"value"`
229+
Values []string `json:"-"`
230+
231+
Value json.RawMessage `json:"value"`
182232
QueryID string `json:"queryId"`
183233
Multi *QueryParameterMultipleValuesOptions `json:"multiValuesOptions,omitempty"`
184234
}
185235

186236
// MarshalJSON sets the type before marshaling.
187237
func (p QueryParameterQuery) MarshalJSON() ([]byte, error) {
188238
p.QueryParameter.Type = queryParameterQueryTypeName
239+
240+
// Set `Value` depending on multiple options being allowed or not.
241+
var err error
242+
if p.Multi == nil {
243+
// Set as single string.
244+
p.Value, err = json.Marshal(p.Values[0])
245+
if err != nil {
246+
return nil, err
247+
}
248+
} else {
249+
// Set as array of strings.
250+
p.Value, err = json.Marshal(p.Values)
251+
if err != nil {
252+
return nil, err
253+
}
254+
}
255+
189256
type localQueryParameter QueryParameterQuery
190257
return json.Marshal((localQueryParameter)(p))
191258
}
192259

260+
// UnmarshalJSON deals with polymorphism of the `value` field.
261+
func (p *QueryParameterQuery) UnmarshalJSON(b []byte) error {
262+
type localQueryParameter QueryParameterQuery
263+
err := json.Unmarshal(b, (*localQueryParameter)(p))
264+
if err != nil {
265+
return err
266+
}
267+
268+
// If multiple options aren't configured, assume `value` is a string.
269+
// Otherwise, it's an array of strings.
270+
if p.Multi == nil {
271+
var v string
272+
err = json.Unmarshal(p.Value, &v)
273+
if err != nil {
274+
return nil
275+
}
276+
p.Values = []string{v}
277+
} else {
278+
var vs []string
279+
err = json.Unmarshal(p.Value, &vs)
280+
if err != nil {
281+
return nil
282+
}
283+
p.Values = vs
284+
}
285+
286+
return nil
287+
}
288+
193289
// QueryParameterDate ...
194290
type QueryParameterDate struct {
195291
QueryParameter

sqlanalytics/resource_query.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,22 @@ type QueryParameterNumber struct {
5959

6060
// QueryParameterEnum ...
6161
type QueryParameterEnum struct {
62-
Value string `json:"value"`
62+
// Value iff `multiple == nil`
63+
Value string `json:"value,omitempty"`
64+
// Values iff `multiple != nil`
65+
Values []string `json:"values,omitempty"`
66+
6367
Options []string `json:"options"`
6468
Multiple *QueryParameterAllowMultiple `json:"multiple,omitempty"`
6569
}
6670

6771
// QueryParameterQuery ...
6872
type QueryParameterQuery struct {
69-
Value string `json:"value"`
73+
// Value iff `multiple == nil`
74+
Value string `json:"value,omitempty"`
75+
// Values iff `multiple != nil`
76+
Values []string `json:"values,omitempty"`
77+
7078
QueryID string `json:"query_id"`
7179
Multiple *QueryParameterAllowMultiple `json:"multiple,omitempty"`
7280
}
@@ -181,21 +189,25 @@ func (r *queryResource) toAPIObject(d *schema.ResourceData) (*api.Query, error)
181189
case p.Enum != nil:
182190
tmp := api.QueryParameterEnum{
183191
QueryParameter: ap,
184-
Value: p.Enum.Value,
185192
Options: strings.Join(p.Enum.Options, "\n"),
186193
}
187194
if p.Enum.Multiple != nil {
195+
tmp.Values = p.Enum.Values
188196
tmp.Multi = p.Enum.Multiple.toAPIObject()
197+
} else {
198+
tmp.Values = []string{p.Enum.Value}
189199
}
190200
iface = tmp
191201
case p.Query != nil:
192202
tmp := api.QueryParameterQuery{
193203
QueryParameter: ap,
194-
Value: p.Query.Value,
195204
QueryID: p.Query.QueryID,
196205
}
197206
if p.Query.Multiple != nil {
207+
tmp.Values = p.Query.Values
198208
tmp.Multi = p.Query.Multiple.toAPIObject()
209+
} else {
210+
tmp.Values = []string{p.Query.Value}
199211
}
200212
iface = tmp
201213
case p.Date != nil:
@@ -279,18 +291,26 @@ func (r *queryResource) fromAPIObject(aq *api.Query, d *schema.ResourceData) err
279291
p.Name = apv.Name
280292
p.Title = apv.Title
281293
p.Enum = &QueryParameterEnum{
282-
Value: apv.Value,
283294
Options: strings.Split(apv.Options, "\n"),
284295
Multiple: newQueryParameterAllowMultiple(apv.Multi),
285296
}
297+
if p.Enum.Multiple != nil {
298+
p.Enum.Values = apv.Values
299+
} else {
300+
p.Enum.Value = apv.Values[0]
301+
}
286302
case *api.QueryParameterQuery:
287303
p.Name = apv.Name
288304
p.Title = apv.Title
289305
p.Query = &QueryParameterQuery{
290-
Value: apv.Value,
291306
QueryID: apv.QueryID,
292307
Multiple: newQueryParameterAllowMultiple(apv.Multi),
293308
}
309+
if p.Query.Multiple != nil {
310+
p.Query.Values = apv.Values
311+
} else {
312+
p.Query.Value = apv.Values[0]
313+
}
294314
case *api.QueryParameterDate:
295315
p.Name = apv.Name
296316
p.Title = apv.Title

sqlanalytics/resource_query_test.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ func TestQueryUpdateWithParams(t *testing.T) {
156156
Title: "Title for column 3",
157157
},
158158
Options: "e1\ne2",
159+
Values: []string{"e1"},
159160
Multi: &api.QueryParameterMultipleValuesOptions{
160161
Prefix: "\"",
161162
Suffix: "\"",
@@ -168,6 +169,7 @@ func TestQueryUpdateWithParams(t *testing.T) {
168169
Title: "Title for column 3 without multiple",
169170
},
170171
Options: "e1\ne2",
172+
Values: []string{"e1"},
171173
Multi: nil,
172174
},
173175
api.QueryParameterQuery{
@@ -176,6 +178,7 @@ func TestQueryUpdateWithParams(t *testing.T) {
176178
Title: "Title for column 4",
177179
},
178180
QueryID: "abc",
181+
Values: []string{"e1"},
179182
Multi: &api.QueryParameterMultipleValuesOptions{
180183
Prefix: "\"",
181184
Suffix: "\"",
@@ -188,6 +191,7 @@ func TestQueryUpdateWithParams(t *testing.T) {
188191
Title: "Title for column 4 without multiple",
189192
},
190193
QueryID: "abc",
194+
Values: []string{"e1"},
191195
Multi: nil,
192196
},
193197
api.QueryParameterDate{
@@ -264,8 +268,8 @@ func TestQueryUpdateWithParams(t *testing.T) {
264268
name = "3"
265269
title = "Title for column 3"
266270
enum {
267-
value = ""
268271
options = ["e1", "e2"]
272+
values = ["e1"]
269273
multiple {
270274
prefix = "\""
271275
suffix = "\""
@@ -278,17 +282,17 @@ func TestQueryUpdateWithParams(t *testing.T) {
278282
name = "3"
279283
title = "Title for column 3 without multiple"
280284
enum {
281-
value = ""
282285
options = ["e1", "e2"]
286+
value = "e1"
283287
}
284288
}
285289
286290
parameter {
287291
name = "4"
288292
title = "Title for column 4"
289293
query {
290-
value = ""
291294
query_id = "abc"
295+
values = ["e1"]
292296
multiple {
293297
prefix = "\""
294298
suffix = "\""
@@ -301,13 +305,8 @@ func TestQueryUpdateWithParams(t *testing.T) {
301305
name = "4"
302306
title = "Title for column 4 without multiple"
303307
query {
304-
value = ""
305308
query_id = "abc"
306-
multiple {
307-
prefix = "\""
308-
suffix = "\""
309-
separator = ","
310-
}
309+
value = "e1"
311310
}
312311
}
313312

0 commit comments

Comments
 (0)