README.md

Qlc
===

[![Build Status](https://travis-ci.org/k1complete/qlc.svg?branch=master)](https://travis-ci.org/k1complete/qlc)

Qlc is implementation `erlang's qlc interface` by elixir.

The qlc module implements a query interface to QLC tables. 
Typical QLC tables are ETS, Dets, and Mnesia tables. 
There is also support for user defined tables, see the Implementing 
a QLC table section. A query is stated using Query List 
Comprehensions (QLCs). 

for more information, see 
[erlang reference manual](http://www.erlang.org/doc/man/qlc.html)

## build

1. find sure qlc.erl in 'stdlib/src'.
2. mix test
3. mix docs (option)

## feature

Allow erlang style list comprehensions for List, ets, Dets, Mnesia QLC tables.

### example

    iex> require Qlc
    iex> list = [a: 1,b: 2,c: 3]
    iex> qlc_handle = Qlc.q("[X || X = {K,V} <- L, K =/= Item]", 
    ...>        [L: list, Item: :b])
    ...> Qlc.e(qlc_handle)
    [a: 1, c: 3]

Qlc.Record.defrecord/2 defines the bang!/2 macro expanding to 
'element(index, record)', for treating record element in qlc query.

### Examples

    iex(1)> require Qlc.Record
    Qlc.Record
    iex(2)> require Qlc
    Qlc
    iex(3)> defmodule A do
    ...(3)> Qlc.Record.defrecord(:item, [id: nil, name: nil, age: nil])
    ...(3)> end
    {:module, A,
     <<70, 79, 82, 49, 0, 0, 10, 48, 66, 69, ...>>, {:item!, 2}}
    iex(4)> require A
    A
    iex(5)> import A
    A
    iex(6)> item()
    {:item, nil, nil, nil}
    iex(7)> item([id: 1, name: :foo, age: 10])
    {:item, 1, :foo, 10}
    iex(8)> item!({:item, 1, :foo, 10}, :age)
    [
      32,
      101,
      108,
      101,
      109,
      101,
      110,
      116,
      40,
      '4',
      44,
      32,
      [[123, ['item', 44, '1', 44, 'foo', 44, '10'], 125]],
      41,
      32
    ]
    iex(9)> item!({:item, 1, :foo, 10}, :age)|>List.flatten()
    ' element(4, {item,1,foo,10}) '
    iex(10)> list = [item(id: 1, name: :a, age: 1), 
    ...(10)>         item(id: 2, name: :b, age: 10), 
    ...(10)>         item(id: 3, name: :c, age: 20)]
    [{:item, 1, :a, 1}, {:item, 2, :b, 10}, {:item, 3, :c, 20}]
    iex(11)> Qlc.q("[ X || X <- L, (N = #{item!(X, :name)}) =:= Name]", 
    ...(11)>      [L: list, Name: :b]) |>
    ...(11)> Qlc.sort(order: :descending) |>
    ...(11)> Qlc.e()
    [{:item, 2, :b, 10}]

    ## Cannot use bang!/2 macro with variable, can use literal only

    iex(12)> b = item([id: 1, name: :foo, age: 10])
    {:item, 1, :foo, 10}
    iex(13)> item!(b, :name)
    warning: variable "b" does not exist and is being expanded to "b()", please use parentheses to remove the ambiguity or change the variable name
    iex(14)> 

## licenses
    
MIT licenses.