2016-02-28 43 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