From c56ebe806574e03d4358ac674a661f45e918d90c Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Fri, 29 Dec 2017 12:49:47 -0600 Subject: [PATCH] DB layer needs the ability to specify other query options: - limit - skip - sort - fields --- packages/gallery/src/interface/allImages.js | 2 +- packages/gallery/src/services/db.js | 11 ++++++----- packages/gallery/src/utils/livearray.js | 12 +++++++----- packages/gallery/src/utils/watcher.js | 18 +++++++++++------- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/packages/gallery/src/interface/allImages.js b/packages/gallery/src/interface/allImages.js index 7936849..6ea8ff0 100644 --- a/packages/gallery/src/interface/allImages.js +++ b/packages/gallery/src/interface/allImages.js @@ -145,7 +145,7 @@ export function AllImagesView(vm, params, key, { appbar }) { { ['sizes.thumbnail']: { $exists: true } }, - true + { live: true } ).then(la => { pushAppBarState(); subscribeToRender( diff --git a/packages/gallery/src/services/db.js b/packages/gallery/src/services/db.js index 149e28b..6c6b853 100644 --- a/packages/gallery/src/services/db.js +++ b/packages/gallery/src/services/db.js @@ -96,7 +96,7 @@ export function PouchORM(PouchDB) { const _baseSelector = Object.freeze({ _id: { $gt: `${prefix}_0`, $lt: `${prefix}_\ufff0` } }); - const watch = Watcher(_db, _baseSelector, true); + const watch = Watcher(_db, _baseSelector, { include_docs: true }); if (!cls.hasOwnProperty('validate')) { warn(`${cls.name} has no validation.`); @@ -104,7 +104,7 @@ export function PouchORM(PouchDB) { const instantiate = doc => new cls(doc); - async function find(idOrSelector, live = false) { + async function find(idOrSelector, opts = {}) { if (typeof idOrSelector === 'string') { return instantiate(await _db.get(idOrSelector)); } @@ -115,10 +115,11 @@ export function PouchORM(PouchDB) { isSelector && idOrSelector._deleted ? { _deleted: true } : { _deleted: { exists: false } }, isSelector ? idOrSelector : _baseSelector ); - if (live) { - return LiveArray(_db, idOrSelector, instantiate); + if (opts.live) { + opts.mapper = instantiate; + return LiveArray(_db, idOrSelector, opts); } - return (await _db.find({ selector: idOrSelector })).docs.map(instantiate); + return (await _db.find(Object.assign({ selector: idOrSelector }, opts))).docs.map(instantiate); } async function getOrCreate(props) { diff --git a/packages/gallery/src/utils/livearray.js b/packages/gallery/src/utils/livearray.js index 271232d..88a338d 100644 --- a/packages/gallery/src/utils/livearray.js +++ b/packages/gallery/src/utils/livearray.js @@ -1,17 +1,19 @@ -import { prop, computed } from 'frptools'; +import { prop, computed, id } from 'frptools'; import { Watcher } from './watcher.js'; import { pouchDocArrayHash } from './conversion.js'; // LiveArray is a subscribable property function that always returns the db results that match the provided selector and calls subscribers when the results change. -export function LiveArray(db, selector, mapper) { - const _watcher = Watcher(db, selector); +export function LiveArray(db, selector, opts = {}) { + const mapper = opts.mapper || id; + opts.mapper && delete opts.mapper; + opts.include_docs = true; + const _watcher = Watcher(db, selector, opts); let changeSub = null; - let _mapper = mapper || (doc => doc); const ready = prop(false); const data = prop({ docs: [] }); - const docs = computed(r => r.docs.map(_mapper), [data], pouchDocArrayHash); + const docs = computed(r => r.docs.map(mapper), [data], pouchDocArrayHash); const cleanup = () => { docs.unsubscribeAll(); diff --git a/packages/gallery/src/utils/watcher.js b/packages/gallery/src/utils/watcher.js index 7b56c1d..8d3bc5a 100644 --- a/packages/gallery/src/utils/watcher.js +++ b/packages/gallery/src/utils/watcher.js @@ -1,6 +1,6 @@ import { log, error } from '../services/console.js'; -export function Watcher(db, selector, include_docs) { +export function Watcher(db, selector, opts) { const subscribers = new Set(); let changes = null; @@ -10,12 +10,16 @@ export function Watcher(db, selector, include_docs) { if (subscribers.size === 1 && !changes) { log(`Watching "${db.name}" for ${JSON.stringify(selector)}`); changes = db - .changes({ - since: 'now', - live: true, - include_docs, - selector - }) + .changes( + Object.assign( + { + since: 'now', + live: true, + selector + }, + opts + ) + ) .on('change', change => { const { id, deleted, doc } = change; log(