@@ -34,6 +34,8 @@ const (
34
34
TYPE_UUID = SimpleType ("uuid" )
35
35
TYPE_VARCHAR = SimpleType ("varchar" )
36
36
TYPE_VARINT = SimpleType ("varint" )
37
+
38
+ MaxUDTParts = 10
37
39
)
38
40
39
41
// TODO: Add support for time when gocql bug is fixed.
@@ -249,6 +251,55 @@ func (tt TupleType) GenValueRange(p *PartitionRange) ([]interface{}, []interface
249
251
return left , right
250
252
}
251
253
254
+ type UDTType struct {
255
+ Types map [string ]SimpleType
256
+ TypeName string
257
+ Frozen bool
258
+ }
259
+
260
+ func (tt UDTType ) Name () string {
261
+ return tt .TypeName
262
+ }
263
+
264
+ func (tt UDTType ) CQLDef () string {
265
+ if tt .Frozen {
266
+ return "frozen<" + tt .TypeName + ">"
267
+ }
268
+ return tt .TypeName
269
+ }
270
+
271
+ func (tt UDTType ) CQLHolder () string {
272
+ return "?"
273
+ }
274
+
275
+ func (tt UDTType ) Indexable () bool {
276
+ for _ , t := range tt .Types {
277
+ if t == TYPE_DURATION {
278
+ return false
279
+ }
280
+ }
281
+ return true
282
+ }
283
+
284
+ func (tt UDTType ) GenValue (p * PartitionRange ) []interface {} {
285
+ vals := make (map [string ]interface {})
286
+ for name , typ := range tt .Types {
287
+ vals [name ] = typ .GenValue (p )[0 ]
288
+ }
289
+ return []interface {}{vals }
290
+ }
291
+
292
+ func (tt UDTType ) GenValueRange (p * PartitionRange ) ([]interface {}, []interface {}) {
293
+ left := make (map [string ]interface {})
294
+ right := make (map [string ]interface {})
295
+ for name , t := range tt .Types {
296
+ ttLeft , ttRight := t .GenValueRange (p )
297
+ left [name ] = ttLeft [0 ]
298
+ right [name ] = ttRight [0 ]
299
+ }
300
+ return []interface {}{left }, []interface {}{right }
301
+ }
302
+
252
303
type SetType struct {
253
304
Type SimpleType
254
305
Frozen bool
@@ -370,15 +421,17 @@ func genColumnName(prefix string, idx int) string {
370
421
}
371
422
372
423
func genColumnType (numColumns int ) Type {
373
- n := rand .Intn (numColumns + 4 )
424
+ n := rand .Intn (numColumns + 5 )
374
425
switch n {
375
426
case numColumns :
376
427
return genTupleType ()
377
428
case numColumns + 1 :
378
- return genSetType ()
429
+ return genUDTType ()
379
430
case numColumns + 2 :
380
- return genListType ()
431
+ return genSetType ()
381
432
case numColumns + 3 :
433
+ return genListType ()
434
+ case numColumns + 4 :
382
435
return genMapType ()
383
436
default :
384
437
return genSimpleType ()
@@ -404,6 +457,22 @@ func genTupleType() Type {
404
457
}
405
458
}
406
459
460
+ func genUDTType () UDTType {
461
+ udtNum := rand .Uint32 ()
462
+ typeName := fmt .Sprintf ("udt_%d" , udtNum )
463
+ ts := make (map [string ]SimpleType )
464
+
465
+ for i := 0 ; i < rand .Intn (MaxUDTParts )+ 1 ; i ++ {
466
+ ts [typeName + fmt .Sprintf ("_%d" , i )] = genSimpleType ()
467
+ }
468
+
469
+ return UDTType {
470
+ Types : ts ,
471
+ TypeName : typeName ,
472
+ Frozen : true ,
473
+ }
474
+ }
475
+
407
476
func genSetType () SetType {
408
477
var t SimpleType
409
478
for {
0 commit comments