search static method

List<SearchableItem> search(
  1. List<SearchableItem> items,
  2. String query, {
  3. SearchConfig config = const SearchConfig(),
})

Search items with basic matching

Implementation

static List<SearchableItem> search(
  List<SearchableItem> items,
  String query, {
  SearchConfig config = const SearchConfig(),
}) {
  if (query.isEmpty) return items;

  final searchQuery =
      config.caseSensitive ? query : query.toLowerCase().trim();
  final results = <SearchableItem>[];
  final exactMatches = <SearchableItem>[];
  final startsWithMatches = <SearchableItem>[];
  final containsMatches = <SearchableItem>[];

  for (final item in items) {
    for (final field in config.searchFields) {
      final fieldValue = _getFieldValue(item, field);
      if (fieldValue == null) continue;

      final searchValue =
          config.caseSensitive ? fieldValue : fieldValue.toLowerCase();

      // Exact match
      if (searchValue == searchQuery) {
        exactMatches.add(item);
        break;
      }
      // Starts with query
      else if (searchValue.startsWith(searchQuery)) {
        startsWithMatches.add(item);
        break;
      }
      // Contains query
      else if (searchValue.contains(searchQuery)) {
        containsMatches.add(item);
        break;
      }
    }
  }

  // Combine results in priority order
  results.addAll(exactMatches);
  results.addAll(startsWithMatches);
  results.addAll(containsMatches);

  return results;
}