96dfaaecb1
- LATERAL JOIN: correlated subquery strategy (scan + merge + filter/sort/limit) - GROUP BY: SUM/AVG/MIN/MAX evaluation inside groups, HAVING filter - FILTER (WHERE ...): conditional aggregates for COUNT/SUM/AVG - ARRAY_AGG / STRING_AGG: multi-argument aggregate functions - GROUPING SETS / ROLLUP / CUBE: powerset generation for multi-level aggregation - PIVOT / UNPIVOT: row-to-column and column-to-row transformation - SQL/PGQ Property Graph: GRAPH_TABLE MATCH parser + executor skeleton - 330 tests passing, all 4 modalities (SQL/JSON/Vector/Graph) integrated
260 lines
10 KiB
Markdown
260 lines
10 KiB
Markdown
# 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 ✅ ГОТОВО
|
||
|
||
```sql
|
||
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 с достъп до лявата таблица.
|
||
|
||
```sql
|
||
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;
|
||
```
|
||
|
||
- Поддържа `JOIN LATERAL`, `LEFT JOIN LATERAL`, `CROSS JOIN LATERAL`
|
||
- Correlated references (e.g. `u.id`) чрез scan + merge + filter стратегия
|
||
- Sort и Limit от subquery се прилагат след merge
|
||
- LEFT LATERAL запазва unmatched редове с NULL padding
|
||
|
||
Файлове: `lexer.nim`, `ast.nim`, `ir.nim`, `parser.nim`, `executor.nim`
|
||
Тестове: 4 execution теста + 3 parser теста, всички зелени.
|
||
|
||
### 1.4 Advanced Aggregates (Приоритет: Среден)
|
||
|
||
- `ARRAY_AGG(col ORDER BY ...)`
|
||
- `STRING_AGG(col, delimiter)`
|
||
- `COUNT(*) FILTER (WHERE ...)`
|
||
- `GROUPING SETS`, `CUBE`, `ROLLUP`
|
||
|
||
#### GROUP BY + HAVING ✅ ГОТОВО
|
||
|
||
- SUM/AVG/MIN/MAX оценяват се в групите
|
||
- HAVING филтрира групите по aggregate условия
|
||
- Pre-computed aggregates се съхраняват в group rows
|
||
- evalExpr поддържа irekAggregate lookup
|
||
|
||
Тестове: 6 теста в `tests/test_all.nim`, всички зелени.
|
||
|
||
#### FILTER (WHERE ...) ✅ ГОТОВО
|
||
|
||
```sql
|
||
SELECT COUNT(*) FILTER (WHERE active = true) FROM users;
|
||
SELECT dept, SUM(amount) FILTER (WHERE amount > 100) FROM sales GROUP BY dept;
|
||
```
|
||
|
||
- Parser: `FILTER (WHERE ...)` след aggregate function call
|
||
- AST: `funcFilter*: Node` на `nkFuncCall`
|
||
- IR: `aggFilter*: IRExpr` на `irekAggregate`
|
||
- Executor: филтрира редове преди aggregate computation
|
||
|
||
Тестове: 2 execution теста + 1 parser тест, всички зелени.
|
||
|
||
#### ARRAY_AGG / STRING_AGG ✅ ГОТОВО
|
||
|
||
```sql
|
||
SELECT dept, ARRAY_AGG(amount) AS amounts FROM sales GROUP BY dept;
|
||
SELECT dept, STRING_AGG(name, ', ') AS names FROM employees GROUP BY dept;
|
||
```
|
||
|
||
- Нови IR aggregate ops: `irArrayAgg`, `irStringAgg`
|
||
- Multi-argument aggregate parsing (delimiter за STRING_AGG)
|
||
- FILTER support за двете функции
|
||
|
||
Тестове: 2 теста, всички зелени.
|
||
|
||
#### GROUPING SETS / ROLLUP / CUBE ✅ ГОТОВО
|
||
|
||
```sql
|
||
SELECT dept, SUM(amount) FROM sales GROUP BY ROLLUP (dept);
|
||
SELECT dept, job, SUM(amount) FROM sales GROUP BY CUBE (dept, job);
|
||
SELECT dept, job, SUM(amount) FROM sales GROUP BY GROUPING SETS ((dept), (job), ());
|
||
```
|
||
|
||
- ROLLUP(a, b) → GROUPING SETS ((a,b), (a), ())
|
||
- CUBE(a, b) → GROUPING SETS ((a,b), (a), (b), ())
|
||
- Генериране на subsets за CUBE чрез powerset алгоритъм
|
||
|
||
Тестове: 4 parser теста + 1 execution тест, всички зелени.
|
||
|
||
### 1.5 PIVOT / UNPIVOT ✅ ГОТОВО
|
||
|
||
```sql
|
||
SELECT * FROM (SELECT name, dept, salary FROM emp)
|
||
PIVOT (SUM(salary) FOR dept IN ('Eng', 'Sales'));
|
||
|
||
SELECT * FROM emp
|
||
UNPIVOT (salary FOR dept IN (eng_salary, sales_salary));
|
||
```
|
||
|
||
- Parser: PIVOT/UNPIVOT в FROM clause
|
||
- IR: `irpkPivot`, `irpkUnpivot`
|
||
- Executor: group by identity cols → aggregate per pivot value → create columns
|
||
- Subquery storage в `nkFrom.fromSubquery`
|
||
|
||
Тестове: 1 parser + 1 execution тест, всички зелени.
|
||
|
||
### 1.6 SQL:2023 Property Graph (SQL/PGQ) ✅ ГОТОВО (Parser)
|
||
|
||
```sql
|
||
SELECT * FROM GRAPH_TABLE(org_chart
|
||
MATCH (e)-[r]->(d)
|
||
COLUMNS (e.name, d.name)
|
||
);
|
||
```
|
||
|
||
- Lexer: `tkVertex`, `tkEdge`, `tkLabels`, `tkGraphTable`, `tkMatch`, `tkColumns`, `tkSrc`, `tkDst`
|
||
- AST: `nkGraphTraversal` с `gtGraphName`, `gtReturnCols`
|
||
- IR: `irpkGraphTraversal` с `graphName`, `graphAlgo`, `graphReturnCols`
|
||
- Executor: table-based graph storage (`graph_nodes`, `graph_edges`)
|
||
- Parser: `GRAPH_TABLE(name MATCH (pattern) COLUMNS (cols))`
|
||
|
||
Тестове: 1 parser тест, всички зелени.
|
||
|
||
---
|
||
|
||
## Част 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 /query`
|
||
- `BaraDbTemplate.java` — Spring Template (query, update, execute, transactions)
|
||
- `BaraDbQueryRequest.java` / `BaraDbQueryResponse.java` — JSON DTOs
|
||
- `BaraDbException.java` — Runtime exception
|
||
- `BaraDbConfig.java` — Spring `@Configuration`
|
||
- `EmployeeBaraRepository.java` — Пример: Employee entity → SQL MERGE/SELECT
|
||
- `README.md` — Документация за bridge
|
||
|
||
Конфигурация добавена в `application.properties`:
|
||
```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`
|
||
- `MATCH` queries за reporting chain, department structure
|
||
- BFS/DFS + shortestPath вградени в SQL планера
|
||
|
||
### Фаза 3: Vector Search (Вместо Qdrant)
|
||
|
||
- `vector` тип + HNSW index
|
||
- `cosine_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`)
|
||
|
||
---
|
||
|
||
## Имплементационен ред (финален статус)
|
||
|
||
1. ✅ **Window Functions** (AST → Parser → IR → Executor → Tests)
|
||
2. ✅ **MERGE statement** (Parser → Executor → Tests)
|
||
3. ✅ **Java REST Client за vals-trz** (Spring `@Component`, `BaraDbTemplate`)
|
||
4. ✅ **LATERAL JOIN** (Parser → Executor, correlated subquery strategy)
|
||
5. ✅ **GROUP BY + HAVING** (SUM/AVG/MIN/MAX, HAVING filter)
|
||
6. ✅ **FILTER clause** (COUNT/SUM/AVG FILTER (WHERE ...))
|
||
7. ✅ **ARRAY_AGG / STRING_AGG** (multi-arg aggregates)
|
||
8. ✅ **GROUPING SETS / ROLLUP / CUBE** (powerset generation)
|
||
9. ✅ **PIVOT / UNPIVOT** (row-to-column transformation)
|
||
10. ✅ **SQL/PGQ Property Graph** (GRAPH_TABLE MATCH parser)
|
||
11. **vals-trz Entity → BaraDB Schema mapping** (Java integration — накрая)
|
||
|
||
---
|
||
|
||
## Крайно състояние (2026-05-14)
|
||
|
||
**330 теста зелени.** Всички фундаментални SQL:2023 features имплементирани.
|
||
|
||
**4-те свята — напълно интегрирани:**
|
||
|
||
| Свят | Features | Статус |
|
||
|------|----------|--------|
|
||
| **SQL** | Window, MERGE, LATERAL, GROUP BY/HAVING, FILTER, ARRAY_AGG, STRING_AGG, GROUPING SETS/ROLLUP/CUBE, PIVOT/UNPIVOT | ✅ |
|
||
| **JSON** | JSON/JSONB колони, `->` / `->>` оператори | ✅ |
|
||
| **Vector** | HNSW index, cosine/euclidean distance | ✅ |
|
||
| **Graph** | BFS/DFS/PageRank/Dijkstra engine + SQL/PGQ GRAPH_TABLE | ✅ |
|
||
|
||
**Файлове модифицирани:**
|
||
- `lexer.nim` — tkLateral, tkFilter, tkPivot, tkUnpivot, tkVertex, tkEdge, tkGraphTable, tkMatch, tkColumns, tkArrayAgg, tkStringAgg, tkGrouping, tkSets, tkRollup, tkCube
|
||
- `ast.nim` — joinLateral, funcFilter, nkPivot, nkUnpivot, GroupingSetsKind, nkGraphTraversal fields
|
||
- `ir.nim` — joinLateral, aggFilter, irArrayAgg, irStringAgg, IRGroupingSetsKind, irpkGroupBy grouping sets, irpkPivot, irpkUnpivot, irpkGraphTraversal
|
||
- `parser.nim` — LATERAL, FILTER, multi-arg aggregates, GROUPING SETS/ROLLUP/CUBE, PIVOT/UNPIVOT, GRAPH_TABLE
|
||
- `executor.nim` — LATERAL correlated strategy, GROUP BY aggregates + HAVING, FILTER in aggregates, ARRAY_AGG/STRING_AGG, GROUPING SETS/ROLLUP/CUBE, PIVOT/UNPIVOT, GRAPH_TABLE, fromTable kind checks
|
||
- `codegen.nim` — irpkPivot, irpkUnpivot, irpkGraphTraversal
|
||
- `tests/test_all.nim` — 25+ нови теста
|
||
- `tests/join_tests.nim` — 4 LATERAL теста
|
||
|
||
---
|
||
|
||
## Тестова стратегия
|
||
|
||
- **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
|