Фильтр - это набор условий, применяемых при отображении данных запроса. В терминах SQL фильтр представляет собой отдельный предикат (условие) оператора WHERE.
Создание и применение фильтров в EntitySchemaQuery
Для создания простого фильтра в EntitySchemaQuery используется метод CreateFilter(), который возвращает созданный объект фильтра Terrasoft.CompareFilter. Наряду с простыми фильтрами, в EntitySchemaQuery реализованы методы создания фильтров специального вида (табл. 1).
Табл. 1. — Методы EntitySchemaQuery для создания фильтров
Метод создания фильтра | Описание | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
createFilter(comparisonType, leftColumnPath, rightColumnPath) |
Создает экземпляр фильтра класса Terrasoft.CompareFilter для сравнения значений двух колонок.
|
|||||||||
createInFilter(leftExpression, rightExpressions) |
Создает экземпляр In-фильтра.
|
|||||||||
createBetweenFilter(leftExpression, rightLessExpression, rightGreaterExpression) |
Создает экземпляр Between-фильтра.
|
|||||||||
createCompareFilter(comparisonType, leftExpression, rightExpression) |
Создает экземпляр Compare-фильтра.
|
|||||||||
createExistsFilter(columnPath) |
Создает экземпляр Exists-фильтра для сравнения типа [Существует по заданному условию] и устанавливает в качестве проверяемого значения выражение колонки, расположенной по заданному пути.
|
|||||||||
createIsNotNullFilter(leftExpression) |
Создает экземпляр IsNull-фильтра.
|
|||||||||
createIsNullFilter(leftExpression) |
Создает экземпляр IsNull-фильтра.
|
|||||||||
createNotExistsFilter(columnPath) |
Создает экземпляр Exists-фильтра для сравнения типа [Не существует по заданному условию] и устанавливает в качестве проверяемого значения выражение колонки, расположенной по заданному пути.
|
|||||||||
createColumnFilterWithParameter(comparisonType, columnPath, paramValue) |
Создает экземпляр Compare-фильтра для сравнения колонки с заданным значением.
|
|||||||||
createColumnInFilterWithParameters(columnPath, paramValues) |
Создает экземпляр In-фильтра для проверки совпадения значения заданной колонки со значением одного из параметров.
|
|||||||||
createColumnBetweenFilterWithParameters(columnPath, lessParamValue, greaterParamValue) |
Создает экземпляр Between-фильтра для проверки попадания колонки в заданный диапазон.
|
|||||||||
createColumnIsNotNullFilter(columnPath) |
Создает экземпляр IsNull-фильтра для проверки заданной колонки.
|
|||||||||
createColumnIsNullFilter(columnPath) |
Создает экземпляр IsNull-фильтра для проверки заданной колонки.
|
|||||||||
createPrimaryDisplayColumnFilterWithParameter(comparisonType, paramValue) |
Создает объект фильтра для сравнения первичной колонки для отоборажения со значением параметра.
|
Экземпляр EntitySchemaQuery имеет свойство filters, которое представляет собой коллекцию фильтров данного запроса (экземпляр класса Terrasoft.FilterGroup, который, в свою очередь, представляет собой коллекцию элементов Terrasoft.BaseFilter). Для того, чтобы добавить фильтр в запрос, необходимо:
- создать экземпляр фильтра для данного запроса (метод createFilter(), методы создания фильтров специального вида);
- добавить созданный экземпляр фильтра в коллекцию фильтров запроса (метод add() коллекции).
По умолчанию все фильтры, добавляемые в коллекцию filters, объединяются между собой логической операцией AND. Свойство logicalOperation коллекции filters позволяет пользователю указать логическую операцию, которой необходимо объединять фильтры. Свойство принимает значения из перечисления Terrasoft.core.enums.LogicalOperatorType:
- AND — И
- OR — Или
В запросах EntitySchemaQuery реализована возможность управления фильтрами, участвующими в построении результирующего набора данных. Каждый элемент коллекции filters имеет свойство isEnabled, которое определяет, участвует ли данный элемент в построении результирующего запроса (true — участвует, false — не участвует). Аналогичное свойство isEnabled также определено для всей коллекции filters. Установив это свойство в false, можно полностью отключить фильтрацию для запроса, при этом коллекция фильтров запроса останется неизменной. Таким образом, изначально сформировав коллекцию фильтров запроса, в дальнейшем можно использовать различные комбинации для фильтрации этого запроса, не внося изменений в саму коллекцию.
Пример управления фильтрами в запросе приведен ниже (пример 1).
Пример 1
// Создание экземпляра запроса с корневой схемой "Contact". var esqContact = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); esqContact.addColumn("Name"); esqContact.addColumn("Country.Name", "CountryName"); // Создание экземпляра первого фильтра. var esqFirstFilter = esqContact.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Украина"); // Создание экземпляра второго фильтра. var esqSecondFilter = esqContact.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Россия"); // Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. esqContact.filters.logicalOperation = Terrasoft.LogicalOperatorType.OR; // Добавление созданных фильтров в коллекцию запроса. esqContact.filters.add("esqFirstFilter", esqFirstFilter); esqContact.filters.add("esqSecondFilter", esqSecondFilter); // В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам. esq.getEntityCollection(function (result) { if (result.success) { result.collection.each(function (item) { // Обработка элементов коллекции. }); } }, this); // Для второго фильтра указывается, что он не будет участвовать в построении результирующего запроса. // При этом данный фильтр не удаляется из коллекции фильтров запроса. esqSecondFilter.isEnabled = false; // В данную коллекцию попадут объекты - результаты запроса, отфильтрованные только по первому фильтру. esq.getEntityCollection(function (result) { if (result.success) { result.collection.each(function (item) { // Обработка элементов коллекции. }); } }, this);
Формирование путей колонок в фильтрах EntitySchemaQuery осуществляется в соответствии с общими правилами построения путей к колонкам относительно корневой схемы (описано в статье Построение путей к колонкам относительно корневой схемы).
Ниже приведен пример, демонстрирующий использование других методов создания фильтров.
Пример 2
// Создание экземпляра запроса с корневой схемой "Contact". var esqContact = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); esqContact.addColumn("Name"); esqContact.addColumn("Country.Name", "CountryName"); // Выбираем все контакты, в которых не указана страна. var esqFirstFilter = esqContact.createColumnIsNullFilter("Country"); // Выбираем все контакты, даты рождения которых находятся в промежутке между 1.01.1970 и 1.01.1980 var dateFrom = new Date(1970, 0, 1, 0, 0, 0, 0); var dateTo = new Date(1980, 0, 1, 0, 0, 0, 0); var esqSecondFilter = esqContact.createColumnBetweenFilterWithParameters("BirthDate", dateFrom, dateTo); // Добавление созданных фильтров в коллекцию запроса. esqContact.filters.add("esqFirstFilter", esqFirstFilter); esqContact.filters.add("esqSecondFilter", esqSecondFilter); // В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам. esq.getEntityCollection(function (result) { if (result.success) { result.collection.each(function (item) { // Обработка элементов коллекции. }); } }, this);