You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.0 KiB
148 lines
3.0 KiB
5 years ago
|
# pull-level
|
||
|
|
||
|
[pull-stream](https://github.com/dominictarr/pull-stream) interface to
|
||
|
[levelup](https://github.com/rvagg/node-levelup)
|
||
|
|
||
|
## Example - reading
|
||
|
|
||
|
read items in database.
|
||
|
|
||
|
``` js
|
||
|
var pl = require('pull-level')
|
||
|
var pull = require('pull-stream')
|
||
|
|
||
|
var db = require('levelup')('/tmp/pull-level-example')
|
||
|
|
||
|
pull(pl.read(db), pull.collect(console.log))
|
||
|
```
|
||
|
|
||
|
read items in database, plus realtime changes
|
||
|
|
||
|
``` js
|
||
|
pull(
|
||
|
pl.read(db, {live: true}),
|
||
|
//log data as it comes,
|
||
|
//because tail will keep the connection open
|
||
|
//so we'll never see the end otherwise.
|
||
|
pull.through(console.log),
|
||
|
//note, pull-streams will not drain unless something is
|
||
|
//pulling the data through, so we have to add drain
|
||
|
//even though the data we want is coming from pull.through()
|
||
|
pull.drain()
|
||
|
)
|
||
|
```
|
||
|
|
||
|
If you just want the realtime inserts,
|
||
|
use `live`
|
||
|
|
||
|
``` js
|
||
|
pull(
|
||
|
pl.live(db, {live: true}),
|
||
|
pull.through(console.log),
|
||
|
pull.drain()
|
||
|
)
|
||
|
```
|
||
|
|
||
|
## Example - writing
|
||
|
|
||
|
To write, pipe batch changes into `write`
|
||
|
|
||
|
``` js
|
||
|
pull(
|
||
|
pull.values([
|
||
|
{key: 0, value: 'zero', type: 'put'},
|
||
|
{key: 1, value: 'one', type: 'put'},
|
||
|
{key: 2, value: 'two', type: 'put'},
|
||
|
]),
|
||
|
pl.write(db)
|
||
|
)
|
||
|
```
|
||
|
|
||
|
If you are lazy/busy, you can leave off `type`.
|
||
|
In that case, if `value` is non-null, the change
|
||
|
is considered a `put` else, a `del`.
|
||
|
|
||
|
``` js
|
||
|
pull(
|
||
|
pull.values([
|
||
|
{key: 0, value: 'zero'},
|
||
|
{key: 1, value: 'one'},
|
||
|
{key: 2, value: 'two'},
|
||
|
]),
|
||
|
pl.write(db)
|
||
|
)
|
||
|
```
|
||
|
|
||
|
|
||
|
## Example - indexes!
|
||
|
|
||
|
With pull-level it's easy to create indexes.
|
||
|
just save a pointer to the key.
|
||
|
|
||
|
like this:
|
||
|
``` js
|
||
|
pull(
|
||
|
pull.values([
|
||
|
{key: key, value: VALUE, type: 'put'},
|
||
|
{key: '~INDEX~' + VALUE.prop, value: key, type: 'put'},
|
||
|
]),
|
||
|
pl.write(db)
|
||
|
)
|
||
|
```
|
||
|
|
||
|
then, when you want to do a `read`, use `asyncMap`
|
||
|
|
||
|
``` js
|
||
|
pull(
|
||
|
pl.read(db, {min: '~INDEX~', max: '~INDEX~~'})
|
||
|
pull.asyncMap(function (e, cb) {
|
||
|
db.get(e.value, function (value) {
|
||
|
cb(null, {key: e.value, value: value})
|
||
|
})
|
||
|
}),
|
||
|
pull.collect(console.log)
|
||
|
)
|
||
|
```
|
||
|
|
||
|
## Example realtime aggregation
|
||
|
|
||
|
We want to keep a realtime count of everything in the database.
|
||
|
When ever something is inserted, we increment. But, we need
|
||
|
to check the records that are *currently* in the database.
|
||
|
|
||
|
Since it takes some time to scan the database, we need to make sure
|
||
|
we have done that before giving an answer. We can read it all with
|
||
|
one stream, using `{sync: true}` to be notified of when we have read out all the old records.
|
||
|
|
||
|
First all the old records are read from the non-live stream,
|
||
|
then you get one `{sync: true}` element, then all the new item.
|
||
|
|
||
|
``` js
|
||
|
var sum = 0, ready = false, waiting = []
|
||
|
|
||
|
//call get count to know s
|
||
|
function getSum (cb) {
|
||
|
if(!ready) waiting.push(cb)
|
||
|
else cb(null, sum)
|
||
|
}
|
||
|
|
||
|
pull(
|
||
|
pl.read(db, {sync: true}),
|
||
|
pull.drain(function (op) {
|
||
|
if(op.sync) {
|
||
|
//if we see a data element with this it means
|
||
|
ready = true
|
||
|
while(waiting.length) waiting.shift()(null, count)
|
||
|
}
|
||
|
//increment our counter!
|
||
|
if(Number.isFinite(+op.value.amount)) //filter out non numbers & NaN.
|
||
|
sum += op.value.amount
|
||
|
})
|
||
|
)
|
||
|
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT
|