2017-04-04 92 views
2

值的列表,我有以下的塞設置:入門使用Lua和塞AQL

INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (1,2,2017,10) 
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (2,2,2017,11) 
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (3,3,2017,12) 
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (4,3,2017,13) 

我在塞和目前我只知道如何在LUA檢索單個值新,但我想知道如何檢索和創建一組值。

舉例來說,我想知道我怎麼能返回結果就像AQL如下:

AGGREGATE test.someFunction() ON test.set 

    +------+--------------+------+ 
    | YEAR | DAY_OF_MONTH | SUMA | 
    +------+--------------+------+ 
    | 2017 | 2   | 21 | 
    | 2017 | 3   | 25 | 
    +------+--------------+------+ 

回答

2

如果你做一個映射,只stream UDF您可以返回多行,但是你想按日計算計數,這樣最終會成爲單一結果。

請注意,返回值只能是受支持的數據類型 - 字符串,blob,整數,雙精度,列表,映射(當前)。您無法返回記錄,並且它不會完全按照您的建議顯示在AQL中。還要明白,AQL是用於管理和數據瀏覽的工具。這不是你應該建立代碼的客戶端。這就是各種語言客戶端的用途(Java,C#,Go,Node.js,Python等)。

這裏是你的要求,你會怎麼做一個例子:

local function reducer(map1, map2) 
    return map.merge(map1, map2, function (id1,id2) 
    return map.merge(id1, id2, function (val1,val2) 
     return (val1 or 0) + (val2 or 0) 
    end) 
    end) 
end 

local function mapper(rec) 
    return map{year=rec.YEAR, day=rec.DAY_OF_MONTH, val=rec.value} 
end 

local function sum_day(group, rec) 
    local year = tostring(rec['year']) 
    local day = tostring(rec['day']) 
    if not group[year] then 
    group[year] = map() 
    end 
    group[year][day] = (group[year][day] or 0) + rec['val'] 
    return group 
end 

local function check_rec(rec) 
    if rec['YEAR'] and rec['DAY_OF_MONTH'] and 
    rec['value'] and 
    type(rec['value']) == 'number' then 
    return true 
    else 
    return false 
    end 
end 

function group_by_day(stream) 
    return stream : filter(check_rec) : map(mapper) : aggregate(map(), sum_day) : reduce(reducer) 
end 

現在從AQL:

aql> aggregate aggr.group_by_day() on test.set 
+-----------------------------------+ 
| group_by_day      | 
+-----------------------------------+ 
| MAP('{"2017":{"3":25, "2":21}}') | 
+-----------------------------------+