whereDate function

CoffeeQueryFilter whereDate(
  1. dynamic type,
  2. WhereOperator operator,
  3. DateTime date, {
  4. String filterBy = 'full-date',
})

Creates a filter for date searches.

type: The property to filter by, either a String or a Function. operator: The comparison operator to use ('==', '!=', '<=', '<', '>=', '>'). date: The date value to compare. filterBy: Specifies the components of the date to filter by ('day', 'month', 'year', 'day-month', 'day-year', 'month-year', 'day-month-year', 'full-date'). Default is 'full-date'.

Returns a CoffeeQueryFilter configured for date searches.

Usage Example

whereDate('createdAt', WhereOperator.equal, DateTime.now(), 'day');
whereDate((Model model) => model.createdAt, WhereOperator.equal, DateTime(2022, 10, 27), 'day');

Implementation

CoffeeQueryFilter whereDate(dynamic type, WhereOperator operator, DateTime date, {
  String filterBy = 'full-date'
}) {
  final propertyName = _getPropertyName(type);

  // Format the date components
  final day = date.day.toString().padLeft(2, '0');
  final month = date.month.toString().padLeft(2, '0');
  final year = date.year.toString();
  final hours = date.hour.toString().padLeft(2, '0');
  final minutes = date.minute.toString().padLeft(2, '0');
  final seconds = date.second.toString().padLeft(2, '0');
  final fullDate = '$year-$month-$day $hours:$minutes:$seconds';

  // Add operator prefix
  String operatorPrefix;
  switch (operator) {
    case WhereOperator.equal:
      operatorPrefix = 'cEqualDate';
      break;
    case WhereOperator.notEqual:
      operatorPrefix = 'cNotEqualDate';
      break;
    case WhereOperator.greaterOrEqual:
      operatorPrefix = 'cGreaterEqualDate';
      break;
    case WhereOperator.lessOrEqual:
      operatorPrefix = 'cLessEqualDate';
      break;
    case WhereOperator.greater:
      operatorPrefix = 'cGreaterDate';
      break;
    case WhereOperator.less:
      operatorPrefix = 'cLessDate';
      break;
    default:
      throw ArgumentError('Invalid operator');
  }

  String expression;
  switch (filterBy) {
    case 'day':
      expression = '$operatorPrefix$propertyName=day=$day';
      break;
    case 'month':
      expression = '$operatorPrefix$propertyName=month=$month';
      break;
    case 'year':
      expression = '$operatorPrefix$propertyName=year=$year';
      break;
    case 'day-month':
      expression = '$operatorPrefix$propertyName=day=$day,$operatorPrefix$propertyName=month=$month';
      break;
    case 'day-year':
      expression = '$operatorPrefix$propertyName=day=$day,$operatorPrefix$propertyName=year=$year';
      break;
    case 'month-year':
      expression = '$operatorPrefix$propertyName=month=$month,$operatorPrefix$propertyName=year=$year';
      break;
    case 'day-month-year':
      expression = '$operatorPrefix$propertyName=day=$day,$operatorPrefix$propertyName=month=$month,$operatorPrefix$propertyName=year=$year';
      break;
    case 'full-date':
      expression = '$operatorPrefix$propertyName=full-date=$fullDate';
      break;
    default:
      throw ArgumentError('Invalid filterBy value');
  }

  return CoffeeQueryFilter(
    expression: expression,
    type: 'filter',
  );
}