azkustodata/kql/query_parameters.go (94 lines of code) (raw):
package kql
import (
"github.com/Azure/azure-kusto-go/azkustodata/value"
"github.com/google/uuid"
"github.com/shopspring/decimal"
"sort"
"strings"
"time"
)
type Parameters struct {
parameters map[string]value.Kusto
}
func NewParameters() *Parameters {
return &Parameters{parameters: make(map[string]value.Kusto)}
}
func (q *Parameters) Count() int {
return len(q.parameters)
}
func (q *Parameters) AddValue(key string, v value.Kusto) *Parameters {
if RequiresQuoting(key) {
panic("Invalid parameter values. make sure to adhere to KQL entity name conventions and escaping rules.")
}
q.parameters[key] = v
return q
}
func (q *Parameters) AddBool(key string, v bool) *Parameters {
return q.AddValue(key, value.NewBool(v))
}
func (q *Parameters) AddDateTime(key string, v time.Time) *Parameters {
return q.AddValue(key, value.NewDateTime(v))
}
func (q *Parameters) AddDynamic(key string, v interface{}) *Parameters {
return q.AddValue(key, value.DynamicFromInterface(v))
}
func (q *Parameters) AddSerializedDynamic(key string, v []byte) *Parameters {
return q.AddValue(key, value.NewDynamic(v))
}
func (q *Parameters) AddGUID(key string, v uuid.UUID) *Parameters {
return q.AddValue(key, value.NewGUID(v))
}
func (q *Parameters) AddInt(key string, v int32) *Parameters {
return q.AddValue(key, value.NewInt(v))
}
func (q *Parameters) AddLong(key string, v int64) *Parameters {
return q.AddValue(key, value.NewLong(v))
}
func (q *Parameters) AddReal(key string, v float64) *Parameters {
return q.AddValue(key, value.NewReal(v))
}
func (q *Parameters) AddString(key string, v string) *Parameters {
return q.AddValue(key, value.NewString(v))
}
func (q *Parameters) AddTimespan(key string, v time.Duration) *Parameters {
return q.AddValue(key, value.NewTimespan(v))
}
func (q *Parameters) AddDecimal(key string, v decimal.Decimal) *Parameters {
return q.AddValue(key, value.NewDecimal(v))
}
func (q *Parameters) ToDeclarationString() string {
const (
declare = "declare query_parameters("
closeStmt = ");"
)
var build = strings.Builder{}
if len(q.parameters) == 0 {
return ""
}
build.WriteString(declare)
keys := make([]string, 0, len(q.parameters))
for k := range q.parameters {
keys = append(keys, k)
}
sort.Strings(keys)
for i, key := range keys {
build.WriteString(key)
build.WriteString(":")
build.WriteString(string(q.parameters[key].GetType()))
if i < len(keys)-1 {
build.WriteString(", ")
}
}
build.WriteString(closeStmt)
return build.String()
}
func (q *Parameters) ToParameterCollection() map[string]string {
var parameters = make(map[string]string)
for key, paramVals := range q.parameters {
parameters[key] = QuoteValue(paramVals)
}
return parameters
}
// Reset resets the parameters map
func (q *Parameters) Reset() {
q.parameters = make(map[string]value.Kusto)
}