riak_ql provides a number of different functions to Riak
- a lexer/parser for the SQL sub-set we support
- a function for calculating time quanta for Time Series
- a compiler for generating helper modules to validate and manipulate records that correspond to a defined table schema in the DDL
Link to the official and still private docs.
This README is an overview of the repo. Individual sub-systems have their own documentation which will be linked to as appropriate.
This document contains the following sections:
- Repository Contents
- Runtime Tools
- SQL Lexer/Parser
- Time Quantiser Fn
- DDL Compiler
- Runtime Query Fns
- Testing Strategy
This application contains the following files:
riak_ql_cmd.erl
riak_ql_ddl_compiler.erl
riak_ql_ddl.erl
riak_ql_lexer.xrl
riak_ql_parser.yrl
riak_ql_quanta.erl
riak_ql_to_string.erl
riak_ql_window_agg_fns.erl
There is an escript that lets you run the lexer/parser from the command line - it is designed to help developers/operators check their syntax.
riak_ql_cmd.erl
Please read the inline documentation for this module.
The SQL Lexer/Parser takes a string representation of a SQL query and then compiles it. The modules that perform this are:
riak_ql_lexer.xrl
riak_ql_parser.yrl
Running ./rebar compile
transforms this pair of leex and yecc files into the executable Erlang counterparts:
riak_ql_lexer.erl
riak_ql_parser.erl
For more details of the lexer and parser see the Lexer And Parser
To understand how the lexer/parser fits into the query pipeline see Query Pipeline
There is a ruby script and set of SQL keywords which can be used to generate some of the lexer components of riak_lexer.xrl
:
priv/keyword_general.rb
priv/riak_ql_keywords.csv
For more details see the Lexer Keywords
This code generates one of two output records:
ddl_v1{}
- which captures theCREATE TABLE...
statementriak_select_v1{}
- which captures aSELECT * FROM...
statement
NOTE: the output of the lexer is a proplist of record field names and values - the actual record is constructed over the fence from riak_ql
in riak_kv
for the purposes of simplifying inter-repo dependency management.
Time quantisation is done by the module:
riak_ql_quanta.erl
Please read the inline documentation for this module.
The DDL compiler is implemented by:
riak_ql_ddl_compiler.erl
riak_ql_ddl.erl
When a CREATE TABLE...
statement if fed into the lexer/parser it generates a #ddl_v1{}
- a data description language. This captures the structure of the table. The DDL compiler then generates a helper module for that table which allows for the programmatic manipulation of data in that particular format via a common and fixed API.
The module riak_ql_ddl_compiler.erl
performs the compilation and the module riak_ql_ddl.erl
provides a set of wrappers around the compiled module to add utility functions to the API.
For more details see the DDL Compiler
The runtime query system performs operations on data in the query pipeline by calling a set of library functions. These are defined in:
riak_ql_window_agg_fns.erl
Details of the testing strategy are written up in riak_test
And Test Strategy