Модуль merger
Модуль merger принимает поток кортежей и предоставляет доступ к ним
как к таблицам.
Четыре функции для создания экземпляра объекта merger:
- merger.new_tuple_source()
- merger.new_buffer_source()
- merger.new_table_source()
- merger.new(merger_source...)
Методы для работы с объектом merger:
Создание нового экземпляра merger из источника кортежей.
Источник кортежей просто возвращает один кортеж.
Функция-генератор gen() позволяет создавать несколько кортежей через
итератор.
Функция gen() должна возвращать:
- state, tuple при каждом вызове, когда доступен новый кортеж,
- nil, когда больше нет доступных кортежей.
Параметры:
gen— функция для поочередного возврата кортежейparam— параметр для функции gen
Возвращает
merger-object объект merger
Пример см. в описании метода merger_object:pairs().
Создание нового экземпляра merger из источника-буфера.
Параметры и возвращаемое значение: те же, что и для merger.new_tuple_source.
Для настройки буфера или серии буферов используйте модуль buffer.
Создание нового экземпляра merger из источника-таблицы.
Параметры и возвращаемое значение: те же, что и для merger.new_tuple_source.
Пример см. в описании метода merger_object:select().
Создание нового экземпляра merger из источника merger.
Источник merger создается из объекта key_def и набора источников (кортежей, буферов, таблиц или merger). Он выполняет своего рода сортировку слиянием. На каждом шаге выбирается источник с минимальным/максимальным кортежем, из него извлекается кортеж, и процесс повторяется.
Параметры:
key_def— объект, созданный с помощьюkey_defsource— параметр для функцииgen()options—reverse=trueдля убывающего порядка, false или nil для возрастающего
Возвращает
merger-object объект merger
Объект key_def может кэшироваться между запросами с одинаковыми
правилами сортировки (обычно это запросы, обращающиеся к одному и тому
же спейсу).
Пример см. в описании метода merger_object:pairs().
Объект merger — это объект, возвращаемый:
- merger.new_tuple_source() или
- merger.new_buffer_source() или
- merger.new_table_source() или
- merger.new(merger_source...).
Он имеет методы:
Доступ к содержимому объекта merger с помощью привычного синтаксиса
select.
Параметры:
buffer— как в методе conn:select клиентаnet.boxlimit— как в методе 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-код для обработки значительно большего числа ситуаций, чем в кратких примерах данного руководства.