Created
February 16, 2018 17:34
-
-
Save reinaldorauch/be89495385ccaf25d83024041911acc0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Promise = require('bluebird'); // usado para rodar o map em sequência para não sobrecarregar o db | |
/** | |
* Converte a chamada da conexão para realizar query para usar promise | |
*/ | |
function mysqlQuery(conn, sql, params) { | |
return new Promise((resolve, reject) => { | |
conn.query(sql, params, (err, result) => { | |
if (err) return reject(err); | |
resolve(result); | |
}); | |
}); | |
} | |
/** | |
* Agrupa um array em um array de arrays com 200 elementos | |
*/ | |
function groupInto200(groups, itemToGroup) { | |
const lastGroup = groups[groups.length - 1]; // último grupo criado | |
if (Array.isArray(lastGroup) && lastGroup.length <= 200) { | |
lastGroup.push(itemToGroup); // adicionando no grupo enquanto tiver menos de 200 elementos | |
} else if (Array.isArray(lastGroup)) { | |
groups.push([itemToGroup]); // criando novo grupo quando há mais de 200 elementos | |
} | |
return groups; // retornando o array de grupos para continuar o reduce | |
} | |
/** | |
* Função para decompor o objeto recebido e convertê-lo para a sintaxe | |
* esperada pelo driver do mysql para gerar a query de insersão múltipla | |
*/ | |
function mapObjectIntoArray ({fielda, fieldb, fieldc}) { | |
return [fielda, fieldb, fieldc]; | |
} | |
/** | |
* Insere no banco um array de elementos tipo | |
* INSERT INTO table (fielda, fieldb, fieldc) VALUES | |
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'), | |
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'), | |
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'), | |
* ... | |
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'); | |
*/ | |
function bulkInsert(conn, data) { | |
const sql = 'INSERT INTO table (fielda, fieldb, fieldc) VALUES ?'; | |
return mysqlQuery(sql, data.map(mapObjectIntoArray)); | |
} | |
function importer(largeArrayToConsume) { | |
return largeArrayToConsume | |
.reduce(groupInto200, []) | |
.mapSeries(bulkInsert); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment