yarn add memory-orm
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
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
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')
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. |
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
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),
}
})
})
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. |
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 }})))
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]