native json in the cache' objectscript 2016.*

28
Native JSON в Caché ObjectScript Тимур Сафин

Upload: timur-safin

Post on 15-Apr-2017

142 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Native json in the Cache' ObjectScript 2016.*

Native JSON вCaché ObjectScript

Тимур Сафин

Page 2: Native json in the Cache' ObjectScript 2016.*

Синтаксис JSON

0“string”

truefalsenull

“key” : “value”{}[]

Page 3: Native json in the Cache' ObjectScript 2016.*

Это – JSON

{"firstName":"John", "lastName":"Doe"}

Page 4: Native json in the Cache' ObjectScript 2016.*

Это – JSON

"employees“ : [{"firstName” : "John", "lastName“ : "Doe"},{"firstName“ : "Anna", "lastName“ : "Smith"},{"firstName“ : "Peter", "lastName“ : "Jones"}

]

Page 5: Native json in the Cache' ObjectScript 2016.*

Это – не совсем JSON

SELECT '[1, 2, "foo", null]'::json;

SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;

SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;

Page 6: Native json in the Cache' ObjectScript 2016.*

%Object и %Array

USER>set object = ##class(%Object).$new()

USER>set object.name = "Stefan Wittmann"

USER>set object.lastSeriesSeen = "Daredevil"

USER>set object.likes = "Galaxy"

Page 7: Native json in the Cache' ObjectScript 2016.*

%Object и %Array

USER>set array = ##class(%Array).$new()

USER>do array.$push(1)

USER>do array.$push("This is a string")

USER>do array.$push(object)

Page 8: Native json in the Cache' ObjectScript 2016.*

Сериализация в JSON

USER>do object.$toJSON()

{"name":"Stefan Wittmann","lastSeriesSeen":"Daredevil","likes":"Galaxy"}

USER>do array.$toJSON()

[1,"This is a string.",{"name":"Stefan Wittmann","lastSeriesSeen":"Daredevil","likes":"Galaxy"}]

Page 9: Native json in the Cache' ObjectScript 2016.*

Разбор JSONUSER>set someJSONstring = "{""firstname"":""Stefan"",""lastname"":""Wittmann""}"

USER>set consumedJSON = ##class(%AbstractObject).$fromJSON(someJSONstring)

USER>write consumedJSON.$size()2USER>write consumedJSON.$toJSON(){"firstname":"Stefan","lastname":"Wittmann"}

Page 10: Native json in the Cache' ObjectScript 2016.*

Итераторы на %Object

USER>set iter = object.$getIterator()

USER>while iter.$getNext(.key,.value) { write "key "_key_" : "_value,! }key name : Stefan Wittmannkey lastSeriesSeen : Daredevilkey likes : Galaxy

Page 11: Native json in the Cache' ObjectScript 2016.*

Итераторы на %Array

USER>set iter = array.$getIterator()

USER>while iter.$getNext(.key,.value) {write "key "_key_" : "_value,! }

key 0 : 1key 1 : This is a string.key 2 : 2@%Library.Object

Page 12: Native json in the Cache' ObjectScript 2016.*

Присваивание элемента в %Array

USER>do array.$set(10,"This is a string in a sparse array")

USER>write array.$toJSON()[1,"This is a string.",{"name":"Stefan Wittmann","lastSeriesSeen":"Daredevil","likes":"Galaxy"},null,null,null,null,null,null,null,"This is a string in a sparse array"]

Page 13: Native json in the Cache' ObjectScript 2016.*

Итератор по разреженному массиву

USER>set iter = array.$getIterator()

USER>while iter.$getNext(.key,.value) {write "key "_key_" : "_value,! }

key 0 : 1key 1 : This is a string.key 2 : 2@%Library.Objectkey 10 : This is a string in a sparse array

Page 14: Native json in the Cache' ObjectScript 2016.*

Native JSON Syntax

USER>set object = {"name":"Stefan Wittmann","lastMovieSeen":"The Martian","likes":"Writing Blogs"}

USER>write object.$toJSON(){"name":"Stefan Wittmann","lastMovieSeen":"The Martian","likes":"Writing Blogs"}USER>set array = [1,2,3,[4,5,6],true,false,null]

USER>write array.$toJSON()[1,2,3,[4,5,6],true,false,null]

Page 15: Native json in the Cache' ObjectScript 2016.*

Native JSON Syntax

USER>set object = {}

USER>set array = []

Page 16: Native json in the Cache' ObjectScript 2016.*

Native JSON Syntax

USER>set name = "Stefan"

USER>set subObject = {"nationality":"German","favoriteColors":["yellow","blue"]}

USER>set object = {"name":name,"details":subObject,"lastUpdate":$ZD($H,3)}

USER>write object.$toJSON(){"name":"Stefan","details":{"nationality":"German","favoriteColors":["yellow","blue"]}," lastUpdate ":"2016-01-31"}

Page 17: Native json in the Cache' ObjectScript 2016.*

Native JSON SyntaxUSER>set array = [1,2,3,[4,5,6],true,false,null]

USER>set iter = array.$getIterator()

USER>while iter.$getNext(.key,.value) { write "key "_key_":"_value,! } key 0:1key 1:2key 2:3key 3:5@%Library.Arraykey 4:1key 5:0key 6:

Page 18: Native json in the Cache' ObjectScript 2016.*

Native JSON Syntax

USER>set array = [1,2,3,[4,5,6],true,false,null]…USER>w array.$getTypeOf(5)booleanUSER>w array.$getTypeOf(6)null

