1.0.7 • Published 7 years ago

loopback-ds-iterator-mixin v1.0.7

Weekly downloads
247
License
MIT
Repository
github
Last release
7 years ago

ITERATOR

Greenkeeper badge

Circle CI Coverage Status Dependencies semantic-release

This module is designed for the Strongloop Loopback framework. It provides a mixin that makes it easy to iterate through large data sets without leaving a large memory footprint.

Data is fetched in batches, with each batch lazy-loading only when needed. The batch size can be configured by setting the batchSize config options.

INSTALL

npm install --save loopback-ds-iterator-mixin

CONFIG

Add the mixins property to your server/model-config.json like the following:

{
  "_meta": {
    "sources": [
      "loopback/common/models",
      "loopback/server/models",
      "../common/models",
      "./models"
    ],
    "mixins": [
      "loopback/common/mixins",
      "../node_modules/loopback-ds-iterator-mixin/lib",
      "../common/mixins"
    ]
  }
}

MODEL CONFIG
=============

To use with your Models add the `mixins` attribute to the definition object of your model config.

```json
  {
    "name": "Item",
    "properties": {
      "name": "String",
      "description": "String",
      "status": "String"
    },
    "mixins": {
      "Iterator": {}
    }
  }

BOOT OPTIONS

The mixin provides a number of configurable values that control how and when results are fetched and processed.

The following options are available:

  • batchSize (default: 100)
    Number of items to fetch from datasource per batch.

  • maxQueueLength (default: 50)
    The maximum size to allow the queue length to grow to.

  • queueWaitInterval (default: 100)
    The number of milliseconds to wait until checking wether the queue has drained below maxQueueLength.

  • concurrentItems (default: 50)
    The number of concurrent items to process (used in forEachAsync).

To use different values for the default add the following parameters to the mixin options.

  {
    "name": "Item",
    "properties": {
      "name": "String",
      "description": "String",
      "status": "String"
    },
    "mixins": {
      "Iterator": {
        "batchSize": "100",
        "maxQueueLength": "50",
        "queueWaitInterval": "100",
        "concurrentItems": "50"
      }
    }
  }

USAGE

An iterate method will be added to your model class that can be used to manually iterate over the results of a find query.

var iterator = this.Item.iterate(query)
iterator.next()
  .then(function (item) {
    expect(item.name).to.equal('Item1');
    return iterator.next();
  })
  .then(function (item) {
    expect(item.name).to.equal('Item2');
    return iterator.next();
  })

Additionally, a forEachAsync method will be added to your model class that can be used to iterate over the results of a find query. maxQueueLength, queueWaitInterval & concurrentItems options can be used to tune things.

var fn = function(task, callback) {
  process.nextTick(function() {
    callback();
  });
}
this.Item.forEachAsync({where: { ... }}, fn, {})
  .then(function () {
    done();
  })
  .catch(done);
});

You can override the default configuration options such as the number of items per page (as defined in the mixin configuration) by setting the optional settings parameter:

var iterator = this.Item.iterate(query, {batchSize: 1000})
iterator.next()
  .then(function (item) {
    ...

TESTING

Run the tests in test.js

  npm test

Run with debugging output on:

  DEBUG='loopback:mixin:iterator' npm test
1.0.7

7 years ago

1.0.6

7 years ago

1.0.5

8 years ago

1.0.4

8 years ago

1.0.3

9 years ago

1.0.2

9 years ago

1.0.1

9 years ago