Skip to main content

Выборка

Тип метаданных query

Библиотека компонентов

http://n2oapp.net/framework/config/schema/query-5.0

Атрибуты

НаименованиеТипОписаниеЗначение по умолчанию
object-idСсылка на объектИдентификатор объекта выборки
routeСтрокаURL выборкиИдентификатор выборки

Тело

<list> - Получение списка записей
<unique> - Получение уникальной записи
<count> - Получение количества записей
<fields> - Список полей выборки
<filters> - Способы фильтрации полей выборки

Пример

<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-5.0"
object-id="myObject">
<list>
<sql>
SELECT :select FROM mytable
WHERE :filters
ORDER BY :sorting
LIMIT :limit OFFSET :offset
</sql>
</list>

<count>
<sql>
SELECT count(*) FROM mytable
WHERE :filters
</sql>
</count>

<fields>
...
</fields>
</query>

<list>

Получение списка записей

note

В выборке может быть несколько <list> с разными наборами фильтров (атрибут filters).

Атрибуты

НаименованиеТипОписаниеЗначение по умолчанию
filtersСписок ссылок на фильтрыИдентификаторы фильтров (через запятую). Вызов провайдера данных сработает только при наличии всех фильтров в запросе
count-mappingСтрокаМаппинг общего количества записей
result-mappingСтрокаМаппинг списка результатов
result-normalizeСтрокаНормализация списка результатов
asc-expressionСтрокаВыражение ASC направления сортировкиasc
desc-expressionСтрокаВыражение DESC направления сортировкиdesc
additional-mappingСтрокаМаппинг дополнительной информации

Настройки

#Значение asc направления сортировки
n2o.engine.query.asc-expression = asc
#Значение desc направления сортировки
n2o.engine.query.desc-expression = desc

Тело

Провайдер данных

Пример

<list filters="firstNameLike, lastNameLike">
<sql>
SELECT first_name, last_name
FROM mytable
WHERE first_name like '%'||:first_name
OR last_name '%'||:last_name
</sql>
</list>

<unique>

Получение уникальной записи

note

В выборке может быть несколько <unique> с разными наборами фильтров (атрибут filters).

Атрибуты

НаименованиеТипОписание
filtersСписок ссылок на фильтрыИдентификаторы фильтров (через запятую). Вызов провайдера данных сработает только при наличии всех фильтров в запросе
result-mappingСтрокаМаппинг результата
result-normalizeСтрокаНормализация результата

Тело

Провайдер данных

Пример

<unique filters="id">
<sql>
SELECT first_name, last_name
FROM mytable
WHERE id = :id
</sql>
</unique>

<count>

Получение количества записей.

note

В выборке может быть несколько <count> с разными наборами фильтров (атрибут filters).

Атрибуты

НаименованиеТипОписание
filtersСписок ссылок на фильтрыИдентификаторы фильтров (через запятую). Вызов провайдера данных сработает только при наличии всех фильтров в запросе
count-mappingСтрокаМаппинг количества записей

Тело

Провайдер данных

Пример

<count filters="firstNameLike">
<sql>
SELECT count(*) FROM mytable
</sql>
</count>

<fields>

Поля выборки

Тело

<field> - Простое поле
<reference> - Составное поле
<list> - Списковое поле

<field>

Простое поле выборки

Атрибуты

НаименованиеТипОписаниеЗначение по умолчаниюОбязательность
idСтрокаИдентификатор поля!
nameСтрокаНаименование поля
domainТип данныхТип данных
default-valueСтрокаЗначение по умолчанию. Проставится в поле, если в провайдере оно не задано
sortingtrue falseЯвляется ли поле сортируемымfalse. Если задан sorting-expression, то - true
sorting-mappingСтрокаМаппинг плейсхолдера направления сортировки в провайдере[идентификатор_поля]Direction
sorting-expressionСтрокаВыражение сортировки поля
mappingСтрокаМаппинг данных поля из провайдераЗначение id
normalizeСтрокаНормализация данных поля из провайдера
selecttrue falseУчаствует ли поле в выборкеtrue
select-expressionСтрокаВыражение для подстановки на место плейсхолдера select в провайдере

Настройки

#Участвует ли поле в выборке (для всех видов полей)
n2o.api.query.field.is_selected = true
#Участвует ли поле в сортировке (для всех видов полей)
n2o.api.query.field.is_sorted = false

Тело

<switch> - Переключатель

Пример

<field id="myName" mapping="['name']" default-value="user" normalize="#this.toUpperCase()">
<switch>...</switch>
</field>

<switch>

Переключатель.

Тело

<case> - Вариант переключения
<default> - Вариант по умолчанию

Пример

<switch>
<case value="1">Мужской</case>
<case value="2">Женский</case>
<default>Неопределенный</default>
</switch>
<case>

Вариант переключения.

Атрибуты

НаименованиеТипОписаниеОбязательность
valueСтрокаЗначение, с которым сравнивается значение поля!

