Работа с read view через модуль CRUD | Tdb
Руководство пользователя Read view Работа с read view через модуль CRUD

Работа с read view через модуль CRUD

Представления для чтения позволяют получать данные с помощью CRUD-операций read_view_object:select() и read_view_object:pairs().

В этом руководстве описано, как с помощью модуля CRUD открыть представление для чтения, получить данные из этого представления с помощью операций select и pairs, а затем закрыть его. Подробные примеры использования операций select и pairs вместе с read view приведены в разделе Фильтрация и итерация в read view с помощью CRUD.

Для выполнения примеров из этого руководства требуется настроенный кластер с подготовленными данными. Чтобы подготовить стенд, используйте инструкцию из раздела Фильтрация и итерация в read view с помощью CRUD.

Руководство включает следующие шаги:

Создание представления для чтения

Чтобы создать read view, вызовите функцию crud.readview():

rv = crud.readview({ name = 'rv', timeout = 3 })

Здесь:

  • name: название read view;

  • timeout: время ожидания vshard.call в секундах.

Фильтрация кортежей

Как и crud.select, метод read_view_object:select() рассматривает кластер как единый спейс и поддерживает выбор с множественными условиями.

Получить выборку кортежей из спейса можно с помощью метода read_view_object:select(). В примере ниже возвращаются все кортежи спейса с помощью параметра fullscan:

rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
  { 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
                                                                                   'type': 'number' } ]
  rows:
    - [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
    - [ 2, 21401, 'Mary', 'Bowman', 46 ]
    - [ 3, 11804, 'David', 'Bradley', 33 ]
  ..............
  - [39, 6507, 'Oliver', 'Lowe', 39]
  - [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...

Здесь:

  • customers – название спейса;

  • nil – условия фильтрации кортежей;

  • batch_size – количество кортежей, которое будет обработано за раз запросом к хранилищу;

  • fullscan – полное сканирование спейса.

Теперь поменяйте данные в спейсе, вставив новый кортеж. В спейсе уже есть кортеж с id = 8, так что в конец будет добавлен новый кортеж с id = 41:

crud.insert('customers', { 8, box.NULL, 'Elizabeth', 23 })
---
- rows:
    - [ 41, 25201, 'Elizabeth', 'Born', 23 ]
  metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
    { 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
                                                                                     'type': 'number' } ]
- null
...

Read view содержит снимок данных, полученный перед вставкой кортежа. Чтобы проверить это, вызовите операцию select еще раз:

rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
  { 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
                                                                                   'type': 'number' } ]
  rows:
    - [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
    - [ 2, 21401, 'Mary', 'Bowman', 46 ]
    - [ 3, 11804, 'David', 'Bradley', 33 ]
  ..............
  - [39, 6507, 'Oliver', 'Lowe', 39]
  - [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...

Действительно, в снимке нет нового кортежа с id = 41.

Фильтрация с условием

Условия выборки для read_view_object:select() совпадают с условиями crud.select.

В примере ниже показано, как просмотреть пять первых покупателей, которым меньше или ровно 35 лет:

rv:select('customers', { { '<=', 'age', 35 } }, { first = 5 })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
  { 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
                                                                                   'type': 'number' } ]
  rows:
    - [ 5, 1172, 'Jack', 'Brown', 35 ]
    - [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
    - [ 16, 11089, 'Emma', 'Hodges', 33 ]
    - [ 3, 11804, 'David', 'Bradley', 33 ]
    - [ 36, 27087, 'Harper', 'Iqbal', 32 ]
- null

Здесь:

  • customers – название спейса;

  • { '<=', 'age', 35 } – условия фильтрации кортежей;

  • first – максимальное количество возвращаемых кортежей.

Итерация с помощью pairs

Для итерации по распределенному спейсу используется метод read_view_object:pairs().

В примере в таблицу записаны кортежи для первых пяти покупателей, которым меньше или ровно 35 лет:

tuples = {}
for _, tuple in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5}) do
    table.insert(tuples, tuple)
end

tuples

Вывод выглядит так:

---
- - [ 5, 1172, 'Jack', 'Brown', 35 ]
  - [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
  - [ 16, 11089, 'Emma', 'Hodges', 33 ]
  - [ 3, 11804, 'David', 'Bradley', 33 ]
  - [ 36, 27087, 'Harper', 'Iqbal', 32 ]
...

Чтобы итерироваться по объектам или плоским кортежам, используйте параметр use_tomap со значением true. В примере в таблицу записаны в виде объектов первые пять покупателей, которым меньше или ровно 35 лет:

objects = {}
for _, object in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5, use_tomap = true }) do
    table.insert(objects, object)
end

objects

Вывод выглядит так:

---
- - bucket_id: 1172
    id: 5
    surname: Brown
    age: 35
    name: Jack
  - bucket_id: 16559
    id: 24
    surname: Walmsley
    age: 34
    name: Ethan
  - bucket_id: 11089
    id: 16
    surname: Hodges
    age: 33
    name: Emma
  - bucket_id: 11804
    id: 3
    surname: Bradley
    age: 33
    name: David
  - bucket_id: 27087
    id: 36
    surname: Iqbal
    age: 32
    name: Harper
...

Закрытие read view

Представления для чтения могут занимать значительный объем памяти. Если read view больше не требуется, закройте его с помощью метода read_view_object:close():

rv:close({ timeout = 3 })

Здесь:

  • timeout: время ожидания vshard.call в секундах.

Если не закрыть read view таким образом, он закроется неявно, когда сборщик мусора Lua соберет объект read view. После закрытия read view его статус меняется на closed. Попытка использовать закрытый read view вызовет ошибку.

Нашли ответ на свой вопрос?
Обратная связь