2016-02-28 14 views
5

ho creato una funzione di aggregazione che opera in aerospike che funziona in AQL:Aerospike NodeJS UDF di aggregazione errore

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

Questo restituisce risultati. che sto quindi cercando di utilizzare lo stesso UDF in NodeJS:

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

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

Il risultato è un errore apparentemente uninformative:

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

Lo stato log del server:

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)

C'è qualcuno hai qualche consiglio per far funzionare un UDF con NodeJS? O qualche idea su come diagnosticare l'errore?

Ho impostato la posizione UDF dell'utente nella configurazione che non influisce sul risultato.

UPDATE: Ecco il codice 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

Qual è il codice per l'UDF 'check_teamId'? –

+0

Inoltre, si ha una clausola 'WHERE' nell'istruzione AQL ma nessuna sezione' filters' nel proprio oggetto statement nella versione Node.JS. –

+0

Grazie a @AdamB. Aggiornato con il codice lua qui sopra. La clausola WHERE non è effettivamente richiesta e la query funziona correttamente senza di essa. – TStu

risposta

3

La ragione più probabile che si stanno ottenendo l'errore di esecuzione UDF (code: 100) è che il sistema e/o il percorso dell'utente per il sottosistema LUA non sono impostati correttamente Se si attiva la registrazione di debug per il client si potrebbe vedere uno o entrambi questi messaggi di errore:

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 

Se il cliente non è in grado di determinare automaticamente il percorso corretto, allora dovete passare il percorso di sistema/utente nella configurazione . (Vedi sotto)

Ma c'è un altro problema con la chiamata UDF nel client Node.js. Gli argomenti per l'UDF devono essere inoltrati nell'elemento args dell'oggetto aggregationUDF, non in arg.

Ecco un esempio completo che funziona per me:

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

Si noti che questo esempio utilizza la versione [email protected] cliente che era solo released. Ma la configurazione e l'esecuzione di una query UDF è identica al client v1.x.

Ho anche caricato questo esempio in Github here. Questo Gist include anche uno script setup.js per creare alcuni record di esempio in base a ciò che la tua funzione map_profile prevede.

Sentitevi liberi di rispondere a questo nel nostro user forum. Mi piacerebbe sapere se hai questo per funzionare per la tua applicazione. (O qualsiasi altro feedback sul client Aerospike Node.js!)

+0

Grazie, @ jan-hecking ci proveremo – TStu