all files / lib/waterline/query/ index.js

88% Statements 22/25
75% Branches 9/12
100% Functions 4/4
91.67% Lines 22/24
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                      266×                 266×     266×                 263×                   263× 264×     264×           263×     263×     263× 263× 263×                                            
/**
 * Dependencies
 */
 
var _ = require('lodash');
var extend = require('../utils/extend');
var AdapterBase = require('../adapter');
var utils = require('../utils/helpers');
var AdapterMixin = require('./adapters');
var hop = utils.object.hasOwnProperty;
 
/**
 * Query
 */
 
var Query = module.exports = function() {
 
  // Create a reference to an internal Adapter Base
  this.adapter = new AdapterBase({
    connections: this.connections,
    query: this,
    collection: this.tableName || this.identity,
    identity: this.identity,
    dictionary: this.adapterDictionary
  });
 
  // Mixin Custom Adapter Functions.
  AdapterMixin.call(this);
 
  // Generate Dynamic Finders
  this.buildDynamicFinders();
};
 
 
/**
 * Automigrate
 *
 * @param  {Function} cb
 */
Query.prototype.sync = function(cb) {
  var self = this;
 
  // If any adapters used in this collection have syncable turned off set migrate to safe.
  //
  // I don't think a collection would ever need two adapters where one needs migrations and
  // the other doesn't but it may be a possibility. The way the auto-migrations work now doesn't
  // allow for this either way so this should be good. We will probably need to revist this soonish
  // however and take a pass at getting something working for better migration systems.
  // - particlebanana
 
  _.keys(this.connections).forEach(function(connectionName) {
    var adapter = self.connections[connectionName]._adapter;
 
    // If not syncable, don't sync
    Iif (hop(adapter, 'syncable') && !adapter.syncable) {
      self.migrate = 'safe';
    }
  });
 
  // Assign synchronization behavior depending on migrate option in collection
  Eif (this.migrate && ['drop', 'alter', 'create', 'safe'].indexOf(this.migrate) > -1) {
 
    // Determine which sync strategy to use
    var strategyMethodName = 'migrate' + utils.capitalize(this.migrate);
 
    // Run automigration strategy
    this.adapter[strategyMethodName](function(err) {
      Iif (err) return cb(err);
      cb();
    });
  }
 
  // Throw Error
  else cb(new Error('Invalid `migrate` strategy defined for collection. Must be one of the following: drop, alter, create, safe'));
};
 
 
_.extend(
  Query.prototype,
  require('./validate'),
  require('./ddl'),
  require('./dql'),
  require('./aggregate'),
  require('./composite'),
  require('./finders/basic'),
  require('./finders/helpers'),
  require('./finders/dynamicFinders'),
  require('./stream')
);
 
// Make Extendable
Query.extend = extend;