lucene-filter.js

Data filter for lucene queries
git clone git://git.finwo.net/lib/lucene-filter.js
Log | Files | Refs | README | LICENSE

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 }