Upload
kiyoshi-sawada
View
23
Download
0
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #26
Global ストレージの JavaScript 用の抽象化
(g) イベント駆動の索引管理
M/Gateway Developments Ltd.Rob Tweed
訳 : 日本ダイナシステム株式会社 嶋 芳成
GT.M 版編集 : 澤田 潔
※ 本稿オリジナルは Cache’ 向けとして編纂
2
ドキュメント保存の索引管理
• ドキュメントのノードがひとつ生成され、変更され、削除されるたびに、それに対応する索引のドキュメント・ノードを維持したいと考えるでしょう• これをモジュラー化し、自動的に呼び出すに
はどのようにしたらよいでしょうか?
2016/9/21 EWD 3 トレーニング・コース #26
3
ドキュメント保存の索引管理
• ドキュメントのノードがひとつ生成され、変更され、削除されるたびに、それに対応する索引のドキュメント・ノードを維持したいと考えるでしょう• これをモジュラー化し、自動的に呼び出すに
はどのようにしたらよいでしょうか? イベントです
2016/9/21 EWD 3 トレーニング・コース #26
4
ドキュメント保存のイベント
• 次のものが、イベントを自動的に発行します• value プロパティ ( 値をセット/変更するための
利用時 )• setDocument() メソッド ( 各ノードが生成され
たとき )• increment() メソッド• delete() メソッド
• これらを利用して、索引を管理するハンドラーを書くことができます
2016/9/21 EWD 3 トレーニング・コース #26
5
ドキュメント保存のイベント
• beforeSet• afterSet• beforeDelete• afterDelete
• 多分、これらのうち after* というイベントをよく使うことになります
2016/9/21 EWD 3 トレーニング・コース #26
6
ドキュメント保存のイベントの処理• this.documentStore.on(eventName, function(obj) {...});
•例えば :this.documentStore.on('afterSet', function(nodeObj) { // 変更されたノードについて何かをする}
2016/9/21 EWD 3 トレーニング・コース #26
7
ドキュメント保存のイベントの処理• this.documentStore.on(eventName, function(obj) {...});
•例えば :this.documentStore.on('afterSet', function(nodeObj) { // 変更されたノードについて何かをする}
2016/9/21 EWD 3 トレーニング・コース #26
どのノードが変更されたかを教え、( もしあれば ) 以前に持っていた値、今持っている新しい値を教えます
8
ドキュメント保存のイベントの処理• ノード・オブジェクトの afterSet の例
{ "documentName":"CacheTempEWDSession", "path":["session","72","foo":, "before": { "value":"bar", "exists":true }, "value":"bar" }
2016/9/21 EWD 3 トレーニング・コース #26
9
ドキュメント保存のイベントの処理
{ "documentName":"CacheTempEWDSession", "path":["session","72","foo":, "before": { "value":"bar", "exists":true }, "value":"bar" }
2016/9/21 EWD 3 トレーニング・コース #26
インデックスを生成・変更する必要があるかもしれない DocumentNode を教えています
10
ドキュメント保存のイベントの処理
{ "documentName":"CacheTempEWDSession", "path":["session","72","foo":, "before": { "value":"bar", "exists":true }, "value":"bar" }
2016/9/21 EWD 3 トレーニング・コース #26
その DocumentNode に afterSet イベントが発行される以前に内容があればその内容
11
ドキュメント保存のイベントの処理
{ "documentName":"CacheTempEWDSession", "path":["session","72","foo":, "before": { "value":"bar", "exists":true }, "value":"bar" }
2016/9/21 EWD 3 トレーニング・コース #26
afterSet イベントの結果、その DocumentNode の新しい値を教えます
12
どこでドキュメント保存のイベントを処理するか?
• アプリケーション特有のバックエンドのハンドラー・モジュール• そのオプションの init() 関数
• もしそのモジュール内で定義するなら、この関数はそのモジュールがワーカー・プロセスにより最初に読み込まれたときに呼び出されます
• この関数内に必要なハンドラーを定義することができます
• そのアプリケーション・モジュール内で、索引を作りたいドキュメントの名前をフィルタ ( 選択 ) することができます
2016/9/21 EWD 3 トレーニング・コース #26
13
ドキュメント保存のイベントを処理する• 例えば、 ~/ewd3/node_modules/demo1.js では :
module.exports = { init: function() { this.documentStore.on('afterSet', function(docNode) { console.log('*** afterSet event triggered by ' + JSON.stringify(docNode)); }); }, handlers: { testButton: function(messageObj, session, send, finished) { session.data.$('foo').value = 'bar'; send({ type: 'intermediate', foo: 'bar', date: new Date().toString() }), finished({ ok: 'testButton message was processed successfully!' }); } }; }
2016/9/21 EWD 3 トレーニング・コース #26
14
ドキュメント保存のイベントを処理する• 例えば、 ~/ewd3/node_modules/demo1.js では :
module.exports = { init: function() { this.documentStore.on('afterSet', function(docNode) { if (docNode.documentName === 'myDoc') { // このドキュメント・ノードの以前の値を削除 // 新しい索引ノードを生成する // -- 索引のドキュメント・ノードそのものに対しても、さらにイベントを呼び出す // ことを覚えておいてください } }); }, handlers: { // その他 ... }; }
2016/9/21 EWD 3 トレーニング・コース #26