EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
EWD 3トレーニングコース#20...
-
Upload
kiyoshi-sawada -
Category
Software
-
view
33 -
download
0
Transcript of EWD 3トレーニングコース#20...
EWD 3トレーニング・コース #20
Global ストレージの JavaScript 用の抽
象化 (a) DocumentNode オブジェクトM/Gateway Developments Ltd.
Rob Tweed訳 : 日本ダイナシステム株式会社 嶋 芳成
2
基本コンセプト
2016/9/11 EWD 3 トレーニング・コース #20
グローバルを表現する階層図
2016/9/11 EWD 3 トレーニング・コース #20 3
myGlobal("a")=123myGlobal("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")=123myGlobal("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")=123myGlobal("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' } }}
添え字 プロパティ
6
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20
Global 節と JavaScript オブジェクトとの 1 対1 の対応
7
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20
Global 節と JavaScript オブジェクトとの 1 対1 の対応
しかし ...
JavaScript オブジェクトはメモリー上にあり、グローバル節はディスク上にあり永続的です
8
• グローバル節
myGlobal("d","e2","f3")
• JavaScript オブジェクト
myGlobal.d.e2.f3
2016/9/11 EWD 3 トレーニング・コース #20
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:\ewd3\node_modules\ewd-qoper8-cahce\node_modules\ewd-document-store\lib\tests\CacheStandalone.js
2016/9/11 EWD 3 トレーニング・コース #20 13
14
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
15
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:\\InterSystems\\Cache2015-2\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
16
c:\ewd3\docStoreTest.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:\\InterSystems\\Cache2015-2\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
17
実行する
cd \ewd3node docStoreTest
2016/9/11 EWD 3 トレーニング・コース #20
18
実行する
cd \ewd3node docStoreTest
• これで、 DocumentNode オブジェクトを用いた一連のサンプルを実行します• これを、あなたのテスト用の基本的な枠組み
として利用することができます
2016/9/11 EWD 3 トレーニング・コース #20
19
あなたのテストの枠組みに合わせてください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:\\InterSystems\\Cache2015-2\mgr', username: '_SYSTEM', password: 'SYS', namespace: 'USER'});
var documentStore = new DocumentStore(db);
// ここ先をすべて削除して置き換えてください// documentStore を用いると、あなたのデータベースへの抽象化されたインターフェースが利用できます
// これを用いて、この後のサンプルを試してください// this.documentStore を、 documentStrore に置き換えるだけです
2016/9/11 EWD 3 トレーニング・コース #20
20
DocumentNode オブジェクト
2016/9/11 EWD 3 トレーニング・コース #20
21
DocumentNode オブジェクトvar dnode = new documentStore.DocumentNode(name, subscripts);
スタンドアロンのテストの枠組みを用いるとき
2016/9/11 EWD 3 トレーニング・コース #20
22
DocumentNode オブジェクトvar dnode = new this.documentStore.DocumentNode(name, subscripts);
ewd-xpres を用いるとき
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(name, subscripts);
document store の階層構造の中の1つの節 ( ノード ) を表します
この時点では、それが物理的に存在するかどうかは分かりません
すなわち、これは節 ( ノード ) を生成しません
その節を表すオブジェクトのインスタンスと、その節を操作しアクセスするための、それに付随する一群のメソッドとプロパティを生成します
2016/9/11 EWD 3 トレーニング・コース #20
25
DocumentNode オブジェクトvar dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
2016/9/11 EWD 3 トレーニング・コース #20
26
DocumentNode オブジェクトvar dnode = new this.documentStore.DocumentNode('myDoc', ['d','e2']);
これは、 mydoc("d","e2") を表します
生成 : dnode.value = 'foo2';
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;
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;
value は読み書きできるプロパティです
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();
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();
注意 : delete は、操作中の Global ストレージの木構造の中の、この節の下に付いている DocumentNode もすべて一緒に削除します
2016/9/11 EWD 3 トレーニング・コース #20
31
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
32
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
33
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
34
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
35
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
36
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
37
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
38
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("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
DocumentNodeオブジェクト
39
DocumentNode オブジェクト
• これについては、このコースのこれ以降のパートでさらに説明します
• さらに詳細については、以下を参照してください
http://gradvs1.mgateway.com/download/ewd-document-store.pdf
2016/9/11 EWD 3 トレーニング・コース #20