Commit b036c3bc by Nicolas Joyard

Ajout operateurs like, ilike, in, nin

parent d3110367
......@@ -6,6 +6,7 @@ from datetime import datetime
from flask import abort, json, jsonify, request
from sqlalchemy.inspection import inspect
from sqlalchemy.sql import not_
from .schema import SchemaFactory
......@@ -107,7 +108,7 @@ class Endpoint(object):
raise EndpointException('Unknown column name: {}'.format(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])
if op == 'eq':
......@@ -122,12 +123,22 @@ class Endpoint(object):
filters.append(col >= value)
elif op == 'lte':
filters.append(col <= value)
elif op == 'like':
filters.append(col.like(value))
elif op == 'ilike':
filters.append(col.ilike(value))
elif op == 'isnull':
null = self._cast_value(value, 'Boolean')
if null:
filters.append(col == None)
else:
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:
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_
* `gt`, `gte`: supérieur, supé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.
* `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*
......
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 sign in to comment