index.js (1771B)
1 // Factory 2 const lucene = module.exports = function factory( parser ) { 3 4 // Parser must be given 5 if (!parser) { 6 throw new Error('No parser given. Must be one of \'lucene\',\'lucene-queryparser\',\'lucene-query-parser\''); 7 } 8 9 // The given parser must be compatible 10 if (('object' !== typeof parser) || ('function' !== typeof parser.parse)) { 11 throw new Error('Incompatible parser given. Must be one of \'lucene\',\'lucene-queryparser\',\'lucene-query-parser\''); 12 } 13 14 // Returns Function(Object):Number 15 function compile(query) { 16 if (!query) return ()=>0; 17 18 if ('string' === typeof query) { 19 try { 20 query = parser.parse(query); 21 } catch(e) { 22 return ()=>0; 23 } 24 } 25 26 // Compile multi-query 27 if (query.operator) { 28 return lucene.operators[query.operator]( 29 compile(query.left), 30 compile(query.right), 31 ); 32 } 33 34 // Wrapped 35 if (query.left) { 36 return compile(query.left); 37 } 38 39 40 // Ensure default boost 41 query.boost = query.boost || 1; 42 43 // Return the first detected filter 44 for (const filter of lucene.filters) { 45 if (filter.detect(query)) { 46 return filter.compile(query); 47 } 48 } 49 50 // Return no match 51 return ()=>0; 52 } 53 54 // Return the data when matching 55 compile.passthrough = function(parser, query) { 56 let match = compile(query); 57 return function(data) { 58 if(match(data)) return data; 59 return undefined; 60 }; 61 }; 62 63 return compile; 64 }; 65 66 // Add filters & operators 67 lucene.filters = require('./filters'); 68 lucene.operators = require('./operators'); 69 70 // Browser exports 71 if (('function' === typeof define) && define.amd) { 72 define(() => lucene); 73 } else if ('object' === typeof window) { 74 window.lucene = lucene; 75 }