crossfilter/universe

View on GitHub
src/crossfilter.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict'

var crossfilter = require('crossfilter2')

var _ = require('./lodash')

module.exports = function (service) {
  return {
    build: build,
    generateColumns: generateColumns,
    add: add,
    remove: remove,
  }

  function build(c) {
    if (_.isArray(c)) {
      // This allows support for crossfilter async
      return Promise.resolve(crossfilter(c))
    }
    if (!c || typeof c.dimension !== 'function') {
      return Promise.reject(new Error('No Crossfilter data or instance found!'))
    }
    return Promise.resolve(c)
  }

  function generateColumns(data) {
    if (!service.options.generatedColumns) {
      return data
    }
    return _.map(data, function (d/* , i */) {
      _.forEach(service.options.generatedColumns, function (val, key) {
        d[key] = val(d)
      })
      return d
    })
  }

  function add(data) {
    data = generateColumns(data)
    return new Promise(function (resolve, reject) {
      try {
        resolve(service.cf.add(data))
      } catch (err) {
        reject(err)
      }
    })
      .then(function () {
        return _.map(service.dataListeners, function (listener) {
          return function () {
            return listener({
              added: data,
            })
          }
        }).reduce(function(promise, data) {
          return promise.then(data)
        }, Promise.resolve(true))
      })
      .then(function () {
        return service
      })
  }

  function remove() {
    return new Promise(function (resolve, reject) {
      try {
        resolve(service.cf.remove())
      } catch (err) {
        reject(err)
      }
    })
      .then(function () {
        return service
      })
  }
}