Files: 7f88a4b1fc7f5b240e746b46280538198e2cecf9 / lib / flumeview-links-raw.js
2638 bytesRaw
1 | // FORKED TO REMOVE FILTERING APPLIED TO INDEXED DATA RESULT |
2 | |
3 | 'use strict' |
4 | var pull = require('pull-stream') |
5 | var query = require('flumeview-query/query') |
6 | var select = require('flumeview-query/select') |
7 | var mfr = require('map-filter-reduce') |
8 | var u = require('flumeview-query/util') |
9 | var Flatmap = require('pull-flatmap') |
10 | var FlumeViewLevel = require('flumeview-level') |
11 | |
12 | var isArray = Array.isArray |
13 | |
14 | //sorted index. |
15 | |
16 | //split this into TWO modules. flumeview-links and flumeview-query |
17 | module.exports = function (indexes, links, version) { |
18 | |
19 | if(!links) |
20 | links = function (data, emit) { emit(data) } |
21 | |
22 | function getIndexes (data, seq) { |
23 | var A = [] |
24 | indexes.forEach(function (index) { |
25 | var a = [index.key] |
26 | for(var i = 0; i < index.value.length; i++) { |
27 | var key = index.value[i] |
28 | if(!u.has(key, data)) return |
29 | a.push(u.get(key, data)) |
30 | } |
31 | a.push(seq) |
32 | A.push(a) |
33 | }) |
34 | return A |
35 | } |
36 | |
37 | var create = FlumeViewLevel(version || 1, function (value, seq) { |
38 | var A = [] |
39 | links(value, function (value) { |
40 | A = A.concat(getIndexes(value, seq)) |
41 | }) |
42 | return A |
43 | }) |
44 | |
45 | return function (log, name) { |
46 | |
47 | var index = create(log, name) |
48 | var read = index.read |
49 | |
50 | index.read = function (opts) { |
51 | |
52 | opts = opts || {} |
53 | var _opts = {} |
54 | var q, k |
55 | |
56 | if(isArray(opts.query)) { |
57 | q = opts.query[0].$filter || {} |
58 | } |
59 | else if(opts.query) { |
60 | q = opts.query |
61 | } |
62 | else |
63 | q = {} |
64 | |
65 | var index = select(indexes, q) |
66 | |
67 | // HACK: allow manual selection of indexes |
68 | if (opts.index) { |
69 | index = indexes.find(x => x.key === opts.index) |
70 | } |
71 | |
72 | if(!index) |
73 | return pull( |
74 | log.stream({ |
75 | values: true, seqs: false, live: opts.live, limit: opts.limit, reverse: opts.reverse |
76 | }), |
77 | Flatmap(function (data) { |
78 | var emit = [] |
79 | links(data, function (a) { |
80 | emit.push(a) |
81 | }) |
82 | return emit |
83 | }) |
84 | ) |
85 | var _opts = query(index, q) |
86 | |
87 | |
88 | _opts.values = false |
89 | _opts.keys = true |
90 | |
91 | _opts.reverse = !!opts.reverse |
92 | _opts.live = opts.live |
93 | _opts.old = opts.old |
94 | _opts.sync = opts.sync |
95 | _opts.limit = opts.limit |
96 | |
97 | return pull( |
98 | read(_opts), |
99 | pull.map(function (data) { |
100 | if(data.sync) return data |
101 | var o = data.value |
102 | for(var i = 0; i < index.value.length; i++) |
103 | u.set(index.value[i], data.key[i+1], o) |
104 | return o |
105 | }), |
106 | isArray(opts.query) ? mfr(opts.query) : pull.through() |
107 | ) |
108 | } |
109 | return index |
110 | } |
111 | } |
112 |
Built with git-ssb-web