Phase 9: Query Model¶
Document Type: Technical Specification
Phase: 9 - Auto-Generated REST API
Status: Active
Overview¶
This document specifies how REST query parameters translate to AeroDB AST.
Query Parameter Syntax¶
Filtering¶
| Syntax | Operator | Example |
|---|---|---|
field=eq.value | Equals | status=eq.active |
field=neq.value | Not equals | status=neq.deleted |
field=gt.value | Greater than | age=gt.18 |
field=gte.value | Greater or equal | age=gte.18 |
field=lt.value | Less than | price=lt.100 |
field=lte.value | Less or equal | price=lte.100 |
field=like.pattern | Pattern match | name=like.*son |
field=in.(a,b,c) | In list | status=in.(active,pending) |
field=is.null | Is null | deleted_at=is.null |
Sorting¶
Pagination¶
Field Selection¶
Translation Pipeline¶
Example¶
Translates to:
QueryParams {
select: None, // All fields
filters: vec![
FilterExpr { field: "author_id", op: Eq, value: "123" },
FilterExpr { field: "status", op: In, value: ["draft", "published"] },
],
order: vec![
OrderBy { field: "created_at", ascending: false },
],
limit: 10,
offset: 0,
}
Bounds Enforcement¶
Invariant Q1: All queries must be bounded¶
| Condition | Action |
|---|---|
| No limit specified | Apply DEFAULT_LIMIT (100) |
| Limit > MAX_LIMIT (1000) | Return 400 error |
| Limit = 0 | Return empty result |
RLS Filter Injection¶
Before query execution, RLS filter is injected:
// Original filters
filters: [status=eq.active]
// After RLS injection (ownership policy)
filters: [status=eq.active, owner_id=eq.{user_id}]
This is transparent to the client.