github.com/ydb-platform/ydb-go-sdk/v3@v3.57.0/internal/params/parameters.go (about)

     1  package params
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
     8  
     9  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/allocator"
    10  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
    11  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
    12  )
    13  
    14  type (
    15  	NamedValue interface {
    16  		Name() string
    17  		Value() value.Value
    18  	}
    19  	Parameter struct {
    20  		parent Builder
    21  		name   string
    22  		value  value.Value
    23  	}
    24  	Parameters []*Parameter
    25  )
    26  
    27  func Named(name string, value value.Value) *Parameter {
    28  	return &Parameter{
    29  		name:  name,
    30  		value: value,
    31  	}
    32  }
    33  
    34  func (p *Parameter) Name() string {
    35  	return p.name
    36  }
    37  
    38  func (p *Parameter) Value() value.Value {
    39  	return p.value
    40  }
    41  
    42  func (p *Parameters) String() string {
    43  	buffer := xstring.Buffer()
    44  	defer buffer.Free()
    45  
    46  	buffer.WriteByte('{')
    47  	if p != nil {
    48  		for i, param := range *p {
    49  			if i != 0 {
    50  				buffer.WriteByte(',')
    51  			}
    52  			buffer.WriteByte('"')
    53  			buffer.WriteString(param.name)
    54  			buffer.WriteString("\":")
    55  			buffer.WriteString(param.value.Yql())
    56  		}
    57  	}
    58  	buffer.WriteByte('}')
    59  
    60  	return buffer.String()
    61  }
    62  
    63  func (p *Parameters) ToYDB(a *allocator.Allocator) map[string]*Ydb.TypedValue {
    64  	if p == nil {
    65  		return nil
    66  	}
    67  	parameters := make(map[string]*Ydb.TypedValue, len(*p))
    68  	for _, param := range *p {
    69  		parameters[param.name] = value.ToYDB(param.value, a)
    70  	}
    71  
    72  	return parameters
    73  }
    74  
    75  func (p *Parameters) Each(it func(name string, v value.Value)) {
    76  	if p == nil {
    77  		return
    78  	}
    79  	for _, p := range *p {
    80  		it(p.name, p.value)
    81  	}
    82  }
    83  
    84  func (p *Parameters) Count() int {
    85  	if p == nil {
    86  		return 0
    87  	}
    88  
    89  	return len(*p)
    90  }
    91  
    92  func (p *Parameters) Add(params ...NamedValue) {
    93  	for _, param := range params {
    94  		*p = append(*p, Named(param.Name(), param.Value()))
    95  	}
    96  }
    97  
    98  func (p *Parameter) Optional() *optional {
    99  	return &optional{
   100  		parent: p.parent,
   101  		name:   p.name,
   102  	}
   103  }
   104  
   105  func (p *Parameter) List() *list {
   106  	return &list{
   107  		parent: p.parent,
   108  		name:   p.name,
   109  	}
   110  }
   111  
   112  func (p *Parameter) Set() *set {
   113  	return &set{
   114  		parent: p.parent,
   115  		name:   p.name,
   116  	}
   117  }
   118  
   119  func (p *Parameter) Text(v string) Builder {
   120  	p.value = value.TextValue(v)
   121  	p.parent.params = append(p.parent.params, p)
   122  
   123  	return p.parent
   124  }
   125  
   126  func (p *Parameter) Bytes(v []byte) Builder {
   127  	p.value = value.BytesValue(v)
   128  	p.parent.params = append(p.parent.params, p)
   129  
   130  	return p.parent
   131  }
   132  
   133  func (p *Parameter) Bool(v bool) Builder {
   134  	p.value = value.BoolValue(v)
   135  	p.parent.params = append(p.parent.params, p)
   136  
   137  	return p.parent
   138  }
   139  
   140  func (p *Parameter) Uint64(v uint64) Builder {
   141  	p.value = value.Uint64Value(v)
   142  	p.parent.params = append(p.parent.params, p)
   143  
   144  	return p.parent
   145  }
   146  
   147  func (p *Parameter) Int64(v int64) Builder {
   148  	p.value = value.Int64Value(v)
   149  	p.parent.params = append(p.parent.params, p)
   150  
   151  	return p.parent
   152  }
   153  
   154  func (p *Parameter) Uint32(v uint32) Builder {
   155  	p.value = value.Uint32Value(v)
   156  	p.parent.params = append(p.parent.params, p)
   157  
   158  	return p.parent
   159  }
   160  
   161  func (p *Parameter) Int32(v int32) Builder {
   162  	p.value = value.Int32Value(v)
   163  	p.parent.params = append(p.parent.params, p)
   164  
   165  	return p.parent
   166  }
   167  
   168  func (p *Parameter) Uint16(v uint16) Builder {
   169  	p.value = value.Uint16Value(v)
   170  	p.parent.params = append(p.parent.params, p)
   171  
   172  	return p.parent
   173  }
   174  
   175  func (p *Parameter) Int16(v int16) Builder {
   176  	p.value = value.Int16Value(v)
   177  	p.parent.params = append(p.parent.params, p)
   178  
   179  	return p.parent
   180  }
   181  
   182  func (p *Parameter) Uint8(v uint8) Builder {
   183  	p.value = value.Uint8Value(v)
   184  	p.parent.params = append(p.parent.params, p)
   185  
   186  	return p.parent
   187  }
   188  
   189  func (p *Parameter) Int8(v int8) Builder {
   190  	p.value = value.Int8Value(v)
   191  	p.parent.params = append(p.parent.params, p)
   192  
   193  	return p.parent
   194  }
   195  
   196  func (p *Parameter) Float(v float32) Builder {
   197  	p.value = value.FloatValue(v)
   198  	p.parent.params = append(p.parent.params, p)
   199  
   200  	return p.parent
   201  }
   202  
   203  func (p *Parameter) Double(v float64) Builder {
   204  	p.value = value.DoubleValue(v)
   205  	p.parent.params = append(p.parent.params, p)
   206  
   207  	return p.parent
   208  }
   209  
   210  func (p *Parameter) Decimal(v [16]byte, precision, scale uint32) Builder {
   211  	p.value = value.DecimalValue(v, precision, scale)
   212  	p.parent.params = append(p.parent.params, p)
   213  
   214  	return p.parent
   215  }
   216  
   217  func (p *Parameter) Timestamp(v time.Time) Builder {
   218  	p.value = value.TimestampValueFromTime(v)
   219  	p.parent.params = append(p.parent.params, p)
   220  
   221  	return p.parent
   222  }
   223  
   224  func (p *Parameter) Date(v time.Time) Builder {
   225  	p.value = value.DateValueFromTime(v)
   226  	p.parent.params = append(p.parent.params, p)
   227  
   228  	return p.parent
   229  }
   230  
   231  func (p *Parameter) Datetime(v time.Time) Builder {
   232  	p.value = value.DatetimeValueFromTime(v)
   233  	p.parent.params = append(p.parent.params, p)
   234  
   235  	return p.parent
   236  }
   237  
   238  func (p *Parameter) Interval(v time.Duration) Builder {
   239  	p.value = value.IntervalValueFromDuration(v)
   240  	p.parent.params = append(p.parent.params, p)
   241  
   242  	return p.parent
   243  }
   244  
   245  func (p *Parameter) JSON(v string) Builder {
   246  	p.value = value.JSONValue(v)
   247  	p.parent.params = append(p.parent.params, p)
   248  
   249  	return p.parent
   250  }
   251  
   252  func (p *Parameter) JSONDocument(v string) Builder {
   253  	p.value = value.JSONDocumentValue(v)
   254  	p.parent.params = append(p.parent.params, p)
   255  
   256  	return p.parent
   257  }
   258  
   259  func (p *Parameter) YSON(v []byte) Builder {
   260  	p.value = value.YSONValue(v)
   261  	p.parent.params = append(p.parent.params, p)
   262  
   263  	return p.parent
   264  }
   265  
   266  func (p *Parameter) UUID(v [16]byte) Builder {
   267  	p.value = value.UUIDValue(v)
   268  	p.parent.params = append(p.parent.params, p)
   269  
   270  	return p.parent
   271  }
   272  
   273  func Declare(p *Parameter) string {
   274  	return fmt.Sprintf(
   275  		"DECLARE %s AS %s",
   276  		p.name,
   277  		p.value.Type().Yql(),
   278  	)
   279  }