electrodb
Advanced tools
Comparing version 0.9.48 to 0.9.49
{ | ||
"name": "electrodb", | ||
"version": "0.9.48", | ||
"version": "0.9.49", | ||
"description": "A library to more easily create and interact with multiple entities and heretical relationships in dynamodb", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
"use strict"; | ||
const { Schema } = require("./schema"); | ||
const { ElectroInstance, KeyTypes, QueryTypes, MethodTypes, Comparisons, ExpressionTypes, ModelVersions, ElectroInstanceTypes } = require("./types"); | ||
const { ElectroInstance, KeyTypes, QueryTypes, MethodTypes, Comparisons, ExpressionTypes, ModelVersions, ElectroInstanceTypes, MaxBatchItems } = require("./types"); | ||
const { FilterFactory, FilterTypes } = require("./filters"); | ||
@@ -154,3 +154,3 @@ const { WhereFactory } = require("./where"); | ||
async go(method, params = {}, options = {}) { | ||
async go(method, parameters = {}, options = {}) { | ||
let config = { | ||
@@ -166,19 +166,11 @@ includeKeys: options.includeKeys, | ||
}; | ||
let parameters = Object.assign({}, params); | ||
let stackTrace = new e.ElectroError(e.ErrorCodes.AWSError); | ||
try { | ||
let response = await this.client[method](parameters).promise().catch(err => { | ||
err.__isAWSError = true; | ||
throw err; | ||
}); | ||
switch (method) { | ||
case MethodTypes.put: | ||
case MethodTypes.create: | ||
return this.formatResponse(parameters.IndexName, parameters, config); | ||
case MethodTypes.batchWrite: | ||
return this.formatBulkWriteResponse(parameters.IndexName, response, config); | ||
return await this.executeBulkWrite(parameters, config); | ||
case MethodTypes.batchGet: | ||
return this.formatBulkGetResponse(parameters.IndexName, response, config); | ||
return await this.executeBulkGet(parameters, config); | ||
default: | ||
return this.formatResponse(parameters.IndexName, response, config); | ||
return await this.executeQuery(method, parameters, config); | ||
} | ||
@@ -202,2 +194,48 @@ } catch (err) { | ||
async _exec(method, parameters) { | ||
return this.client[method](parameters).promise().catch(err => { | ||
err.__isAWSError = true; | ||
throw err; | ||
}); | ||
} | ||
async executeBulkWrite(parameters, config) { | ||
if (!Array.isArray(parameters)) { | ||
parameters = [parameters]; | ||
} | ||
let results = []; | ||
await Promise.all(parameters.map(async params => { | ||
let response = await this._exec(MethodTypes.batchWrite, params); | ||
let unprocessed = this.formatBulkWriteResponse(params.IndexName, response, config); | ||
results = [...results, ...unprocessed]; | ||
})); | ||
return results; | ||
} | ||
async executeBulkGet(parameters, config) { | ||
if (!Array.isArray(parameters)) { | ||
parameters = [parameters]; | ||
} | ||
let resultsAll = []; | ||
let unprocessedAll = []; | ||
await Promise.all(parameters.map(async params => { | ||
let response = await this._exec(MethodTypes.batchGet, params); | ||
let [results, unprocessed] = this.formatBulkGetResponse(params.IndexName, response, config); | ||
resultsAll = [...resultsAll, ...results]; | ||
unprocessedAll = [...unprocessedAll, ...unprocessed]; | ||
})); | ||
return [resultsAll, unprocessedAll]; | ||
} | ||
async executeQuery(method, parameters, config) { | ||
// let params = Object.assign({}, parameters); | ||
let response = await this._exec(method, parameters); | ||
if (method === MethodTypes.put || method === MethodTypes.create) { | ||
return this.formatResponse(parameters.IndexName, parameters, config); | ||
} else { | ||
return this.formatResponse(parameters.IndexName, response, config); | ||
} | ||
} | ||
cleanseRetrievedData(item = {}, options = {}) { | ||
@@ -574,3 +612,3 @@ let { includeKeys } = options; | ||
let userDefinedParams = config.params || {}; | ||
let keys = []; | ||
let records = []; | ||
for (let itemState of state.batch.items) { | ||
@@ -581,13 +619,16 @@ let method = itemState.query.method; | ||
let {Key} = params; | ||
keys.push(Key); | ||
records.push(Key); | ||
} | ||
} | ||
return { | ||
RequestItems: { | ||
[table]: { | ||
...userDefinedParams, | ||
Keys: keys | ||
let batches = utilities.batchItems(records, MaxBatchItems.batchGet); | ||
return batches.map(batch => { | ||
return { | ||
RequestItems: { | ||
[table]: { | ||
...userDefinedParams, | ||
Keys: batch | ||
} | ||
} | ||
} | ||
} | ||
}); | ||
} | ||
@@ -597,3 +638,3 @@ | ||
let table = config.table || this._getTableName(); | ||
let batch = []; | ||
let records = []; | ||
for (let itemState of state.batch.items) { | ||
@@ -605,7 +646,7 @@ let method = itemState.query.method; | ||
let {Item} = params; | ||
batch.push({PutRequest: {Item}}); | ||
records.push({PutRequest: {Item}}); | ||
break; | ||
case MethodTypes.delete: | ||
let {Key} = params; | ||
batch.push({DeleteRequest: {Key}}); | ||
records.push({DeleteRequest: {Key}}); | ||
break; | ||
@@ -617,7 +658,10 @@ /* istanbul ignore next */ | ||
} | ||
return { | ||
RequestItems: { | ||
[table]: batch | ||
let batches = utilities.batchItems(records, MaxBatchItems.batchWrite); | ||
return batches.map(batch => { | ||
return { | ||
RequestItems: { | ||
[table]: batch | ||
} | ||
} | ||
} | ||
}); | ||
} | ||
@@ -624,0 +668,0 @@ |
@@ -81,2 +81,7 @@ const KeyTypes = { | ||
const MaxBatchItems = { | ||
[MethodTypes.batchGet]: 100, | ||
[MethodTypes.batchWrite]: 25 | ||
}; | ||
module.exports = { | ||
@@ -88,2 +93,3 @@ KeyTypes, | ||
Comparisons, | ||
MaxBatchItems, | ||
ModelVersions, | ||
@@ -90,0 +96,0 @@ AttributeTypes, |
@@ -51,3 +51,17 @@ const v = require("./validations"); | ||
function batchItems(arr = [], size) { | ||
if (isNaN(size)) { | ||
throw new Error("Batch size must be of type number"); | ||
} | ||
let batched = []; | ||
for (let i = 0; i < arr.length; i++) { | ||
let partition = Math.floor(i / size); | ||
batched[partition] = batched[partition] || []; | ||
batched[partition].push(arr[i]); | ||
} | ||
return batched; | ||
} | ||
module.exports = { | ||
batchItems, | ||
getInstanceType, | ||
@@ -54,0 +68,0 @@ getModelVersion, |
Sorry, the diff of this file is too big to display
227501
3703
3006