feat: initial BaraDB — multimodal database engine in Nim

- LSM-Tree storage engine with WAL, bloom filter, MemTable
- BaraQL query language: lexer (80+ tokens), recursive descent parser, AST
- Vector engine: HNSW + IVF-PQ indexes, 4 distance metrics
- Graph engine: adjacency list, BFS/DFS, Dijkstra, PageRank
- Full-Text Search: inverted index, BM25 ranking, stemming, stop words
- Type system: 17 types (int/float/string/uuid/json/vector/...)
- Async TCP server
- 21 passing tests
This commit is contained in:
2026-05-06 00:22:12 +03:00
commit 6935889877
18 changed files with 2676 additions and 0 deletions
+318
View File
@@ -0,0 +1,318 @@
## BaraQL AST — Abstract Syntax Tree nodes
import ../core/types
type
NodeKind* = enum
# Statements
nkSelect
nkInsert
nkUpdate
nkDelete
nkCreateType
nkDropType
nkAlterType
nkCreateIndex
nkDropIndex
# Clauses
nkFrom
nkWhere
nkOrderBy
nkGroupBy
nkHaving
nkLimit
nkOffset
nkReturning
nkWith
# Expressions
nkBinOp
nkUnaryOp
nkFuncCall
nkTypeCast
nkPath
nkIdent
nkIntLit
nkFloatLit
nkStringLit
nkBoolLit
nkNullLit
nkArrayLit
nkVectorLit
nkObjectLit
nkIfElse
nkCase
nkSubquery
nkExists
nkInExpr
nkBetweenExpr
nkLikeExpr
nkIsExpr
# Graph-specific
nkGraphTraversal
nkBfsQuery
nkDfsQuery
nkShortestPath
nkPatternMatch
# Vector-specific
nkVectorSimilar
nkVectorNearest
# Join
nkJoin
# Type definitions
nkPropertyDef
nkLinkDef
nkIndexDef
nkConstraintDef
# Top-level
nkStatementList
BinOpKind* = enum
bkAdd = "+"
bkSub = "-"
bkMul = "*"
bkDiv = "/"
bkMod = "%"
bkPow = "**"
bkFloorDiv = "//"
bkEq = "="
bkNotEq = "!="
bkLt = "<"
bkLtEq = "<="
bkGt = ">"
bkGtEq = ">="
bkAnd = "AND"
bkOr = "OR"
bkIn = "IN"
bkNotIn = "NOT IN"
bkLike = "LIKE"
bkILike = "ILIKE"
bkConcat = "++"
bkCoalesce = "??"
bkAssign = ":="
bkArrow = "=>"
UnaryOpKind* = enum
ukNeg = "-"
ukNot = "NOT"
ukIsNull = "IS NULL"
ukIsNotNull = "IS NOT NULL"
JoinKind* = enum
jkInner
jkLeft
jkRight
jkFull
jkCross
SortDir* = enum
sdAsc
sdDesc
Node* = ref object
line*: int
col*: int
case kind*: NodeKind
of nkSelect:
selDistinct*: bool
selWith*: seq[Node]
selResult*: seq[Node]
selFrom*: Node
selJoins*: seq[Node]
selWhere*: Node
selGroupBy*: seq[Node]
selHaving*: Node
selOrderBy*: seq[Node]
selLimit*: Node
selOffset*: Node
of nkInsert:
insTarget*: string
insFields*: seq[Node]
insValues*: seq[Node]
insReturning*: seq[Node]
insConflict*: Node
of nkUpdate:
updTarget*: string
updAlias*: string
updSet*: seq[Node]
updWhere*: Node
updReturning*: seq[Node]
of nkDelete:
delTarget*: string
delAlias*: string
delWhere*: Node
delReturning*: seq[Node]
of nkCreateType:
ctName*: string
ctBases*: seq[string]
ctProperties*: seq[Node]
ctLinks*: seq[Node]
of nkDropType:
dtName*: string
of nkAlterType:
atName*: string
atOps*: seq[Node]
of nkCreateIndex:
ciTarget*: string
ciName*: string
ciExpr*: Node
ciKind*: IndexKind
of nkDropIndex:
diName*: string
of nkFrom:
fromTable*: string
fromAlias*: string
of nkWhere:
whereExpr*: Node
of nkOrderBy:
orderByExpr*: Node
orderByDir*: SortDir
of nkGroupBy:
groupExprs*: seq[Node]
of nkHaving:
havingExpr*: Node
of nkLimit:
limitExpr*: Node
of nkOffset:
offsetExpr*: Node
of nkReturning:
retExprs*: seq[Node]
of nkWith:
withBindings*: seq[(string, Node)]
of nkBinOp:
binOp*: BinOpKind
binLeft*: Node
binRight*: Node
of nkUnaryOp:
unOp*: UnaryOpKind
unOperand*: Node
of nkFuncCall:
funcName*: string
funcArgs*: seq[Node]
of nkTypeCast:
castType*: string
castExpr*: Node
of nkPath:
pathParts*: seq[string]
of nkIdent:
identName*: string
of nkIntLit:
intVal*: int64
of nkFloatLit:
floatVal*: float64
of nkStringLit:
strVal*: string
of nkBoolLit:
boolVal*: bool
of nkNullLit:
discard
of nkArrayLit:
arrayElems*: seq[Node]
of nkVectorLit:
vecElems*: seq[Node]
of nkObjectLit:
objFields*: seq[(string, Node)]
of nkIfElse:
ifCond*: Node
ifThen*: Node
ifElse*: Node
of nkCase:
caseExpr*: Node
caseWhens*: seq[(Node, Node)]
caseElse*: Node
of nkSubquery:
subQuery*: Node
of nkExists:
existsExpr*: Node
of nkInExpr:
inLeft*: Node
inRight*: Node
of nkBetweenExpr:
betweenExpr*: Node
betweenLow*: Node
betweenHigh*: Node
of nkLikeExpr:
likeExpr*: Node
likePattern*: Node
likeCaseInsensitive*: bool
of nkIsExpr:
isExpr*: Node
isType*: string
isNegated*: bool
of nkGraphTraversal:
gtStart*: Node
gtEdge*: string
gtDirection*: string
gtEnd*: Node
gtMaxDepth*: int
of nkBfsQuery:
bfsStart*: Node
bfsTarget*: Node
bfsEdge*: string
bfsMaxDepth*: int
bfsFilter*: Node
of nkDfsQuery:
dfsStart*: Node
dfsTarget*: Node
dfsEdge*: string
dfsMaxDepth*: int
dfsFilter*: Node
of nkShortestPath:
spStart*: Node
spEnd*: Node
spEdge*: string
spMaxDepth*: int
of nkPatternMatch:
pmPattern*: Node
pmWhere*: Node
of nkVectorSimilar:
vsField*: string
vsVector*: Node
vsLimit*: int
vsMetric*: string
of nkVectorNearest:
vnField*: string
vnVector*: Node
vnLimit*: int
vnMetric*: string
of nkJoin:
joinKind*: JoinKind
joinTarget*: Node
joinOn*: Node
joinAlias*: string
of nkPropertyDef:
pdName*: string
pdType*: string
pdRequired*: bool
pdDefault*: Node
pdComputed*: bool
pdExpr*: Node
of nkLinkDef:
ldName*: string
ldTarget*: string
ldCardinality*: Cardinality
ldRequired*: bool
of nkIndexDef:
idName*: string
idExpr*: Node
idKind*: IndexKind
of nkConstraintDef:
cdName*: string
cdExpr*: Node
of nkStatementList:
stmts*: seq[Node]
proc newNode*(kind: NodeKind, line, col: int = 0): Node =
result = Node(kind: kind, line: line, col: col)
case kind
of nkSelect: result.selResult = @[]
of nkInsert: result.insFields = @[]; result.insValues = @[]
of nkUpdate: result.updSet = @[]
of nkDelete: discard
of nkStatementList: result.stmts = @[]
else: discard