Commit b036c3bc authored by Nicolas Joyard's avatar Nicolas Joyard

Ajout operateurs like, ilike, in, nin

parent d3110367
...@@ -6,6 +6,7 @@ from datetime import datetime ...@@ -6,6 +6,7 @@ from datetime import datetime
from flask import abort, json, jsonify, request from flask import abort, json, jsonify, request
from sqlalchemy.inspection import inspect from sqlalchemy.inspection import inspect
from sqlalchemy.sql import not_
from .schema import SchemaFactory from .schema import SchemaFactory
...@@ -107,7 +108,7 @@ class Endpoint(object): ...@@ -107,7 +108,7 @@ class Endpoint(object):
raise EndpointException('Unknown column name: {}'.format(colname)) raise EndpointException('Unknown column name: {}'.format(colname))
col = getattr(self.model, colname) col = getattr(self.model, colname)
if op in ('eq', 'ne', 'gt', 'lt', 'gte', 'lte'): if op in ('eq', 'ne', 'gt', 'lt', 'gte', 'lte', 'like', 'ilike'):
value = self._cast_value(value, columns[colname]) value = self._cast_value(value, columns[colname])
if op == 'eq': if op == 'eq':
...@@ -122,12 +123,22 @@ class Endpoint(object): ...@@ -122,12 +123,22 @@ class Endpoint(object):
filters.append(col >= value) filters.append(col >= value)
elif op == 'lte': elif op == 'lte':
filters.append(col <= value) filters.append(col <= value)
elif op == 'like':
filters.append(col.like(value))
elif op == 'ilike':
filters.append(col.ilike(value))
elif op == 'isnull': elif op == 'isnull':
null = self._cast_value(value, 'Boolean') null = self._cast_value(value, 'Boolean')
if null: if null:
filters.append(col == None) filters.append(col == None)
else: else:
filters.append(col != None) filters.append(col != None)
elif op in ('in', 'nin'):
values = map(lambda x: self._cast_value(x, columns[colname]), value.split(','))
expr = col.in_(values)
if op == 'nin':
expr = not_(expr)
filters.append(expr)
else: else:
raise EndpointException('Unknown operator: {}'.format(op)) raise EndpointException('Unknown operator: {}'.format(op))
......
...@@ -21,8 +21,10 @@ Il est possible de spécifier un opérateur de comparaison sous la forme `champ_ ...@@ -21,8 +21,10 @@ Il est possible de spécifier un opérateur de comparaison sous la forme `champ_
* `gt`, `gte`: supérieur, supérieur ou égal * `gt`, `gte`: supérieur, supérieur ou égal
* `lt`, `lte`: inférieur, inférieur ou égal * `lt`, `lte`: inférieur, inférieur ou égal
* `isnull`: permet de filtrer les valeurs vierges. La valeur associée doit être un booléen. * `isnull`: permet de filtrer les valeurs vierges. La valeur associée doit être un booléen.
* `in`, `nin`: valeur parmi une liste ou absente d'une liste (les valeurs doivent alors être séparées par des virgules)
* `like`, `ilike`: comparaison de chaine avec jokers ; `ilike` est insensible à la casse (par exemple `prenom__ilike=jean%` cherche tous les prénoms commençant par "Jean")
La requête suivante permet par exemple de lister les acteurs décédés, prénommés "Jean", et nés après le 1er janvier 1945 : [`/rest/an/acteurs/?prenom=Jean&date_deces__isnull=false&date_naissance__gt=1945-01-01`](/rest/an/acteurs/?prenom=Jean&date_deces__isnull=false&date_naissance__gt=1945-01-01) La requête suivante permet par exemple de lister les acteurs décédés, dont le prénom contient "Jean", et nés après le 1er janvier 1945 : [`/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01`](/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01)
##### Recherche *full-text* ##### Recherche *full-text*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment