Parse Socrata SODA2 API to Abstract Syntax Tree (AST)
npm install node-soda2-parser``javascript`
var Parser = require('node-soda2-parser');
var ast = Parser.parse("$select=date, type, magnitude&$where=magnitude > 3.0 and source = 'pr'&$group=type");
#### Parses to:
`javascript`
{ type: 'select',
distinct: null,
columns:
[ { expr: { type: 'column_ref', table: '', column: 'date' },
as: null },
{ expr: { type: 'column_ref', table: '', column: 'type' },
as: null },
{ expr: { type: 'column_ref', table: '', column: 'magnitude' },
as: null } ],
from: null,
where:
{ type: 'binary_expr',
operator: 'AND',
left:
{ type: 'binary_expr',
operator: '>',
left: { type: 'column_ref', table: '', column: 'magnitude' },
right: { type: 'number', value: 3 } },
right:
{ type: 'binary_expr',
operator: '=',
left: { type: 'column_ref', table: '', column: 'source' },
right: { type: 'string', value: 'pr' } } },
groupby: [ { type: 'column_ref', table: '', column: 'type' } ],
orderby: null,
limit: null,
params: [] }
With this AST, you can:
- Convert it to clean SQL using Parser.stringify.parse(ast) (as seen in soda-postgres)
- Write recursive functions to translate it to another query language
- Write recursive functions to interact with an ORM
- Print it out and hang it on the wall
ensure the following functionality from the SODA2 docs (which is basically everything except what's listed under Unsupported)
$3
- Multiple fields
- Field aliases
- Functions, ie. $select=date_trunc_ym(datetime) AS month
- Operators, ie. $select=depth * 3.28 AS depth_feet$3
- Basic filters, ie. foo=bar&animal=lion
- Expressions
- Recursive And/Or
- Functions, ie. $where=within_box(incident_location, 47.5998951, -122.33707, 47.5942794, -122.3270522)
- Between, ie. $where=date between '2015-01-10T12:00:00' and '2015-01-10T14:00:00'
- Operators, ie. $where=end - start < 1
- Modulo, ie. $where=foo % 2$3
- $group
- $order
- $limit
- $offsetUnsupported
The following was tested and does not parse- Not between, ie.
$where=date not between '2015-01-10T12:00:00' and '2015-01-10T14:00:00' (reference)
- Escaping single quote by doubling, ie. $where=text_value='Bob''s string' (reference)
- Double pipe concatenate, ie. $select=theft_date, dc_dist || dc_num AS dist_dc (reference)
- Free text search, ie. $q=foobar` (reference) (see issue)