Skip to content

Commit

Permalink
0.13.0 patch - Other 0.13.0 changes including some interface and meth…
Browse files Browse the repository at this point in the history
…od renaming, removed 'Adapter' suffix from PermissionedDataPersisterAdapter class and DataPersister.Adapter interface. Made DataCollection.collection public for easy access to underlying lokijs collection.
  • Loading branch information
TeamworkGuy2 committed Jun 2, 2016
1 parent f5ece8d commit 5f70bf6
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 66 deletions.
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@ This project does its best to adhere to [Semantic Versioning](http://semver.org/


--------
### [0.13.0](https://github.com/TeamworkGuy2/lokijs-collections/commit/067fe49f6093a8738178da4ba271884aa701d4c3) - 2016-05-27
### [0.13.0](https://github.com/TeamworkGuy2/lokijs-collections/commit/f5ece8dcbbf3153cdc94b1467050ea98d609825d) - 2016-05-27
#### Changed
* Renamed PermissionedDataPersistAdapter -> PermissionedDataPersister
* Renamed DataPersister.AdapterFactory -> DataPersister.Factory
* Renamed DataPersister.clearPersistenceDb() -> clearPersistentDb()
* Moved DataPersister.Adapter interface up and merged it with DataPersister module
* Made DataCollection.collection public to make it easy to access the underlying lokijs collection (please note this field is meant to be readonly)

#### Removed
* sync/ directory moved to new [lokijs-collections-sync](https://github.com/TeamworkGuy2/lokijs-collections-sync) library

Expand Down
5 changes: 4 additions & 1 deletion db-collections/DataCollection.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ var ModelDefinitionsSet = require("../data-models/ModelDefinitionsSet");
var DataCollection = (function () {
/** Create a new document collection backed by a provided 'InMemDb' instance.
* @param {string} collectionName: the name of this collection
* @param dataModel: the data model used to determine primary key constraints, object validity, syncing behavior, etc.
* @param dataModelFuncs: functions used to manipulate the types of items stored in this collection,
* currently contains a copy function for creating deep copies of objects stored in this collection
* @param dbInst: the 'InMemDb' containing this collection's actual data
* @param {boolean} trackChanges: flag to initialize an event handler and change tracker for this collection or not.
* The event handler allows outside code to add listeners for collection changes (documents added, removed, updated),
Expand Down Expand Up @@ -56,7 +59,7 @@ var DataCollection = (function () {
* @see #initializeEventHandler()
* @see #destroyEventHandler()
*/
DataCollection.prototype.getCollectionEventHandler = function () {
DataCollection.prototype.getEventHandler = function () {
return this.eventHandler;
};
/**
Expand Down
12 changes: 9 additions & 3 deletions db-collections/DataCollection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ import ModelDefinitionsSet = require("../data-models/ModelDefinitionsSet");
* @param <E> the type of data stored in this data collection
* @param <O> the filter/query type, this is normally type {@code E} with all most or all properties optional
*/
class DataCollection<E, O> implements DataCollection<E, O> {
class DataCollection<E, O> implements _DataCollection<E, O> {
/** The underlying lokijs collection
* TODO readonly once TypeScript supports it, please DO NOT change this reference
*/
public collection: LokiCollection<E>;
private collectionName: string;
private dbInst: InMemDb;
private collection: LokiCollection<E>;
//private addCb: (added: E | E[]) => void;
//private removeCb: (removed: E | E[]) => void;
//private modifyCb: (modified: E | E[]) => void;
Expand All @@ -30,6 +33,9 @@ class DataCollection<E, O> implements DataCollection<E, O> {

/** Create a new document collection backed by a provided 'InMemDb' instance.
* @param {string} collectionName: the name of this collection
* @param dataModel: the data model used to determine primary key constraints, object validity, syncing behavior, etc.
* @param dataModelFuncs: functions used to manipulate the types of items stored in this collection,
* currently contains a copy function for creating deep copies of objects stored in this collection
* @param dbInst: the 'InMemDb' containing this collection's actual data
* @param {boolean} trackChanges: flag to initialize an event handler and change tracker for this collection or not.
* The event handler allows outside code to add listeners for collection changes (documents added, removed, updated),
Expand Down Expand Up @@ -73,7 +79,7 @@ class DataCollection<E, O> implements DataCollection<E, O> {
* @see #initializeEventHandler()
* @see #destroyEventHandler()
*/
public getCollectionEventHandler() {
public getEventHandler() {
return this.eventHandler;
}

Expand Down
14 changes: 7 additions & 7 deletions db-collections/LokiDbImpl.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ var ChangeTrackers = require("../change-trackers/ChangeTrackers");
var ModelKeysImpl = require("../key-constraints/ModelKeysImpl");
var PrimaryKeyMaintainer = require("../key-constraints/PrimaryKeyMaintainer");
var NonNullKeyMaintainer = require("../key-constraints/NonNullKeyMaintainer");
var PermissionedDataPersisterAdapter = require("./PermissionedDataPersisterAdapter");
var PermissionedDataPersister = require("./PermissionedDataPersister");
/** A {@link ResultSetLike} implementation for an empty collection
* @author TeamworkGuy2
*/
Expand Down Expand Up @@ -61,16 +61,16 @@ var LokiDbImpl = (function () {
throw new Error("cloneType '" + cloneType + "' is not a recognized clone type");
}
this.dataPersisterFactory = dataPersisterFactory;
this.dataPersisterInst = LokiDbImpl.createDefaultDataPersister(this, dataPersisterFactory);
this.dataPersister = LokiDbImpl.createDefaultDataPersister(this, dataPersisterFactory);
}
// ======== static methods ========
// ======== private static methods ========
LokiDbImpl._createNewDb = function (dbName, options) {
return new Loki(dbName, options);
};
LokiDbImpl.createDefaultDataPersister = function (dbDataInst, dataPersisterFactory) {
dbDataInst.setDataPersister(function (dbInst, getDataCollections, getSaveItemTransformFunc, getRestoreItemTransformFunc) {
var dataPersister = dataPersisterFactory(dbInst, getDataCollections, getSaveItemTransformFunc, getRestoreItemTransformFunc);
var persistAdapter = new PermissionedDataPersisterAdapter(dataPersister, dbDataInst.syncSettings, dbDataInst.storeSettings);
var persistAdapter = new PermissionedDataPersister(dataPersister, dbDataInst.syncSettings, dbDataInst.storeSettings);
return persistAdapter;
});
return dbDataInst.getDataPersister();
Expand Down Expand Up @@ -104,17 +104,17 @@ var LokiDbImpl = (function () {
LokiDbImpl.prototype.resetDataStore = function () {
var dfd = Q.defer();
this.db = null;
this.dataPersisterInst = LokiDbImpl.createDefaultDataPersister(this, this.dataPersisterFactory);
this.dataPersister = LokiDbImpl.createDefaultDataPersister(this, this.dataPersisterFactory);
dfd.resolve(null);
return dfd.promise;
};
LokiDbImpl.prototype.setDataPersister = function (dataPersisterFactory) {
var _this = this;
this.dataPersisterFactory = dataPersisterFactory;
this.dataPersisterInst = dataPersisterFactory(this, function () { return _this.getCollections(); }, function (collName) { return _this.cloneFunc; }, function (collName) { return null; });
this.dataPersister = dataPersisterFactory(this, function () { return _this.getCollections(); }, function (collName) { return _this.cloneFunc; }, function (collName) { return null; });
};
LokiDbImpl.prototype.getDataPersister = function () {
return this.dataPersisterInst;
return this.dataPersister;
};
LokiDbImpl.prototype._addHandlePrimaryAndGeneratedKeys = function (collection, dataModel, primaryConstraint, generateOption, docs, dstMetaData) {
// TODO primaryConstraint and generateOption validation
Expand Down
26 changes: 13 additions & 13 deletions db-collections/LokiDbImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import ChangeTrackers = require("../change-trackers/ChangeTrackers");
import ModelKeysImpl = require("../key-constraints/ModelKeysImpl");
import PrimaryKeyMaintainer = require("../key-constraints/PrimaryKeyMaintainer");
import NonNullKeyMaintainer = require("../key-constraints/NonNullKeyMaintainer");
import PermissionedDataPersisterAdapter = require("./PermissionedDataPersisterAdapter");
import PermissionedDataPersister = require("./PermissionedDataPersister");


/** A {@link ResultSetLike} implementation for an empty collection
Expand Down Expand Up @@ -58,8 +58,8 @@ class LokiDbImpl implements InMemDb {
private modelKeys: ModelKeys;
private db: Loki;
private dbName: string;
private dataPersisterFactory: DataPersister.AdapterFactory;
private dataPersisterInst: DataPersister.Adapter;
private dataPersisterFactory: DataPersister.Factory;
private dataPersister: DataPersister;
private syncSettings: ReadWritePermission;
private storeSettings: StorageFormatSettings;
private cloneFunc: InMemDbCloneFunc;
Expand All @@ -76,7 +76,7 @@ class LokiDbImpl implements InMemDb {
* @param dataPersisterFactory a factory for creating a data persister
*/
constructor(dbName: string, settings: ReadWritePermission, storeSettings: StorageFormatSettings, cloneType: "for-in-if" | "keys-for-if" | "keys-excluding-for" | "clone-delete", metaDataStorageCollectionName: string,
modelDefinitions: ModelDefinitions, dataPersisterFactory: (dbInst: InMemDb) => DataPersister.Adapter) {
modelDefinitions: ModelDefinitions, dataPersisterFactory: (dbInst: InMemDb) => DataPersister) {
this.dbName = dbName;
this.syncSettings = settings;
this.storeSettings = storeSettings;
Expand All @@ -89,20 +89,20 @@ class LokiDbImpl implements InMemDb {
}

this.dataPersisterFactory = dataPersisterFactory;
this.dataPersisterInst = LokiDbImpl.createDefaultDataPersister(this, dataPersisterFactory);
this.dataPersister = LokiDbImpl.createDefaultDataPersister(this, dataPersisterFactory);
}


// ======== static methods ========
// ======== private static methods ========

private static _createNewDb(dbName: string, options: LokiConfigureOptions) {
return new Loki(dbName, options);
}

private static createDefaultDataPersister(dbDataInst: LokiDbImpl, dataPersisterFactory: DataPersister.AdapterFactory): DataPersister.Adapter {
private static createDefaultDataPersister(dbDataInst: LokiDbImpl, dataPersisterFactory: DataPersister.Factory): DataPersister {
dbDataInst.setDataPersister((dbInst, getDataCollections, getSaveItemTransformFunc, getRestoreItemTransformFunc) => {
var dataPersister = dataPersisterFactory(dbInst, getDataCollections, getSaveItemTransformFunc, getRestoreItemTransformFunc);
var persistAdapter = new PermissionedDataPersisterAdapter(dataPersister, dbDataInst.syncSettings, dbDataInst.storeSettings);
var persistAdapter = new PermissionedDataPersister(dataPersister, dbDataInst.syncSettings, dbDataInst.storeSettings);
return persistAdapter;
});
return dbDataInst.getDataPersister();
Expand Down Expand Up @@ -150,20 +150,20 @@ class LokiDbImpl implements InMemDb {
public resetDataStore(): Q.Promise<void> {
var dfd = Q.defer<void>();
this.db = null;
this.dataPersisterInst = LokiDbImpl.createDefaultDataPersister(this, this.dataPersisterFactory);
this.dataPersister = LokiDbImpl.createDefaultDataPersister(this, this.dataPersisterFactory);
dfd.resolve(null);
return dfd.promise;
}


public setDataPersister(dataPersisterFactory: DataPersister.AdapterFactory): void {
public setDataPersister(dataPersisterFactory: DataPersister.Factory): void {
this.dataPersisterFactory = dataPersisterFactory;
this.dataPersisterInst = dataPersisterFactory(this, () => this.getCollections(), (collName: string) => this.cloneFunc, (collName: string) => null);
this.dataPersister = dataPersisterFactory(this, () => this.getCollections(), (collName: string) => this.cloneFunc, (collName: string) => null);
}


public getDataPersister(): DataPersister.Adapter {
return this.dataPersisterInst;
public getDataPersister(): DataPersister {
return this.dataPersister;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ var PermissionedDataPersisterAdapter = (function () {
}
else {
var dfd = Q.defer();
dfd.reject("permission denied: data persister write permission denied due to settings");
dfd.reject("permission denied: data persister write permissions are denied");
return dfd.promise;
}
};
Expand All @@ -24,17 +24,17 @@ var PermissionedDataPersisterAdapter = (function () {
}
else {
var dfd = Q.defer();
dfd.reject("permission denied: data persister read permission denied due to settings");
dfd.reject("permission denied: data persister read permissions are denied");
return dfd.promise;
}
};
PermissionedDataPersisterAdapter.prototype.clearPersistenceDb = function () {
PermissionedDataPersisterAdapter.prototype.clearPersistentDb = function () {
if (this.syncSettings.writeAllow) {
return this.persister.clearPersistenceDb();
return this.persister.clearPersistentDb();
}
else {
var dfd = Q.defer();
dfd.reject("permission denied: data persister write permission denied due to settings");
dfd.reject("permission denied: data persister write permissions are denied");
return dfd.promise;
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
/** {@link DataPersister.Adapter} wrapper that checks permissions before reading/writing data
* @author TeamworkGuy2
*/
class PermissionedDataPersisterAdapter implements DataPersister.Adapter {
private persister: DataPersister.Adapter;
class PermissionedDataPersisterAdapter implements DataPersister {
private persister: DataPersister;
private syncSettings: ReadWritePermission;
private storeSettings: StorageFormatSettings;


constructor(persister: DataPersister.Adapter, syncSettings: ReadWritePermission, storeSettings: StorageFormatSettings) {
constructor(persister: DataPersister, syncSettings: ReadWritePermission, storeSettings: StorageFormatSettings) {
this.syncSettings = syncSettings;
this.storeSettings = storeSettings;
this.persister = persister;
Expand All @@ -21,7 +21,7 @@ class PermissionedDataPersisterAdapter implements DataPersister.Adapter {
}
else {
var dfd = Q.defer<any>();
dfd.reject("permission denied: data persister write permission denied due to settings");
dfd.reject("permission denied: data persister write permissions are denied");
return dfd.promise;
}
}
Expand All @@ -33,19 +33,19 @@ class PermissionedDataPersisterAdapter implements DataPersister.Adapter {
}
else {
var dfd = Q.defer<any>();
dfd.reject("permission denied: data persister read permission denied due to settings");
dfd.reject("permission denied: data persister read permissions are denied");
return dfd.promise;
}
}


public clearPersistenceDb(): Q.Promise<void> {
public clearPersistentDb(): Q.Promise<void> {
if (this.syncSettings.writeAllow) {
return this.persister.clearPersistenceDb();
return this.persister.clearPersistentDb();
}
else {
var dfd = Q.defer<any>();
dfd.reject("permission denied: data persister write permission denied due to settings");
dfd.reject("permission denied: data persister write permissions are denied");
return dfd.promise;
}
}
Expand Down
50 changes: 25 additions & 25 deletions db-collections/in-mem-collections.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ interface InMemDb {

initializeDb(options: LokiConfigureOptions): void;

setDataPersister(dataPersisterFactory: DataPersister.AdapterFactory): void;
setDataPersister(dataPersisterFactory: DataPersister.Factory): void;


// ======== Add, Remove, Update Operations ========
Expand Down Expand Up @@ -144,7 +144,7 @@ interface DataCollection<E, O> {

destroyEventHandler(): void;

getCollectionEventHandler(): Events.ListenerList<Changes.CollectionChange, Changes.ChangeListener>;
getEventHandler(): Events.ListenerList<Changes.CollectionChange, Changes.ChangeListener>;

/**
* @return {string} the name of this collection of data models
Expand Down Expand Up @@ -259,6 +259,8 @@ interface DataCollection<E, O> {
*/
deleteCollection(dstResultInfo?: Changes.CollectionChangeTracker): void;
}
// Work around for DataCollection.ts containing a class named 'DataCollection' and trying to implement this interface
interface _DataCollection<E, O> extends DataCollection<E, O> { }



Expand All @@ -277,10 +279,28 @@ interface DtoCollection<E, F, S> extends DataCollection<E, F> {



/* Interface for persisting data to a long term* storage medium, (*longer than the browser session)
/* Adapter interface for persisting/restoring in in-memory database to/from long term* storage, (*longer than browser session or program lifetime)
* Data persist read/write interface for InMemDb
* @author TeamworkGuy2
*/
interface DataPersister {

/** Save this in-memory database to some form of persistent storage
* Removes tables from store that don't exist in in-memory db
*/
persist(options?: { maxObjectsPerChunk?: number; compress?: boolean; }): Q.Promise<DataPersister.PersistResult>;

/** Restore in-memory database from persistent store
* All in memory tables are dropped and re-added
*/
restore(options?: { decompress?: boolean; }): Q.Promise<DataPersister.RestoreResult>;

/** Delete all data related this database from persistent storage
*/
clearPersistentDb(): Q.Promise<void>;
}


declare module DataPersister {

interface CollectionData {
Expand All @@ -301,27 +321,7 @@ declare module DataPersister {
}


/** Adapter for persisting/restoring an in-memory database
*/
export interface Adapter {

/** Save this in-memory database to some form of persistent storage
* Removes tables from store that don't exist in in-memory db
*/
persist(options?: { maxObjectsPerChunk?: number; compress?: boolean; }): Q.Promise<PersistResult>;

/** Restore in-memory database from persistent store
* All in memory tables are dropped and re-added
*/
restore(options?: { decompress?: boolean; }): Q.Promise<RestoreResult>;

/** Delete all data related this database from persistent storage
*/
clearPersistenceDb(): Q.Promise<void>;
}


export interface AdapterFactory {
export interface Factory {
/**
* @param dbInst: the in-memory database that the persister pulls data from
* @param getCollections: returns a list of data collections that contain the data to persist/restore to
Expand All @@ -332,7 +332,7 @@ declare module DataPersister {
*/
(dbInst: InMemDb, getCollections: () => LokiCollection<any>[],
getSaveItemTransformFunc?: (collName: string) => ((item: any) => any),
getRestoreItemTransformFunc?: (collName: string) => ((item: any) => any)): DataPersister.Adapter;
getRestoreItemTransformFunc?: (collName: string) => ((item: any) => any)): DataPersister;
}

}
Expand Down
2 changes: 1 addition & 1 deletion test/DummyDataPersister.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ var DummyDataPersister = (function () {
DummyDataPersister.prototype.restore = function (options) {
return null;
};
DummyDataPersister.prototype.clearPersistenceDb = function () {
DummyDataPersister.prototype.clearPersistentDb = function () {
throw new Error("DummyDataPersister.clearPersistenceDb() not yet implemented");
};
return DummyDataPersister;
Expand Down
Loading

0 comments on commit 5f70bf6

Please sign in to comment.