fix(query): range sur colonnes non-numériques + blank/notBlank sur numérique/date (#41)

- `range` était ignoré silencieusement (TRUE, pas de filtre) sur les
  colonnes texte/date car seul `_numeric_to_sql` le gérait. Ajout du
  cas `range` dans la branche texte/date (BETWEEN, CAST VARCHAR pour
  les dates, comme les autres opérateurs de comparaison).
- `blank`/`notBlank` comparaient toujours à `''`, ce qui fait planter
  DuckDB (Conversion Error) sur les colonnes numériques/date. Le
  check est déplacé après le calcul de is_numeric/col_is_date : ces
  types utilisent IS [NOT] NULL sans comparaison à chaîne vide.
This commit is contained in:
Colin Maudry
2026-07-10 07:49:43 +02:00
parent 68f615370f
commit 979874760d
2 changed files with 40 additions and 5 deletions
+14 -5
View File
@@ -82,14 +82,18 @@ def _condition_to_sql(cond: Condition, schema: pl.Schema) -> tuple[str, list]:
col_type = schema[col]
quoted = f'"{col}"'
if cond.operator == "blank":
return f"({quoted} IS NULL OR {quoted} = '')", []
if cond.operator == "notBlank":
return f"({quoted} IS NOT NULL AND {quoted} <> '')", []
is_numeric = col_type.is_numeric()
col_is_date = col_type == pl.Date
if cond.operator == "blank":
if is_numeric or col_is_date:
return f"{quoted} IS NULL", []
return f"({quoted} IS NULL OR {quoted} = '')", []
if cond.operator == "notBlank":
if is_numeric or col_is_date:
return f"{quoted} IS NOT NULL", []
return f"({quoted} IS NOT NULL AND {quoted} <> '')", []
if is_numeric:
return _numeric_to_sql(cond, col_type, quoted)
@@ -106,6 +110,11 @@ def _condition_to_sql(cond: Condition, schema: pl.Schema) -> tuple[str, list]:
return f"{quoted} IS NOT NULL AND {target} {op_map[cond.operator]} ?", [
str(cond.value)
]
if cond.operator == "range":
return f"{quoted} IS NOT NULL AND {target} BETWEEN ? AND ?", [
str(cond.value),
str(cond.value2),
]
if cond.operator == "startsWith":
return f"{quoted} ILIKE ?", [f"{cond.value}%"]
if cond.operator == "endsWith":