2016-02-28 40 views
5

我創建了一個聚合函數,這在塞在其中工作的AQL工作:塞式UDF的NodeJS聚集錯誤

AGGREGATE filter2.check_teamId('123', 0, 1456499994597) ON analytics.tracking 
WHERE teamId = '123' 

這將返回結果。 我然後嘗試使用相同的UDF中的NodeJS:

var statement = { 
    aggregationUDF: {module: 'filter2', funcname: 'check_teamId', 
    arg:['123', 0, 1456499994597]} 
}; 

var query = client.query('analytics', 'tracking', statement); 
var stream = query.execute(); 

結果是一個看似無信息錯誤:

{ code: 100, 
    message: 'UDF: Execution Error 1', 
    func: 'as_query_aggregate', 
    file: 'src/main/aerospike/aerospike_query.c', 
    line: 903 } 

服務器日誌狀態:

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::933) starting aggregation scan job 1201452721893048027 {analytics:tracking} priority 2

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::1026) finished aggregation scan job 1201452721893048027 (0)

有誰有任何提示讓UDF與NodeJS一起工作? 或者任何想法如何診斷錯誤?

我已經在配置中設置了用戶UDF位置,但不影響結果。

UPDATE: 這裏是Lua代碼:

local function map_profile(record) 
    return map {interaction=record.interaction, 
       teamId=record.teamId, datetime=record.datetime, 
       timestamp=record.timestamp, version=record.version, 
       interactions=record.interactions} 
end 
function check_teamId(stream, teamId, startDate, endDate) 
    local function filter_teamId(record) 
    return record.teamId == teamId and 
      record.timestamp >= startDate and record.timestamp <= endDate 
    end 
    return stream : filter(filter_teamId) : map(map_profile) 
end 
+0

「check_teamId」UDF的代碼是什麼? –

+0

另外,在Node.JS版本的語句對象中,AQL語句中有'WHERE'子句,但沒有'filters'部分。 –

+0

謝謝@AdamB。用上面的lua代碼更新。 WHERE子句實際上不是必需的,查詢在沒有它的情況下運行良好。 – TStu

回答

3

的是你所得到的UDF執行錯誤(代碼:100)最有可能的原因是,該系統和/或用戶路徑,LUA子系統沒有正確設置。如果你打開調試日誌記錄的客戶端,您可能會看到這些錯誤消息的一個或兩個:

Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:248] [config_from_jsobject] - Could not find a valid LUA system path ./aerospike-client-c/package/usr/local/aerospike/client/sys/udf/lua/ 
Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:273] [config_from_jsobject] - Could not find valid LUA user path ./aerospike-client-c/package/usr/local/aerospike/client/usr/udf/lua 

如果客戶端無法自動確定正確的路徑,那麼你必須通過在配置系統/用戶路徑。 (見下文)

但是,Node.js客戶端中的UDF調用存在另一個問題。 UDF的參數應傳遞給aggregationUDF對象的args元素,而不是arg

這裏是爲我工作的一個完整的例子:

const Aerospike = require('aerospike') 

const config = { 
    hosts: '192.168.33.10:3000', 
    log: { level: 5 }, 
    modlua: { 
    userPath: './', 
    systemPath: './node_modules/aerospike/aerospike-client-c/lua/' 
    } 
} 

Aerospike.connect(config, (error, client) => { 
    if (error) throw error 

    var statement = { 
    aggregationUDF: { 
     module: 'agg', 
     funcname: 'check_teamId', 
     args: ['123', 0, 1456499994597] 
    } 
    } 
    var query = client.query('test', 'tracking', statement) 
    var stream = query.execute() 

    var count = 0 
    stream.on('error', (error) => console.error('error:', error)) 
    stream.on('data', (result) => { 
    count++ 
    console.log('result:', result) 
    }) 
    stream.on('end',() => { 
    console.log('found %d records', count) 
    client.close() 
    }) 
}) 

注意,此示例使用只是released[email protected]客戶端版本。但是,UDF查詢的設置和執行與v1.x客戶端完全相同。

我也上傳了這個例子到Github here。此Gist還包含一個setup.js腳本,可根據您的map_profile函數預期創建一些樣本記錄。

請隨時在我們的user forum進行跟進。我很想聽聽你是否有這個功能來爲你的應用程序工作。 (或者任何關於Aerospike Node.js客戶端的反饋!)

+0

謝謝,@ jan-hecking會試一試 – TStu