2016-02-28 5 views
5

私はAQLで働くエアロスパイクで動作する集約関数を作成しました:エアロスパイクNodeJS UDF集約エラー

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

これは結果を返します。私はその後、NodeJSで同じUDFを使用しようとしている :

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)

は誰もいNodeJSとUDFを連携させるためのヒントはありますか? エラーを診断する方法はありますか?

結果に影響しないconfig内のユーザーUDFの場所を設定しました。 UPDATE

:あなたは(コード:100)UDFの実行エラーを取得している

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

また、AQLステートメントにはWHERE句がありますが、Node.JSバージョンのステートメントオブジェクトには 'filters'セクションはありません。 –

+0

ありがとう@AdamB。上記のluaコードで更新されました。 WHERE句は実際には必要ではなく、問合せはそれなしで正常に実行されます。 – TStu

答えて

3

最も可能性が高い理由:ここで はLuaのコードであること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の引数は、argではなく、aggregationUDFオブジェクトのargs要素に渡す必要があります。この例では、ちょうどreleased[email protected]クライアントのバージョンを使用していること

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

注:ここでは

は、私の作品の完全な例です。ただし、UDFクエリの設定と実行はv1.xクライアントと同じです。

また、この例をGithub hereにアップロードしました。このGistには、map_profile関数が期待するものに基づいてサンプルレコードを作成するためのsetup.jsスクリプトも含まれています。

私たちのuser forumでこれをフォローアップしてください。私はあなたがあなたのアプリケーションのためにこれを働かせるなら、聞いてみたいと思います。 (またはAerospike Node.jsクライアントに関するその他のフィードバック)

+0

ありがとう、@ jan-heckingは試してみる – TStu