Q is a
programming language for
array processing, developed by
Arthur Whitney. It is
proprietary software
Proprietary software is computer software, software that is deemed within the free and open-source software to be non-free because its creator, publisher, or other rightsholder or rightsholder partner exercises a legal monopoly afforded by modern ...
, commercialized by
Kx Systems. Q serves as the query language for
kdb+, a disk based and
in-memory
An in-memory database (IMDB, or main memory database system (MMDB) or memory resident database) is a database management system that primarily relies on main memory for computer data storage. It is contrasted with database management systems that e ...
,
column-based database
In computing, a database is an organized collection of data stored and accessed electronically. Small databases can be stored on a file system, while large databases are hosted on computer clusters or cloud storage. The design of databases spa ...
. Kdb+ is based on the language
k, a terse variant of the language
APL. Q is a thin wrapper around k, providing a more readable, English-like interface. One of the use cases is financial time series analysis, as one could do inexact time matches. An example is to match the a bid and the ask before that. Both timestamps slightly differ and are matched anyway.
Overview
The fundamental building blocks of q are ''atoms'', ''lists'', and ''functions''. Atoms are
scalars and include the
data type
In computer science and computer programming, a data type (or simply type) is a set of possible values and a set of allowed operations on it. A data type tells the compiler or interpreter how the programmer intends to use the data. Most progra ...
s numeric, character, date, and time.
Lists
A ''list'' is any set of items in a row. List or lists may also refer to:
People
* List (surname)
Organizations
* List College, an undergraduate division of the Jewish Theological Seminary of America
* SC Germania List, German rugby union ...
are ordered collections of atoms (or other lists) upon which the higher level data structures ''
dictionaries'' and ''
tables'' are internally constructed. A dictionary is a map of a list of keys to a list of values. A table is a transposed dictionary of symbol keys and equal length lists (columns) as values. A ''keyed table'', analogous to a table with a
primary key
In the relational model of databases, a primary key is a ''specific choice'' of a ''minimal'' set of attributes (columns) that uniquely specify a tuple (row) in a relation ( table). Informally, a primary key is "which attributes identify a record ...
placed on it, is a dictionary where the keys and values are arranged as two tables.
The following code demonstrates the relationships of the data structures. Expressions to evaluate appear prefixed with the
q)
prompt, with the output of the evaluation shown beneath:
q)`john / an atom of type symbol
`john
q)50 / an atom of type integer
50
q)`john`jack / a list of symbols
`john`jack
q)50 60 / a list of integers
50 60
q)`john`jack!50 60 / a list of symbols and a list of integers combined to form a dictionary
john, 50
jack, 60
q)`name`age!(`john`jack;50 60) / an arrangement termed a column dictionary
name, john jack
age , 50 60
q)flip `name`age!(`john`jack;50 60) / when transposed via the function "flip", the column dictionary becomes a table
name age
--------
john 50
jack 60
q)(flip (enlist `name)!enlist `john`jack)!flip (enlist `age)!enlist 50 60 / two equal length tables combined as a dictionary become a keyed table
name, age
----, ---
john, 50
jack, 60
These entities are manipulated via functions, which include the built-in functions that come with Q (which are defined as
K macros) and user-defined functions. Functions are a data type, and can be placed in lists, dictionaries and tables, or passed to other functions as parameters.
Examples
Like K, Q is interpreted and the result of the evaluation of an expression is immediately displayed, unless terminated with a semi-colon. The
Hello world program is thus trivial:
q)"Hello world!"
"Hello world!"
The following expression sorts a list of strings stored in the variable x descending by their lengths:
x@idesc count each x
The expression is evaluated from right to left as follows:
# "count each x" returns the length of each word in the list x.
# "idesc" returns the indices that would sort a list of values in descending order.
# @ use the integer values on the right to index into the original list of strings.
The factorial function can be implemented directly in Q as
or recursively as
Note that in both cases the function implicitly takes a single argument called x - in general it is possible to use up to three implicit arguments, named x, y and z, or to give arguments local variable bindings explicitly.
In the direct implementation, the expression "til x" enumerates the integers from 0 to x-1, "1+" adds 1 to every element of the list and "prd" returns the product of the list.
In the recursive implementation, the syntax "$
ondition; expr1; expr2 is a ternary conditional - if the condition is true then expr1 is returned; otherwise expr2 is returned. The expression ".z.s" is loosely equivalent to 'this' in Java or 'self' in Python - it is a reference to the containing object, and enables functions in q to call themselves.
When x is an integer greater than 2, the following function will return 1 if it is a prime, otherwise 0:
The function is evaluated from right to left:
# "til x" enumerate the non-negative integers less than x.
# "2_" drops the first two elements of the enumeration (0 and 1).
# "x mod" performs modulo division between the original integer and each value in the truncated list.
# "min" find the minimum value of the list of modulo result.
The q programming language contains its own table query syntax calle
qSQL which resembles traditional
SQL but has important differences, mainly due to the fact that the underlying tables are oriented by column, rather than by row.
q)show t:([] name:`john`jack`jill`jane; age: 50 60 50 20) / define a simple table and assign to "t"
name age
--------
john 50
jack 60
jill 50
jane 20
q)
select from t where name like "ja*",age>50
name age
--------
jack 60
q)
select rows:count i by age from t
age, rows
---, ----
20 , 1
50 , 2
60 , 1
References
Further reading
*
*
External links
* , Kx Systems
* , kdb+
Online documentation and developer siteOnline kdb TutorialsqStudio an IDE with timeseries charting for kdb Kx Developer, an IDE for kdb+ kdb+ repositories on GitHubFree online version of ''Q for Mortals''''Q for All'' video tutorialsTechnical Whitepapersjq, an implementation of q on the JVM
{{APL programming language
APL programming language family
Array programming languages
Data-centric programming languages
Dynamic programming languages
Function-level languages
Proprietary database management systems