Skip to content

sqlite: подготовить каноническую dark-проекцию из реляционной схемы вместо прямой загрузки raw DSL #73

@zavx0z

Description

@zavx0z

Проблема

После последних изменений pkg/sqlite стал канонической точкой сборки MetaDSL в SQLite:

  • схема собирается из корневых *.sql;
  • relation() раскладывает meta, fields, superposition, processes, reactions, matter по реляционным таблицам;
  • AST-слой убран из текущего пути подготовки данных. :contentReference[oaicite:0]{index=0} :contentReference[oaicite:1]{index=1}

Но dark всё ещё живёт от raw DSL:

  • dark/load.ts загружает meta.json и строит Meta напрямую из объекта;
  • в Dark ещё осталась завязка на MetaAST / старый AST-слой. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}

В итоге сейчас SQLite уже хранит каноническое описание, но данные для тёмной материи из него ещё не подготавливаются.

Что нужно сделать

Нужно перевести подготовку данных для Dark на SQLite и сделать отдельную dark-проекцию из канонической реляционной схемы.

Важно:

  • не делать raw DSL вторым источником истины;
  • не дублировать канонические данные в новых persist-таблицах без необходимости;
  • использовать SQLite как канонический слой, а в TypeScript собирать из него dark-пакет для materialization.

Цель

Сделать так, чтобы Dark получал не сырой TS/JSON DSL, а уже подготовленный нормализованный пакет данных из SQLite, пригодный для сборки тёмной топологии.

Текущее состояние, которое нужно учесть

1. Канонический SQLite-слой уже есть

pkg/sqlite/sqlite.ts собирает общую схему из отдельных SQL-модулей и открывает БД как каноническую MetaDSL-базу. relation.ts уже пишет в неё meta, fields, superposition, process, reactions, matter. :contentReference[oaicite:4]{index=4} :contentReference[oaicite:5]{index=5}

2. matter-схема уже рассчитана на более полную проекцию, чем реально записывается сейчас

DDL уже содержит:

  • matter_node
  • matter_edge
  • matter_binding
  • matter_binding_dep
  • matter_meta
  • matter_condition
  • matter_logical
  • matter_map
  • matter_attr
  • matter_attr_binding
  • matter_attr_part
  • matter_style_prop
  • matter_event_update :contentReference[oaicite:6]{index=6}

Но текущий relationMatter() фактически пишет только:

  • узлы,
  • рёбра,
  • src_binding для meta-узлов. :contentReference[oaicite:7]{index=7}

То есть схема уже позволяет хранить нормализованное topology/matter-представление, но write-side пока доведён не до конца.

3. process тоже записывается не полностью

DDL уже содержит:

  • process_action
  • process_action_read
  • process_action_write
  • process_finally
  • process_finally_read :contentReference[oaicite:8]{index=8} :contentReference[oaicite:9]{index=9}

Но текущий relationProcess() сохраняет только:

  • запись в process
  • env в process_env. :contentReference[oaicite:10]{index=10}

4. Поля уже движутся в правильную сторону для topology-слоя

enum и array уже сохраняются по позициям, а значения приводятся к текстовой форме. Это подходит для topology-уровня, где важнее порядок, связь и вариант, чем исходный scalar-type. :contentReference[oaicite:11]{index=11} :contentReference[oaicite:12]{index=12}

Архитектурное решение

Нужен отдельный projector/assembler в pkg/sqlite, который:

  1. читает канонические строки из SQLite;
  2. собирает из них нормализованный dark-bundle;
  3. возвращает его в dark/load для дальнейшей materialization.

То есть источник истины остаётся один — SQLite.
Dark получает уже готовую скрытую топологию, а не raw DSL.

Предлагаемое направление проекции

Смысловая проекция должна быть такой:

  • matter_node.node_kind = 'meta'Wimp
  • matter_node.node_kind = 'cond'Fuzzy
  • matter_node.node_kind = 'log'Axion
  • matter_node.node_kind = 'map'Macho

Bindings при этом должны собираться в нормализованную форму:

  • static
  • variable
  • dynamic + deps + expr

то есть без потери различия между:

  • литералом,
  • ссылкой на путь,
  • вычисляемым выражением с зависимостями.

Что именно нужно реализовать

Этап 1. Довести запись канонического слоя до полноты

Дописать сохранение в SQLite для matter:

  • matter_meta.fields_binding
  • matter_meta.mass_binding
  • matter_condition.predicate_binding
  • matter_logical.predicate_binding
  • matter_map.collection_binding
  • ветвление then / else
  • matter_attr
  • matter_attr_binding
  • matter_attr_part
  • matter_style_prop
  • matter_event_update

Дописать сохранение для process:

  • process_action
  • process_action_read
  • process_action_write
  • process_finally
  • process_finally_read

Этап 2. Добавить dark read-model поверх SQLite

Добавить в pkg/sqlite новый модуль, например:

  • pkg/sqlite/dark.ts

с публичной функцией вида:

readDarkBundle(db, src)

которая возвращает нормализованный пакет для Dark.

Этап 3. Перевести dark/load на SQLite

Заменить прямую загрузку raw DSL на чтение из SQLite:

  • либо полностью,
  • либо сначала параллельным путём под тесты и миграцию.

Ожидаемый результат

После выполнения задачи:

  • pkg/sqlite становится не только write-side канонического DSL-слоя, но и точкой подготовки данных для Dark;

  • Dark перестаёт зависеть от прямой загрузки raw DSL / meta.json;

  • тёмная материя начинает materialize-иться из канонической SQLite-схемы;

  • канонический источник истины остаётся один;

  • появляется чёткое разделение:

    • SQLite — каноническая плоскость,
    • TypeScript — сборка dark-проекции,
    • Dark — materialization скрытой связности.

Критерии приёмки

  • matter записывается в SQLite полностью, без потери src / fields / mass / predicate / collection / attrs / events / branches;

  • process записывается полностью, включая action/finally/read/write;

  • из SQLite можно собрать dark-bundle без обращения к raw DSL;

  • dark/load может построить Meta и topology из SQLite-проекции;

  • тесты покрывают:

    • meta → sqlite
    • sqlite → dark-bundle
    • dark-bundle → materialization
  • raw DSL больше не является обязательным runtime-источником для Dark.

Дополнительно

На этом этапе не нужно:

  • заводить отдельные persist-таблицы dark_*, если проекция может собираться из канонических таблиц;
  • дублировать source of truth;
  • возвращать AST назад в новый путь.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status
Todo

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions