Page tree

Citypoint - контроль и аналитика автопарка

Skip to end of metadata
Go to start of metadata

Фильтрация происходит посредством указания параметра filter в запросе.

После ключевого слова filter в квадратных скобочках указывается:
1) название типа запрашиваемого объекта, затем знак "=" и выражение фильтра

2) название типа запрашиваемого объекта, затем знак "=" и id объекта (если нужно несколько объектов то указывается несколько id через запятую)

Возможно несколько раз указать filter, в этом случае останутся только те результаты которые удовлетворяют всем фильтрам (условия фильтров объединяются через конъюнкцию). Если filter используется несколько раз то в квадратных скобочках должны быть разные объекты (т.е, Можно делать запросы виду "...&filter[carState]=gt(Velocity,0)&filter[driver]=1,2,3" (состояния тс где id водителья 1, 2 или 3 и скорость больше 0 ), но нельзя "...&filter[carState]=gt(Velocity,0)&filter[carState]=lte(Direction,55)&filter[carState]=gte(Direction,22)" (состояния тс где скорость больше 0 и направление примерно на северо-восток).

Возможные выражения для фильтрации полей:

ОператорЗначениеФорматОбъекты запрошенные  в примереПримерРасшифровка
eqстрого равно

eq( значение1, значеие2 )

Водителиfilter[driver]=eq(Licence.DrivingLicenceCategory,"A")Все водители у которых категория прав строго равна "А" (водители с правами "AB" также будут отфильтрованы)
inстрого равно (проверка нескольких вариантов)

in( значение1, значение2, 3, 4...)

значение1 - что стравниваем

значение2, 3, 4 - Варианты допустимых значений, через запятую

Водителиfilter[driver]=in(Licence.DrivingLicenceCategory,"A","B","C")Все водители у которых категория прав строго равна "А" либо  "B" либо "С". Но не "AB", "AC", "BC", "D" ...
like"Похоже на"like ( поле, 'строка' )Водители

filter[driver]=like(Licence.DrivingLicenceCategory, "%B%")



Все водители у которых в правах есть категория "B".


ТСfilter[car]=like(RegNumber, 'X%')Все ТС к которых регистрационный номер начинается с "X".
notОтрицание значения либо выраженияnot( выражение либо значение )Водителиfilter[driver]=not(eq(Licence.DrivingLicenceCategory,"A"))

Все водители у которых категория прав строго не равна "А" (водители с правами "AB" будут оставлены)

Если на вход NOT будет передано число или поле, то оно будет приведено к булевому типу.

для чисел 0 - лож, все остальное - истина.

null считается ложью

ltстрого меньшеlt(поле, значение для сравнения)Агрегированные данные для всех ТСfilter[carAggrData]=lt(Mileage,1000)Все ТС у которых пробег строго меньше 10 км. (может быть использовано для получения ТС с маленьким пробегом)
lteменьше либо равноlte(поле, значение для сравнения)Агрегированный данные для всех ТСfilter[carAggrData]=lte(Mileage,1000)всек ТС у которых пробег меньше либо равно 10  км. (может быть использовано для получения ТС с маленьким пробегом)
gtстрого большеgt(поле, значение для сравнения)Агрегированный данные для всех ТСfilter[carAggrData]=gt(Mileage,0)Все ТС у которых пробег строго больше 0 км. (может быть использовано для получения ТС у которых есть пробег)
gteбольше либо равноgte(поле, значение для сравнения)Агрегированный данные для всех ТСfilter[carAggrData]=gte(Mileage,5000)Все ТС у которых пробег больше либо 5000 км.
orлогическое ИЛИor(выражение либо значение, выражение либо значение )Агрегированный данные для всех ТСfilter[carAggrData]=or(gte(Mileage,1000),gte(FuelConsumption,100))Все ТС которые проехали более 1000 км. ИЛИ затратили более 100л. топлива
andлогическое Иand(выражение либо значение, выражение либо значение)Агрегированный данные для всех ТСfilter[carAggrData]=and(gte(Mileage,1000),gte(FuelConsumption,100))

Все ТС которые проехали более 1000 км. И затратили более 100л. топлива.

ТС которые проехали более 1000 км. но затратили менее 100л. не будут показаны, как и те что затратили более 100л. но проехали менее 1000км.


existстрого равно (проверка одного варианта из множества по ключу)exist(поле, значение1, значение2, ..., значениеN)В фильтре указывается для какого типа объектов идёт сортировка (должно совпадать с полем type в объекте)filter[histState]=exist(Sensor.id, "71")

Все записи истории, у которых есть сенсор 71

На данный момент поддерживается только в детализации истории.

Знаки "[","]","(",")" приведены для удобства чтения, В реальных запросах они должны быть закодированы в соответствии с rfc3986.


Грамматика языка фильтрации (РБНФ):

FILTER= OP

    | FIELD

    | IDSARR


IDSARR = IDVAL NEXTID


NEXTID = "," IDVAL NEXTID

    | ε


IDVAL = NUMBER

    | STRING


FIELD = FLDNAME


OP = "not" "(" EXPR ")"

   | "eq"  "(" EXPR "," EXPR ")"

   | "in"  "(" FLDNAME "," ARGS ")"

   | "gte" "(" EXPR "," EXPR ")"

   | "gt"  "(" EXPR "," EXPR ")"

   | "lte" "(" EXPR "," EXPR ")"

   | "lt"  "(" EXPR "," EXPR ")"

   | "and" "(" EXPR "," EXPR ")"

   | "or"  "(" EXPR "," EXPR ")"

   | "exist"  "(" FLDNAME "," ARGS ")"


EXPR = OP | VALUE


ARGS = EXPR NEXTARG


NEXTARG = "," EXPR NEXTARG

        | ε


VALUE = DATETIME

      | NUMBER

      | STRING

      | FLDNAME

      | NULL


DATETIME = Дата в формате ISO8601. Должна парситься регулярным выражением - /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/

NUMBER   = Любое число. /\d(.\d)?/

STRING     =  Строка. Любой набор символов заключенный в одинарные либо двойные кавычки.  /'[^']*'/ | /"[^"]*"/

FLDNAME  = Поле Объекта. Последовательность Букв начинающаяся с Заглавной буквы /[A-Z]\w+(\.[A-Z]\w+)*/

NULL         = Отсутствие какого-либо значения. Просто "NULL" (Регистр важен).


  • No labels