in exprs.go [915:971]
func createBoundSetPredicate(op Operation, term BoundTerm, lits Set[Literal]) (BooleanExpression, error) {
boundType := term.Type()
typedSet := newLiteralSet()
for _, v := range lits.Members() {
casted, err := v.To(boundType)
if err != nil {
return nil, err
}
typedSet.Add(casted)
}
switch typedSet.Len() {
case 0:
if op == OpIn {
return AlwaysFalse{}, nil
} else if op == OpNotIn {
return AlwaysTrue{}, nil
}
case 1:
if op == OpIn {
return createBoundLiteralPredicate(OpEQ, term, typedSet.Members()[0])
} else if op == OpNotIn {
return createBoundLiteralPredicate(OpNEQ, term, typedSet.Members()[0])
}
}
switch term.Type().(type) {
case BooleanType:
return newBoundSetPredicate[bool](op, term, typedSet), nil
case Int32Type:
return newBoundSetPredicate[int32](op, term, typedSet), nil
case Int64Type:
return newBoundSetPredicate[int64](op, term, typedSet), nil
case Float32Type:
return newBoundSetPredicate[float32](op, term, typedSet), nil
case Float64Type:
return newBoundSetPredicate[float64](op, term, typedSet), nil
case DateType:
return newBoundSetPredicate[Date](op, term, typedSet), nil
case TimeType:
return newBoundSetPredicate[Time](op, term, typedSet), nil
case TimestampType, TimestampTzType:
return newBoundSetPredicate[Timestamp](op, term, typedSet), nil
case StringType:
return newBoundSetPredicate[string](op, term, typedSet), nil
case BinaryType, FixedType:
return newBoundSetPredicate[[]byte](op, term, typedSet), nil
case DecimalType:
return newBoundSetPredicate[Decimal](op, term, typedSet), nil
case UUIDType:
return newBoundSetPredicate[uuid.UUID](op, term, typedSet), nil
}
return nil, fmt.Errorf("%w: invalid bound type for set predicate - %s",
ErrType, term.Type())
}