MongoDB receives and sends data in BSON
The driver keeps the data in the language specific datastructures
driver data --encode--> BSON
BSON --decode--> driver data
cMQL must be able to encode and decode the data in all the supported languages
- cMQL-j should encode and decode Java Documents <-> BSON (provided by the driver) Clojure maps <-> BSON (custom org.mongodb/bson implementation)
js objects <-> BSON (provided by the driver) Clojure maps <-> BSON (custom js-bson implementation)
cMQL does that directly from and to BSON,without extra transformation step for perfomance reasons. For example it doesn't convert a Clojure map to a Java Document and then to BSON. cMQL goes directly from Clojure map to BSON.
Encode in cMQL
Encode is auto-detected.If the user gives a Clojure map,encoder see it and encode accordinally.
Its auto-detected in both cMQL-j and cMQL-js.
User sets the encode methods only for other classes like when using Pojo in Java
On decode 3 things were important
- decode directly from BSON
- save the data in a form that can be used as normal clojure maps/vectors
- each query to be able to select the decode method
- cMQL-j can return Clojure(clojure-maps/vectors)/Java(java-map/arraylist) data structures
- cMQL-js can return Clojure(clojure-maps/vectors)/JS(objects/arrays)
Java default classes to used to save documents and arrays.
- Documents Java driver uses a Document class,that inside holds a LinkedHashMap
- Arrays are ArrayLists
This is done by the driver
Java Document class,that inside holds a Clojure map
Keys become keywords
- Arrays are vectors
Documents implement all Clojure interfaces and they behave like Clojure maps. There is no need to take the Clojure map from inside,they are them selves maps.
For example if doc1 is instance of a Document class,that contains inside a Clojure map i can use it as a normal Clojure map,for example i can
We only need to set the registry to be clj-registry,no need to give a return-class, in both cases the return class is a Document class.
Perfomance is very good,as like to native java.
cMQL has a modified js-bson implementation
2 Options exists for decode
For now they are separated implementations of js-bson
The reason for using bean is perfomance,clojurescript maps is >8 keys,become hashmaps and they are 2x-3x slower in creation from the js-objects
Beans are as fast as js-objects,and allows us to use the bean as if it was a normal clojure map For example we can assoc,get,map etc