in pkg/data-query/dataQuery.go [402:475]
func writeWhereClause(sb *strings.Builder, query Query) error {
sb.WriteString(" where")
for i, filter := range query.Filters {
if i != 0 {
sb.WriteString(" and")
}
sb.WriteString(" (")
sb.WriteString(filter.Field)
if filter.Sql != "" {
if filter.Operator != "" {
return errors.New("sql and operator are mutually exclusive")
}
if filter.Value != nil {
return errors.New("sql and value are mutually exclusive")
}
sb.WriteByte(' ')
sb.WriteString(filter.Sql)
sb.WriteByte(')')
continue
}
switch v := filter.Value.(type) {
case int:
sb.WriteString(filter.Operator)
sb.WriteString(strconv.Itoa(filter.Value.(int))) //nolint:errcheck // we're sure that filter is int due to switch case on type
case float64:
sb.WriteString(filter.Operator)
if v == math.Trunc(v) {
sb.WriteString(strconv.Itoa(int(v)))
} else {
sb.WriteString(strconv.FormatFloat(v, 'f', -1, 64))
}
case bool:
sb.WriteString(filter.Operator)
sb.WriteString(strconv.FormatBool(v))
case string:
sb.WriteString(" ")
sb.WriteString(filter.Operator)
sb.WriteString(" ")
writeString(sb, v)
case []string:
sb.WriteString(" in (")
for j := range v {
if j != 0 {
sb.WriteByte(',')
}
writeString(sb, v[j])
}
sb.WriteByte(')')
case []any:
sb.WriteString(" in (")
for j := range v {
if j != 0 {
sb.WriteByte(',')
}
switch e := v[j].(type) {
case string:
writeString(sb, e)
case bool:
sb.WriteString(strconv.FormatBool(e))
default:
return fmt.Errorf("filter value type [%T] is not supported", v[j])
}
}
sb.WriteByte(')')
default:
return fmt.Errorf("filter value type %T is not supported", v)
}
sb.WriteByte(')')
}
return nil
}