toQuery method

String toQuery(
  1. ColumnDefinition columnDefinition
)

Generates a SQL WHERE clause from the filter constraint.

Implementation

String toQuery(ColumnDefinition columnDefinition) {
  assert(columnDefinition.name == column);

  var columnType = columnDefinition.columnType;
  String formattedValue;
  if (columnType == ColumnType.integer ||
      columnType == ColumnType.bigint ||
      columnType == ColumnType.doublePrecision ||
      columnType == ColumnType.boolean) {
    formattedValue = value;
  } else if (columnType == ColumnType.text) {
    formattedValue = ValueEncoder.instance.convert(value);
  } else if (columnType == ColumnType.timestampWithoutTimeZone) {
    if (type == FilterConstraintType.inThePast) {
      formattedValue = _microsecondsToInterval(int.parse(value));
    } else {
      var dateTime = DateTime.tryParse(value);
      if (dateTime != null) {
        formattedValue = ValueEncoder.instance.convert(dateTime);
      } else {
        formattedValue = 'NULL';
      }
    }
  } else {
    throw Exception(
      'Unsupported column type ${columnDefinition.columnType} for column "${columnDefinition.name}".',
    );
  }

  switch (type) {
    case FilterConstraintType.equals:
      return '"$column" = $formattedValue';
    case FilterConstraintType.notEquals:
      return '"$column" != $formattedValue';
    case FilterConstraintType.greaterThan:
      return '"$column" > $formattedValue';
    case FilterConstraintType.greaterThanOrEquals:
      return '"$column" >= $formattedValue';
    case FilterConstraintType.lessThan:
      return '"$column" < $formattedValue';
    case FilterConstraintType.lessThanOrEquals:
      return '"$column" <= $formattedValue';
    case FilterConstraintType.like:
      return '"$column" LIKE $formattedValue';
    case FilterConstraintType.notLike:
      return '"$column" NOT LIKE $formattedValue';
    case FilterConstraintType.iLike:
      return '"$column" ILIKE $formattedValue';
    case FilterConstraintType.notILike:
      return '"$column" NOT ILIKE $formattedValue';
    case FilterConstraintType.between:
      return '"$column" BETWEEN $formattedValue AND $value2';
    case FilterConstraintType.inThePast:
      return '"$column" > (NOW() - $formattedValue)';
    case FilterConstraintType.isNull:
      return '"$column" IS NULL';
    case FilterConstraintType.isNotNull:
      return '"$column" IS NOT NULL';
  }
}