EWD 3
トレーニング・コース #20
GlobalストレージのJavaScript用の抽象化
(a) DocumentNodeオブジェクト
M/Gateway Developments Ltd.
Rob Tweed
訳: 日本ダイナシステム株式会社 嶋 芳成
基本コンセプト
2016/9/11 EWD 3 トレーニング・コース #20 2
グローバルを表現する階層図
2016/9/11 EWD 3 トレーニング・コース #20 3
myGlobal("a")=123
myGlobal("b","c1")="foo"
myGlobal("b","c2")="foo2"
myGlobal("d","e1","f1")="bar1"
myGlobal("d","e1","f2")="bar2"
myGlobal("d","e2","f1")="bar1"
myGlobal("d","e2","f2")="bar2"
myGlobal("d","e2","f3")="bar3"
myGlobal
"a" 123
"b"
"c1" "foo"
"c2" "foo2"
"d"
"e1"
"e2"
"f1" "bar1"
"f2" "bar2"
"f1" "bar1"
"f2" "bar2"
"f3" "bar3"
2016/9/11 EWD 3 トレーニング・コース #20 4
Global節の木構造とJavaScriptオブジェクトと
の1対1の対応
myGlobal("a")=123
myGlobal("b","c1")="foo"
myGlobal("b","c2")="foo2"
myGlobal("d","e1","f1")="bar1"
myGlobal("d","e1","f2")="bar2"
myGlobal("d","e2","f1")="bar1"
myGlobal("d","e2","f2")="bar2"
myGlobal("d","e2","f3")="bar3"
myGlobal = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
e1: {
f1: 'bar1',
f2: 'bar2'
}
e2: {
f1: 'bar1',
f2: 'bar2',
f3: 'bar3'
}
}
}
2016/9/11 EWD 3 トレーニング・コース #20 5
Global節とJavaScriptオブジェクトとの1対1の対応
myGlobal("a")=123
myGlobal("b","c1")="foo"
myGlobal("b","c2")="foo2"
myGlobal("d","e1","f1")="bar1"
myGlobal("d","e1","f2")="bar2"
myGlobal("d","e2","f1")="bar1"
myGlobal("d","e2","f2")="bar2"
myGlobal("d","e2","f3")="bar3"
myGlobal = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
e1: {
f1: 'bar1',
f2: 'bar2'
}
e2: {
f1: 'bar1',
f2: 'bar2',
f3: 'bar3'
}
}
}
添え字 プロパティ
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20 6
Global節とJavaScriptオブジェクトとの1対1の対応
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20 7
Global節とJavaScriptオブジェクトとの1対1の対応
しかし...
JavaScriptオブジェクトはメモリー上にあり、グローバ
ル節はディスク上にあり永続的です
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20 8
Global節とJavaScriptオブジェクトとの1対1の対応
グローバル節の抽象化を、永続的なJavaScriptオブ
ジェクトにすることができるでしょうか?
ewd-document-store
• Globalストレージの JavaScript 用抽象化
https://github.com/robtweed/ewd-document-store
• 基本的な cache.node API の上に搭載されます
2016/9/11 EWD 3 トレーニング・コース #20 9
ewd-document-store
• Globalストレージの JavaScript 用抽象化
https://github.com/robtweed/ewd-document-store
• 基本的な cache.node API の上に搭載されます
• ewd-xpress のワーカーの中に自動的に読み込まれます
2016/9/11 EWD 3 トレーニング・コース #20 10
ewd-document-store
• Globalストレージの JavaScript 用抽象化
https://github.com/robtweed/ewd-document-store
• 基本的な cache.node API の上に搭載されます
• ewd-xpress のワーカーの中に自動的に読み込まれます
• ewd-xpress 内では this.documentStoreでアクセスでき
ます
2016/9/11 EWD 3 トレーニング・コース #20 11
ewd-document-store
• Globalストレージの JavaScript 用抽象化
https://github.com/robtweed/ewd-document-store
• 基本的な cache.node API の上に搭載されます
• ewd-xpress のワーカーの中に自動的に読み込まれます
• ewd-xpress 内では this.documentStoreでアクセスでき
ます
• テストとデバッグのために、それだけ(スタンドアロン)でも利用可
能です
2016/9/11 EWD 3 トレーニング・コース #20 12
ewd-document-store
• Globalストレージの JavaScript 用抽象化
• テストの枠組みの中で用いる
• 次のサンプルを見てください
c:ewd3node_modulesewd-qoper8-cahcenode_modulesewd-
document-storelibtestsCacheStandalone.js
2016/9/11 EWD 3 トレーニング・コース #20 13
CacheStandalone.js を編集する
var DocumentStore = require('ewd-document-store');
var interface = require('cache');
var db = new interface.cache();
console.log('db: ' * JSON.stringify(db));
//次のパラメータをあなたのCachéシステムに合わせて変更してください
var ok = db.open({
path: '/opt/cache/mgr',
username: '_SYSTEM',
password: 'SYS',
namespace: 'USER'
});
console.log('ok: ' + JSON.stringify(ok));
var documentStore = new DocumentStore(db);
console.log(db.version());
var rob = new documentStore.DocumentNode('rob');
2016/9/11 EWD 3 トレーニング・コース #20 14
CacheStandalone.js を編集する
var DocumentStore = require('ewd-qoper8-cache/node_modules/ewd-document-store');
var interface = require('cache');
var db = new interface.cache();
console.log('db: ' * JSON.stringify(db));
//次のパラメータをあなたのCachéシステムに合わせて変更してください
var ok = db.open({
path: 'c:InterSystemsCache2015-2mgr',
username: '_SYSTEM',
password: 'SYS',
namespace: 'USER'
});
console.log('ok: ' + JSON.stringify(ok));
var documentStore = new DocumentStore(db);
console.log(db.version());
var rob = new documentStore.DocumentNode('rob');
2016/9/11 EWD 3 トレーニング・コース #20 15
c:ewd3docStoreTest.js として保存
var DocumentStore = require('ewd-qoper8-cache/node_modules/ewd-document-store');
var interface = require('cache');
var db = new interface.cache();
console.log('db: ' * JSON.stringify(db));
//次のパラメータをあなたのCachéシステムに合わせて変更してください
var ok = db.open({
path: 'c:InterSystemsCache2015-2mgr',
username: '_SYSTEM',
password: 'SYS',
namespace: 'USER'
});
console.log('ok: ' + JSON.stringify(ok));
var documentStore = new DocumentStore(db);
console.log(db.version());
var rob = new documentStore.DocumentNode('rob');
2016/9/11 EWD 3 トレーニング・コース #20 16
実行する
cd ewd3
node docStoreTest
2016/9/11 EWD 3 トレーニング・コース #20 17
実行する
cd ewd3
node docStoreTest
• これで、DocumentNodeオブジェクトを用いた一連
のサンプルを実行します
• これを、あなたのテスト用の基本的な枠組みとして利
用することができます
2016/9/11 EWD 3 トレーニング・コース #20 18
あなたのテストの枠組みに合わせてください
var DocumentStore = require('ewd-qoper8-cache/node_modules/ewd-document-store');
var interface = require('cache');
var db = new interface.cache();
var ok = db.open({
path: 'c:InterSystemsCache2015-2mgr',
username: '_SYSTEM',
password: 'SYS',
namespace: 'USER'
});
var documentStore = new DocumentStore(db);
// ここ先をすべて削除して置き換えてください
// documentStore を用いると、あなたのデータベースへの抽象化されたインターフェースが利用できます
// これを用いて、この後のサンプルを試してください
// this.documentStore を、documentStrore に置き換えるだけです
2016/9/11 EWD 3 トレーニング・コース #20 19
DocumentNode オブジェクト
2016/9/11 EWD 3 トレーニング・コース #20 20
DocumentNode オブジェクト
var dnode = new documentStore.DocumentNode(name, subscripts);
スタンドアロンのテストの枠組みを用いるとき
2016/9/11 EWD 3 トレーニング・コース #20 21
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode(name, subscripts);
ewd-xpres を用いるとき
2016/9/11 EWD 3 トレーニング・コース #20 22
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode(name, subscripts);
document storeの階層構造の中の1つの節(ノード)を表します
この時点では、それが物理的に存在するかどうかは分かりません
すなわち、これは節(ノード)を生成しません
2016/9/11 EWD 3 トレーニング・コース #20 23
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode(name, subscripts);
document storeの階層構造の中の1つの節(ノード)を表します
この時点では、それが物理的に存在するかどうかは分かりません
すなわち、これは節(ノード)を生成しません
その節を表すオブジェクトのインスタンスと、その節を操作しアクセスす
るための、それに付随する一群のメソッドとプロパティを生成します
2016/9/11 EWD 3 トレーニング・コース #20 24
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
2016/9/11 EWD 3 トレーニング・コース #20 25
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
2016/9/11 EWD 3 トレーニング・コース #20 26
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
取得: var x = dnode.value;
2016/9/11 EWD 3 トレーニング・コース #20 27
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
取得: var x = dnode.value;
value は読み書きできるプロパティです
2016/9/11 EWD 3 トレーニング・コース #20 28
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
取得: var x = dnode.value;
削除: dnode.delete();
2016/9/11 EWD 3 トレーニング・コース #20 29
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
取得: var x = dnode.value;
削除: dnode.delete();
注意: delete は、操作中の Globalストレージの木構造の中の、この節の下に
付いている DocumentNode もすべて一緒に削除します
2016/9/11 EWD 3 トレーニング・コース #20 30
DocumentNode オブジェクト
var dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成: dnode.value = 'foo2';
取得: var x = dnode.value;
削除: dnode.delete();
存在? var exists = dnode.exists; // true|false
2016/9/11 EWD 3 トレーニング・コース #20 31
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
2016/9/11 EWD 3 トレーニング・コース #20 32
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
dnode.hasChildren // true
dnode.hasValue // false
dnode.exists // true
2016/9/11 EWD 3 トレーニング・コース #20 33
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d', 'e2']);
dnode.hasChildren // true
dnode.hasValue // false
dnode.exists // true
2016/9/11 EWD 3 トレーニング・コース #20 34
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d', 'e2', 'f3']);
dnode.hasChildren // false
dnode.hasValue // true
dnode.exists // true
2016/9/11 EWD 3 トレーニング・コース #20 35
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d', 'e2', 'f4']);
dnode.hasChildren // false
dnode.hasValue // false
dnode.exists // false
その節が物理的に存在しなくても、それに対応する DocumentNodeオブジェクトは定義可能です
2016/9/11 EWD 3 トレーニング・コース #20 36
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d', 'e2', 'f3']);
dnode.name // f3 節の名前 === グローバルの最後の添字 です
dnode.parent // myDoc("d","e2")
これは DocumentNode オブジェクトを返します
2016/9/11 EWD 3 トレーニング・コース #20 37
Global節とJavaScriptオブジェクト
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1")="bar1"
myDoc("d","e1","f2")="bar2"
myDoc("d","e2","f1")="bar1"
myDoc("d","e2","f2")="bar2"
myDoc("d","e2","f3")="bar3"
var dnode = new this.documentStore.DocumentNode('myDoc', ['d', 'e2']);
dnode.firstChild // myDoc("d","e2","f1")
dnode.lastChild // myDoc("d","e2","f3")
dnode.previousSibling // myDoc("d","e1")
dnode.nextSibling // undefined
2016/9/11 EWD 3 トレーニング・コース #20 38
DocumentNode
オブジェクト
DocumentNode オブジェクト
• これについては、このコースのこれ以降のパートでさらに
説明します
• さらに詳細については、以下を参照してください
http://gradvs1.mgateway.com/download/ewd-document-store.pdf
2016/9/11 EWD 3 トレーニング・コース #20 39

EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト