Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Модуль merger

Общие сведения

Модуль merger принимает поток кортежей и предоставляет доступ к ним как к таблицам.

Указатель

Четыре функции для создания экземпляра объекта merger:

Методы для работы с объектом merger:

merger.new_tuple_source(gen, param, state)

Создание нового экземпляра merger из источника кортежей.

Источник кортежей просто возвращает один кортеж.

Функция-генератор gen() позволяет создавать несколько кортежей через итератор.

Функция gen() должна возвращать:

  • state, tuple при каждом вызове, когда доступен новый кортеж,
  • nil, когда больше нет доступных кортежей.

Параметры:

  • gen — функция для поочередного возврата кортежей
  • param — параметр для функции gen

Возвращает

merger-object объект merger

Пример см. в описании метода merger_object:pairs().

merger.new_buffer_source(gen, param, state)

Создание нового экземпляра merger из источника-буфера.

Параметры и возвращаемое значение: те же, что и для merger.new_tuple_source.

Для настройки буфера или серии буферов используйте модуль buffer.

merger.new_table_source(gen, param, state)

Создание нового экземпляра merger из источника-таблицы.

Параметры и возвращаемое значение: те же, что и для merger.new_tuple_source.

Пример см. в описании метода merger_object:select().

merger.new(key_def, sources, options)

Создание нового экземпляра merger из источника merger.

Источник merger создается из объекта key_def и набора источников (кортежей, буферов, таблиц или merger). Он выполняет своего рода сортировку слиянием. На каждом шаге выбирается источник с минимальным/максимальным кортежем, из него извлекается кортеж, и процесс повторяется.

Параметры:

  • key_def — объект, созданный с помощью key_def
  • source — параметр для функции gen()
  • optionsreverse=true для убывающего порядка, false или nil для возрастающего

Возвращает

merger-object объект merger

Объект key_def может кэшироваться между запросами с одинаковыми правилами сортировки (обычно это запросы, обращающиеся к одному и тому же спейсу).

Пример см. в описании метода merger_object:pairs().

merger_object

Объект merger — это объект, возвращаемый:

Он имеет методы:

merger_object:select([buffer[, limit]])

Доступ к содержимому объекта merger с помощью привычного синтаксиса select.

Параметры:

  • buffer — как в методе conn:select клиента net.box
  • limit — как в методе conn:select клиента net.box

Возвращает

таблица кортежей, аналогичная той, которую вернул бы select

Пример с new_table_source():

-- Source via new_table_source, simple generator function-- tarantool> s:select()<table class="tableblock frame-all grid-all stretch"><colgroup><col style="width: 50%;"><col style="width: 50%;"></colgroup><thead><tr><th class="tableblock halign-left valign-top">{decodeBase64(IC0tIC0tIC0tIG1lIGs9IGZ1IGNoIGNoIHMgczogYGAgOjo=)}</th><th class="tableblock halign-left valign-top">{decodeBase64(IC0gLSAgIC0gLi4uIGdlciBjdGkgID0gZiBwIGV0dSBuZCBua3MgbmtzICBtZSBlbGU=)}</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IHsgOjogcGE=)}</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IG1lciAgbWUgcnMo)}</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(INCc0LUg0LLQviDQv9GA)}</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(INC+0LQg0LLRgNCwINC00L7RgQoKcGEgOg==)}</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IGFtICDQutC+CgpyZSA6)}</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IHVybiAg0LrQviAgYHA=)}</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(ICoq)}</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(INGA0LjQvA==)}</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IGBgIC0tIC0tIC0t)}</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">{decodeBase64(IGx1IFNvdSBUaGUgdGFy)}</p></td></tr></tbody></table>-- - - [100]--   - [200]-- ...merger = require('merger')box.schema.space.create('s')box.space.s:create_index('i')box.space.s:insert({100})box.space.s:insert({200})so = merger.new_tuple_source(box.space.s:pairs())so:pairs():totable()

Пример с двумя merger:

-- Source via key_def, and table data-- Create the key_def objectmerger = require('merger')key_def_lib = require('key_def')key_def = key_def_lib.new({{    fieldno = 1,    type = 'string',}})-- Create the table sourcedata = {{'a'}, {'b'}, {'c'}}source = merger.new_source_fromtable(data)i1 = merger.new(key_def, {source}):pairs()i2 = merger.new(key_def, {source}):pairs()-- t1 will be 'a' (tuple 1 from merger 1)t1 = i1:head():totable()-- t3 will be 'c' (tuple 3 from merger 2)t3 = i2:head():totable()-- t2 will be 'b' (tuple 2 from merger 1)t2 = i1:head():totable()-- i1:is_null() will be true (merger 1 ends)i1:is_null()-- i2:is_null() will be true (merger 2 ends)i2:is_null()

Дополнительные примеры:

См. https://github.com/Totktonada/tarantool-merger-examples — помимо подробного описания API merger, там приведен Lua-код для обработки значительно большего числа ситуаций, чем в кратких примерах данного руководства.