Page 19: Native json in the Cache' ObjectScript 2016.*

Native JSON Syntax

USER>set array = [1,2,3,[4,5,6],true,false,null]…USER>do array.$set(7,1)

USER>write array.$toJSON()[1,2,3,[4,5,6],true,false,null,1]USER>do array.$set(7,1,"boolean")

USER>write array.$toJSON()[1,2,3,[4,5,6],true,false,null,true]

Page 20: Native json in the Cache' ObjectScript 2016.*

Системные методы

$new$set$push$pop$size

$compose

Page 21: Native json in the Cache' ObjectScript 2016.*

$compose

SAMPLES>set object = array.$compose("%Object")

SAMPLES>write ["zero","one","two"].$compose("%Object").$toJSON(){"0":"zero","1":"one","2":"two"}

Page 22: Native json in the Cache' ObjectScript 2016.*

$compose

SAMPLES>set person = ##class(Sample.Person).%OpenId(10)

SAMPLES>set object = person.$compose("%Object")

SAMPLES>write object.$toJSON(){"$CLASSNAME":"Sample.Person","$REFERENCE":"10","Age":46,"DOB":47058,"FavoriteColors":[],"Home":{"City":"Washington","State":"HI","Street":"4358 Franklin Place","Zip":59519},"Name":"Quincy,Neil Z.","Office":{"City":"Bensonhurst","State":"WI","Street":"8620 Clinton Drive","Zip":75074},"SSN":"966-11-9404"}

Page 23: Native json in the Cache' ObjectScript 2016.*

Result SetsSAMPLES>set result = $system.SQL.Execute("call sample.sp_sample_by_name('N')").%NextResult()

SAMPLES>write result.$toJSON(){"content":[{"DOB":"63986","ID":"189","Name":"Nathanson,Natasha T.","SSN":"439-13-7455"},{"DOB":"58420","ID":"85","Name":"Nelson,Charlotte Y.","SSN":"664-42-8486"},{"DOB":"34965","ID":"150","Name":"Noodleman,Charles Y.","SSN":"156-64-3875"},{"DOB":"39300","ID":"134","Name":"North,Ted J.","SSN":"308-14-4306"}],"metadata":{"columnCount":4,"columns":[{"ODBCType":4,"clientType":"","colName":"ID","isAliased":1,"isAutoIncrement":1,"isCaseSensitive":1,"isCurrency":0,"isExpression":0,"isHidden":0,"isIdentity":1,"isKeyColumn":1,"isNullable":0,"isReadOnly":1,"isRowId":1,"isRowVersion":0,"isUnique":1,"label":"ID","precision":10,"qualifier":"","scale":0,"schemaName":"Sample","tableName":"Person"},{"ODBCType":12,"clientType":"","colName":"Name","isAliased":1,"isAutoIncrement":0,"isCaseSensitive":0,"isCurrency":0,"isExpression":0,"isHidden":0,"isIdentity":0,"isKeyColumn":0,"isNullable":0,"isReadOnly":0,"isRowId":0,"isRowVersion":0,"isUnique":0,"label":"Name","precision":50,"qualifier":"","scale":0…

Page 24: Native json in the Cache' ObjectScript 2016.*

И это мы еще не рассказали про JSON расширения в SQL…

Page 25: Native json in the Cache' ObjectScript 2016.*

JSON & SQLLATEST:USER>set response = ##class(%Net.Http).getJSON("http://localhost:57772/api/document/v1/SAMPLES/continents",{"Username":"_SYSTEM","Password":"SYS"})

LATEST:USER>do response.$toJSON(){"collection":"continents","size":8,"content":[{"documentID":1,"documentVersion":1,"content":{"code":"NA","name":"North America"}},{"documentID":2,"documentVersion":2,"content":{"code":"SA","name":"South America"}},{"documentID":3,"documentVersion":3,"content":{"code":"AF","name":"Africa"}},{"documentID":4,"documentVersion":4,"content":{"code":"AS","name":"Asia"}},{"documentID":5,"documentVersion":5,"content":{"code":"EU","name":"Europe"}},{"documentID":6,"documentVersion":6,"content":{"code":"OC","name":"Oceana"}},{"documentID":7,"documentVersion":7,"content":{"code":"AN","name":"Antarctica"}},{"documentID":9,"documentVersion":8,"content":{}}]}

Page 26: Native json in the Cache' ObjectScript 2016.*

JSON & SQL

select code, name from JSON_TABLE(%Net.getJSON('http://localhost/api/document/v1/SAMPLES/continents','{"Username":"_SYSTEM","Password":"SYS","Port":57772}'),'$.content' columns (document varchar(2000) path '$',code varchar(2) path '$.content.code',name varchar(50) path '$.content.name')) order by name

Page 27: Native json in the Cache' ObjectScript 2016.*

Производительность

Page 28: Native json in the Cache' ObjectScript 2016.*

Производительность разбора JSON

(Each company has an average of 20

employees and 20 customers each with several

addresses)

Caché 2015.1

zenProxyObject

Caché 2016.*

Native JSON

NodeJS

0.12.2

v8: 3.28.73

Load 1000 companies JSON file

(10.8MB)

28000ms 94ms 97ms

Find how many employees called

"Robert“ (126 employees)

55ms 55ms 2ms

Load 10,000 companies JSON file

(108MB)

386700ms 904ms 892ms

Find how many employees called

"Robert" (1346 employees)

554.5ms 567ms 13ms