Data Management 3: Bulletproof Data Management
Post on 25-Jul-2015
155 Views
Preview:
Transcript
Buzz MoschettiEnterprise Architect
buzzmoschettimongodbcombuzzmoschetti
BulletproofData Management
2
Part 3 In The Data Management Series
Validating Data
Software Best Practices
Safe Leverage
From RelationalTo MongoDB
ConqueringData Proliferation
BulletproofData Management
ccedilΩ
Part1
Part2
Part3
3
Congratulations At this Point Yoursquove
bull Created a Data Designbull Migrated Databull Built a PoC or maybe an Appbull Explored Operations
4
The Next Stage Defend amp Leverage
bull Document Validationbull Redactionbull Quality Of Service
5
MongoDB Doesnrsquot Have These Things
bull Document Validationbull Redactionbull Quality Of Service
YET^
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
2
Part 3 In The Data Management Series
Validating Data
Software Best Practices
Safe Leverage
From RelationalTo MongoDB
ConqueringData Proliferation
BulletproofData Management
ccedilΩ
Part1
Part2
Part3
3
Congratulations At this Point Yoursquove
bull Created a Data Designbull Migrated Databull Built a PoC or maybe an Appbull Explored Operations
4
The Next Stage Defend amp Leverage
bull Document Validationbull Redactionbull Quality Of Service
5
MongoDB Doesnrsquot Have These Things
bull Document Validationbull Redactionbull Quality Of Service
YET^
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
3
Congratulations At this Point Yoursquove
bull Created a Data Designbull Migrated Databull Built a PoC or maybe an Appbull Explored Operations
4
The Next Stage Defend amp Leverage
bull Document Validationbull Redactionbull Quality Of Service
5
MongoDB Doesnrsquot Have These Things
bull Document Validationbull Redactionbull Quality Of Service
YET^
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
4
The Next Stage Defend amp Leverage
bull Document Validationbull Redactionbull Quality Of Service
5
MongoDB Doesnrsquot Have These Things
bull Document Validationbull Redactionbull Quality Of Service
YET^
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
5
MongoDB Doesnrsquot Have These Things
bull Document Validationbull Redactionbull Quality Of Service
YET^
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
6
What Can We Do Today
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
Write Some Code
1 Focus on interfaces2 Design for change3 Keep application data access layer
data management logic and database io well-factored
4 Minimize compile-time binding
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
8
Starting Point The Data Access Layer
MongoDBJava Driver
Data Access Layer
Application
class DataAccessLayer private String authenicatedID private String effectiveID private Role role
init() MongoClient mc = new MongoClient (args) DB db = mcgetDB(args)
List getTransactions(Map predicate) Map mql = doWhateverYouNeed(predicate)
DBCollection coll = dbget(ldquoTXrdquo) DBCursor c = collfind(mql)
while(chasNext()) Map raw = (Map) cgetNext() Map morphed = myMorphingLogic(raw) listadd(morphed) return list
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
9
Document Validation
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
10
A Query Filters Outbound Data
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
11
How About Using It To Filter Inbounds
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
12
$exists And $type Already in MQL
ldquonamerdquo$type2
$or[ldquoagerdquo$existsfalse ldquoagerdquo$type16 ]
$and [ $name $type2 $or[ $and[weightrdquo$type16 height$type16] $and[weightrdquo$exists0 height$exists0] ]])
Ensure ldquonamerdquo exists (because not null) and is a string
ldquoagerdquo optional but if exists must be a 32bit integer
ldquonamerdquo required as string and weight and height both required integers or both not present
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
13
hellip And MQL Goes Way Beyondhellip
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
14
A New MQL Validator Module Emerges
class MQLValidator ValidationResult validate(Map MQL Map data)
MongoDBJava Driver
Data Access Layer
Application
Validator NOT inline to MongoDB driverbull Interface too big to create a faccediladebull Beware of ldquotall stacksrdquo
MQLValidator
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
15
MongoDBDB Engine
Migrating Capability into MongoDB
MongoDBJava Driver
MQLValidatorJava
Data Access Layer
MongoDBDB Engine
MongoDBJava Driver
MQLValidator
JavaData Access
Layer
bull Coming in v32bull Investment in validation design preservedbull Validation enforceable through ALL drivers
and languages
MongoDBPython Driver
Application Application
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
16
Code For The FuturehellipToday
class DataAccessLayer
someWriteOperation(Map data)
if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else Map mql = getMQL() wersquoll see this shortly $or[ldquoagerdquo$existsfalse ldquoagerdquo$type16] ValidationResult vr = MQLValidatorvalidate(mqldata) if(vrok()) collectioninsert(data)
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
17
But What About Today
MQLValidator
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
18
Temporary Filling PQL
bull (P)refix (Q)uery (L)anguagebull Database independent filter of Mapsbull Similar to MQLbull 450 lines of Javabull moschettiorgrantsPQLhtml
PQL
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
19
Bridge MQL to PQL
class MQLValidator private PQLFilter pqlfilter
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else Map pqlfilter = convertMQLtoPQL(mql) or[ldquonullrdquo ldquoagerdquo ldquotyperdquo ldquoagerdquo ldquoINTrdquo] rc = pqlfiltereval(pql data) return rc Map convertMQLtoPQL(Map mql) ~200 lines
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
20
No PQL No Problem
class MQLValidator
validate(Map mql Map data) boolean rc if(MQLValidationAvailableAsLibrary) rc = ActualMongoDBMQLvalidate(mql data) else SomeType yo = convertMQLtoYourThing(mql) rc = YourFilter(yo data) return rc SomeType convertMQLtoYourThing(Map mql)
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
21
MQL Is Easy To Navigate
$or[ $and[ ldquonamerdquo $type2 ldquonumCluesrdquo $gt 0 ldquonumCluesrdquo$type16 ldquobirthdayrdquo $type 9 ldquohiredaterdquo $type 9 $or [ldquoprefsrdquo$existsfalse ldquoprefsrdquo$type3 ] ] ldquonamerdquo $existsfalse ]
bull ldquoWalkrdquo not ldquoparserdquobull Operators distinct from operandsbull Operands are native type (eg Date)
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
22
Where Do Validations Come From
The Database
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
23
The Validations Collection
gt dbvalidationsfind() ldquocollectionNamerdquo ldquoproductrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo __$or[ldquoagerdquo__$existsfalse ldquoagerdquo__$type16 ] ] ldquocollectionNamerdquo ldquotransactionrdquo ldquovalidationsrdquo [ ldquonamerdquo ldquofrontOfficerdquo ldquotyperdquo ldquoMQLrdquo ldquoexprrdquo hellip lots of MQL here hellip ]
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
24
Various ldquoLevelsrdquo of Validation
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquodefaultValidationrdquo ldquoinitialSetuprdquo ldquovalidationsrdquo [ ldquonamerdquo ldquoinitialSetuprdquo hellip ldquonamerdquo ldquofrontOfficerdquo hellip ldquonamerdquo ldquomiddleOfficerdquo hellip ldquonamerdquo ldquobackOfficerdquo hellip ]
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
25
Multiple Types Schema By Example
gt dbvalidationsfind() ldquocollectionNamerdquo ldquofoordquo ldquovalidationsrdquo [ ldquonamerdquo ldquosimplerdquo ldquotyperdquo ldquoSBErdquo ldquoexprrdquo ldquonamerdquo ldquostringrdquo ldquoagerdquo ldquointegerrdquo ldquopetNamesrdquo [ ldquostringrdquo ] ldquobdayrdquo ldquodaterdquo ]
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
26
The Stack So Far
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
ValidatorDBUtils populates an MQLValidator object from MongoDB
PQLFilter
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
27
Representative Example
class DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) dbvalidations
someWriteOperation(Map data) if(ValidationEnabledInMongoDBengine) collectioninsert(data) Not yet else String vn = ldquoappropriateValidationRulesNamerdquo ValidationResult vr = vvvalidate(collname vn data)) if(vrok()) collectioninsert(data)
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
28
Redaction
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
29
Concept Post Query Operations (PQO)
ssn $hash model birthdate null
$and[ldquonamerdquordquobuzzrdquoldquoprefsrdquo$existstrue]
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
30
Adopt MQL-like behavior
ldquossnrdquonull
ldquoaddressrdquo ldquoXXXXrdquo
ldquossnrdquo $substitute ldquossnmodelrdquo
Remove field by setting to null
Redact address with fixed value
Substitute SSN with a different correct consistent value
ldquocounterpartyrdquo $hash ldquoMD5rdquo
Hash counterparty name to consistent value
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
31
A New PostQuery Module Emerges
class PostQuery process(Map data Map operations)
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
32
Where Do PQOs Come From
The Database
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
33
The Postquery Collection
gt dbpostqueryfind() ldquocollectionNamerdquo ldquoproductrdquo ldquooperationsrdquo [ ldquonamerdquo ldquobasicPIrdquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo ldquossnrdquonull ] ldquocollectionNamerdquo ldquocustomerIndordquo ldquooperationsrdquo [ ldquonamerdquo ldquopersonalDatardquo ldquotyperdquo ldquoPQOrdquo ldquoexprrdquo hellip lots of PQO here hellip ]
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
34
The Stack Is Getting Rich
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
35
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db)
someWriteOperation(Map data) hellip
someReadOperation(Map pred) Map mql = convertToMQL(pred) Map data = collectionfind(mql) String pqon = mapRoleToRulesName() ppprocess(collname pqon data) in place update return data
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
36
Quality of Service
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
37
QOS In Action
class DataAccessLayer someReadOperation(Map pred) if(qosblackout(ldquosomeReadOperationrdquo)) throw QOSOperationDenied
Map mql = convertToMQL(pred) int ms = qosgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxTime(msTimeUnitMILLISECONDS) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
38
Where Do We Store QOS Values
The Database
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
39
The QOS Collection
gt dbqosfind() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquostdrdquo ldquomaxtimerdquo 250
ldquofunctionrdquo ldquosomeReadOperationrdquo ldquorulerdquo ldquoreportingrdquo ldquoblackoutrdquo ldquostartrdquo ldquo0800rdquo ldquoendrdquo ldquo1700rdquo ldquomaxtimerdquo 2000 ldquo hellip rdquo ]
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
40
QOSDBUtils
Coming Togetherhellip
PostQuery
MongoDBJava Driver
MQLValidator
Data Access Layer
Application
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
41
Representative Exampleclass DataAccessLayer MQLValidator vv = new MQLValidator() NOT DB dependent PostQuery pp = new PostQuery() QOS qs = new QOS()
init() DB db = mongoClientgetDB( rdquomydb ) ValidatorDBUtilspopulate(vv db) PQODBUtilspopulate(pp db) QOSDBUtilspopulate(qs db)
someReadOperation(Map pred) Map mql = convertToMQL(pred) String role = getRole() somehow int maxms = qsgetMaxTime(ldquosomeReadOperationrdquo role) Map data = collectionfind(mql)maxtTime(maxms tu) String pqon = ldquoappropriatePQORulesNamerdquo ppprocess(collname pqon data) in place update return data
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
42
QOSDBUtils
A Highly Leveragable Investment
PostQuery
MQLValidator
Data Access Layer 1
Application1
ValidatorDBUtils
PQLFilter
PQODBUtils
QOS
Application2
Data Access Layer 2
Application3
Application4
Data Access Layer 3
Application5
Application6Reusable For ALL Data Access Layer Logic
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
43
Not Just Java Not A Problem
DAL operations have little or no statehellip
Data and MQL and diagnostics easily and losslessly converted to and from JSONhellip
Can you say hellip Web Service
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
44
A Really Nice Stack
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorDBUtils
PQLFilter
HTTP Endpoint
pythonApplication
curl
JSON over HTTP(S)
JSONlt-gtJava Maps
QOSDBUtils
PostQuery
PQODBUtils
QOS
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
45
What Can We Do
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
46
Secure Access To Redacted Data for Testing
$ curl ndasho contactsjson -H X-Portal-IdtestID -H X-Portal-PWthePassword httpsrefdata8080customersop=findamppredicate=lsquoldquonamelastrdquo ldquoJonesrdquorsquo
$ head -1 contactsjson ldquonamerdquo ldquofirstrdquordquoBobrdquo ldquolastrdquordquoJonesrdquo ldquolocationrdquordquoNA-EASTrdquo ldquossnrdquo ldquo000-00-0000rdquo ldquohiredaterdquo ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquo
$ mongoimport ndash-host testHost ndashd testdb ndashc contacts contactsjson15 items inserted
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
47
Get It Programmatically Too
This JSON parser observes MongoDB type metadata conventions eg ldquo$daterdquo ldquo2015-04-22T170454580-0400rdquoimport commongodbutilJSON
getData() String url = httpsrefdata8080customershelliprdquo URLConnection con = new URL(url)openConnection() InputStream response = congetInputStream() BufferedReader in = new BufferedReader(response)
String doc while((doc = inreadLine()) = null) Map data = JSONparse(doc) datassn = ldquo000-00-0000rdquo datehiredate = javautilDate 2015-04 hellip datanamefirst = ldquoBobrdquo
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
48
Robust Validated Data Ingest
$ curl ndashd tradesjson -H X-Portal-Idprodadm -H X-Portal-PWthePassword httpsrefdata8080tradesop=load -o responsejson
$ cat responsejson ldquoassignedBatchIDrdquo ldquoB123rdquo ldquonumItemsExaminedrdquo 13245 ldquonumItemsInsertedrdquo 13242 ldquonumItemsRejectedrdquo 3 ldquoerrorsrdquo [ type ldquovalfailrdquo rule ldquofront hellip ] ldquobatchMD5rdquo ldquoe19c1283c925b3206685ff522acfe3e6rdquo
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
49
Concept The control_ Collection
gt show collectionsbookscontrol_customerfirmsgt dbcontrol_find() ldquocollectionNamerdquo ldquoproductrdquo ldquoqosrdquo [ hellip ] ldquovalidationsrdquo [ hellip ] ldquooperationsrdquo [hellip ]
bull Single namespace for capabilitiesbull Easier to add new capabilitiesbull Tighter (therefore better) securityentitlement
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
50
Validation QOS and PQO via Web Services
MongoDBJava Driver
MQLValidator
Data Access Layer
JavaApplication
ValidatorHTTPUtils
PQLFilter
pythonApplication
curl
JSON over HTTP(S)
QOSHTTPUtils
PostQuery
PQOHTTPUtils
QOS
HTTP Service
JSONlt-gtJava Maps
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
51
Are We Excited Yet
Contact me or MongoDB forbull Beta program for 32 featuresbull Access to MQLValidator PQO
and other Java resources
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
Questions amp Answers
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
54
Concept DataProvider
public interface DataProvider init() fetch(String collection Map mql) insert(String collection Map data) update(String collection Map mql Map newData)
Class MongoProvider implements DataProvider hellip
Class RESTfulProvider implements DataProvider hellip
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
55
The RESTful Provider
class RESTfulProvider implements DataProvider init() setup HTTP machineport endpoint
fetch(String collection Map mql) String jsonstr = JSONUtilstoJSON(mql) String url = construct(collection jsonstr)
url is httpmachineportcollectionNameop=findampmql=lsquoldquoproductrdquordquocleanserrdquordquoexpiresrdquo $gt $date ldquo20200101rdquorsquo
HTTPResponse res = call(url) Map data = JSONUtilsfromJSON(resgetContent())
- Slide 1
- Part 3 In The Data Management Series
- Congratulations At this Point Yoursquove
- The Next Stage Defend amp Leverage
- MongoDB Doesnrsquot Have These Things
- What Can We Do Today
- Write Some Code
- Starting Point The Data Access Layer
- Document Validation
- A Query Filters Outbound Data
- How About Using It To Filter Inbounds
- $exists And $type Already in MQL
- hellip And MQL Goes Way Beyondhellip
- A New MQL Validator Module Emerges
- Migrating Capability into MongoDB
- Code For The FuturehellipToday
- But What About Today
- Temporary Filling PQL
- Bridge MQL to PQL
- No PQL No Problem
- MQL Is Easy To Navigate
- Where Do Validations Come From
- The Validations Collection
- Various ldquoLevelsrdquo of Validation
- Multiple Types Schema By Example
- The Stack So Far
- Representative Example
- Redaction
- Concept Post Query Operations (PQO)
- Adopt MQL-like behavior
- A New PostQuery Module Emerges
- Where Do PQOs Come From
- The Postquery Collection
- The Stack Is Getting Rich
- Representative Example (2)
- Quality of Service
- QOS In Action
- Where Do We Store QOS Values
- The QOS Collection
- Coming Togetherhellip
- Representative Example (3)
- A Highly Leveragable Investment
- Not Just Java Not A Problem
- A Really Nice Stack
- What Can We Do
- Secure Access To Redacted Data for Testing
- Get It Programmatically Too
- Robust Validated Data Ingest
- Concept The control_ Collection
- Validation QOS and PQO via Web Services
- Are We Excited Yet
- Questions amp Answers
- Slide 53
- Concept DataProvider
- The RESTful Provider
top related