lucene-filter.js

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

comparison.js (1198B)


      1 const field = require('../../field');
      2 
      3 module.exports = {
      4   detect : function (query) {
      5     if (!query) {
      6       return false;
      7     }
      8     if ('object' !== typeof query) {
      9       return false;
     10     }
     11     if (!query.term) {
     12       return false;
     13     }
     14     return Array.isArray(query.term.match(/^[<=>]+/));
     15   },
     16   compile: function (query) {
     17     query.similarity = query.similarity || 0;
     18     return function (data) {
     19       return field(query.field, data, function (value) {
     20         let sign, num;
     21         value = parseFloat(value);
     22         if (sign = query.term.match(/^[<=>]+/)) {
     23           [sign] = sign;
     24         }
     25         num = query.term.match(/[0-9.]+/);
     26         if (!num) {
     27           return false;
     28         }
     29         num = Number(num[0]);
     30         if (sign) {
     31           if (sign === '>') {
     32             return value > num;
     33           } else if (sign === '>=') {
     34             return value >= num;
     35           } else if (sign === '<') {
     36             return value < num;
     37           } else if (sign === '<=') {
     38             return value <= num;
     39           } else {
     40             throw new Error(`Invalid sign: ${sign}`);
     41           }
     42         } else {
     43           return value === num;
     44         }
     45       });
     46     };
     47   },
     48 };