Skip to content

Commit

Permalink
Fixed combining empty and non-empty filter
Browse files Browse the repository at this point in the history
Previously it would then act as a wildcard filter
  • Loading branch information
Donkie committed Sep 20, 2023
1 parent f967aef commit 597dca7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
25 changes: 17 additions & 8 deletions spoolman/database/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,15 @@ def add_where_clause_str_opt(
) -> Select:
"""Add a where clause to a select statement for an optional string field."""
if value is not None:
if len(value) == 0:
stmt = stmt.where(sqlalchemy.or_(field.is_(None), field == ""))
else:
stmt = stmt.where(sqlalchemy.or_(*(field.ilike(f"%{value}%") for value in value.split(","))))
conditions = []
for value_part in value.split(","):
if len(value_part) == 0:
conditions.append(field.is_(None))
conditions.append(field == "")
else:
conditions.append(field.ilike(f"%{value_part}%"))

stmt = stmt.where(sqlalchemy.or_(*conditions))
return stmt


Expand All @@ -59,10 +64,14 @@ def add_where_clause_str(
) -> Select:
"""Add a where clause to a select statement for a string field."""
if value is not None:
if len(value) == 0:
stmt = stmt.where(field == "")
else:
stmt = stmt.where(sqlalchemy.or_(*(field.ilike(f"%{value}%") for value in value.split(","))))
conditions = []
for value_part in value.split(","):
if len(value_part) == 0:
conditions.append(field == "")
else:
conditions.append(field.ilike(f"%{value_part}%"))

stmt = stmt.where(sqlalchemy.or_(*conditions))
return stmt


Expand Down
13 changes: 13 additions & 0 deletions tests_integration/tests/spool/test_find.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,19 @@ def test_find_spools_by_empty_location(spools: Fixture):
assert spool_lists_equal(spools_result, (spools.spools[3], spools.spools[4]))


def test_find_spools_by_empty_and_filled_location(spools: Fixture):
# Execute
result = httpx.get(
f"{URL}/api/v1/spool",
params={"location": "The Pantry,"},
)
result.raise_for_status()

# Verify
spools_result = result.json()
assert spool_lists_equal(spools_result, (spools.spools[0], spools.spools[3], spools.spools[4]))


def test_find_spools_by_lot_nr(spools: Fixture):
# Execute
result = httpx.get(
Expand Down

0 comments on commit 597dca7

Please sign in to comment.