SlideShare a Scribd company logo
Copyright © 2016 M/Gateway Developments Ltd
EWD 3 Training Course
Part 21
JavaScript Abstraction of Global Storage:
(b) Persistent JavaScript Objects
Rob Tweed
Director, M/Gateway Developments Ltd
Twitter: @rtweed
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
Can we then refer to: myDoc.d.e2.f3 ?
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
Is a DocumentNode Object
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
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"
Would also have to be a DocumentNode Object
This would mean we'd have to know that the 'd' property was, or could be, a valid node
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
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"
Would also have to be a DocumentNode Object
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
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"
Would also have to be a DocumentNode Object
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
BUT: Impossible to predict or determine in advance all the
possible subscripts of a Global
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
BUT: Impossible to predict or determine in advance all the
possible subscripts of a Global
•No schema to tell us
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.d.e2.f3
BUT: Impossible to predict or determine in advance all the
possible subscripts of a Global
•No schema to tell us
•could be hundreds of thousands, or millions of subscript values
and any number of levels of hierarchy
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"
Copyright © 2016 M/Gateway Developments Ltd
var myDoc = new this.documentStore.DocumentNode( 'myDoc');
myDoc.x.value
Also: can't create properties automatically using subscript names
as these might clash with DocumentNode property or method names
as in the case above
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"
myDoc("x","value")="hello world"
Copyright © 2016 M/Gateway Developments Ltd
$() Function
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
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"
Copyright © 2016 M/Gateway Developments Ltd
$() Function
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
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"
Copyright © 2016 M/Gateway Developments Ltd
$() Function
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
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"
$():
- Returns a DocumentNode Object representing the specified sub-node
of the parent DocumentNode
Copyright © 2016 M/Gateway Developments Ltd
$() Function
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = new this.documentStore.DocumentNode('myDoc', [ 'd']);
This does the same thing, but is much more verbose
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"
Copyright © 2016 M/Gateway Developments Ltd
Chaining $() Functions
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
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"
Copyright © 2016 M/Gateway Developments Ltd
Chaining $() Functions
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
var e2Node = dNode.$('e2');
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"
Copyright © 2016 M/Gateway Developments Ltd
Chaining $() Functions
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
var e2Node = myDoc.$('d').$('e2');
Does the same thing by chaining
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"
Copyright © 2016 M/Gateway Developments Ltd
Chaining $() Functions
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
A DocumentNode represented by $d was instantiated as a property of
the myDoc DocumentNode
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
A DocumentNode represented by $d was instantiated as a property of
the myDoc DocumentNode
Now accessible as myDoc.$d
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
A DocumentNode represented by $e2 was instantiated as a property of myDoc.$d
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
A DocumentNode represented by $e2 was instantiated as a property of myDoc.$d
Now accesible as myDoc.$d.$e2
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
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"
Only need to use $() once for any specific subscript
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f2Node = myDoc.$('d').$('e2').$('f2');
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"
So we don’t need to do this
Copyright © 2016 M/Gateway Developments Ltd
$() only needs invoking once
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f2Node = myDoc.$d.$e2.$('f2');
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"
We can do this instead, provided $() has been
used previously for the specified subscript
Copyright © 2016 M/Gateway Developments Ltd
$ properties are DocumentNodes
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f3Value = f3Node.value; // bar3
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"
Copyright © 2016 M/Gateway Developments Ltd
$ properties are DocumentNodes
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f3Value = myDoc.$d.$e2.$f3.value; // bar3
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"
Copyright © 2016 M/Gateway Developments Ltd
$ properties are DocumentNodes
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
myDoc.$d.$e2.$f3.value = 'New value';
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"
Copyright © 2016 M/Gateway Developments Ltd
Persistent JavaScript Objects!
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
myDoc.$d.$e2.$f3.value = 'New value';
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")=”New value"
Updates value on disk, not an in-memory copy
"Persistent JavaScript Objects"
Copyright © 2016 M/Gateway Developments Ltd
Persistent JavaScript Objects
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")=”New value"
Not quite: myDoc.d.e2.f3
Instead: myDoc.$d.$e2.$f3
But no chance of subscript-based properties clashing with
DocumentNode property or method names by prefixing with $

More Related Content

