Implementing NoSql with Anson¶
This is a way of persisting unstructured data with a relational database. For general idea of NoSql & pros and cons, see [1].
Save
To persist a structured object in to database, e.g. to insert / update a db field, text type for sqlite, simply set an instance of sub-class of AnDbField with nv().
T_PhotoCSS anson = new T_PhotoCSS(w, h);
st.insert("a_funcs")
.nv("funcId", "a01")
.nv("funcName", anson)
.nv("uri", ExprPart.constStr(null))
.commit(sqls);
// The object anson is serialized to a string value.
assertEquals(
"insert into a_funcs (funcId, funcName, uri) values ('a01', '{\"type\": \"io.odysz.transact.sql.parts.T_PhotoCSS\", \"size\": [4, 3]}\n', null)",
sqls.get(0));
See semantic-transact test case, AnsonFieldTest.
Load
To load an instance of Anson from db text at server side (java), use AnResultSet#<T>getAnson(). This function will deserialize the instance.
AnResultset rs = ((AnResultset) st.select("b_alarms")
.col("remarks")
.whereEq("typeId", "02-photo")
.rs(s0) // commit query
.rs(0)) // results[0]
.nxt(); // row 1
T_PhotoCSS anson = rs.<T_PhotoCSS>getAnson("remarks");
assertEquals(16, anson.w());
assertEquals( 9, anson.h());
See Semantic-DA test case, method DASemantextTest::testAnsonField.
To convert a JSON string to object at client in typescript with tslint support, use Protocol.registerFactory().
class Profiles extends AnsonBody {
home: string;
maxUsers: number;
servtype: number;
constructor (obj: { servtype: number; maxUsers: number; home: string }) {
super( { type: 'io.oz.album.tier.Profiles' } );
this.home = obj.home;
this.maxUsers = obj.maxUsers;
this.servtype = obj.servtype;
}
}
Protocol.registerBody('io.oz.album.tier.Profiles', (jsonBd) => { return new Profiles(jsonBd); });
See Anclient test case, admin-tier.ts class Profiles.
Reference¶
[1] IBM, What is a NoSQL database?, Retrieved on Aug 2, 2023.