Commit 70bc98e1fcb76213a7b487d8e8b7a8f49cc45943
Use fulltext search plugin if it is available
- Fallback to old search if fulltext plugin is not present - Only show search counter if using linear searchcel committed on 1/19/2017, 6:13:35 AM
Parent: cab96cfe6398bece694d747fcda9a4ec2211eef3
Files changed
manifest.json | changed |
modules_core/sbot.js | changed |
modules_extra/search.js | changed |
manifest.json | ||
---|---|---|
@@ -103,8 +103,11 @@ | ||
103 | 103 … | "push": "async", |
104 | 104 … | "changes": "source", |
105 | 105 … | "createWants": "source" |
106 | 106 … | }, |
107 … | + "fulltext": { | |
108 … | + "search": "source" | |
109 … | + }, | |
107 | 110 … | "links2": { |
108 | 111 … | "read": "source", |
109 | 112 … | "dump": "source" |
110 | 113 … | }, |
modules_core/sbot.js | ||
---|---|---|
@@ -42,8 +42,9 @@ | ||
42 | 42 … | sbot_blobs_add: true, |
43 | 43 … | sbot_links: true, |
44 | 44 … | sbot_links2: true, |
45 | 45 … | sbot_query: true, |
46 … | + sbot_fulltext_search: true, | |
46 | 47 … | sbot_get: true, |
47 | 48 … | sbot_log: true, |
48 | 49 … | sbot_user_feed: true, |
49 | 50 … | sbot_gossip_peers: true, |
@@ -134,8 +135,11 @@ | ||
134 | 135 … | }), |
135 | 136 … | sbot_user_feed: rec.source(function (opts) { |
136 | 137 … | return sbot.createUserStream(opts) |
137 | 138 … | }), |
139 … | + sbot_fulltext_search: rec.source(function (opts) { | |
140 … | + return sbot.fulltext.search(opts) | |
141 … | + }), | |
138 | 142 … | sbot_get: rec.async(function (key, cb) { |
139 | 143 … | if('function' !== typeof cb) |
140 | 144 … | throw new Error('cb must be function') |
141 | 145 … | if(CACHE[key]) cb(null, CACHE[key]) |
modules_extra/search.js | |||
---|---|---|---|
@@ -5,9 +5,10 @@ | |||
5 | 5 … | var TextNodeSearcher = require('text-node-searcher') | |
6 | 6 … | ||
7 | 7 … | exports.needs = { | |
8 | 8 … | message_render: 'first', | |
9 | - sbot_log: 'first' | ||
9 … | + sbot_log: 'first', | ||
10 … | + sbot_fulltext_search: 'first' | ||
10 | 11 … | } | |
11 | 12 … | ||
12 | 13 … | exports.gives = 'screen_view' | |
13 | 14 … | ||
@@ -49,16 +50,35 @@ | |||
49 | 50 … | searcher.highlight() | |
50 | 51 … | return el | |
51 | 52 … | } | |
52 | 53 … | ||
54 … | +function fallback(reader) { | ||
55 … | + var fallbackRead | ||
56 … | + return function (read) { | ||
57 … | + return function (abort, cb) { | ||
58 … | + read(abort, function next(end, data) { | ||
59 … | + if (end && reader && (fallbackRead = reader(end))) { | ||
60 … | + reader = null | ||
61 … | + read = fallbackRead | ||
62 … | + read(abort, next) | ||
63 … | + } else { | ||
64 … | + cb(end, data) | ||
65 … | + } | ||
66 … | + }) | ||
67 … | + } | ||
68 … | + } | ||
69 … | +} | ||
70 … | + | ||
53 | 71 … | exports.create = function (api) { | |
54 | 72 … | ||
55 | 73 … | return function (path) { | |
56 | 74 … | if(path[0] === '?') { | |
57 | - var query = path.substr(1).trim().split(whitespace) | ||
75 … | + var queryStr = path.substr(1).trim() | ||
76 … | + var query = queryStr.split(whitespace) | ||
58 | 77 … | var _matches = searchFilter(query) | |
59 | 78 … | ||
60 | 79 … | var total = 0, matches = 0 | |
80 … | + var usingLinearSearch = false | ||
61 | 81 … | ||
62 | 82 … | var header = h('div.search_header', '') | |
63 | 83 … | var content = h('div.column.scroller__content') | |
64 | 84 … | var div = h('div.column.scroller', | |
@@ -72,14 +92,14 @@ | |||
72 | 92 … | function matchesQuery (data) { | |
73 | 93 … | total++ | |
74 | 94 … | var m = _matches(data) | |
75 | 95 … | if(m) matches++ | |
76 | - header.textContent = 'searched:'+total+', found:'+matches | ||
96 … | + if(usingLinearSearch) { | ||
97 … | + header.textContent = 'searched:'+total+', found:'+matches | ||
98 … | + } | ||
77 | 99 … | return m | |
78 | 100 … | } | |
79 | 101 … | ||
80 | - | ||
81 | - | ||
82 | 102 … | function renderMsg(msg) { | |
83 | 103 … | var el = api.message_render(msg) | |
84 | 104 … | highlight(el, createOrRegExp(query)) | |
85 | 105 … | return el | |
@@ -91,10 +111,18 @@ | |||
91 | 111 … | Scroller(div, content, renderMsg, true, false) | |
92 | 112 … | ) | |
93 | 113 … | ||
94 | 114 … | pull( | |
95 | - u.next(api.sbot_log, {reverse: true, limit: 500, live: false}), | ||
96 | - pull.filter(matchesQuery), | ||
115 … | + u.next(api.sbot_fulltext_search, {query: queryStr, reverse: true, limit: 500, live: false}), | ||
116 … | + fallback(function (err) { | ||
117 … | + if (/^no source/.test(err.message)) { | ||
118 … | + usingLinearSearch = true | ||
119 … | + return pull( | ||
120 … | + u.next(api.sbot_log, {reverse: true, limit: 500, live: false}), | ||
121 … | + pull.filter(matchesQuery) | ||
122 … | + ) | ||
123 … | + } | ||
124 … | + }), | ||
97 | 125 … | Scroller(div, content, renderMsg, false, false) | |
98 | 126 … | ) | |
99 | 127 … | ||
100 | 128 … | return div |
Built with git-ssb-web