PDF
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
PDF
EWD 3 Training Course Part 25: Document Database Capabilities
PDF
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
PPTX
Getting Started with MongoDB and NodeJS
PPTX
Webinar: Building Your First App in Node.js
PDF
Inside MongoDB: the Internals of an Open-Source Database
PDF
CouchDB on Rails
PDF
CouchDB on Rails - FrozenRails 2010
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
Getting Started with MongoDB and NodeJS
Webinar: Building Your First App in Node.js
Inside MongoDB: the Internals of an Open-Source Database
CouchDB on Rails
CouchDB on Rails - FrozenRails 2010

What's hot (20)

PDF
CouchDB on Rails - RailsWayCon 2010
TXT
Books
PDF
Look Ma, “update DB to HTML5 using C++”, no hands! 
PPTX
Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ...
PDF
20110514 mongo dbチューニング
PPTX
Back to Basics Webinar 5: Introduction to the Aggregation Framework
TXT
Agile Testing Days 2018 - API Fundamentals - postman collection
PDF
HDTR images with Photoshop Javascript Scripting
PDF
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
PDF
PPTX
Operational Intelligence with MongoDB Webinar
PDF
NoSQL meets Microservices - Michael Hackstein
PDF
Dynamic C++ Silicon Valley Code Camp 2012
PDF
Leap Ahead with Redis 6.2
PPTX
It's 10pm: Do You Know Where Your Writes Are?
PDF
Apache CouchDB talk at Ontario GNU Linux Fest
PPTX
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
PDF
Cascading Through Hadoop for the Boulder JUG
PDF
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
TXT
"><img src="x">
CouchDB on Rails - RailsWayCon 2010
Books
Look Ma, “update DB to HTML5 using C++”, no hands! 
Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ...
20110514 mongo dbチューニング
Back to Basics Webinar 5: Introduction to the Aggregation Framework
Agile Testing Days 2018 - API Fundamentals - postman collection
HDTR images with Photoshop Javascript Scripting
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
Operational Intelligence with MongoDB Webinar
NoSQL meets Microservices - Michael Hackstein
Dynamic C++ Silicon Valley Code Camp 2012
Leap Ahead with Redis 6.2
It's 10pm: Do You Know Where Your Writes Are?
Apache CouchDB talk at Ontario GNU Linux Fest
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
Cascading Through Hadoop for the Boulder JUG
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
"><img src="x">
Ad

Viewers also liked (20)

PDF
EWD 3 Training Course Part 20: The DocumentNode Object
PDF
EWD 3 Training Course Part 26: Event-driven Indexing
PDF
EWD 3 Training Course Part 18: Modelling NoSQL Databases using Global Storage
PDF
EWD 3 Training Course Part 19: The cache.node APIs
PDF
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
PDF
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
PDF
EWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
PDF
EWD 3 Training Course Part 16: QEWD Services
PDF
EWD 3 Training Course Part 30: Modularising QEWD Applications
PDF
EWD 3 Training Course Part 27: The QEWD Session
PDF
EWD 3 Training Course Part 22: Traversing Documents using DocumentNode Objects
PPT
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
PDF
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
PDF
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
PDF
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
PDF
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
PDF
EWD 3 Training Course Part 35: QEWD Session Locking
PDF
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
PDF
EWD 3 Training Course Part 13: Putting Everything so far into Practice using ...
PDF
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 20: The DocumentNode Object
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 18: Modelling NoSQL Databases using Global Storage
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
EWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
EWD 3 Training Course Part 16: QEWD Services
EWD 3 Training Course Part 30: Modularising QEWD Applications
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 22: Traversing Documents using DocumentNode Objects
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 13: Putting Everything so far into Practice using ...
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
Ad

Similar to EWD 3 Training Course Part 21: Persistent JavaScript Objects (20)

