getSearchableFilter method

Map<String, Object?> getSearchableFilter({
  1. required Map<String, Object?> inputs,
  2. String searchFiled = 'search',
})

Generates search and filter criteria based on form field definitions.

This method creates MongoDB query filters based on:

  • Searchable fields: Creates text-based search using regex patterns
  • Filterable fields: Creates exact-match filters for specific values

Parameters:

  • inputs - Input data containing search terms and filter values
  • searchFiled - Name of the field containing the search term (default: 'search')

Returns a MongoDB query filter object that can be used in find operations.

The method automatically:

  • Builds OR conditions for searchable fields using regex patterns
  • Builds AND conditions for filterable fields using exact matches
  • Combines search and filter conditions appropriately

Example:

var filter = collection.getSearchableFilter(
  inputs: {
    'search': 'john',
    'status': 'active',
    'role': 'admin'
  }
);
// Results in: {$and: [{$or: [name: /john/i, email: /john/i]}, {status: 'active', role: 'admin'}]}

Implementation

Map<String, Object?> getSearchableFilter({
  required Map<String, Object?> inputs,
  String searchFiled = 'search',
}) {
  var resSearch = <String, Object?>{};
  if (inputs[searchFiled] != null &&
      inputs[searchFiled].toString().trim().isNotEmpty) {
    var searchOr = [];
    for (var key in form.fields.keys) {
      if (form.fields[key]!.searchable) {
        searchOr.add(
          DQ.field(key, DQ.like(inputs[searchFiled].toString().trim())),
        );
      }
    }

    if (searchOr.isNotEmpty) {
      resSearch = DQ.or(searchOr);
    }
  }

  var resFilter = <String, Object?>{};
  var filterAnd = [];
  for (var key in form.fields.keys) {
    if (form.fields[key]!.filterable) {
      if (inputs[key] != null) {
        filterAnd.add(
          DQ.field(
            key,
            ObjectDescovery.descovr(
              inputs[key],
              form.fields[key]!.type,
              def: form.fields[key]!.defaultValue?.call(),
            ),
          ),
        );
      }
    }
  }
  if (filterAnd.isNotEmpty) {
    resFilter = DQ.and(filterAnd);
  }

  var res = <String, Object?>{};
  if (resSearch.isNotEmpty && resFilter.isNotEmpty) {
    res = DQ.and([resSearch, resFilter]);
  }
  res = {...resSearch, ...resFilter};
  return res;
}