mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-29 18:10:09 +00:00
prepping to refactor indexing mechanics...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
95b6083b24
commit
276e90e805
@ -13,6 +13,137 @@ var types = require('ig-types')
|
|||||||
var pwpath = require('../path')
|
var pwpath = require('../path')
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// - define (name, generate, merge)
|
||||||
|
// inline
|
||||||
|
// online
|
||||||
|
// - undefine (online)
|
||||||
|
// - enumerate/list
|
||||||
|
// - group operations:
|
||||||
|
// - update item
|
||||||
|
// - remove item
|
||||||
|
// - reset (cache)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
// XXX need support for:
|
||||||
|
// 'update', <path>, <value>
|
||||||
|
// 'remove', <path>
|
||||||
|
//
|
||||||
|
var makeIndexed =
|
||||||
|
function(name, generate, options={}){
|
||||||
|
var cache = !!options.attr ?
|
||||||
|
name
|
||||||
|
: `__${name}_cache`
|
||||||
|
var merge = `__${name}_merge__`
|
||||||
|
var special = `__${name}__`
|
||||||
|
|
||||||
|
// make local cache...
|
||||||
|
var _make = function(){
|
||||||
|
return this[special] != null ?
|
||||||
|
this[special]()
|
||||||
|
: generate.call(this) }
|
||||||
|
// unwrap a promised value into cache...
|
||||||
|
var _await = function(obj, val){
|
||||||
|
if(val instanceof Promise){
|
||||||
|
val.then(function(value){
|
||||||
|
obj[cache] = value }) }
|
||||||
|
return val }
|
||||||
|
|
||||||
|
var meth
|
||||||
|
return (meth = Object.assign(
|
||||||
|
function(action='get', ...args){
|
||||||
|
var that = this
|
||||||
|
// clear/reset...
|
||||||
|
if(action == 'clear'
|
||||||
|
|| action == 'reset'){
|
||||||
|
delete this[cache] }
|
||||||
|
// clear...
|
||||||
|
if(action == 'clear'){
|
||||||
|
return }
|
||||||
|
// other actions...
|
||||||
|
if(action != 'get'
|
||||||
|
&& action != 'reset'){
|
||||||
|
var action_meth = `__${name}_${action}__`
|
||||||
|
// generate cache if not available...
|
||||||
|
var cur = cache in this ?
|
||||||
|
this[cache]
|
||||||
|
: meth.call(this, 'reset')
|
||||||
|
return _await(this, this[cache] =
|
||||||
|
(action in options
|
||||||
|
&& typeof(options[action]) == 'function') ?
|
||||||
|
options[action].call(this, cur, ...args)
|
||||||
|
: action_meth in this ?
|
||||||
|
this[action_meth](cur, ...args)
|
||||||
|
: cur) }
|
||||||
|
// get...
|
||||||
|
return _await(this,
|
||||||
|
// NOTE: this is intentionally not cached...
|
||||||
|
action == 'local' ?
|
||||||
|
_make.call(this)
|
||||||
|
// get...
|
||||||
|
: (this[cache] =
|
||||||
|
// cached...
|
||||||
|
this[cache] != null ?
|
||||||
|
this[cache]
|
||||||
|
// generate + merge...
|
||||||
|
: this[merge] != null ?
|
||||||
|
this[merge](_make.call(this))
|
||||||
|
// generate...
|
||||||
|
: _make.call(this)) ) },
|
||||||
|
{
|
||||||
|
attr: name,
|
||||||
|
indexed: true,
|
||||||
|
options,
|
||||||
|
})) }
|
||||||
|
|
||||||
|
|
||||||
|
var indexTest =
|
||||||
|
module.indexTest =
|
||||||
|
{
|
||||||
|
get indexi(){
|
||||||
|
var that = this
|
||||||
|
return object.deepKeys(this)
|
||||||
|
.filter(function(key){
|
||||||
|
var d = object.values(that, key, true).next().value.value
|
||||||
|
return typeof(d) == 'function'
|
||||||
|
&& d.indexed }) },
|
||||||
|
|
||||||
|
index: async function(action='get', ...args){
|
||||||
|
var that = this
|
||||||
|
return Object.fromEntries(
|
||||||
|
await Promise.all(
|
||||||
|
this.indexi
|
||||||
|
.map(async function(name){
|
||||||
|
return [
|
||||||
|
that[name].attr,
|
||||||
|
await that[name](action, ...args),
|
||||||
|
] }))) },
|
||||||
|
|
||||||
|
// tests...
|
||||||
|
//
|
||||||
|
moo: makeIndexed('moo', () => 123),
|
||||||
|
|
||||||
|
_foo_index: makeIndexed('foo', () => 123, {
|
||||||
|
attr: true,
|
||||||
|
add: function(cur, val){
|
||||||
|
return cur + val },
|
||||||
|
}),
|
||||||
|
|
||||||
|
__boo_add__: function(cur, val){
|
||||||
|
return cur + val },
|
||||||
|
boo: makeIndexed('boo', () => 123),
|
||||||
|
|
||||||
|
__amoo_add__: async function(cur, val){
|
||||||
|
return await cur + val },
|
||||||
|
amoo: makeIndexed('amoo', async () => 123),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@ -739,10 +870,12 @@ module.MetaStore = {
|
|||||||
// trim path...
|
// trim path...
|
||||||
path.slice(path.indexOf(p)+p.length),
|
path.slice(path.indexOf(p)+p.length),
|
||||||
...[...arguments].slice(1))
|
...[...arguments].slice(1))
|
||||||
|
this.__cache_add(path)
|
||||||
return this }
|
return this }
|
||||||
// add local...
|
// add local...
|
||||||
return object.parentCall(MetaStore.update, this, ...arguments) },
|
return object.parentCall(MetaStore.update, this, ...arguments) },
|
||||||
// XXX Q: how do we delete a substore???
|
// XXX Q: how do we delete a substore???
|
||||||
|
// XXX need to call .__cache_remove(..) here if we did not super-call...
|
||||||
delete: metaProxy('delete'),
|
delete: metaProxy('delete'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
18
pwiki2.js
18
pwiki2.js
@ -17,6 +17,24 @@
|
|||||||
* - CLI
|
* - CLI
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
* XXX INDEX / CACHE:
|
||||||
|
* - centralized
|
||||||
|
* - nestable
|
||||||
|
* - updates propagate down to substore
|
||||||
|
* - updates propagate up to root
|
||||||
|
* - extensible
|
||||||
|
* name, generate, get (extensible), update, delete
|
||||||
|
* - event-based???
|
||||||
|
* - sync???
|
||||||
|
* API???:
|
||||||
|
* // create
|
||||||
|
* <store>.index(<name>, {generate, update, ... })
|
||||||
|
* delete <store>.index.<name>
|
||||||
|
* <store>.<name> - index data (prop)
|
||||||
|
* <store>.__<name>__() - index getter
|
||||||
|
* <store>.index.<name>(..) - update
|
||||||
|
* <store>.index.clear()
|
||||||
|
* <store>.index.refresh()
|
||||||
* XXX BUG: when editing the root page of a substore the page's .cache is
|
* XXX BUG: when editing the root page of a substore the page's .cache is
|
||||||
* not reset for some reason...
|
* not reset for some reason...
|
||||||
* ...the problem is in that .names() cache is not reset when a new
|
* ...the problem is in that .names() cache is not reset when a new
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user