Условия выборки - "conditions"

Условия выборки "conditions" - это фильтры при открытии списка объектов.

Сохраненные фильтры

Перед открытием любой страницы, в реестрах происходит считывание фильтров, которые подходят для данного окна. Подходящие фильтры состоят из двух частей:

  1. Общие фильтры, которые применимы для всех классов.
  2. Фильтры, сохраненные конкретно для данного класса.

Общие фильтры для всех классов

Общие фильтры для всех классов - это фильтры, которые отображаются для всех открываемых классов. Их отличие в коде в том, что в атрибуте класса у общего фильтра стоит ключевое слово ALL, у персональных фильтров в этом атрибуте стоит название класса, для которого он применим.

Чтобы сделать фильтр для всех классов, при сохранении поставьте «Для всех классов».

Фильтры для конкретных классов

Чтобы создать фильтр для конкретного класса, откройте объекты этого класса, сгенерируйте фильтр и сохраните его убедившись, что поле «Для всех классов» не отмечено.

Реализация в коде

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

В основном работаем с файлом _list-filter-ui - именно он запускает поиск нужных фильтров, а также разбирает текущие данные для создания новых фильтров. В файле _list-filter-ui описано какие атрибуты могут участвовать в создании фильтров и как именно они должны выглядеть и сохраняться (например, дата и чекбокс выглядят по разному).

В параметре cond находятся данные фильтра, которые в последствие подставляются в условие для поиска (в файле _metaCRUD.js).

Пример

if (cond !== undefined && cond !== '' && cond !== 'undefined') {
  var condObj = JSON.parse(cond);
  if (Array.isArray(condObj) && condObj.length > 0) {
    for (var k = 0; k < condObj.length; k++) {
      if (condObj[k].type === 6) {
        condObj[k].value = new Date(condObj[k].value);
      }
      where[condObj[k].property] = getwherebyOperation(condObj[k]);
    }
  }
}

NB: новые фильтры - min и max расширяют возможности создания фильтров и условий в меню.

Необходимая мета

Необходимая мета для работы - это класс фильтров ion_filter. Он находится в папке calc, которая по умолчанию является папкой с классами и метой для системы. Кроме одного класса ничего более не нужно. Пересмотреть

Поиск по ссылочным объектам

Если поиск идет по принципу равно или содержит - то ищется в семантике этого объекта. Если поиск идет по принципу - максимум/минимум - то ищем уже значение поля. Таким образом, есть возможность поиска в ссылочных атрибутах, при этом без лишних запросов к базе, что повышает производительность.

[{property:okatoNasPunkta_title,operation:20,value:Лес,title:Населенный пункт содержит Лес,type:2}]

Фильтры в меню

Есть возможность не только выдавать отсортированные данные в списке из условий меню, но и ограничивать выборки, т.е. применять фильтры.

Мета отвечающая за работу фильтров

Пример меню с фильтром

{
  "code": "passportObject.naselenie",
  "type": 1,
  "orderNumber": 10,
  "caption": "Население",
  "classname": "naselenie",
  "container": null,
  "collection": null,
  "conditions": [
  {"property": "god"
  ,"operation": 10}
  ],
  "sorting": [],
  "pathChains": []
}

Атрибут conditions содержит два объекта:

  1. property - свойство, по которому происходит фильтрация
  2. operation - операция фильтрации

В данном случае этот фильтр имеет такой смысл - показать все объекты класса ``naselenie`` с минимальным годом.

Если нужно указать значение, то третьим атрибутом пойдет value и значение для поиска.

Например:

{"property": "god"
  ,"operation": 0
, "value": 2015}

Настройка фильтра для отображения объектов класса-наследника

Страницей класса для узла навигации является родительский класс. Если при переходе по данной навигации необходимо отображать объекты класса наследника данного класса, то применяется фильтр вида:

{
   property: "atr1.__class",
   operation: 0,
   value: ["childClass@ns"]
}

где atr1.__class - атрибут родительского класса, по которому идет выборка объектов, childClass - наследник, объекты которого отображаются в навигации. То есть - показать на форме списка только те объекты, у которых атрибут ``atr1`` является объектом класса-наследника ``childClass``.

Таблица операций

Поле Наименование Допустимые значения Описание
"property" Атрибут Строка, только латиница без пробелов Атрибут класса, значение поля которого проверяется на соответствие данному условию данного вектора.
"operation" Операция Код операции Операция, согласно которой производится определение.
    0 - равно (И)  
    1 - не равно (ИЛИ)  
    2 - пусто (НЕ)  
    3 - не пусто (МИН ИЗ)  
    4 - (МАКС ИЗ)  
    5 - < ()  
    6 - >  
    7 - <=  
    8 - >=  
    9 - IN /Похож/  
    10 - содержит  
"value" Значение Зависит от типа операции Второе значение для бинарных операций
"nestedConditions" Вложенные условия отбора Объект, структура аналогична структуре самого объекта условий отбора.  

NB: код операции соответствует разным значениям операций, в зависимости от того, выбран атрибут или нет. Если поле "property" равно null, то кодируется логическое условие, по которому объединяются вложенные условия отбора (указаны в скобках в таблице выше).

