Waterline ORM adapter for ArangoDB.
JavaScript
Switch branches/tags
Nothing to show
Clone or download
gbevan and gabriel-letarte fix nongraph joins. common query builder. Support for waterline unit …
…tests + more operators and functions. (#22)

* Moved console.logs to debug sa they can be turned off by default

* Allow joins without a graph as a fallback

* cleaned up some noisy debugs.  added support for field selection when doing a join

* have find() and join() use common query builder. Added support for LIKE and LOWER function. added sort, skip and limit support.

* standardised on lodash, removed underscore

* Consistent sorting

* casting data types on find and join.  added support for date fields. started waterline unit-test compliance...

* Fixes to now pass 119 (out of 180) waterline-adapter-tests (v0.11.2)

* resoved jshint warnings

* fix select from being treated as a function

* added gulpfile. jsdocs. project layer of unit-testing with mocha and gulp.

* renamed users model

* Fixed drop() method, with unit test

* fixed caseSensitive option + unit test

* more unit tests for caseSensitive option

* replaced update method approach with aql and using standard query builder.  cast results from destroy().

* cleanup comments.  fixed some jshints.  deprecated fixIds() in favour of processor cast()

* fixed jshint complaining about reserved word.

* fixed exclude for skip (pagination) as a function

* Added support for nested object filter criteria (still wip).  reworked std joins to make better use of AQB. Added support for filtering across joins.

* default to case insensitive comparisons, but allow override both globally in config and per query.  Fixed <= for undefined values.

* Fixed buildWhere recursion adding duplicate AND's

* Apply functions to joins

* fix to prevent joins from being treated like a function to be applied

* Add support for nin and ! array. fixed support for in array.

* fixed IN and NOT IN for id, _key etc - bug was converting arrays to joined strings.

* Added date as string search test based on waterline adapter test - this however uses toISOString() to match the date format used by arangodb

* readded required:true on user_1 name for unit tests

* reinstate collect drops at end of unit-tests

* Added support for groupBy (for "post-aggregation") to meet waterline adapter tests.

* added support for or clause to meet waterline adapter tests.

* added support for $replace on update - to force a deep replace operation

* Improved error handling in gulpfile. Updated the neighbors() method for arangodb 3.*.  Fixed and promisified createEdge and deleteEdge. Added jsdocs for adapter methods. Added unit tests for createEdge, neighbors (with an anonymous graph) and deleteEdge.  id is now using columnName of _id instead of _key as edges require full _id values.

* Allow creating of named graphs (instead of a single global graph), from schema models and api. Fixed edge based joins.

* support neighbours via a named graph.

* tidyup

* bumped to 0.3.0.  updated README.

* tidyup gulpfile and readme
Latest commit 729e021 Jul 19, 2017

README.md

image_squidhome@2x.png

sails-arangodb

Provides easy access to ArangoDB from Sails.js & Waterline.

Take a look at sails-arangodb-demo for more up-to-date examples.

This module is a Waterline/Sails adapter, an early implementation of a rapidly-developing, tool-agnostic data standard. Its goal is to provide a set of declarative interfaces, conventions, and best-practices for integrating with all sorts of data sources. Not just database s-- external APIs, proprietary web services, or even hardware.

Strict adherence to an adapter specification enables the (re)use of built-in generic test suites, standardized documentation, reasonable expectations around the API for your users, and overall, a more pleasant development experience for everyone.

This adapter has been developed pretty quickly and may contain bugs.

Installation

To install this adapter, run:

$ npm install sails-arangodb

Usage

This adapter exposes the following methods:

find()
create()
update()
destroy()
createGraph() # Create a Named Graph
neighbors() # Experimental, method signature is subject to change
createEdge() # Experimental, method signature is subject to change
deleteEdge() # Experimental, method signature is subject to change

Connection

Check out Connections in the Sails docs, or see the config/connections.js file in a new Sails project for information on setting up adapters.

in connection.js

localArangoDB: {
    adapter: 'sails-arangodb',

    host: 'localhost',
    port: 8529,

    user: 'root',
    password: 'CgdYW3zBLy5yCszR',

    database: '_system'

    collection: 'examplecollection'  // ArangoDB specific
}

Schema for Graphs

Defining a Named Graph in the Schema

/*jshint node: true, esversion: 6*/
'use strict';

const Waterline = require('waterline');

const UsersProfilesGraph = Waterline.Collection.extend({
  identity: 'users_profiles_graph',
  schema: true,
  connection: 'arangodb',

  attributes: {
    // this is a named graph
    $edgeDefinitions: [
      {
        collection: 'users_profiles',
        from: ['users_1'],
        to: ['profiles_1']
      }
    ]
  }
});
module.exports = UsersProfilesGraph;

If a model has an attribute called $edgeDefinitions then the model becomes a named graph. Any further attributes are ignored.

See tests for further examples.

Unit Testing

To run unit-tests every time you save a change to a file, simply:

$ gulp

One off run of sails-arangodb specific tests (same as above):

$ gulp test  # or mocha

(Important: you must create a test.json file for your local db instance first - see test/README.md)

To run the waterline adapter compliance tests:

$ gulp waterline

Generate api jsdocs:

$ gulp docs

(these are also generated in the default 'watch' mode above)


Older doc

Example model definitions

/**
 * User Model
 *
 * The User model represents the schema of authentication data
 */
module.exports = {

    // Enforce model schema in the case of schemaless databases
    schema: true,
    tableName: 'User',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        username: {
            type: 'string',
            unique: true
        },
        email: {
            type: 'email',
            unique: true
        },
        profile: {
            collection: 'Profile',
            via: 'user',
            edge: 'userCommented'
        }
    }
};
// api/models/Profile.js
module.exports = {
    tableName: 'profile',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        user: {
            model: "User",
            required: true
        },
        familyName: {
            type: 'string'
        },
        givenName: {
            type: 'string'
        },
        profilePic: {
            type: 'string'
        }
    }
    }

// api/models/User.js
module.exports = {
    tableName: 'user',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        username: {
            type: 'string'
        },
        profile: {
            collection: 'profile',
            via: 'user',
            edge: 'profileOf'
        }
    }
};
;

License

MIT © 2016 Gabriel Letarte (gabriel-letarte) & [thanks to] Taneli Leppä (rosmo) & [thanks to] vjsrinath & [thanks to] balderdashy, Mike McNeil, Balderdash & contributors

This adapter has been developed using vjsrinath's sails-orientdb as a template.

Sails is free and open-source under the MIT License.