Nose Picking Mechanisms

    level-indico

    0.3.1 • Public • Published

    Synopsis

    Create and manage indices for your leveldb database.

    • Provides simple querying of indexed data
    • Supports inverted sorting of indices (e.g. sort a Date from newer to older)
    • Uses bytewise encoding for indices.
    • Supports automatic indexing (using hooks).
    • Works with changing fields (with some performance impact during reads).

    NPM

    Build Status Dependency Status

    Stability

    2 - Unstable

    The API is in the process of settling, but has not yet had sufficient real-world testing to be considered stable.

    Usage

    var indico = require('level-indico');
     
    var db = sublevel(level('db', { valueEncoding: 'json' }));
     
    //set indices on a sublevel
    var posts = indico(db.sublevel('posts'));
     
    /*
      post = {
        title: String,
        commentCount: Number,
        user: {
          name: String, 
          id: String
        },
        createdDate: Date
      }
     
    */
     
    //set a single index,  and save the index object for later use
    var titleIndex = posts.indico.ensureIndex(['title']);
    posts.indico.ensureIndex(['createdDate']);
    //works with nested properties
    posts.indico.ensureIndex(['user.id']);
    //set a compound index
    posts.indico.ensureIndex(['title', 'commentCount']);
    //set a descending index on 'createdDate' (so it sorts from newer to older)
    posts.indico.ensureIndex([['createdDate', 'desc'], 'commentCount']);
     
    //[...] Put some data
     
    //Now query...
     
    //SELECT * FROM posts WHERE title = 'Hello'
    titleIndex.find({start: ['Hello'], end: ['Hello']}, function (err, data) {
      //...
    });
     
    //SELECT * FROM posts WHERE title = 'Hello' AND commentCount >= 1
    posts.indico.findBy(['title', 'commentCount'], {start: ['Hello', 1], end: ['Hello', undefined]}, function (err, data) {
      //...
    });
     
    //SELECT * FROM posts ORDER BY createdDate DESC
    posts.indico.findBy([['createdDate', 'desc']], {start: [null], end: [undefined]}, function (err, data) {
      //...
    });
     
    //SELECT * FROM posts WHERE createdDate <= '1/1/2010' AND commentCount >= 10
    posts.indico.findBy([['createdDate', 'desc'], 'commentCount'], {
        start: [new Date(2010,01,00), 10],
        end: [undefined, undefined]
      }, function (err, data) {
      //...
    });
     
    //SELECT * FROM posts ORDER BY createdDate ASC
    posts.indico.streamBy([['createdDate', 'desc']], {start: [null], end: [undefined]})
    .on('data', function(data) {
    //...
    })
    .on(close, function() {
    //...
    })
     

    API

    db.indico

    indico.ensureIndex(properties)

    Sets an index on the specified properties.

    Arguments

    • properties: an Array listing the properties to index. Each item can be:
      • String: (e.g 'title') the property to include in the index, by default sorted Ascending.
      • Array: An array containing 2 String items:
        • [0]: The property name
        • [1]: The sorting order, one between 'desc' and 'asc'.

    Returns

    QueryManager for the specified index.

    Example

    var titleIndex = db.indico.ensureIndex(['title']);
    var dateAndCommentIndex = db.indico.ensureIndex([['createdDate', 'desc'], 'commentCount']);
     

    indico.index(properties)

    Alias of indico.ensureIndex

    indico.findBy(properties, options, callback)

    Invokes find on the QueryManager corresponding to the specified properties

    indico.streamBy(properties, options)

    Invokes stream on the QueryManager corresponding to the specified properties

    QueryManager

    find(options, callback)

    Finds all values corresponding to the specified options

    Arguments

    • options:
      • start: Array specifying the index you wish to start the read at. It must have the same arity of the index.
      • end: Array specifying index you wish to end the read on. It must have the same arity of the index.
    • callback: function(err, data)

    Note: Since level-indico uses bytewise under the hood, it means that null will sort before any other value, while undefined will sort aftern any other value.

    Example

    //SELECT * FROM posts WHERE title = 'Hello' ORDER BY commentCount ASC
    posts.indico.findBy(['title', 'commentCount'], {start: ['Hello', null], end: ['Hello', undefined]}, function (err, data) {
      //...
    });

    stream(options)

    Same as find, but returns a ReadableStream for the specified query.

    TODO

    • Index nested objects (not just values)
    • Full reindex

    Breaking changes

    0.1 -> 0.2

    ensureIndex('title', 'content') becomes ensureIndex(['title', 'content'])

    License

    MIT


    Bitdeli Badge

    Keywords

    none

    Install

    npm i level-indico

    DownloadsWeekly Downloads

    0

    Version

    0.3.1

    License

    none

    Last publish

    Collaborators

    • mariocasciaro