Фильтр отбора в группе (АВО)¶
Этот фильтр работает только по данным доступным по формату АВО и его признаком является наличие "which" в первом элементе.
Без этого фильтр считается заданным в формате ДК, описанном выше.
Фильтр отбора состоит из списка элементов задающих условия отбора или условия объединения других условий.
Пустой фильтр (т.е. не содержащий ни одного элемента) ни когда не совпадает ни с чем и результат его использования всегда пустой.
Каждый элемент содержит поле "which" задающее его тип и возможные дополнительные поля в зависимости от типа:
-
aid - код анкеты
-
qid - код вопроса
-
resp - значение(я) ответа(ов)
-
group - вложенный фильтр
-
pid - код группы
При получении описания фильтра вставляются дополнительные поля aid.name, qid.name и pid.name содержащие названия, соответствующие кодам.
И значения ключей хэша resp так же становятся названиями соответствующих ответов.
Это позволяет сократить количество запросов к API для визуализации фильтра на стороне клиента.
При установке значения фильтра эти дополнительные поля и значения ключей хэша resp игнорируются.
Ознакомьтесь в разделе "Общие замечания" с особенностями сравнения чисел и дат при пустых или отсутствующих значениях.
Формальное описание фильтра АВО¶
[
{
"which" : "тип элемента 1"
<возможно дополнительные поля>
}
,{
"which" : "тип элемента 2"
<возможно дополнительные поля>
}
...
,{
"which" : "тип элемента N"
<возможно дополнительные поля>
}
]
Пример фильтра АВО¶
Адрес имеет 2 и меньше ошибки доставкиИрегион проживания один из RU01,RU05,RU40Идень рождения завтраИ (входи в группу abcИЛИвходит в группу xyz)
При записи фильтра
[
{
"which" : "<=", -- Адрес имеет 2 и меньше ошибки доставки
"aid" : "member",
"qid" : "error",
"resp" : "2"
},
{
"which" : "AND"
},
{
"which" : "any", -- регион проживания один из RU01,RU05,RU40
"aid" : "personal",
"qid" : "region",
"resp" : {
"RU01" : null
,"RU13" : null
,"RU40" : null
}
},
{
"which" : "AND"
},
{
"which" : "dtnowmd", -- день рождения завтра
"aid" : "personal",
"qid" : "birthday",
"resp" : "+1"
},
{
"which" : "AND"
},
{
"which" : "group",
"group" : [
{
"which" : "PRF", -- входи в группу abc
"resp" : 1,
"pid" : "abc"
},
{
"which" : "OR"
},
{
"which" : "PRF", -- входи в группу xyz
"resp" : 1,
"pid" : "xyz"
}
}
При получении фильтра
[
{
"which" : "<=", -- Адрес имеет 2 и меньше ошибки доставки
"aid" : "member",
"qid" : "error",
"resp" : "2",
"aid.name" : "Системная анкета",
"qid.name" : "Количество ошибок доставки"
},
{
"which" : "AND"
},
{
"which" : "any", -- регион проживания один из RU01,RU05,RU40
"aid" : "personal",
"qid" : "region",
"aid.name" : "Персональные данные",
"qid.name" : "Регион"
"resp" : {
"RU01" : "Адыгея"
,"RU13" : "Мордовия"
,"RU40" : "Калуга"
}
},
{
"which" : "AND"
},
{
"which" : "dtnowmd", -- день рождения завтра
"aid" : "personal",
"qid" : "birthday",
"resp" : "+1"
"aid.name" : "Персональные данные",
"qid.name" : "День рождения"
},
{
"which" : "AND"
},
{
"which" : "group",
"group" : [
{
"which" : "PRF", -- входи в группу abc
"resp" : 1,
"pid" : "abc"
"pid.name" : "Группа знающих буквы A-B-C"
},
{
"which" : "OR"
},
{
"which" : "PRF", -- входи в группу xyz
"resp" : 1,
"pid" : "xyz"
"pid.name" : "Группы знающих буквы X-Y-Z"
}
}
Условия объединения в фильтре АВО¶
Для обеспечения приоритета условий используйте скобки, а не предположения какой у чего приоритет на основании "в таком-то языке так-то".
Условие "И" в фильтре АВО¶
Условие "ИЛИ" в фильтре АВО¶
Группа условий (скобки)¶
Вхождение в состав группы в фильтре АВО¶
{
"which" : "PRF"
,"resp" : "0 - не входит в группу, 1 - входит в группу"
,"pid" : "код проверяемой группы"
}
Попадание в выборку Универсальной Статистики в фильтре АВО¶
{
"which" : "stat.uni"
,"resp" : "0 - не попадает, 1 - попадает"
-- параметры stat.uni
-- подразумевается unique = 1
,"filter" : [ условие выборки как у запроса в вызове stat.uni ]
,"cache" : [ настройки кэширования как у запроса в вызове stat.uni ]
,"select" : [ ... ] -- используйте только если не подходит значение по умолчанию [ "member.id" ]
,"have" : [ условие фильтрации агрегирования как у запроса в вызове stat.uni ]
}
Любой из списка ответов¶
Хотя бы одни ответ из списка есть в ответах подписчика
{
"which" : "any"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : {
"код ответа 1" : null
,"код ответа 2" : null
.....
}
}
Каждый из списка ответов¶
Каждый ответ из списка есть в ответах подписчика
{
"which" : "each"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : {
"код ответа 1" : null
,"код ответа 2" : null
.....
}
}
Есть хоть один ответ¶
Выбран хотя бы один ответ
Нет ни одного ответа¶
На вопрос не выбран ни один ответ
Целочисленное сравнение в фильтре АВО¶
Ответ на вопрос как число не равен (!=), равен (==), меньше(<), меньше или равен (<=), больше или равен (>=), больше (>) чем число в "resp"
{
"which" : "!= | == | < | <= | => | >"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : "целое число"
}
Числено равно сегодня¶
Ответ на вопрос числено равен текущему году (nowy), месяцу (nowm) или дню (nowd)
Дата равна сегодня¶
Компонента "дата" в ответе равна (dtnow), не равна (dtnowne), ранее (dtnowlt), ранее или равна (dtnowle), позже или равна (dtnowge), позже (dtnowgl) чем "дата сегодня +/- сдвиг"
{
"which" : " dtnow | dtnowne | dtnowlt | dtnowle | dtnowge | dtnowgt "
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : "сдвиг в днях от сегодня" -- не обязательно. например: -2 - позавчера, +1 - завтра
}
Месяц и день равны сегодня¶
Компонента "месяц и день" в ответе равны месяцу и дню в "дате сегодня +/- сдвиг"
{
"which" : "dtnowmd"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : "сдвиг в днях от сегодня" -- не обязательно. например: -2 - позавчера, +1 - завтра
}
Год равен текущему¶
Компонент "год" в ответе равен текущему году
Месяц равен текущему¶
Компонент "месяц" в ответе равен текущему месяцу
День равен текущему¶
Компонент "день" в ответе равен текущему дню +/- сдвиг
{
"which" : "dtnowd"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : "сдвиг в днях от сегодня" -- не обязательно. например: -2 - позавчера, +1 - завтра
}
Строка пуста¶
Ответ пустой
Строка не пуста¶
Строчное сравнение¶
Это медленный фильтр.
В будущем он может быть удалён.
В большинстве случаев его использования можно избежать, если изначально делать вопрос не полем ввода, а списком выбора
Строка ответа на вопрос не равна (ne), равна (eq), меньше(lt), меньше или равна (le), больше или равна (ge), больше (gt) чем строка в "resp"
Для вопросов типа дата-время сравнение производится с учётом точности resp.
Например, при содержимом ответа на вопрос "2015-03-26 18:36:25" (от года до секунды) сравнение с "2015-03-30" (от года до дня) вызовет сначала снижение точности ответа до аналогичной - "2015-03-26" и только потом будет проведено сравнение.
Если точность resp выше точности ответа на вопрос, то точности уравниваться не будут и произойдёт обычное сравнение строк.
{
"which" : "ne | eq | lt | le | ge | gt"
,"aid" : "код анкеты"
,"qid" : "код вопроса"
,"resp" : "строка для сравнения"
}
Наличие подстроки в строке¶
Это медленый фильтр.
В будущем он может быть удалён.
В большинстве случаев его использования можно избежать, если изначально делать вопрос не полем ввода, а списком выбора
Строка ответа начинается (beg) или не начинается (nbeg) со строки "resp"; содержит (has) или не содержит (nhas) строку "resp"; заканчивает (end) или не заканчивается (nend) строкой "resp"