node.js lua udf aerospike

node.js - Error de agregación UDF NodeJS de Aerospike



lua (1)

La razón más probable por la que está obteniendo el error de ejecución UDF (código: 100) es que el sistema y / o la ruta del usuario para el subsistema LUA no están configurados correctamente. Si activa el registro de depuración para el cliente, es posible que vea uno o ambos de estos mensajes de error:

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

Si el cliente no puede determinar la ruta correcta automáticamente, entonces debe pasar la ruta del sistema / usuario en la configuración. (Vea abajo.)

Pero hay otro problema con su invocación de UDF en el cliente Node.js. Los argumentos para la UDF se deben pasar en el elemento args del objeto aggregationUDF , no en arg .

Aquí hay un ejemplo completo que funciona para mí:

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() }) })

Tenga en cuenta que este ejemplo utiliza la versión del cliente [email protected] que acaba de lanzarse . Pero la configuración y ejecución de una consulta UDF es idéntica a la del cliente v1.x.

También he cargado este ejemplo a Github aquí . Este Gist también incluye un script setup.js para crear algunos registros de muestra en función de lo que espera la función map_profile .

Siéntase libre de seguir esto en nuestro foro de usuarios . Me encantaría saber si conseguiste que esto funcione para tu aplicación. (¡O cualquier otro comentario sobre el cliente de Aerospike Node.js!)

Creé una función agregada que funciona en aerospike que funciona en AQL:

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

Esto arroja resultados. Estoy tratando de usar el mismo UDF en NodeJS:

var statement = { aggregationUDF: {module: ''filter2'', funcname: ''check_teamId'', arg:[''123'', 0, 1456499994597]} }; var query = client.query(''analytics'', ''tracking'', statement); var stream = query.execute();

El resultado es un error aparentemente no informativo:

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

El servidor registra estado:

28 de febrero de 2016 22:33:58 GMT: INFO (escaneo): (escaneo.c :: 933) comenzando trabajo de escaneo de agregación 1201452721893048027 {analytics: tracking} prioridad 2

28 de febrero de 2016 22:33:58 GMT: INFO (escaneo): (escaneo.c :: 1026) finalizó el trabajo de escaneo de agregación 1201452721893048027 (0)

¿Alguien tiene alguna sugerencia para obtener un UDF para trabajar con NodeJS? O alguna idea de cómo diagnosticar el error?

Establecí la ubicación UDF del usuario en la configuración que no afecta el resultado.

ACTUALIZACIÓN: Aquí está el código 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