Size: a a a

2020 July 24

GS

Gleb Selyukov in Tarantool
Mons Anderson
:pairs('a',{iterator='GE'}):take_while(function(t) return t[1]:match('^a') end):totable()

;)
Спасибо огромное
источник

GS

Gleb Selyukov in Tarantool
Спасибо всем огромное, вы лучшие
источник
2020 July 25

F

Fox in Tarantool
Добрый день! Нужна небольшая помощь, хочу понять как правильно. Предположим у меня список товаров и у каждого товара список свойств, я делаю отбор по какому-то свойству и возвращаю список товаров, но возвращать нужно частями, клинт будет перемещаться по этому списку выводя по 10 товаров. Понятно как сделать если нет отбора, а как нужно если я отбираю по сложным условиям по связаным таблицам?
источник

F

Fox in Tarantool
Нужна помощь общего рода, подскажите принцип
источник

OK

Oleg Koshovetc in Tarantool
Отбор как делаете? По индексу, или фулсканите список товаров с фильтром? Как задействованы связные таблицы?
источник

F

Fox in Tarantool
Oleg Koshovetc
Отбор как делаете? По индексу, или фулсканите список товаров с фильтром? Как задействованы связные таблицы?
По индесу. Я так понимаю как-то нужно задать смещение и лимит, но что-то вся картина не складывается.
источник

OK

Oleg Koshovetc in Tarantool
-- Space
space_format = {
 { name = 'id',       type = 'string' }
 { name = 'property', type = 'string' }
 { name = 'meta',     type = '*'      }
}

-- indexes
primary = { parts = { 'id' },        unique = true }
property = { parts = { 'property' }, unique = false }

-- scan
box.space.goods.index.property:select({ 'some_property' }, { limit = 10 })
источник

OK

Oleg Koshovetc in Tarantool
спейс с индексами +- так выглядит?
источник

F

Fox in Tarantool
Oleg Koshovetc
Отбор как делаете? По индексу, или фулсканите список товаров с фильтром? Как задействованы связные таблицы?
Есть таблица с товарами, есть со свойствами, в таблице со свойствами: Id, id_goods, key, val
источник

F

Fox in Tarantool
Oleg Koshovetc
спейс с индексами +- так выглядит?
Да, ну примерно. Вообще мне на любом примере понять идею)
источник

OK

Oleg Koshovetc in Tarantool
ID - айдишник свойства
ID_GOODS - айдишник товара

и вы ищете товары с конкретным ID?
окей, сейчас примерно нарисую
источник

F

Fox in Tarantool
Oleg Koshovetc
ID - айдишник свойства
ID_GOODS - айдишник товара

и вы ищете товары с конкретным ID?
окей, сейчас примерно нарисую
Не совсем, id это просто id записи, у свойств есть имена, я из в поле key записываю, val значение свойсва
источник

OK

Oleg Koshovetc in Tarantool
-- Space
space_format = {
 { name = 'id',       type = 'string' }
 { name = 'property', type = 'string' }
 { name = 'meta',     type = '*'      }
}

-- indexes
primary  = { parts = { 'id' },             unique = true }
property = { parts = { 'property', 'id' }, unique = true }

-- scan
prop = 'some_property'
if last_id == nil then
 return box.space.goods.index.property:select({ prop }, { limit = 10 })
else
 return box.space.goods.index.property:pairs({ prop, last_id }, { iterator = 'GT' })
   :take_while(function(t)
     return t.property == prop
   end)
   :take(10)
   :totable()
end
источник

OK

Oleg Koshovetc in Tarantool
короче приведу пример на таком спейсе
вот у вас есть индекс по идентификатору свойства

суть в том, что индекс этот неуникальный, поэтому на него не получится точно отпозиционироваться
можно засунуть в этот индекс id-шник товара, сделав его уникальным

и листить так
- первый листинг начинается с начала индекса, там простой селект с лимитом, ничего интересного
- на последюущие листинги вам всегда передают последний id-шник увиденного товара, и вы начинаете сканить по этой проперти с этим id-шником итератором GT с лимитом

тут нужно быть аккуратным, потому что такой итератор может в процессе скана перескачить на другой property, поэтому такую штуку надо фильтровать
это можно делать либо с помощью pairs + luafun
либо можно сделать тупее - сделать простой селект, как и в первом случае, а потом руками пройтись по таблице и выкинуть значения с неправильным property
источник

OK

Oleg Koshovetc in Tarantool
соответсвенно, если связь property-goods у вас во внешнем спейсе, то попробуйте добавить goods_id в конец индекса по key
источник

OK

Oleg Koshovetc in Tarantool
За правильность итератора не ручаюсь, я на тарантуле давно ничего не писал
источник

F

Fox in Tarantool
Oleg Koshovetc
короче приведу пример на таком спейсе
вот у вас есть индекс по идентификатору свойства

суть в том, что индекс этот неуникальный, поэтому на него не получится точно отпозиционироваться
можно засунуть в этот индекс id-шник товара, сделав его уникальным

и листить так
- первый листинг начинается с начала индекса, там простой селект с лимитом, ничего интересного
- на последюущие листинги вам всегда передают последний id-шник увиденного товара, и вы начинаете сканить по этой проперти с этим id-шником итератором GT с лимитом

тут нужно быть аккуратным, потому что такой итератор может в процессе скана перескачить на другой property, поэтому такую штуку надо фильтровать
это можно делать либо с помощью pairs + luafun
либо можно сделать тупее - сделать простой селект, как и в первом случае, а потом руками пройтись по таблице и выкинуть значения с неправильным property
Олег, спасибо! Теперь хоть какие-то мысли появились у меня! Буду экспериментировать!
источник

OK

Oleg Koshovetc in Tarantool
у тарантула, кстати, в селекте есть опция offset, но я ни разу не тестил ее и не знаю, как она под коробкой работает (мб, делает тупой скан на offset элементов вперед, чтобы плохо бы работало при большом оффсете)
но можете попробовать
https://www.tarantool.io/en/doc/2.2/reference/reference_lua/box_space/#lua-function.space_object.select
источник

ОБ

Олег Бабин in Tarantool
Oleg Koshovetc
у тарантула, кстати, в селекте есть опция offset, но я ни разу не тестил ее и не знаю, как она под коробкой работает (мб, делает тупой скан на offset элементов вперед, чтобы плохо бы работало при большом оффсете)
но можете попробовать
https://www.tarantool.io/en/doc/2.2/reference/reference_lua/box_space/#lua-function.space_object.select
Именно скан
источник

OK

Oleg Koshovetc in Tarantool
ну да, я даже не поленился и пробенчил
(в спейсе миллион туплов и уникальным id-шником и prop=0 у всех)
unix/:./data/breeze_01.control> local offset = 0 local start = require 'clock'.time() box.space.t.index.prop:select({0}, { limit = 10, offset = offset }) return require 'clock'.time() - start
---
- 0.00054216384887695
...

unix/:./data/breeze_01.control> local offset = 999990 local start = require 'clock'.time() box.space.t.index.prop:select({0}, { limit = 10, offset = offset }) return require 'clock'.time() - start
---
- 0.15941262245178
...
источник