1 | const path = require('path');
|
2 | const lunr = require('lunr');
|
3 | const esql = require('sql-extra');
|
4 |
|
5 | var corpus = null;
|
6 | var index = null;
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | function fixRow(r) {
|
12 | if (r.sno==='1') r.monosaccharide = 1;
|
13 | r.hydrolysis = r.hydrolysis || NaN;
|
14 | r.monosaccharide = r.monosaccharide || NaN;
|
15 | return r;
|
16 | }
|
17 |
|
18 | function createIndex() {
|
19 | return lunr(function() {
|
20 | this.ref('sno');
|
21 | this.field('sno');
|
22 | this.field('carbohydrate');
|
23 | for (var r of corpus.values())
|
24 | this.add(fixRow(r));
|
25 | });
|
26 | }
|
27 |
|
28 | function load() {
|
29 | if (corpus) return corpus;
|
30 | corpus = require('./corpus');
|
31 | index = createIndex();
|
32 | return corpus;
|
33 | }
|
34 |
|
35 | function csv() {
|
36 | return path.join(__dirname, 'index.csv');
|
37 | }
|
38 |
|
39 | function sql(tab='carbohydrates', opt={}) {
|
40 | return esql.setupTable(tab, {sno: 'TEXT', carbohydrate: 'TEXT', hydrolysis: 'REAL', monosaccharide: 'REAL'},
|
41 | loadCorpus().values(), Object.assign({pk: 'sno', index: true, tsvector: {sno: 'A', carbohydrate: 'B'}}, opt));
|
42 | }
|
43 |
|
44 |
|
45 | function carbohydrates(txt) {
|
46 | if (!corpus) load();
|
47 | var a = [], txt = txt.replace(/\W/g, ' ');
|
48 | var ms = index.search(txt), max = 0;
|
49 | for (var m of ms)
|
50 | max = Math.max(max, Object.keys(m.matchData.metadata).length);
|
51 | for (var m of ms)
|
52 | if (Object.keys(m.matchData.metadata).length===max) a.push(corpus.get(m.ref));
|
53 | return a;
|
54 | }
|
55 | carbohydrates.load = load;
|
56 | carbohydrates.csv = csv;
|
57 | carbohydrates.sql = sql;
|
58 | module.exports = carbohydrates;
|