From 8a6adda5bfb2c44404c3a8ae997754f80ebea36b Mon Sep 17 00:00:00 2001 From: Lyz Date: Wed, 22 Dec 2021 13:05:26 +0100 Subject: [PATCH] feat: make string search case insensitive --- src/repository_orm/adapters/data/pypika.py | 6 ++++-- src/repository_orm/adapters/data/tinydb.py | 2 +- tests/integration/test_repository.py | 24 +++++++++++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/repository_orm/adapters/data/pypika.py b/src/repository_orm/adapters/data/pypika.py index 690b4fe..0628d13 100644 --- a/src/repository_orm/adapters/data/pypika.py +++ b/src/repository_orm/adapters/data/pypika.py @@ -8,7 +8,7 @@ from sqlite3 import OperationalError from typing import Dict, List, Type, Union -from pypika import Query, Table +from pypika import Query, Table, functions from yoyo import get_backend, read_migrations from ...exceptions import EntityNotFoundError, TooManyEntitiesError @@ -234,7 +234,9 @@ def search( if key == "id_": key = "id" if isinstance(value, str): - query = query.where(getattr(table, key).regexp(value)) + query = query.where( + functions.Lower(getattr(table, key)).regexp(value.lower()) + ) else: query = query.where(getattr(table, key) == value) diff --git a/src/repository_orm/adapters/data/tinydb.py b/src/repository_orm/adapters/data/tinydb.py index c2c0e1f..e91def0 100644 --- a/src/repository_orm/adapters/data/tinydb.py +++ b/src/repository_orm/adapters/data/tinydb.py @@ -269,7 +269,7 @@ def _build_search_query( if isinstance(value, str): model_query_parts.append( (Query().model_type_ == model.__name__.lower()) - & (Query()[field].search(value)) + & (Query()[field].search(value, flags=re.IGNORECASE)) ) else: model_query_parts.append( diff --git a/tests/integration/test_repository.py b/tests/integration/test_repository.py index 788c3aa..d6a1dc4 100644 --- a/tests/integration/test_repository.py +++ b/tests/integration/test_repository.py @@ -487,7 +487,6 @@ def test_repository_can_search_regular_expression( When: We search using a regular expression Then: The matching entity is found """ - # ignore: we know that all the entities we test have the name property expected_entities = [ entity_ for entity_ in inserted_entities @@ -500,6 +499,29 @@ def test_repository_can_search_regular_expression( assert result == expected_entities +def test_repository_search_by_regular_expression_is_case_insensitive( + repo: Repository, inserted_entities: List[Entity] +) -> None: + """ + Given: More than one entity is inserted in the repository. + When: We search using a regular expression with the wrong capitalization + Then: The matching entity is found + + If you come to disable this functionality, make it configurable instead, being the + default the search as case insensitive + """ + expected_entities = [ + entity_ + for entity_ in inserted_entities + if entity_.name == inserted_entities[0].name + ] + regular_expression = fr"^{expected_entities[0].name.upper()}.*" + + result = repo.search({"name": regular_expression}, type(expected_entities[0])) + + assert result == expected_entities + + def test_repository_search_raises_error_if_searching_by_inexistent_field( repo: Repository, inserted_entities: List[Entity],