Индексы и отборы в узлах

Ввиду того что хранение в NL – это практически NoSQL, без фиксированной структуры полей, это накладывает некоторые особенности на фильтры и отборы. А именно то, что о них надо позаботиться отдельно, создав индексы. Т.е. отборы работают на индексах, заданных в конфигурации – как пользовательские механизмы, так и программные методы. Такие задачи как поиск по ключу(ключам) одного или нескольких узлов – это тоже к индексам

Настройка индексов

_images/index_config.png

Настройка осуществляется через класс, закладка Индексы

Задаются:

  • Имя это имя, которое будет использоваться в функциях

  • Тип индекса (*На текущий момент доступен только hash-индекс – т.е. по точному соответствию значения)

  • Ключи – это может быть одно поле, либо составной индекс из нескольких полей через разделитель – |

Отбор в списке узлов (*только для веб-версии)

_images/index_filter.png

Также можно задать пользовательские фильтры (отборы) в списке узлов.

Для этого определяется:

  • Заголовок - отображаемое имя поля (как оно будет выглядеть в списке узлов)

  • Тип значения фильтра – помимо базовых (string, number, Boolean) доступны и поля типа Узел и Датасет. Например Node(Product) – фильтр по полям типа «Product»

  • Доступен список – можно задавать несколько значений в отборе в виде списка

Функции для работы с индексами (для Python и NodaScript)

*Для Python функции возвращают объекты-узлы, NodaScript возвращает _id (в строковом виде), чтобы получить _data узла нужна функция getData(_id)

getByIndex(class_or_name, index_name, value) – получить единственное значение по индексу (или первое)

Пример NodaScript

sku_id = getByIndex("Product","barcode",_data.cam_barcode); //one value result
if sku_id!=null {
 message(getData(sku_id).name); //getData return _data of node by _id
}

Пример Python

res = getByIndex("Product","barcode","4690216127392")
toast(str(res._data["name"]))

findByIndex(class_or_name, index_name, value) – получить список _id по условию (подходит для использования функциями from_uid)

Глобальные индексы

Для любых узлов, в том числе тех, у которых нет класса можно пользоваться индексами, если ключевые поля в _data определять через префикс __ , например __barcode тогда такое поле автоматически считается hash-индексом и по нему ведется индекс. Он уже без класса (как и без конфигурации) и методы работы с ним:

findByGlobalIndex(index: str, value) – поиск по отбору по полю, возвращает список _id

getByGlobalIndex(index: str, value) – отбор по значению, возвращает один узел(_id)