9 месяцев не было #diffbelt, жесть. Ничего практически не делал, словил какой-то сильный fatigue относительно него. А потом переезд, покупка 3D-принтера и как-то отложилось. Про 3D в следующем посте немного напишу.
Усталось и прокрастинацию по диффбелту отхватил в основном потому что там слишком много мелких нудных деталей которые нужно сделать, чтобы получилось как задумал, а задумал как-то не очень. У меня здесь есть свой тестинговый фреймворк, где в yaml-конфиге для cli-тулы описываешь коллекции и какие функции нужно вызывать чтобы превращать байтовые ключи/значения из коллекции в человеко-читаемый вид:
- name: parsed-log-lines:1d
human_readable:
wasm: example
key_to_bytes: parsedLogLines1dKeyToBytes
bytes_to_key: parsedLogLines1dBytesToKey
value_to_bytes: parsedLogLines1dValueToBytes
bytes_to_value: parsedLogLines1dBytesToValue
Затем описываешь транформации, например:
- name: parsed_lines_1d
source: parsed-log-lines
target: parsed-log-lines:1d
reader_name: parsed-log-lines
aggregate:
wasm: example
map: aggregateMap
initial_accumulator: aggregateInitialAccumulator
reduce: aggregateReduce
merge_accumulators: aggregateMergeAccumulators
apply: aggregateApply
human_readable:
wasm: example
bytes_to_target_key: parsedLogLinesBytesToTargetKey
bytes_to_mapped_value: parsedLogLinesBytesToMappedValue
mapped_value_to_bytes: parsedLogLinesBytesToMappedValue
bytes_to_accumulator: parsedLogLinesBytesToAccumulator
accumulator_to_bytes: parsedLogLinesAccumulatorToBytes
Где ещё кучка таких функций, а map/initial_accumulator/reduce/merge_accumulators/apply реализуют саму логику агрегации и работают с байтами.
И затем идёт секция с тестами, где для каждой из функций можно накидать значения на вход и ожидаемый выход. Которые распарсятся, превратятся в байты, подёргают wasm-функций, получат результат, сериализируются в строки и сравнятся с ожидаемым. Для map/reduce это довольно тривиальная задача и требует только чтобы были определены у самих коллекций функции человекочитаемости. А для агрегаций это ещё вот пачка функций которые нужно написать.
Текущий мой этап — реализовать возможность делать запросы к базе в процессе агрегации, чтобы иметь возможность считать перцентили. Сама реализация запросов будет довольно рутинная, но терпимая. А вот необходимость научить тесты их понимать — это беда. Нужно для каждого типа запросов написать десериализатор описания из ямла, плюс самого ямла становится слишком много, когда в каждом методе пишешь какие запросы ожидаешь что будут сделаны и какие будут результаты. В общем, добавляет ещё больше работы и не видно её конца и края.
Усталось и прокрастинацию по диффбелту отхватил в основном потому что там слишком много мелких нудных деталей которые нужно сделать, чтобы получилось как задумал, а задумал как-то не очень. У меня здесь есть свой тестинговый фреймворк, где в yaml-конфиге для cli-тулы описываешь коллекции и какие функции нужно вызывать чтобы превращать байтовые ключи/значения из коллекции в человеко-читаемый вид:
- name: parsed-log-lines:1d
human_readable:
wasm: example
key_to_bytes: parsedLogLines1dKeyToBytes
bytes_to_key: parsedLogLines1dBytesToKey
value_to_bytes: parsedLogLines1dValueToBytes
bytes_to_value: parsedLogLines1dBytesToValue
Затем описываешь транформации, например:
- name: parsed_lines_1d
source: parsed-log-lines
target: parsed-log-lines:1d
reader_name: parsed-log-lines
aggregate:
wasm: example
map: aggregateMap
initial_accumulator: aggregateInitialAccumulator
reduce: aggregateReduce
merge_accumulators: aggregateMergeAccumulators
apply: aggregateApply
human_readable:
wasm: example
bytes_to_target_key: parsedLogLinesBytesToTargetKey
bytes_to_mapped_value: parsedLogLinesBytesToMappedValue
mapped_value_to_bytes: parsedLogLinesBytesToMappedValue
bytes_to_accumulator: parsedLogLinesBytesToAccumulator
accumulator_to_bytes: parsedLogLinesAccumulatorToBytes
Где ещё кучка таких функций, а map/initial_accumulator/reduce/merge_accumulators/apply реализуют саму логику агрегации и работают с байтами.
И затем идёт секция с тестами, где для каждой из функций можно накидать значения на вход и ожидаемый выход. Которые распарсятся, превратятся в байты, подёргают wasm-функций, получат результат, сериализируются в строки и сравнятся с ожидаемым. Для map/reduce это довольно тривиальная задача и требует только чтобы были определены у самих коллекций функции человекочитаемости. А для агрегаций это ещё вот пачка функций которые нужно написать.
Текущий мой этап — реализовать возможность делать запросы к базе в процессе агрегации, чтобы иметь возможность считать перцентили. Сама реализация запросов будет довольно рутинная, но терпимая. А вот необходимость научить тесты их понимать — это беда. Нужно для каждого типа запросов написать десериализатор описания из ямла, плюс самого ямла становится слишком много, когда в каждом методе пишешь какие запросы ожидаешь что будут сделаны и какие будут результаты. В общем, добавляет ещё больше работы и не видно её конца и края.