All files / src/index BooleanIndex.js

97.06% Statements 33/34
100% Branches 12/12
100% Functions 12/12
96.97% Lines 32/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103    9x 9x   9x           17x 17x         66x 66x   55x   22x     66x         11x         11x               11x   66x 66x                 84x         11x     5x   6x             5x 5x   30x 30x   12x     5x         6x 6x   36x   4x     6x         9x 9x    
"use strict";
 
const Index = require('./Index');
const extractObjectValues = require('../misc/extractObjectValues');
 
const INDEX_TYPE = 'boolean';
 
class BooleanIndex extends Index
{
  constructor(config = {}, type = undefined)
  {
    super(config, type || INDEX_TYPE);
    this.filters = ['is', 'exists'];
  }
 
  getDocumentValues(document)
  {
    let value = null;
    extractObjectValues(document, this.fields, newValue =>
    {
      if (typeof newValue === 'boolean')
      {
        value = newValue;
      }
    });
    return value;
  }
 
  analyseValues(values)
  {
    return values;
  }
 
  createIndex()
  {
    return [];
  }
 
  /**
   * O(documentIndices)
   */
  async addToIndex(index, documentIndices, documentsValues)
  {
    documentIndices.forEach((documentIndex, valuesOffset) =>
    {
      let value = documentsValues[valuesOffset];
      index[documentIndex] = value;
    });
  }
 
  /**
   * O(documentIndices)
   */
  async removeFromIndex(index, documentIndices, documentsValues)
  {
    documentIndices.forEach(documentIndex => index[documentIndex] = null);
  }
 
  filterBasedOnIndex(index, filter, results)
  {
    switch (filter.filter)
    {
    case 'exists':
      return this.filterExistsImpl(index, filter, results);
    case 'is':
      return this.filterIsImpl(index, filter, results);
    }
    return results;
  }
 
  filterExistsImpl(index, filter, results)
  {
    const targetValue = filter.values[0].toLowerCase() === 'true';
    for (let resultIndex = 0; resultIndex < index.length; resultIndex++)
    {
      const exists = typeof index[resultIndex] === 'boolean';
      if (targetValue === exists)
      {
        results.addHit(resultIndex, 1);
      }
    }
    return results;
  }
 
  filterIsImpl(index, filter, results)
  {
    const targetValue = filter.values[0].toLowerCase() === 'true';
    for (let resultIndex = 0; resultIndex < index.length; resultIndex++)
    {
      if (index[resultIndex] === targetValue)
      {
        results.addHit(resultIndex, 1);
      }
    }
    return results;
  }
 
}
 
module.exports = BooleanIndex;
require('./register')
  .add(BooleanIndex, INDEX_TYPE);