資料 - InterSystems

強化されたJSONインターフェース
について
インターシステムズジャパン株式会社
テクニカルコンサルティング部
上級コンサルタント
皆本 稔彦
JSONについて
•
•
•
•
•
•
•
JavaScript Object Notation
スマホなどのモバイルデバイスにて使用
FHIRなど医療分野でも使用されるようになる
動的なオブジェクト
{
バインディング不要
"name" : "John Smith",
"address" : {
自由度が高い
"streetAddress": "21 2nd Street",
軽量
"city" : "New York",
"state" : "NY",
"postalCode" : 10021
},
"phone" : [
{ "home": "212 555-1234" },
{ "fax": "646 555-4567" }
]
}
1
インターシステムズの取り組み
• %ZEN.Auxiliary.jsonProvider
– JSONパーサー
– COSによる実装
– 特定のクラスか%ZEN.proxyObjectのインスタンスを生成する
• %ObjectToJSON,%ArrayToJSON,
%WriteJSONfromSQL,%WriteJSONfromObjectメソッド
– 解析可能な構造であればJSONとして出力可能
2
新JSON APIの目標
• 高速化
• 機能の向上
• 利便性の向上
3
JSON APIの高速化
• パーサーをカーネル内で行うように変更
• 文字列からオブジェクトへの変換方法を改良
• メモリ使用量を減らす
4
パフォーマンス
5
パフォーマンス
6
機能の向上
• JSON文字列を%Object,%Arrayの構造に変換
• %Object、%Arrayオブジェクト
– スキーマレス
– メモリでのダイナミックディスパッチ
– $Listに似た配列ベースのフォーマット
• 最大文字列長なし
• イテレーター不要(直接該当番号に飛べるようインデックスが作成されている)
• スパース配列
– メモリーフォーマットとディスク上のストレージ形式に近づける
• %ZEN.proxyObject は%Objectインターフェースを使用
7
利便性の向上
• システムメソッドの追加
– $メソッド名
• Javascriptシンタックスをサポート
Set array=[ 1,2,3,4 ]
Set array=[ 1,x,y*2,"string",x_","_y ]
Set object={ "forename":"Joe",surname:"Blogs" }
8
Javascriptシンタックスの使用方法
• 単純な配列の設定
大括弧を使用
set array = [ 1,2,3,4 ]
• オブジェクトの設定
中括弧を使用
set obj = { "Name":"皆本", "Gender":"M" }
• 変数値や表現式を指定
set obj = { "Name":"Tシャツ", "Amount": 3, "Total":unit*3 }
• 複雑な形式も指定可能
set obj = { "customer":"鈴木", "order": [
{"name":"Tシャツ", "amount":3 },
{"name":"ズボン","amount":2 } ] }
9
代入した変数値の参照方法
• 配列の値
write array
1@%Library.Array
• オブジェクトの値
write obj
2@%Library.Object
• 各要素の値の参照
do obj.$toJSON()
• 配列要素の取得
set val=array.$get(0)
• オブジェクトのプロパティ値の参照
if obj.$isDefined("customer") {
set val=obj.customer
}
10
その他のアクセス方法
• JSON形式の文字列からオブジェクトを作成
set obj = ##class(%AbstractObject).$fromJSON(stream)
• オブジェクトのプロパティ一覧
set it = obj.$getIterators()
while it.$getNext(.key,.value) {
write key,",", value,!
}
11
JSONデータの格納
• ドキュメント指向データベース
• JSONの構造をそのまま登録可能
• スキーマレス
ドキュメント
name 鈴木
address
東京都
phone
自宅 0573-11-2222
勤務先 03-2222-3333
ドキュメント
name 山田
phone
自宅 078-234-5678
mail
自宅 [email protected]
データベース
12
コレクション
• ドキュメントを格納するためのコンテナ
• ドキュメントIDで管理
• インデックスの設定が可能
患者情報コレクション
ドキュメント
name 鈴木
address 東京都
phone
自宅 0573-11-2222
勤務先 03-2222-3333
名前
インデックス
鈴木
ドキュメント
name 山田
phone
自宅 078-234-5678
mail
自宅 [email protected]
13
山田
データベース、コレクションへのアクセス
• $getDatabaseメソッドでデータベースのインスタンスを取得
set db = $SYSTEM.Document.$getDatabase()
• $getCollectionメソッドでコレクションを作成、取得
set collection = db.$getCollection(コレクション名)
14
インデックスの定義
• $createIndexメソッドでインデックスを定義
set idx = collection.$createIndex(インデックス名, インデックス定義)
• インデックス定義はJSON形式
{ "type":"map",
"key": [ ["lastname","string"],["firstname", "string"]] }
15
JSONデータの登録、更新、削除
• コレクションに対してドキュメントを追加
set doc = { "lastname":"皆本", "firstname":"稔彦", … }
set ret = collection.$insert(doc)
• ドキュメントの更新
set ret = collection.$replace(docid, doc)
• ドキュメントの削除
set ret = collection.$remove(docid)
16
ドキュメントの検索
• SQLのJSON_TABLEマクロを使用
Select * from JSON_TABLE(…) WHERE LastName='皆本'
• JSON_TABLEの記述方法
JSON_TABLE(collection,'{
"columns":[
{"column":"LastName","path":"$.lastname","type":"VARCHAR(50)"},
{"column":"FirstName","path":"$.firstname","type":"VARCHAR(50)"},
{"column":"Age","path":"$.age","type":"INTEGER"}
]
}')
17
検索例
• PGAプロゴルファーのデータベース
• ドキュメントの構造
{ "firstname":名, "lastname":姓, "country": 国籍,
"fedex":Fedexポイント, "events":参加イベント数,
"wins": 優勝数, "top10":トップ10回数
}
• SQL文
SELECT * from JSON_TABLE('PGAPlayers','
{ "columns":[
{"column":"FirstName","path":"$.firstname","type":"VARCHAR(50)"},
{"column":"LastName","path":"$.lastname","type":"VARCHAR(50)"},
{"column":"Country","path":"$.country","type":"VARCHAR(50)"},
{"column":"FeDex","path":"$.fedex","type":"INTEGER"}
]} ') order by Fedex desc
18
リリース予定
• 2015.3
• 2016.1
19
ベータバージョンとして同梱
正式版
強化されたJSONインター
フェースについて
20