eval method

  1. @override
Object? eval(
  1. Map<String, Object?> row
)
override

Evaluate this expression in the context of row (column name -> value).

Implementation

@override
Object? eval(Map<String, Object?> row) {
  final v = expr.eval(row);
  if (v == null) return null;
  // CAST has more lenient conversion than the implicit table coercion:
  // - double->int truncates
  // - int/double->TEXT stringifies
  switch (targetType) {
    case DataType.integer:
      if (v is int) return v;
      if (v is double) return v.truncate();
      if (v is String) {
        final i = int.tryParse(v);
        if (i != null) return i;
        final d = double.tryParse(v);
        if (d != null) return d.truncate();
        return 0;
      }
      if (v is bool) return v ? 1 : 0;
      return coerce(v, targetType);
    case DataType.real:
      if (v is num) return v.toDouble();
      if (v is String) return double.tryParse(v) ?? 0.0;
      return coerce(v, targetType);
    case DataType.text:
      return v.toString();
    default:
      return coerce(v, targetType);
  }
}