# Constraints

Hard constraints (must obey):
- Leave the input/output interface unchanged.
- Use standard C++ threading (std::thread, std::mutex, thread pools, etc.).
- Do not cheat by shifting query results from execution to ingestion: No materialized views, no pre-aggregation, no query-result caching, no query-specific lookup tables or query-specific precomputed maps/arrays. Indexes, zone maps, and query-agnostic statistics ARE allowed (they accelerate access to the base columns without storing a query's answer); every filter, grouping, and aggregate must still be computed at query time.
- Maintain ONE storage layout for all queries (no multiple copies of the same logical data).
- Storage layout must remain general enough that in theory arbitrary SQL could be executed.
- Always load all data from Parquet during ingestion (do not skip rows or columns).
