memory-orm
v0.7.0
Published
client side ORM + map reduce
Downloads
31
Readme
Install
yarn add memory-orm
Quick Start
const { Rule, Set, Query } = require('memory-orm')
new Rule('todo').schema(function () {
this.has_many('checks')
})
new Rule('check').schema(function () {
this.belongs_to('todo')
})
Set.todo.merge([
{
_id: 1,
label: '歯を磨く',
},
{
_id: 2,
label: '宿題をする',
},
{
_id: 3,
label: 'お風呂はいる',
},
])
Set.check.merge([
{
_id: 1,
todo_id: 1,
label: '右上',
checked: true,
},
{
_id: 2,
todo_id: 1,
label: '左上',
checked: true,
},
{
_id: 3,
todo_id: 3,
label: 'シャワー浴びる',
checked: false,
},
{
_id: 4,
todo_id: 3,
label: '肩まで入って10数える',
checked: true,
},
])
Query.todos.pluck('label')
Query.todos.find(3).checks.where({ checked: true }).list
Query.todos.find(3).checks.where({ checked: false }).list
map reduce
| name | target | action | | :------------ | :------------- | :---------------------------------------- | | count | count | reduce + | | all | all | reduce + | | all, count | avg | all / count | | all, count | variance | variance sample. | | all, count | sd | standard deviation. | | pow | pow | reduce * | | pow, count | avg | pow / count | | list | list | listup object ( key is not use ) | | set | set, hash | hash has item by key. set is unique keys. | | min | min, min_is | pick min key. min_is is item. | | max | max, max_is | pick max key. max_is is item. | | min, max | range | max - min | | min, max, all | range, density | all / range |
const { Rule, Set, Query } = require("memory-orm");
new Rule("position").schema(function() {
this.model = class model extends this.model {
static map_reduce (o, emit) {
for ( const p of o.position ) {
emit("position", { count: 1, all: p, min: p, max: p})
}
}
}
});
Set.position.merge([{
"_id": "x1",
"position": [40,60,80,100,200]
},{
"_id": "y1",
"position": [70,190,220,160,240]
},{
"_id": "x2",
"position": [40,60,80,100,200]
},{
"_id": "y2",
"position": [20,90,20,60,40]
}])
{ count, all, avg, density, min, min_is, max, max_is, range } = Query.where({_id: "x1"}).reduce.position
order
| name | target | action |
| :--------- | :------------ | :------------------------------------------------------------- |
| belongs_to | | data's prototype is Query[key].find( object index or item.id ) |
| page | | separate by page-size. see: Query.page(size)
|
| sort | | lodash.orderBy(...key) |
| diff | diff | calculate differential. use with sort. |
| cover | remain, cover | key has full index. cover has index. remain not has index. |
| pluck | | get path data by list values. |
| index | | group by item[key]. |
const { Rule, Set, Query } = require('memory-orm')
new Rule('check').schema(function () {
this.model = class model extends this.model {
static map_reduce(o, emit) {
emit('asc', { list: true })
emit('desc', { list: true })
}
static order(o, emit) {
emit('asc', 'list', { sort: ['label', 'asc'] })
emit('desc', 'list', { sort: ['label', 'desc'] })
}
}
})
Set.check.merge([
{
_id: 1,
todo_id: 1,
label: '右上',
checked: true,
},
{
_id: 2,
todo_id: 1,
label: '左上',
checked: true,
},
{
_id: 3,
todo_id: 3,
label: 'シャワー浴びる',
checked: false,
},
{
_id: 4,
todo_id: 3,
label: '肩まで入って10数える',
checked: true,
},
])
Query.checks.reduce.asc.list.pluck('label')
Query.checks.reduce.desc.list.pluck('label')
class list
Model
| style | name | action | | :----- | :------------------------ | :------------------------------------------------- | | get | id | same as _id | | static | deploy(model) | event when Set item. this is item. model is class. | | static | update(item, old_item) | event when add data exist. | | static | create(item) | event when add data not exist. | | static | delete(old_item) | event when del data exist. | | static | bless(item) | value become extends this | | static | map_partition(item, emit) | define map reduce. emit is function. | | static | map_reduce(item, emit) | define map reduce. emit is function. | | static | order(item, emit) | define order process for reduced value. |
List
| style | name | action | | :---- | :------------- | :---------------------------- | | . | pluck(...keys) | listup by keys for item. | | . | where(...) | create query. see Query#where | | . | in(...) | create query. see Query#in | | get | first | [0] | | get | head | [0] | | get | tail | [length - 1] | | get | last | [length - 1] | | get | uniq | get unique values |
const { list } = Query.checks.reduce.asc
list.pluck('label')
list.first
list.head
list.tail
list.last
Rule
| style | name | action |
| :---- | :---------------------- | :---------------------------------------------------------------------------------- |
| . | schema(dsl) | execute schema definition dsl. |
| . | key_by(keys) | id value. default: _id
|
| . | key_by(callback) | callback return id. default: this._id
|
| . | deploy(callback) | data adjust before Set. |
| . | scope(callback) | define query shorthand and cached. |
| . | property(...) | define property shorthand. |
| . | default_scope(callback) | root Query replace. |
| . | shuffle() | root Query replace. and replace sort order by Math.random. |
| . | order(...) | root Query replace. and replace order. |
| . | sort(...) | root Query replace. and replace order. |
| . | path(...keys) | set name property. for id separate by '-'. add argument '*', tree structure by id. |
| . | belongs_to(to, options) | set target property. find by ${target}_id
|
| . | habtm(to, option) | set target property. finds by ${target}_ids
|
| . | has_many(to, option) | set target property. find from ${target}_id
by _id |
| . | tree(option) | set 'nodes' method. scan recursivery by ${target}_id
|
| . | graph(option) | set 'path' method. scan recursivery by ${target}_id
|
| . | model | Model base class ( need extends ) |
| . | list | List base class ( need extends ) |
| . | set | Set base class ( need extends ) |
| . | map | Map base class ( need extends ) |
new Rule('todo').schema(function () {
this.key_by(function () {
return this._id
})
this.deploy(function (model) {
this.search_words = this.label
})
this.scope(function (all) {
return {
scan: (word) => all.where({ checked: true }).search(word),
}
})
})
State
| style | name | action | | :---- | :-------------------------- | :---------------------------- | | . | transaction(callback, meta) | get transaction diff data. | | . | store(meta) | merge transaction diff data. | | . | step.< plural name > | countup if data manipulation. | | get | mixin | for vue.js mixin. |
Set.< base name >
| style | name | action | | :---- | :---------- | :---------------------------------------------------------------- | | . | set | set data. and old data cleanup. | | . | reset | set data. and old data cleanup. | | . | merge | set data. | | . | add | set datum. | | . | append | set datum. | | . | reject | remove data. | | . | del | remove datum. | | . | remove | remove datum. | | . | clear_cache | recalculate query caches. | | . | refresh | recalculate query caches. | | . | rehash | recalculate query caches. | | . | find | pick first data from all memory by ids. and mark for transaction. |
const {
checks: {
$sort,
$memory,
$format,
}
} = State.transaction(=>{
Set.check.add({
_id: 10,
todo_id: 1,
label: "新しい項目",
checked: true
})
Set.check.del({ _id: 10 })
})
State.store(JSON.parse(JSON.stringify({ checks: { $sort, $memory, $format }})))
Query.< plural name >
| style | name | action |
| :---- | :-------------------------------- | :------------------------------------------------------------------------------------------- |
| . | where({ [key]: val }) | copy Query and add conditions. same (o)=> val === o[key]
|
| . | where({ [key]: /regexp/ }) | copy Query and add conditions. same (o)=> (/regexp/).test( o[key] )
|
| . | where({ [key]: [...args] }) | copy Query and add conditions. same (o)=> args.includes( o[key] )
|
| . | in({ [key]: val }) | copy Query and add conditions. same (o)=> o[key].includes( val )
|
| . | in({ [key]: /regexp/ }) | copy Query and add conditions. same (o)=> o[key].find((oo)=> (/regexp/).test( oo ))
|
| . | in({ [key]: [...args] }) | copy Query and add conditions. same (o)=> o[key].find((oo)=> args.find((arg)=> oo == arg))
|
| . | partition(keys) | copy Query and replace partition keys. default: ["set"]
|
| . | search(text) | copy Query and add conditions. for "q.search_words" |
| . | shuffle() | copy Query and replace sort order by Math.random. |
| . | distance(key, "asc", [...point]) | copy Query and replace order. near o[key]
is top. |
| . | distance(key, "desc", [...point]) | copy Query and replace order. far o[key]
is top. |
| . | order(keys, order) | copy Query and replace order. |
| . | sort(...sort) | copy Query and replace order's sort parameter. same this.order({ sort })
|
| . | page(size) | copy Query and replace page_by. if order option set page: true, resuls page separated list. |
| . | find(...ids) | pick first data from hash by ids. |
| . | finds(ids) | pick all data from hash by ids. |
| . | pluck(...keys) | get path data by keys. |
| get | reduce | calculate map reduce. |
| get | list | calculate list. ( same reduce.list
) |
| get | hash | calculate hash. ( same reduce.hash
) |
| get | ids | calculate hash and get keys. |
| get | memory | all stored data. |
Query.positions.in({ position: 100 }).pluck('_id')
Query.positions.in({ position: [100, 90] }).pluck('_id')
Query.checks.shuffle().pluck('label')
Query.checks.sort('label').pluck('label')
Query.checks.sort('label', 'desc').pluck('label')
Query.checks.order({ sort: ['label', 'desc'] }).pluck('label')
Query.checks.page(3).list[0][0]
Query.checks.page(3).list[0][1]
Query.checks.page(3).list[0][2]
Query.checks.page(3).list[1][0]