Skip to content

Commit

Permalink
feat(loki): add option to disable meta property for documents added t…
Browse files Browse the repository at this point in the history
…o a collection

See techfort/LokiJS@d031e47
  • Loading branch information
Viatorus committed Mar 2, 2018
1 parent db26d02 commit a79c8d5
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 8 deletions.
13 changes: 13 additions & 0 deletions packages/loki/spec/generic/persistence.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,19 @@ describe("testing unique index serialization", () => {
});
});

describe("testing disable meta serialization", function () {
it("should have meta disabled", function () {
const db = new Loki();
db.addCollection<User>("users", { disableMeta: true });

const ser = db.serialize();
const reloaded = new Loki();
reloaded.loadJSON(ser);
const coll = reloaded.getCollection("users");
expect(coll["disableMeta"]).toEqual(true);
});
});

describe("testing destructured serialization/deserialization", () => {
it("verify default (D) destructuring works as expected", () => {
const ddb = new Loki("test.db", {serializationMethod: "destructured"});
Expand Down
18 changes: 18 additions & 0 deletions packages/loki/spec/generic/test.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,24 @@ describe("loki", () => {
users.remove(testObject as any);
expect(userCount1).toEqual(users.count());
});

it("meta not set on returned objects", function() {
const tdb = new Loki("test.db");
const coll = tdb.addCollection<{a: number, b: number}>("tc", { disableMeta: true });

// verify single insert return objs do not have meta set
const obj = coll.insert({ a: 1, b: 2 });
expect(obj.hasOwnProperty("meta")).toEqual(false);
expect(obj.hasOwnProperty("$loki")).toEqual(true);

// verify batch insert return objs do not have meta set
const objs = coll.insert([{ a: 2, b: 3 }, { a: 3, b: 4 }]);
expect(Array.isArray(objs));
objs.forEach((o) => {
expect(o.hasOwnProperty("meta")).toEqual(false);
expect(o.hasOwnProperty("$loki")).toEqual(true);
});
});
});

describe("dot notation", () => {
Expand Down
42 changes: 35 additions & 7 deletions packages/loki/src/collection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ export class Collection<TData extends object = object, TNested extends object =
*/
public cloneMethod: CloneMethod;

/**
* If set to true we will not maintain a meta property for a document.
*/
private disableMeta: boolean;

/**
* Disable track changes.
Expand Down Expand Up @@ -168,19 +172,34 @@ export class Collection<TData extends object = object, TNested extends object =
* @param {string[]} [options.indices=[]] - array property names to define binary indexes for
* @param {boolean} [options.adaptiveBinaryIndices=true] - collection indices will be actively rebuilt rather than lazily
* @param {boolean} [options.asyncListeners=false] - whether listeners are invoked asynchronously
* @param {boolean} [options.disableMeta=false] - set to true to disable meta property on documents
* @param {boolean} [options.disableChangesApi=true] - set to false to enable Changes API
* @param {boolean} [options.disableDeltaChangesApi=true] - set to false to enable Delta Changes API (requires Changes API, forces cloning)
* @param {boolean} [options.clone=false] - specify whether inserts and queries clone to/from user
* @param {boolean} [options.serializableIndices =true] - converts date values on binary indexed property values are serializable
* @param {string} [options.cloneMethod="deep"] - the clone method
* @param {number} [options.transactional=false] - ?
* @param {number} [options.ttl=] - ?
* @param {number} [options.ttlInterval=] - time interval for clearing out 'aged' documents; not set by default.
* @param {number} [options.ttl=] - age of document (in ms.) before document is considered aged/stale.
* @param {number} [options.ttlInterval=] - time interval for clearing out 'aged' documents; not set by default
* @param {FullTextSearch.FieldOptions} [options.fullTextSearch=] - the full-text search options
* @see {@link Loki#addCollection} for normal creation of collections
*/
constructor(name: string, options: Collection.Options<TData> = {}) {
super();

// Consistency checks.
if (options && options.disableMeta === true) {
if (options.disableChangesApi === false) {
throw new Error("disableMeta option cannot be passed as true when disableChangesApi is passed as false");
}
if (options.disableDeltaChangesApi === false) {
throw new Error("disableMeta option cannot be passed as true when disableDeltaChangesApi is passed as false");
}
if (typeof options.ttl === "number" && options.ttl > 0) {
throw new Error("disableMeta option cannot be passed as true when ttl is enabled");
}
}

// the name of the collection
this.name = name;
// the data held by the collection
Expand Down Expand Up @@ -233,6 +252,9 @@ export class Collection<TData extends object = object, TNested extends object =
// .
this.asyncListeners = options.asyncListeners !== undefined ? options.asyncListeners : false;

// .
this.disableMeta = options.disableMeta !== undefined ? options.disableMeta : false;

// .
this.disableChangesApi = options.disableChangesApi !== undefined ? options.disableChangesApi : true;

Expand Down Expand Up @@ -340,6 +362,7 @@ export class Collection<TData extends object = object, TNested extends object =
adaptiveBinaryIndices: this.adaptiveBinaryIndices,
transactional: this.transactional,
asyncListeners: this.asyncListeners,
disableMeta: this.disableMeta,
disableChangesApi: this.disableChangesApi,
disableDeltaChangesApi: this.disableDeltaChangesApi,
cloneObjects: this.cloneObjects,
Expand All @@ -358,6 +381,7 @@ export class Collection<TData extends object = object, TNested extends object =
coll.adaptiveBinaryIndices = obj.adaptiveBinaryIndices !== undefined ? (obj.adaptiveBinaryIndices === true) : false;
coll.transactional = obj.transactional;
coll.asyncListeners = obj.asyncListeners;
coll.disableMeta = obj.disableMeta;
coll.disableChangesApi = obj.disableChangesApi;
coll.cloneObjects = obj.cloneObjects;
coll.cloneMethod = obj.cloneMethod || "deep";
Expand Down Expand Up @@ -757,8 +781,8 @@ export class Collection<TData extends object = object, TNested extends object =
// if configured to clone, do so now... otherwise just use same obj reference
const obj = this.cloneObjects ? clone(doc, this.cloneMethod) : doc;

if ((<any>obj).meta === undefined) {
(<any>obj).meta = {
if (!this.disableMeta && (obj as Doc<TData>).meta === undefined) {
(obj as Doc<TData>).meta = {
revision: 0,
created: 0
};
Expand Down Expand Up @@ -944,7 +968,9 @@ export class Collection<TData extends object = object, TNested extends object =

const newDoc = obj as Doc<TData>;
newDoc.$loki = this.maxId;
newDoc.meta.version = 0;
if (!this.disableMeta) {
newDoc.meta.version = 0;
}

const constrUnique = this.constraints.unique;
for (const key in constrUnique) {
Expand Down Expand Up @@ -1194,7 +1220,7 @@ export class Collection<TData extends object = object, TNested extends object =
let len;
let idx;

if (!obj) {
if (this.disableMeta || !obj) {
return;
}

Expand Down Expand Up @@ -1224,7 +1250,7 @@ export class Collection<TData extends object = object, TNested extends object =
}

private _updateMeta(obj: Doc<TData>) {
if (!obj) {
if (this.disableMeta || !obj) {
return;
}
obj.meta.updated = (new Date()).getTime();
Expand Down Expand Up @@ -2053,6 +2079,7 @@ export namespace Collection {
indices?: (keyof TData)[];
adaptiveBinaryIndices?: boolean;
asyncListeners?: boolean;
disableMeta?: boolean;
disableChangesApi?: boolean;
disableDeltaChangesApi?: boolean;
clone?: boolean;
Expand Down Expand Up @@ -2095,6 +2122,7 @@ export namespace Collection {
adaptiveBinaryIndices: boolean;
transactional: boolean;
asyncListeners: boolean;
disableMeta: boolean;
disableChangesApi: boolean;
disableDeltaChangesApi: boolean;
cloneObjects: boolean;
Expand Down
5 changes: 4 additions & 1 deletion packages/loki/src/loki.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,13 @@ export class Loki extends LokiEventEmitter {
* @param {array} [options.exact=[]] - array of property names to define exact constraints for
* @param {array} [options.indices=[]] - array property names to define binary indexes for
* @param {boolean} [options.asyncListeners=false] - whether listeners are called asynchronously
* @param {boolean} [options.disableMeta=false] - set to true to disable meta property on documents
* @param {boolean} [options.disableChangesApi=true] - set to false to enable Changes Api
* @param {boolean} [options.disableDeltaChangesApi=true] - set to false to enable Delta Changes API (requires Changes API, forces cloning)
* @param {boolean} [options.clone=false] - specify whether inserts and queries clone to/from user
* @param {string} [options.cloneMethod=CloneMethod.DEEP] - the clone method
* @param {int} options.ttlInterval - time interval for clearing out 'aged' documents; not set by default.
* @param {number} [options.ttl=] - age of document (in ms.) before document is considered aged/stale
* @param {number} [options.ttlInterval=] - time interval for clearing out 'aged' documents; not set by default
* @returns {Collection} a reference to the collection which was just added
*/
public addCollection<T extends object = object, U extends object = object>(name: string, options: Collection.Options<T> = {}): Collection<T, U> {
Expand Down

0 comments on commit a79c8d5

Please sign in to comment.