QuickQL
A lightweight pipeline query language for transforming JSON, CSV, and HTTP data sources. QuickQL queries are plain text files (.ql) that describe a sequence of data transformation steps executed top to bottom.
Quick Example
SOURCE OPEN('orders.json')
FILTER EQ(status, 'shipped')
MAP customer_id, total, shipped_date = GETDATE(shipped_at)
GROUP_BY customer_id MAP total = SUM(total), last_ship = MAXDATE(shipped_date)
SORT_BY last_ship DESC
Statements
Each line in a .ql file is one pipeline step. Steps are separated by newlines; comments start with --.
| Statement |
Description |
SOURCE |
Load data from a file, URL, or inline literal |
MAP |
Select, rename, or compute columns |
FILTER |
Keep only rows matching a condition |
MAP_MANY |
Flatten an array field into individual rows |
GROUP_BY |
Group rows by keys and aggregate |
SORT_BY |
Sort rows by one or more columns |
Data Sources
QuickQL can read:
- JSON files — array of objects or a single object/array
- CSV files — automatically detected by
.csv extension
- HTTP endpoints —
GET, POST, or PUT with optional headers, body, and pagination
- Other
.ql files — compose queries by referencing them as sources
-- JSON file
SOURCE OPEN('data/users.json')
-- CSV file
SOURCE OPEN('reports/sales.csv')
-- HTTP API
SOURCE GET('https://api.example.com/users')
-- Another query
SOURCE OPEN('other_query.ql')
-- Multiple sources merged
SOURCE OPEN('users.json'), OPEN('admins.json')
Select and rename columns
SOURCE OPEN('users.json')
MAP id, name, email
SOURCE OPEN('users.json')
MAP id, full_name = name, contact = email
Compute new fields
SOURCE OPEN('orders.json')
MAP *, total_with_tax = SUM(total, tax)
Filter rows
SOURCE OPEN('users.json')
FILTER active
SOURCE OPEN('orders.json')
FILTER AND(EQ(status, 'pending'), total)
Flatten nested arrays
SOURCE OPEN('invoices.json') -- each invoice has a "lines" array
MAP_MANY lines
MAP product_id, quantity, price
Group and aggregate
SOURCE OPEN('sales.json')
GROUP_BY region MAP revenue = SUM(amount), orders = COUNT(amount)
Sort
SOURCE OPEN('products.json')
SORT_BY price DESC, name ASC
Functions
| Function |
Description |
SUM(field) |
Sum of numeric values (works on grouped arrays) |
COUNT(field) |
Count of values |
ARRAY(a, b, ...) |
Collect values into an array |
CONCAT(a, b, ...) |
Concatenate strings |
EQ(a, b) |
true if a equals b |
AND(a, b, ...) |
true if all arguments are truthy |
OR(a, b, ...) |
true if any argument is truthy |
GETDATE(field) |
Extract the date part from an ISO datetime string |
MINDATE(field) |
Earliest date in a set |
MAXDATE(field) |
Latest date in a set |
BASE64(value) |
Base64-encode a value |
OPEN(src) / GET(src) |
Load a file or URL (HTTP GET) |
POST(src) |
HTTP POST |
PUT(src) |
HTTP PUT |
See docs/functions.md for full details and examples.
Values and Expressions
- Field reference:
name, address.city (dot-notation for nested fields)
- String:
'hello' or "hello"
- Number:
42, -3.14
- Boolean:
true, false
- Inline object:
{key: value, other: 'text'}
- Inline array:
[1, 2, 3]
- Function call:
SUM(amount)
See docs/values-and-expressions.md for full details.
Development
Install locally
code --install-extension quickql-0.0.3.vsix
Build package
vsce package
Detailed Documentation