Files: 5200adabbef51ad8ccb3c18fc1b9a0ce470f4a70 / lib / flumeview-links-raw.js
2646 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 | if(!index) |
68 | return pull( |
69 | log.stream({ |
70 | values: true, seqs: false, live: opts.live, limit: opts.limit, reverse: opts.reverse |
71 | }), |
72 | Flatmap(function (data) { |
73 | var emit = [] |
74 | links(data, function (a) { |
75 | emit.push(a) |
76 | }) |
77 | return emit |
78 | }) |
79 | ) |
80 | |
81 | var _opts = query(index, q) |
82 | |
83 | _opts.values = false |
84 | _opts.keys = true |
85 | |
86 | _opts.reverse = !!opts.reverse |
87 | _opts.live = opts.live |
88 | _opts.old = opts.old |
89 | _opts.sync = opts.sync |
90 | |
91 | var stream = pull( |
92 | read(_opts), |
93 | pull.map(function (data) { |
94 | if(data.sync) return data |
95 | var o = data.value |
96 | for(var i = 0; i < index.value.length; i++) |
97 | u.set(index.value[i], data.key[i+1], o) |
98 | return o |
99 | }), |
100 | isArray(opts.query) ? mfr(opts.query) : pull.through() |
101 | ) |
102 | |
103 | if (typeof opts.limit === 'number') { |
104 | return pull( |
105 | stream, |
106 | pull.take(opts.limit) |
107 | ) |
108 | } else { |
109 | return stream |
110 | } |
111 | } |
112 | return index |
113 | } |
114 | } |
115 |
Built with git-ssb-web