Тело

Значение, возвращаемое в случае совпадения value со значением поля.

<default>

Вариант по умолчанию.

Тело

Значение, которое будет выбрано при несовпадении ни одного из value со значением поля.

<reference>

Составное поле выборки

Атрибуты

НаименованиеТипОписаниеЗначение по умолчанию
idСтрокаИдентификатор поля
mappingСтрокаМаппинг данных поля из провайдераЗначение id
normalizeСтрокаНормализация данных поля из провайдера
selecttrue falseУчаствует ли поле в выборкеtrue
select-expressionСтрокаВыражение для подстановки на место плейсхолдера select в провайдере
select-keyСтрокаКлюч для подстановки на место плейсхолдера в select-expression

Тело

<field> - Простое поле
<reference> - Составное поле
<list> - Списковое поле

Пример

<reference id="owner" select-expression="owner { $$ownerSelect }" select-key="ownerSelect">
<field>...</field>
<list>...</list>
<reference>...</reference>
</reference>

<list>

Списковое поле выборки

Атрибуты

НаименованиеТипОписаниеЗначение по умолчанию
idСтрокаИдентификатор поля
mappingСтрокаМаппинг данных поля из провайдераЗначение id
normalizeСтрокаНормализация данных поля из провайдера
selecttrue falseУчаствует ли поле в выборкеtrue
select-expressionСтрокаВыражение для подстановки на место плейсхолдера select в провайдере
select-keyСтрокаКлюч для подстановки на место плейсхолдера в select-expression

Тело

<field> - Простое поле
<reference> - Составное поле
<list> - Списковое поле

Пример

<list id="showrooms" select-key="showroomsSelect" select-expression="showrooms { $$showroomsSelect }">
<field>...</field>
<list>...</list>
<reference>...</reference>
</list>

<filters>

Способы фильтраций полей выборки

Тело

НаименованиеТипОписание
<eq>ВыражениеФильтр эквивалентности
<notEq>ВыражениеФильтр не эквивалентности
<more>ВыражениеФильтр больше
<less>ВыражениеФильтр меньше
<like>ВыражениеФильтр вхождения подстроки в строку
<in>ВыражениеФильтр вхождения хотя бы одного в список
<notIn>ВыражениеФильтр не вхождения в список
<contains>ВыражениеФильтр вхождения списка в список
<isNull>ВыражениеФильтр пустого поля
<isNotNull>ВыражениеФильтр не пустого поля
<eqOrIsNull>ВыражениеФильтр эквивалентности и не пустого поля
<likeStart>ВыражениеФильтр начала подстроки
note

Важно отметить, что тип фильтра играет роль только для <test> и <mongo> провайдеров. В таком случае тело фильтра может быть сгенерировано согласно его типу. Во всех остальных ситуациях указание тела фильтра обязательно, а его тип служит скорее удобным указанием для какой фильтрации он используется, но не несет никакой дополнительной функции.

Значения выражений по умолчанию для разных провайдеров

Наименованиеtestmongo
<eq>fieldId :eq :filterId{'fieldId' : filterId}
<notEq>fieldId :notEq :filterId{'fieldId': {$ne: '#filterId'}}
<more>fieldId :more :filterId{'fieldId': {$gte: '#filterId'}}
<less>fieldId :less :filterId{'fieldId': {$lte: '#filterId'}}
<like>fieldId :like :filterId{'fieldId': {$regex: '.*#filterId.*'}}
<in>fieldId :in :filterId{'fieldId': {$in: '#filterId'}}
<notIn>fieldId :notIn :filterId{'fieldId': {$nin: '#filterId'}}
<contains>fieldId :contains :filterId-
<isNull>fieldId :isNull :filterId-
<isNotNull>fieldId :isNotNull :filterId-
<eqOrIsNull>fieldId :eqOrIsNull :filterId-
<likeStart>-{'fieldId': {$regex: '#filterId.*'}}

Базовые атрибуты

НаименованиеТипОписаниеЗначение по умолчаниюОбязательность
filter-idСтрокаИдентификатор фильтра
field-idСсылка на полеИдентификатор поля фильтра!
mappingСтрокаМаппинг значения фильтра в поле провайдераЗначение filter-id
domainТип данныхТип, в который будет сконвертировано значение фильтраЗначение domain от <field>
default-valueСтрокаЗначение, которое будет использоваться, если значение фильтра не передано
normalizeСтрокаВыражение для предварительной нормализации данных фильтра
requiredtrue falseОбязательность фильтра выборкиfalse

Пример

<filters>
<eq field-id="gender.id" mapping="gender_id" default-value="1">
gender_id = :gender_id
</eq>
<in field-id="genders" filter-id="genders*.id" domain="integer[]">
gender_id in (:genders)
</in>
<like field-id="gender.name" filter-id="gender.name"
domain="string" normalize="#this.toLowerCase()"/>
</filters>