Операции для дат

код значение системное имя
8 Создаем дату DATE
9 Добавляем к дате интервал DATEADD
10 Находим интервал между датами DATEDIFF
12 Вычитание  
24 День месяца  

Аргументы DATEADD: дата, интервал, ед.изм интервала [ms, s, min, h, d, m, y] (по умолчанию - день(d))

Аргументы DATEDIFF: конечная дата, начальная дата, ед. изм. результата [ms, s, min, h, d, m, y] (по умолчанию - день(d)), логический флаг приведения к целому числу

Сравнение текущей даты с месяцем

Настройка выборки объектов в списке с возможностью сравнения значения даты с любым месяцем года. Например, настройка фильтра таким образом, чтобы в навигации показывались только те объекты, у которых значение атрибута «Дата окончания» - текущий месяц.

Для этого вычисляется начало текущего месяца. После этого к нему можно добавлять или вычитать произвольное колличество месяцев и сравнивать полученный результат с необходимой датой.

Вычисление конца текущего месяца:

{
  "property": null,
  "operation": 9,
  "value": null,
  "nestedConditions": [
    {
      "property": null,
      "operation": 9,
      "value": null,
      "nestedConditions": [
        {
          "property": null,
          "operation": 8,
          "value": ["today"],
          "nestedConditions": []
        },
        {
          "property": null,
          "operation": 12,
          "value": null,
          "nestedConditions": [
            {
              "property": null,
              "operation": null,
              "value": [0],
              "nestedConditions": []
            },
            {
              "property": null,
              "operation": 24,
              "value": null,
              "nestedConditions": [
                {
                  "property": null,
                  "operation": 8,
                  "value": ["today"],
                  "nestedConditions": []
                }
              ]
            }
          ]
        },
        {
          "property": null,
          "operation": null,
          "value": ["d"],
          "nestedConditions": []
        }
      ]
    },
    {
      "property": null,
      "operation": null,
      "value": [1],
      "nestedConditions": []
    },
    {
      "property": null,
      "operation": null,
      "value": ["m"],
      "nestedConditions": []
    }
  ]
}
  1. Для начала вычисляется значение дня месяца для текущей даты:
{
  "property": null,
  "operation": 24,
  "value": null,
  "nestedConditions": [
    {
      "property": null,
      "operation": 8,
      "value": ["today"],
      "nestedConditions": []
    }
  ]
}
  1. Получено условное значение «d». Далее необходимо отнять полученное значение от 0 (0-d):
{
  "property": null,
  "operation": 12,
  "value": null,
  "nestedConditions": [
    {
      "property": null,
      "operation": null,
      "value": [0],
      "nestedConditions": []
    },
    {
      "property": null,
      "operation": 24,
      "value": null,
      "nestedConditions": [
        {
          "property": null,
          "operation": 8,
          "value": ["today"],
          "nestedConditions": []
        }
      ]
    }
  ]
}
  1. Получено условное значение «-d». Далее к текущей дате прибавляется значение «-d» дней:
{
  "property": null,
  "operation": 9,
  "value": null,
  "nestedConditions": [
    {
      "property": null,
      "operation": 8,
      "value": ["today"],
      "nestedConditions": []
    },
    {
      "property": null,
      "operation": 12,
      "value": null,
      "nestedConditions": [
        {
          "property": null,
          "operation": null,
          "value": [0],
          "nestedConditions": []
        },
        {
          "property": null,
          "operation": 24,
          "value": null,
          "nestedConditions": [
            {
              "property": null,
              "operation": 8,
              "value": ["today"],
              "nestedConditions": []
            }
          ]
        }
      ]
    },
    {
      "property": null,
      "operation": null,
      "value": ["d"],
      "nestedConditions": []
    }
  ]
}
  1. Получено начало текущего месяца.
  2. Для вычисления конца текущего месяца нужно прибавить к полученному значению начала месяца 1 месяц:
{
  "property": "date",
  "operation": 5,
  "value": null,
  "nestedConditions": [
    {
      "property": null,
      "operation": 9,
      "value": null,
      "nestedConditions": [
        {
          "property": null,
          "operation": 9,
          "value": null,
          "nestedConditions": [
            {
              "property": null,
              "operation": 8,
              "value": ["today"],
              "nestedConditions": []
            },
            {
              "property": null,
              "operation": 12,
              "value": null,
              "nestedConditions": [
                {
                  "property": null,
                  "operation": null,
                  "value": [0],
                  "nestedConditions": []
                },
                {
                  "property": null,
                  "operation": 24,
                  "value": null,
                  "nestedConditions": [
                    {
                      "property": null,
                      "operation": 8,
                      "value": ["today"],
                      "nestedConditions": []
                    }
                  ]
                }
              ]
            },
            {
              "property": null,
              "operation": null,
              "value": ["d"],
              "nestedConditions": []
            }
          ]
        },
        {
          "property": null,
          "operation": null,
          "value": [1],
          "nestedConditions": []
        },
        {
          "property": null,
          "operation": null,
          "value": ["m"],
          "nestedConditions": []
        }
      ]
    }
  ]
}