Код Middle CDC и инкрементальная загрузка спрашивают часто обновлено

Применить события Debezium к состоянию

Условие

Напишите apply_changes(state, events). state: словарь id -> строка (строка это словарь), ключи строки в виде строк. events: список событий в формате, похожем на Debezium: {"op": "c" | "u" | "d" | "r", "before": dict | None, "after": dict | None, "lsn": int}; у строки есть поле "id". События могут прийти не по порядку и с повторами: применяйте их в порядке lsn, событие с уже применённым или меньшим lsn для того же ключа пропускайте. Для c, u, r записывайте after в state[str(after["id"])], для d удаляйте state[str(before["id"])], если он есть. Верните итоговое состояние.

Примеры

apply_changes({}, [{"op":"c","before":null,"after":{"id":1,"city":"Казань"},"lsn":10}]) // {"1":{"id":1,"city":"Казань"}}
apply_changes({"1":{"id":1,"city":"Казань"}}, [{"op":"u","before":{"id":1,"city":"Казань"},"after":{"id":1,"city":"Москва"},"lsn":20}, {"op":"d","before":{"id":1,"city":"Москва"},"after":null,"lsn":30}]) // {}
apply_changes({}, [{"op":"d","before":{"id":1},"after":null,"lsn":30}, {"op":"c","before":null,"after":{"id":1},"lsn":10}]) // {}

Как подойти

Подсказки: 2
  1. Отсортируйте события по lsn.
  2. Храните последний применённый lsn по ключу.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.