func writeWhereClause()

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
}