Класс EntitySchemaQuery. Работа с фильтрами
Glossary Item Box
Фильтр — это набор условий, применяемых при отображении данных запроса. В терминах 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 esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); esq.addColumn("Name"); esq.addColumn("Country.Name", "CountryName"); // Создание экземпляра первого фильтра. var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Испания"); // Создание экземпляра второго фильтра. var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Франция"); // Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.OR; // Добавление созданных фильтров в коллекцию запроса. esq.filters.add("esqFirstFilter", esqFirstFilter); esq.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 осуществляется в соответствии с общими правилами построения путей к колонкам относительно корневой схемы (описано в статье "Класс EntitySchemaQuery. Построение путей к колонкам").
Ниже приведен пример, демонстрирующий использование других методов создания фильтров.
Пример 2
// Создание экземпляра запроса с корневой схемой "Contact". var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); esq.addColumn("Name"); esq.addColumn("Country.Name", "CountryName"); // Выбираем все контакты, в которых не указана страна. var esqFirstFilter = esq.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 = esq.createColumnBetweenFilterWithParameters("BirthDate", dateFrom, dateTo); // Добавление созданных фильтров в коллекцию запроса. esq.filters.add("esqFirstFilter", esqFirstFilter); esq.filters.add("esqSecondFilter", esqSecondFilter); // В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам. esq.getEntityCollection(function (result) { if (result.success) { result.collection.each(function (item) { // Обработка элементов коллекции. }); } }, this);