PPTX
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
PPTX
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
PDF
[CB20] DeClang: Anti-hacking compiler by Mengyuan Wan
PDF
Vhdl ppt
PDF
Building a DSL with GraalVM (CodeOne)
PDF
dojo.Patterns
PDF
LISA QooxdooTutorial Slides
PDF
An Introduction to Tinkerpop
PDF
Go 1.10 Release Party - PDX Go
PDF
All I know about rsc.io/c2go
PDF
building_games_with_ruby_rubyconf
PDF
building_games_with_ruby_rubyconf
PDF
MongoDB, Hadoop and humongous data - MongoSV 2012
PDF
LISA Qooxdoo Tutorial Handouts
PDF
Trimming The Cruft
PPTX
C#7, 7.1, 7.2, 7.3 e C# 8
PDF
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
PDF
Building a DSL with GraalVM (VoxxedDays Luxembourg)
PDF
The Ring programming language version 1.8 book - Part 53 of 202
PDF
Kotlin, smarter development for the jvm
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
[CB20] DeClang: Anti-hacking compiler by Mengyuan Wan
Vhdl ppt
Building a DSL with GraalVM (CodeOne)
dojo.Patterns
LISA QooxdooTutorial Slides
An Introduction to Tinkerpop
Go 1.10 Release Party - PDX Go
All I know about rsc.io/c2go
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
MongoDB, Hadoop and humongous data - MongoSV 2012
LISA Qooxdoo Tutorial Handouts
Trimming The Cruft
C#7, 7.1, 7.2, 7.3 e C# 8
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
Building a DSL with GraalVM (VoxxedDays Luxembourg)
The Ring programming language version 1.8 book - Part 53 of 202
Kotlin, smarter development for the jvm

More from Rob Tweed (18)

PDF
QEWD Update
PPT
Data Persistence as a Language Feature
PPT
LNUG: Having Your Node.js Cake and Eating It Too
PPT
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
PPT
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
PPT
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
PPT
QEWD.js, JSON Web Tokens & MicroServices
PPT
QEWD.js: Have your Node.js Cake and Eat It Too
PPT
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
PDF
qewd-ripple: The Ripple OSI Middle Tier
PPT
EWD 3 Training Course Part 42: The QEWD Docker Appliance
PDF
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
PDF
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
PDF
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
PDF
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
PDF
EWD 3 Training Course Part 34: QEWD Resilient Mode
PDF
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
PDF
EWD 3 Training Course Part 29: Running QEWD as a Service
QEWD Update
Data Persistence as a Language Feature
LNUG: Having Your Node.js Cake and Eating It Too
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
QEWD.js, JSON Web Tokens & MicroServices
QEWD.js: Have your Node.js Cake and Eat It Too
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
qewd-ripple: The Ripple OSI Middle Tier
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 29: Running QEWD as a Service

Recently uploaded (20)

PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
assetexplorer- product-overview - presentation
PDF
top salesforce developer skills in 2025.pdf
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Transform Your Business with a Software ERP System
PPTX
Computer Software and OS of computer science of grade 11.pptx
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Nekopoi APK 2025 free lastest update
PPTX
L1 - Introduction to python Backend.pptx
PDF
Digital Systems & Binary Numbers (comprehensive )
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Designing Intelligence for the Shop Floor.pdf
PPTX
Introduction to Artificial Intelligence
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
How to Migrate SBCGlobal Email to Yahoo Easily
Which alternative to Crystal Reports is best for small or large businesses.pdf
assetexplorer- product-overview - presentation
top salesforce developer skills in 2025.pdf
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
2025 Textile ERP Trends: SAP, Odoo & Oracle
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Transform Your Business with a Software ERP System
Computer Software and OS of computer science of grade 11.pptx
Design an Analysis of Algorithms I-SECS-1021-03
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Nekopoi APK 2025 free lastest update
L1 - Introduction to python Backend.pptx
Digital Systems & Binary Numbers (comprehensive )
Softaken Excel to vCard Converter Software.pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Designing Intelligence for the Shop Floor.pdf
Introduction to Artificial Intelligence
VVF-Customer-Presentation2025-Ver1.9.pptx
Wondershare Filmora 15 Crack With Activation Key [2025

EWD 3 Training Course Part 21: Persistent JavaScript Objects

  • 1. Copyright © 2016 M/Gateway Developments Ltd EWD 3 Training Course Part 21 JavaScript Abstraction of Global Storage: (b) Persistent JavaScript Objects Rob Tweed Director, M/Gateway Developments Ltd Twitter: @rtweed
  • 2. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); 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"
  • 3. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); Can we then refer to: myDoc.d.e2.f3 ? 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"
  • 4. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 Is a DocumentNode Object 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"
  • 5. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 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" Would also have to be a DocumentNode Object This would mean we'd have to know that the 'd' property was, or could be, a valid node
  • 6. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 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" Would also have to be a DocumentNode Object
  • 7. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 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" Would also have to be a DocumentNode Object
  • 8. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 BUT: Impossible to predict or determine in advance all the possible subscripts of a Global 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"
  • 9. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 BUT: Impossible to predict or determine in advance all the possible subscripts of a Global •No schema to tell us 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"
  • 10. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.d.e2.f3 BUT: Impossible to predict or determine in advance all the possible subscripts of a Global •No schema to tell us •could be hundreds of thousands, or millions of subscript values and any number of levels of hierarchy 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"
  • 11. Copyright © 2016 M/Gateway Developments Ltd var myDoc = new this.documentStore.DocumentNode( 'myDoc'); myDoc.x.value Also: can't create properties automatically using subscript names as these might clash with DocumentNode property or method names as in the case above 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" myDoc("x","value")="hello world"
  • 12. Copyright © 2016 M/Gateway Developments Ltd $() Function var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); 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"
  • 13. Copyright © 2016 M/Gateway Developments Ltd $() Function var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); 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"
  • 14. Copyright © 2016 M/Gateway Developments Ltd $() Function var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); 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" $(): - Returns a DocumentNode Object representing the specified sub-node of the parent DocumentNode
  • 15. Copyright © 2016 M/Gateway Developments Ltd $() Function var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = new this.documentStore.DocumentNode('myDoc', [ 'd']); This does the same thing, but is much more verbose 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"
  • 16. Copyright © 2016 M/Gateway Developments Ltd Chaining $() Functions var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); 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"
  • 17. Copyright © 2016 M/Gateway Developments Ltd Chaining $() Functions var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); var e2Node = dNode.$('e2'); 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"
  • 18. Copyright © 2016 M/Gateway Developments Ltd Chaining $() Functions var myDoc = new this.documentStore.DocumentNode('myDoc'); var dNode = myDoc.$('d'); var e2Node = myDoc.$('d').$('e2'); Does the same thing by chaining 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"
  • 19. Copyright © 2016 M/Gateway Developments Ltd Chaining $() Functions var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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"
  • 20. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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" A DocumentNode represented by $d was instantiated as a property of the myDoc DocumentNode
  • 21. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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" A DocumentNode represented by $d was instantiated as a property of the myDoc DocumentNode Now accessible as myDoc.$d
  • 22. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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" A DocumentNode represented by $e2 was instantiated as a property of myDoc.$d
  • 23. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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" A DocumentNode represented by $e2 was instantiated as a property of myDoc.$d Now accesible as myDoc.$d.$e2
  • 24. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); 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" Only need to use $() once for any specific subscript
  • 25. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); var f2Node = myDoc.$('d').$('e2').$('f2'); 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" So we don’t need to do this
  • 26. Copyright © 2016 M/Gateway Developments Ltd $() only needs invoking once var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); var f2Node = myDoc.$d.$e2.$('f2'); 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" We can do this instead, provided $() has been used previously for the specified subscript
  • 27. Copyright © 2016 M/Gateway Developments Ltd $ properties are DocumentNodes var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); var f3Value = f3Node.value; // bar3 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"
  • 28. Copyright © 2016 M/Gateway Developments Ltd $ properties are DocumentNodes var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); var f3Value = myDoc.$d.$e2.$f3.value; // bar3 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"
  • 29. Copyright © 2016 M/Gateway Developments Ltd $ properties are DocumentNodes var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); myDoc.$d.$e2.$f3.value = 'New value'; 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"
  • 30. Copyright © 2016 M/Gateway Developments Ltd Persistent JavaScript Objects! var myDoc = new this.documentStore.DocumentNode('myDoc'); var f3Node = myDoc.$('d').$('e2').$('f3'); myDoc.$d.$e2.$f3.value = 'New value'; 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")=”New value" Updates value on disk, not an in-memory copy "Persistent JavaScript Objects"
  • 31. Copyright © 2016 M/Gateway Developments Ltd Persistent JavaScript Objects 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")=”New value" Not quite: myDoc.d.e2.f3 Instead: myDoc.$d.$e2.$f3 But no chance of subscript-based properties clashing with DocumentNode property or method names by prefixing with $