|
@@ -50,10 +50,9 @@ export class MemoryAdapter extends Adapter {
|
|
|
* @returns {number}
|
|
* @returns {number}
|
|
|
*/
|
|
*/
|
|
|
_genNextIdValue(modelName, propName) {
|
|
_genNextIdValue(modelName, propName) {
|
|
|
- const propType = this.getService(
|
|
|
|
|
- ModelDefinitionUtils,
|
|
|
|
|
- ).getDataTypeByPropertyName(modelName, propName);
|
|
|
|
|
- if (propType !== DataType.ANY && propType !== DataType.NUMBER)
|
|
|
|
|
|
|
+ const modelUtils = this.getService(ModelDefinitionUtils);
|
|
|
|
|
+ const propType = modelUtils.getDataTypeByPropertyName(modelName, propName);
|
|
|
|
|
+ if (propType !== DataType.ANY && propType !== DataType.NUMBER) {
|
|
|
throw new InvalidArgumentError(
|
|
throw new InvalidArgumentError(
|
|
|
'The memory adapter able to generate only Number identifiers, ' +
|
|
'The memory adapter able to generate only Number identifiers, ' +
|
|
|
'but the primary key %v of the model %v is defined as %s. ' +
|
|
'but the primary key %v of the model %v is defined as %s. ' +
|
|
@@ -65,18 +64,36 @@ export class MemoryAdapter extends Adapter {
|
|
|
capitalize(propType),
|
|
capitalize(propType),
|
|
|
propName,
|
|
propName,
|
|
|
);
|
|
);
|
|
|
- const tableName =
|
|
|
|
|
- this.getService(ModelDefinitionUtils).getTableNameByModelName(modelName);
|
|
|
|
|
- const lastId = this._lastIds.get(tableName) ?? 0;
|
|
|
|
|
- const nextId = lastId + 1;
|
|
|
|
|
- this._lastIds.set(tableName, nextId);
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ const tableName = modelUtils.getTableNameByModelName(modelName);
|
|
|
const table = this._getTableOrCreate(modelName);
|
|
const table = this._getTableOrCreate(modelName);
|
|
|
- const existedIds = Array.from(table.keys());
|
|
|
|
|
- if (existedIds.includes(nextId))
|
|
|
|
|
- return this._genNextIdValue(modelName, propName);
|
|
|
|
|
|
|
+ let nextId = this._lastIds.get(tableName) ?? 0;
|
|
|
|
|
+ do {
|
|
|
|
|
+ nextId++;
|
|
|
|
|
+ } while (table.has(nextId));
|
|
|
|
|
+ this._lastIds.set(tableName, nextId);
|
|
|
return nextId;
|
|
return nextId;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Update last id value if needed.
|
|
|
|
|
+ *
|
|
|
|
|
+ * Если переданное значение последнего использованного
|
|
|
|
|
+ * идентификатора больше текущего, то текущее значение
|
|
|
|
|
+ * перезаписывается полученным.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {string} modelName
|
|
|
|
|
+ * @param {number} idValue
|
|
|
|
|
+ */
|
|
|
|
|
+ _updateLastIdValueIfNeeded(modelName, idValue) {
|
|
|
|
|
+ const tableName =
|
|
|
|
|
+ this.getService(ModelDefinitionUtils).getTableNameByModelName(modelName);
|
|
|
|
|
+ const currentLastId = this._lastIds.get(tableName) ?? 0;
|
|
|
|
|
+ if (idValue > currentLastId) {
|
|
|
|
|
+ this._lastIds.set(tableName, idValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Create
|
|
* Create
|
|
|
*
|
|
*
|
|
@@ -95,6 +112,12 @@ export class MemoryAdapter extends Adapter {
|
|
|
if (idValue == null || idValue === '' || idValue === 0) {
|
|
if (idValue == null || idValue === '' || idValue === 0) {
|
|
|
idValue = this._genNextIdValue(modelName, pkPropName);
|
|
idValue = this._genNextIdValue(modelName, pkPropName);
|
|
|
}
|
|
}
|
|
|
|
|
+ // если идентификатор передан вручную и является числом,
|
|
|
|
|
+ // то значение последнего использованного идентификатора
|
|
|
|
|
+ // обновляется на полученное
|
|
|
|
|
+ else if (typeof idValue === 'number') {
|
|
|
|
|
+ this._updateLastIdValueIfNeeded(modelName, idValue);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const table = this._getTableOrCreate(modelName);
|
|
const table = this._getTableOrCreate(modelName);
|
|
|
if (table.has(idValue))
|
|
if (table.has(idValue))
|
|
@@ -174,6 +197,12 @@ export class MemoryAdapter extends Adapter {
|
|
|
if (idValue == null || idValue === '' || idValue === 0) {
|
|
if (idValue == null || idValue === '' || idValue === 0) {
|
|
|
idValue = this._genNextIdValue(modelName, pkPropName);
|
|
idValue = this._genNextIdValue(modelName, pkPropName);
|
|
|
}
|
|
}
|
|
|
|
|
+ // если идентификатор передан вручную и является числом,
|
|
|
|
|
+ // то значение последнего использованного идентификатора
|
|
|
|
|
+ // обновляется на полученное
|
|
|
|
|
+ else if (typeof idValue === 'number') {
|
|
|
|
|
+ this._updateLastIdValueIfNeeded(modelName, idValue);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const table = this._getTableOrCreate(modelName);
|
|
const table = this._getTableOrCreate(modelName);
|
|
|
modelData = cloneDeep(modelData);
|
|
modelData = cloneDeep(modelData);
|