memory-orm v0.7.0
Install
yarn add memory-ormQuick 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 }).listmap 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.positionorder
| name | target | action |
|---|---|---|
| belongs_to | data's prototype is Querykey.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 itemkey. |
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.lastRule
| 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]5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago