Skip to content

Instantly share code, notes, and snippets.

@Vadorequest
Created May 4, 2014 09:59
Show Gist options
  • Save Vadorequest/11513855 to your computer and use it in GitHub Desktop.
Save Vadorequest/11513855 to your computer and use it in GitHub Desktop.
///<reference path='./def/defLoader.d.ts'/>
import populate = require('./../../shared/lib/core/lib/CorePopulate');
/**
* Used to populate the database to fill it with the default values.
*/
export class Populate extends populate.CorePopulate {
private static _added = 0;
private static _read = 0;
public static populate(){
// Read all files inside the populate folder.
fs.readdir(__config.path.populate, function(err, files){
if(err){
consoleDev(err);
}else{
sync.fiber(function() {
sync.parallel(function () {
Populate._readFiles(files);
});
var results = sync.await();
var created = _.reduce(results, function(sum, num) {
return sum + num;
});
console.log(created + ' documents were created, there are now ' + results.length + ' populated documents.')
});
}
});
}
private static _readFiles(files){
// For each file, get the data to populate stored in the file.
_.each(files, function(file){
_.each(require(__config.path.base + __config.path.populate + file), function(documents){
var callback = sync.defer()
// The file name must be the same as the targeted model.
var Model = __Dao.getModel(file.split('.')[0]);// Filter the extension.
if(Model){
// For each data, try to add it if it does not exist in the DB.
Model.findOrCreate(documents, function(err, doc, created){
if(err){
callback(err, 0);
}else if(created){
callback(null, 1);
consoleDev('The following document was created in the [' + Model.modelName + '] collection: ' + JSON.stringify(doc));
}else{
callback(null, 0);
}
});
}else{
callback('Unable to populate the file: ' + file + '. The model was not found.', 0);
}
});
});
}
}
@Vadorequest
Copy link
Author

En gros le workflow là c'est que j'ouvre des fichiers en parrallèle dans des processus/threads séparés, pour chacun d'entre eux je vais récupérer une liste d'objets et pour chaque objet je vais dans un autre processus/thread faire une requête d'ajout à la base de données si l'objet n'existe pas déjà. Donc j'ai du n² requêtes asynchrones. L'histoire pourrait s'arrêter là et le code serait moins complexe, mais ce que je veux c'est afficher une fois que tous les processus sont terminés le nombre d'éléments modifiés, du coup j'ai un await() pour attendre que tous les processus parallèles soient terminés pour compter ce qui a été ajouté.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment