- Add Window Functions: ROW_NUMBER, RANK, DENSE_RANK, LEAD, LAG, FIRST_VALUE, LAST_VALUE, NTILE with PARTITION BY, ORDER BY, ROWS/RANGE frame specifications - Add MERGE/UPSERT statement with WHEN MATCHED UPDATE and WHEN NOT MATCHED INSERT - Add SQL/PGQ Property Graph long-term plan in PLAN_SQL_ADVANCED.md - Add 7 new tests for Window Functions and MERGE - Update baraql.md documentation
5.9 KiB
BaraDB — Дългосрочен план за Advanced SQL + All-in-One Engine
Визия: BaraDB става единният мултимодален backend за vals-trz и други ERP/HR системи. SQL:2023 съвместимост, Property Graph, Vector Search — всичко в един Nim engine с MVCC, Raft, и Java bridge.
Част 1: BaraDB Advanced SQL Engine
1.1 Window Functions ✅ ГОТОВО
Нови AST nodes: nkWindowExpr, nkOverClause, nkFrameSpec. Нов IR plan: irpkWindow.
| Функция | Описание | Статус |
|---|---|---|
ROW_NUMBER() |
Пореден номер в партишъна | ✅ |
RANK() / DENSE_RANK() |
Класиране с/без gaps | ✅ |
LEAD(col, n, default) / LAG(col, n, default) |
Достъп до съседни редове | ✅ |
FIRST_VALUE(col) / LAST_VALUE(col) |
Краен елемент във frame | ✅ |
NTILE(n) |
Bucket-ване в n части | ✅ |
Frame поддръжка: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ✅
Файлове: lexer.nim, ast.nim, ir.nim, parser.nim, executor.nim, codegen.nim
Тестове: 5 теста в tests/test_all.nim, всички зелени.
1.2 MERGE / UPSERT ✅ ГОТОВО
MERGE INTO inventory AS target
USING updates AS source
ON target.sku = source.sku
WHEN MATCHED THEN UPDATE SET qty = target.qty + source.delta
WHEN NOT MATCHED THEN INSERT (sku, qty) VALUES (source.sku, source.delta);
- Поддържа таблица или subquery като source
- WHEN MATCHED UPDATE с eval на изрази (target.col + source.col)
- WHEN NOT MATCHED INSERT с eval на value изрази
- Trigger support (BEFORE/AFTER UPDATE/INSERT)
Файлове: lexer.nim, ast.nim, ir.nim, parser.nim, executor.nim, codegen.nim
Тестове: 2 теста в tests/test_all.nim, всички зелени.
1.3 LATERAL JOIN / CROSS APPLY (Приоритет: Висок)
Позволява correlated subquery във FROM clause с достъп до лявата таблица.
SELECT u.name, recent_orders.*
FROM users u,
LATERAL (
SELECT order_id, total FROM orders o
WHERE o.user_id = u.id ORDER BY created_at DESC LIMIT 3
) recent_orders;
1.4 Advanced Aggregates (Приоритет: Среден)
ARRAY_AGG(col ORDER BY ...)STRING_AGG(col, delimiter)COUNT(*) FILTER (WHERE ...)GROUPING SETS,CUBE,ROLLUP
1.5 PIVOT / UNPIVOT (Приоритет: Среден)
1.6 SQL:2023 Property Graph (SQL/PGQ) — Дългосрочен
CREATE PROPERTY GRAPH org_chart
VERTEX TABLES (employees LABEL person PROPERTIES (id, name))
EDGE TABLES (
employments
SOURCE KEY (employee_id) REFERENCES employees (id)
DESTINATION KEY (department_id) REFERENCES departments (id)
LABEL works_in
);
SELECT * FROM GRAPH_TABLE(org_chart
MATCH (e IS person WHERE e.name = 'Иван')-[IS works_in]->(d)
COLUMNS (d.name AS department)
);
Част 2: vals-trz → BaraDB Миграционна стратегия
Фаза 0: Java REST Bridge ✅ ГОТОВО
vals-trz (Spring Boot)
↓ HTTP/JSON (BaraDB REST API)
BaraDB Server (Nim)
↓ Native execution
Storage (LSM-Tree / B-Tree / HNSW / InvertedIndex)
Създадени файлове в vals-trz/backend/src/main/java/com/valstrz/baradb/:
BaraDbProperties.java—@ConfigurationProperties(prefix = "baradb")BaraDbClient.java— HTTP клиент къмPOST /queryBaraDbTemplate.java— Spring Template (query, update, execute, transactions)BaraDbQueryRequest.java/BaraDbQueryResponse.java— JSON DTOsBaraDbException.java— Runtime exceptionBaraDbConfig.java— Spring@ConfigurationEmployeeBaraRepository.java— Пример: Employee entity → SQL MERGE/SELECTREADME.md— Документация за bridge
Конфигурация добавена в application.properties:
baradb.enabled=false
baradb.host=localhost
baradb.port=9470
baradb.database=valstrz
Фаза 1: Document Storage (Вместо ArangoDB)
- JSON/JSONB колони за гъвкави документи
- Всеки
BaseEntity→ таблица сid,tenant_id,data jsonb - Или: full relational mapping (всеки Java field → SQL колона)
Фаза 2: Graph йерархия (Вместо ArangoDB edges)
- SQL/PGQ
CREATE PROPERTY GRAPH org_chart MATCHqueries за reporting chain, department structure- BFS/DFS + shortestPath вградени в SQL планера
Фаза 3: Vector Search (Вместо Qdrant)
vectorтип + HNSW indexcosine_distance(embedding, [...])в WHERE/ORDER BY- Hybrid: vector similarity + BM25 + relational filters в една транзакция
Фаза 4: Distributed (Когато трябва scale)
- Raft consensus за HA
- Sharding за multi-tenant isolation (shard by
tenant_id)
Имплементационен ред (обновен)
- ✅ Window Functions (AST → Parser → IR → Executor → Tests)
- ✅ MERGE statement (Parser → Executor → Tests)
- ✅ Java REST Client за vals-trz (Spring
@Component,BaraDbTemplate) - LATERAL JOIN (Parser → Executor)
- Advanced Aggregates (FILTER, GROUPING SETS)
- SQL/PGQ Property Graph (DDL parser → Graph engine integration)
- vals-trz Entity → BaraDB Schema mapping
- PIVOT/UNPIVOT
Тестова стратегия
- Unit: Всеки нов AST/IR/Parser тест — property-based (генериране на случайни partition/order)
- Integration: Testcontainers с BaraDB HTTP server + Java client
- TLA+:
windowfunctions.tla— deterministic partitioning semantics - Benchmark: Window function performance vs PostgreSQL