Comparing version 3.2.0 to 3.2.1
@@ -0,1 +1,4 @@ | ||
### v3.2.1 | ||
- Fix has many 'has' accessor failing when join table has duplicate entries ([#761](../../issues/761)) | ||
### v3.2.0 | ||
@@ -2,0 +5,0 @@ - Make [.find|.where|.all] synonyms & allow them to chain multiple times |
@@ -161,2 +161,3 @@ var _ = require("lodash"); | ||
options.autoFetchLimit = 0; | ||
options.__merge = { | ||
@@ -184,10 +185,13 @@ from: { table: association.mergeTable, field: Object.keys(association.mergeAssocId) }, | ||
association.model.find(conditions, options, function (err, instances) { | ||
if (err) { | ||
return cb(err); | ||
} | ||
if (!Instances.length) { | ||
return cb(null, instances.length > 0); | ||
} | ||
return cb(null, instances.length == Instances.length); | ||
association.model.find(conditions, options, function (err, foundItems) { | ||
if (err) return cb(err); | ||
if (_.isEmpty(Instances)) return cb(null, false); | ||
var foundItemsIDs = _(foundItems).map('id').uniq().value(); | ||
var InstancesIDs = _(Instances ).map('id').uniq().value(); | ||
var sameLength = foundItemsIDs.length == InstancesIDs.length; | ||
var sameContents = sameLength && _.isEmpty(_.difference(foundItemsIDs, InstancesIDs)); | ||
return cb(null, sameContents); | ||
}); | ||
@@ -301,2 +305,3 @@ return this; | ||
var cb = noOperation; | ||
for (var i = 0; i < arguments.length; i++) { | ||
@@ -356,2 +361,3 @@ switch (typeof arguments[i]) { | ||
var cb = noOperation; | ||
var run = function () { | ||
@@ -358,0 +364,0 @@ var savedAssociations = []; |
var _ = require("lodash"); | ||
var async = require("async"); | ||
var Utilities = require("./Utilities"); | ||
@@ -21,3 +22,3 @@ var ChainInstance = require("./ChainInstance"); | ||
var chainRun = function (cb) { | ||
var chainRun = function (done) { | ||
var order, conditions; | ||
@@ -38,54 +39,53 @@ | ||
exists : opts.exists | ||
}, function (err, data) { | ||
}, function (err, dataItems) { | ||
if (err) { | ||
return cb(err); | ||
return done(err); | ||
} | ||
if (data.length === 0) { | ||
return cb(null, []); | ||
if (dataItems.length === 0) { | ||
return done(null, []); | ||
} | ||
var pending = data.length; | ||
var pending = dataItems.length; | ||
var createInstance = function (idx) { | ||
opts.newInstance(data[idx], function (err, instance) { | ||
data[idx] = instance; | ||
if (--pending === 0) { | ||
return (opts.__eager && opts.__eager.length ? eagerLoading : cb)(null, data); | ||
} | ||
}); | ||
}; | ||
var eagerLoading = function (err, data) { | ||
var eagerLoad = function (err, items) { | ||
var pending = opts.__eager.length; | ||
var idMap = {}; | ||
var count = 0; | ||
var keys = _.map(data, function (instance) { | ||
var key = instance[opts.keys[0]]; | ||
var keys = _.map(items, function (item, index) { | ||
var key = item[opts.keys[0]]; | ||
// Create the association arrays | ||
for (var i = 0, association; association = opts.__eager[i]; i++) { | ||
instance[association.name] = []; | ||
item[association.name] = []; | ||
} | ||
idMap[key] = index; | ||
idMap[key] = count++; | ||
return key; | ||
}); | ||
_.map(opts.__eager, function (association) { | ||
opts.driver.eagerQuery(association, opts, keys, function (err, instances) { | ||
for (var i = 0, instance; instance = instances[i]; i++) { | ||
// Perform a parent lookup with $p, and initialize it as an instance. | ||
data[idMap[instance.$p]][association.name].push(association.model(instance)); | ||
} | ||
async.eachSeries(opts.__eager, | ||
function (association, cb) { | ||
opts.driver.eagerQuery(association, opts, keys, function (err, instances) { | ||
if (err) return cb(err) | ||
if (--pending === 0) { | ||
return cb(null, data); | ||
} | ||
}); | ||
}); | ||
for (var i = 0, instance; instance = instances[i]; i++) { | ||
// Perform a parent lookup with $p, and initialize it as an instance. | ||
items[idMap[instance.$p]][association.name].push(association.model(instance)); | ||
} | ||
cb(); | ||
}); | ||
}, | ||
function (err) { | ||
if (err) done(err); | ||
else done(null, items); | ||
} | ||
); | ||
}; | ||
for (var i = 0; i < data.length; i++) { | ||
createInstance(i); | ||
} | ||
async.map(dataItems, opts.newInstance, function (err, items) { | ||
if (err) return done(err); | ||
var shouldEagerLoad = opts.__eager && opts.__eager.length; | ||
var completeFn = shouldEagerLoad ? eagerLoad : done; | ||
return completeFn(null, items); | ||
}); | ||
}); | ||
@@ -92,0 +92,0 @@ } |
var _ = require("lodash"); | ||
var async = require("async"); | ||
var ChainFind = require("./ChainFind"); | ||
@@ -563,24 +564,42 @@ var Instance = require("./Instance").Instance; | ||
model.create = function () { | ||
var Instances = []; | ||
var options = {}; | ||
var cb = null, idx = 0, single = false; | ||
var createNext = function () { | ||
if (idx >= Instances.length) { | ||
return cb(null, single ? Instances[0] : Instances); | ||
var itemsParams = [] | ||
var items = []; | ||
var options = {}; | ||
var done = null; | ||
var single = false; | ||
for (var i = 0; i < arguments.length; i++) { | ||
switch (typeof arguments[i]) { | ||
case "object": | ||
if ( !single && Array.isArray(arguments[i]) ) { | ||
itemsParams = itemsParams.concat(arguments[i]); | ||
} else if (i === 0) { | ||
single = true; | ||
itemsParams.push(arguments[i]); | ||
} else { | ||
options = arguments[i]; | ||
} | ||
break; | ||
case "function": | ||
done = arguments[i]; | ||
break; | ||
} | ||
} | ||
Instances[idx] = createInstance(Instances[idx], { | ||
var iterator = function (params, index, cb) { | ||
createInstance(params, { | ||
is_new : true, | ||
autoSave : opts.autoSave, | ||
autoFetch : false | ||
}, function (err) { | ||
}, function (err, item) { | ||
if (err) { | ||
err.index = idx; | ||
err.instance = Instances[idx]; | ||
err.index = index; | ||
err.instance = item; | ||
return cb(err); | ||
} | ||
Instances[idx].save(function (err) { | ||
item.save(function (err) { | ||
if (err) { | ||
err.index = idx; | ||
err.instance = Instances[idx]; | ||
err.index = index; | ||
err.instance = item; | ||
@@ -590,4 +609,4 @@ return cb(err); | ||
idx += 1; | ||
createNext(); | ||
items[index] = item; | ||
cb(); | ||
}); | ||
@@ -597,22 +616,7 @@ }); | ||
for (var i = 0; i < arguments.length; i++) { | ||
switch (typeof arguments[i]) { | ||
case "object": | ||
if ( !single && Array.isArray(arguments[i]) ) { | ||
Instances = Instances.concat(arguments[i]); | ||
} else if (i === 0) { | ||
single = true; | ||
Instances.push(arguments[i]); | ||
} else { | ||
options = arguments[i]; | ||
} | ||
break; | ||
case "function": | ||
cb = arguments[i]; | ||
break; | ||
} | ||
} | ||
async.eachOfSeries(itemsParams, iterator, function (err) { | ||
if (err) return done(err); | ||
done(null, single ? items[0] : items); | ||
}); | ||
createNext(); | ||
return this; | ||
@@ -619,0 +623,0 @@ }; |
@@ -15,3 +15,3 @@ { | ||
], | ||
"version" : "3.2.0", | ||
"version" : "3.2.1", | ||
"license" : "MIT", | ||
@@ -40,8 +40,9 @@ "homepage" : "http://dresende.github.io/node-orm2", | ||
"dependencies": { | ||
"async" : "2.1.4", | ||
"enforce" : "0.1.6", | ||
"sql-query" : "0.1.26", | ||
"sql-ddl-sync" : "0.3.12", | ||
"hat" : "0.0.3", | ||
"lodash" : "4.17.2", | ||
"path-is-absolute" : "1.0.1" | ||
"path-is-absolute" : "1.0.1", | ||
"sql-query" : "0.1.26", | ||
"sql-ddl-sync" : "0.3.12" | ||
}, | ||
@@ -52,3 +53,2 @@ "devDependencies": { | ||
"sqlite3" : "3.1.8", | ||
"async" : "1.5.2", | ||
"mocha" : "3.2.0", | ||
@@ -55,0 +55,0 @@ "should" : "11.1.1", |
241697
7
6022
7
+ Addedasync@2.1.4
+ Addedasync@2.1.4(transitive)