@aws-amplify/datastore 3.12.12 → 3.12.13-custom-pk.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/aws-amplify-datastore.js +1854 -965
  2. package/dist/aws-amplify-datastore.js.map +1 -1
  3. package/dist/aws-amplify-datastore.min.js +7 -7
  4. package/dist/aws-amplify-datastore.min.js.map +1 -1
  5. package/lib/datastore/datastore.d.ts +13 -16
  6. package/lib/datastore/datastore.js +130 -63
  7. package/lib/datastore/datastore.js.map +1 -1
  8. package/lib/index.d.ts +3 -19
  9. package/lib/predicates/index.d.ts +3 -2
  10. package/lib/predicates/index.js +12 -2
  11. package/lib/predicates/index.js.map +1 -1
  12. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +4 -3
  13. package/lib/storage/adapter/AsyncStorageAdapter.js +354 -203
  14. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  15. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +14 -4
  16. package/lib/storage/adapter/AsyncStorageDatabase.js +65 -28
  17. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  18. package/lib/storage/adapter/IndexedDBAdapter.d.ts +5 -4
  19. package/lib/storage/adapter/IndexedDBAdapter.js +389 -267
  20. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  21. package/lib/storage/adapter/index.d.ts +1 -1
  22. package/lib/storage/storage.d.ts +1 -1
  23. package/lib/storage/storage.js +92 -27
  24. package/lib/storage/storage.js.map +1 -1
  25. package/lib/sync/index.d.ts +21 -4
  26. package/lib/sync/index.js +13 -11
  27. package/lib/sync/index.js.map +1 -1
  28. package/lib/sync/merger.d.ts +3 -3
  29. package/lib/sync/merger.js +7 -6
  30. package/lib/sync/merger.js.map +1 -1
  31. package/lib/sync/outbox.d.ts +2 -2
  32. package/lib/sync/outbox.js +11 -9
  33. package/lib/sync/outbox.js.map +1 -1
  34. package/lib/sync/processors/mutation.js +60 -42
  35. package/lib/sync/processors/mutation.js.map +1 -1
  36. package/lib/sync/processors/subscription.js.map +1 -1
  37. package/lib/sync/processors/sync.js.map +1 -1
  38. package/lib/sync/utils.d.ts +3 -2
  39. package/lib/sync/utils.js +61 -8
  40. package/lib/sync/utils.js.map +1 -1
  41. package/lib/types.d.ts +64 -25
  42. package/lib/types.js +10 -1
  43. package/lib/types.js.map +1 -1
  44. package/lib/util.d.ts +56 -24
  45. package/lib/util.js +334 -170
  46. package/lib/util.js.map +1 -1
  47. package/lib-esm/datastore/datastore.d.ts +13 -16
  48. package/lib-esm/datastore/datastore.js +132 -65
  49. package/lib-esm/datastore/datastore.js.map +1 -1
  50. package/lib-esm/index.d.ts +3 -19
  51. package/lib-esm/predicates/index.d.ts +3 -2
  52. package/lib-esm/predicates/index.js +13 -3
  53. package/lib-esm/predicates/index.js.map +1 -1
  54. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +4 -3
  55. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +355 -204
  56. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  57. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +14 -4
  58. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +66 -29
  59. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  60. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +5 -4
  61. package/lib-esm/storage/adapter/IndexedDBAdapter.js +390 -268
  62. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  63. package/lib-esm/storage/adapter/index.d.ts +1 -1
  64. package/lib-esm/storage/storage.d.ts +1 -1
  65. package/lib-esm/storage/storage.js +92 -27
  66. package/lib-esm/storage/storage.js.map +1 -1
  67. package/lib-esm/sync/index.d.ts +21 -4
  68. package/lib-esm/sync/index.js +15 -13
  69. package/lib-esm/sync/index.js.map +1 -1
  70. package/lib-esm/sync/merger.d.ts +3 -3
  71. package/lib-esm/sync/merger.js +7 -6
  72. package/lib-esm/sync/merger.js.map +1 -1
  73. package/lib-esm/sync/outbox.d.ts +2 -2
  74. package/lib-esm/sync/outbox.js +12 -10
  75. package/lib-esm/sync/outbox.js.map +1 -1
  76. package/lib-esm/sync/processors/mutation.js +61 -43
  77. package/lib-esm/sync/processors/mutation.js.map +1 -1
  78. package/lib-esm/sync/processors/subscription.js.map +1 -1
  79. package/lib-esm/sync/processors/sync.js.map +1 -1
  80. package/lib-esm/sync/utils.d.ts +3 -2
  81. package/lib-esm/sync/utils.js +62 -10
  82. package/lib-esm/sync/utils.js.map +1 -1
  83. package/lib-esm/types.d.ts +64 -25
  84. package/lib-esm/types.js +9 -2
  85. package/lib-esm/types.js.map +1 -1
  86. package/lib-esm/util.d.ts +56 -24
  87. package/lib-esm/util.js +334 -170
  88. package/lib-esm/util.js.map +1 -1
  89. package/package.json +7 -7
  90. package/src/datastore/datastore.ts +253 -113
  91. package/src/predicates/index.ts +32 -10
  92. package/src/storage/adapter/AsyncStorageAdapter.ts +309 -93
  93. package/src/storage/adapter/AsyncStorageDatabase.ts +74 -26
  94. package/src/storage/adapter/IndexedDBAdapter.ts +319 -136
  95. package/src/storage/adapter/index.ts +1 -1
  96. package/src/storage/storage.ts +68 -21
  97. package/src/sync/index.ts +41 -26
  98. package/src/sync/merger.ts +14 -4
  99. package/src/sync/outbox.ts +21 -8
  100. package/src/sync/processors/mutation.ts +49 -45
  101. package/src/sync/processors/subscription.ts +0 -1
  102. package/src/sync/processors/sync.ts +1 -3
  103. package/src/sync/utils.ts +69 -12
  104. package/src/types.ts +181 -29
  105. package/src/util.ts +415 -176
@@ -56,7 +56,7 @@ import { ConsoleLogger as Logger } from '@aws-amplify/core';
56
56
  import AsyncStorageDatabase from './AsyncStorageDatabase';
57
57
  import { ModelPredicateCreator, ModelSortPredicateCreator, } from '../../predicates';
58
58
  import { isPredicateObj, OpType, QueryOne, } from '../../types';
59
- import { exhaustiveCheck, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, sortCompareFunction, } from '../../util';
59
+ import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, exhaustiveCheck, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, sortCompareFunction, keysEqual, getStorename, getIndexKeys, extractPrimaryKeyValues, IDENTIFIER_KEY_SEPARATOR, } from '../../util';
60
60
  var logger = new Logger('DataStore');
61
61
  var AsyncStorageAdapter = /** @class */ (function () {
62
62
  function AsyncStorageAdapter() {
@@ -64,11 +64,19 @@ var AsyncStorageAdapter = /** @class */ (function () {
64
64
  AsyncStorageAdapter.prototype.getStorenameForModel = function (modelConstructor) {
65
65
  var namespace = this.namespaceResolver(modelConstructor);
66
66
  var modelName = modelConstructor.name;
67
- return this.getStorename(namespace, modelName);
67
+ return getStorename(namespace, modelName);
68
68
  };
69
- AsyncStorageAdapter.prototype.getStorename = function (namespace, modelName) {
70
- var storeName = namespace + "_" + modelName;
71
- return storeName;
69
+ // Retrieves primary key values from a model
70
+ AsyncStorageAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
71
+ var modelConstructor = Object.getPrototypeOf(model)
72
+ .constructor;
73
+ var namespaceName = this.namespaceResolver(modelConstructor);
74
+ var keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
75
+ return extractPrimaryKeyValues(model, keys);
76
+ };
77
+ // Retrieves concatenated primary key values from a model
78
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
79
+ return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
72
80
  };
73
81
  AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
74
82
  return __awaiter(this, void 0, void 0, function () {
@@ -115,7 +123,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
115
123
  AsyncStorageAdapter.prototype.save = function (model, condition) {
116
124
  var e_1, _a;
117
125
  return __awaiter(this, void 0, void 0, function () {
118
- var modelConstructor, storeName, connectedModels, namespaceName, set, connectionStoreNames, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, id, fromDB_1, opType, e_1_1;
126
+ var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, keyValuesPath, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, itemKeyValuesPath, fromDB_1, opType, modelKeyValues, e_1_1;
119
127
  var _this = this;
120
128
  return __generator(this, function (_b) {
121
129
  switch (_b.label) {
@@ -123,16 +131,18 @@ var AsyncStorageAdapter = /** @class */ (function () {
123
131
  modelConstructor = Object.getPrototypeOf(model)
124
132
  .constructor;
125
133
  storeName = this.getStorenameForModel(modelConstructor);
126
- connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
127
134
  namespaceName = this.namespaceResolver(modelConstructor);
135
+ connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
128
136
  set = new Set();
129
137
  connectionStoreNames = Object.values(connectedModels).map(function (_a) {
130
138
  var modelName = _a.modelName, item = _a.item, instance = _a.instance;
131
- var storeName = _this.getStorename(namespaceName, modelName);
139
+ var storeName = getStorename(namespaceName, modelName);
132
140
  set.add(storeName);
133
- return { storeName: storeName, item: item, instance: instance };
141
+ var keys = getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
142
+ return { storeName: storeName, item: item, instance: instance, keys: keys };
134
143
  });
135
- return [4 /*yield*/, this.db.get(model.id, storeName)];
144
+ keyValuesPath = this.getIndexKeyValuesPath(model);
145
+ return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
136
146
  case 1:
137
147
  fromDB = _b.sent();
138
148
  if (condition && fromDB) {
@@ -155,14 +165,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
155
165
  case 4:
156
166
  if (!(connectionStoreNames_1_1 = _b.sent(), !connectionStoreNames_1_1.done)) return [3 /*break*/, 8];
157
167
  resItem = connectionStoreNames_1_1.value;
158
- storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance;
159
- id = item.id;
160
- return [4 /*yield*/, this.db.get(id, storeName_1)];
168
+ storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
169
+ itemKeyValues = keys.map(function (key) { return item[key]; });
170
+ itemKeyValuesPath = itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
171
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
161
172
  case 5:
162
173
  fromDB_1 = _b.sent();
163
174
  opType = fromDB_1 ? OpType.UPDATE : OpType.INSERT;
164
- if (!(id === model.id || opType === OpType.INSERT)) return [3 /*break*/, 7];
165
- return [4 /*yield*/, this.db.save(item, storeName_1)];
175
+ modelKeyValues = this.getIndexKeyValuesFromModel(model);
176
+ if (!(keysEqual(itemKeyValues, modelKeyValues) ||
177
+ opType === OpType.INSERT)) return [3 /*break*/, 7];
178
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
166
179
  case 6:
167
180
  _b.sent();
168
181
  result.push([instance, opType]);
@@ -194,7 +207,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
194
207
  var records_1, records_1_1, records_2, records_2_1;
195
208
  var e_2, _a, e_3, _b, e_4, _c;
196
209
  return __awaiter(this, void 0, void 0, function () {
197
- var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, relationType, storeName, modelConstructor_1, _d, recordItem, getByfield, connectionRecord, e_3_1, recordItem, connectionRecord, e_4_1, e_2_1;
210
+ var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, targetNames, relationType, storeName, modelConstructor_1, _d, recordItem, getByFields, allPresent, keys, connectionRecord, getByfield, key, connectionRecord, e_3_1, recordItem, allPresent, keys, connectionRecord, key, connectionRecord, e_4_1, e_2_1;
198
211
  var _this = this;
199
212
  return __generator(this, function (_e) {
200
213
  switch (_e.label) {
@@ -203,7 +216,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
203
216
  relations = namespace.relationships[srcModelName].relationTypes;
204
217
  connectionStoreNames = relations.map(function (_a) {
205
218
  var modelName = _a.modelName;
206
- return _this.getStorename(namespaceName, modelName);
219
+ return getStorename(namespaceName, modelName);
207
220
  });
208
221
  modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
209
222
  if (connectionStoreNames.length === 0) {
@@ -213,121 +226,171 @@ var AsyncStorageAdapter = /** @class */ (function () {
213
226
  }
214
227
  _e.label = 1;
215
228
  case 1:
216
- _e.trys.push([1, 34, 35, 40]);
229
+ _e.trys.push([1, 38, 39, 44]);
217
230
  relations_1 = __asyncValues(relations);
218
231
  _e.label = 2;
219
232
  case 2: return [4 /*yield*/, relations_1.next()];
220
233
  case 3:
221
- if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 33];
234
+ if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 37];
222
235
  relation = relations_1_1.value;
223
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, relationType = relation.relationType;
224
- storeName = this.getStorename(namespaceName, modelName);
236
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames, relationType = relation.relationType;
237
+ storeName = getStorename(namespaceName, modelName);
225
238
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
226
239
  _d = relationType;
227
240
  switch (_d) {
228
241
  case 'HAS_ONE': return [3 /*break*/, 4];
229
- case 'BELONGS_TO': return [3 /*break*/, 17];
230
- case 'HAS_MANY': return [3 /*break*/, 30];
242
+ case 'BELONGS_TO': return [3 /*break*/, 19];
243
+ case 'HAS_MANY': return [3 /*break*/, 34];
231
244
  }
232
- return [3 /*break*/, 31];
245
+ return [3 /*break*/, 35];
233
246
  case 4:
234
- _e.trys.push([4, 10, 11, 16]);
247
+ _e.trys.push([4, 12, 13, 18]);
235
248
  records_1 = __asyncValues(records);
236
249
  _e.label = 5;
237
250
  case 5: return [4 /*yield*/, records_1.next()];
238
251
  case 6:
239
- if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 9];
252
+ if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 11];
240
253
  recordItem = records_1_1.value;
241
- getByfield = recordItem[targetName] ? targetName : fieldName;
242
- if (!recordItem[getByfield])
243
- return [3 /*break*/, 9];
244
- return [4 /*yield*/, this.db.get(recordItem[getByfield], storeName)];
254
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
255
+ getByFields = [];
256
+ allPresent = void 0;
257
+ // iterate through all targetnames to make sure they are all present in the recordItem
258
+ allPresent = targetNames.every(function (targetName) {
259
+ return recordItem[targetName] != null;
260
+ });
261
+ if (!allPresent) {
262
+ return [3 /*break*/, 11];
263
+ }
264
+ getByFields = targetNames;
265
+ keys = getByFields
266
+ .map(function (getByField) { return recordItem[getByField]; })
267
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
268
+ return [4 /*yield*/, this.db.get(keys, storeName)];
245
269
  case 7:
246
270
  connectionRecord = _e.sent();
247
271
  recordItem[fieldName] =
248
272
  connectionRecord &&
249
273
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
250
- _e.label = 8;
251
- case 8: return [3 /*break*/, 5];
252
- case 9: return [3 /*break*/, 16];
253
- case 10:
274
+ return [3 /*break*/, 10];
275
+ case 8:
276
+ getByfield = recordItem[targetName]
277
+ ? targetName
278
+ : fieldName;
279
+ if (!recordItem[getByfield])
280
+ return [3 /*break*/, 11];
281
+ key = recordItem[getByfield];
282
+ return [4 /*yield*/, this.db.get(key, storeName)];
283
+ case 9:
284
+ connectionRecord = _e.sent();
285
+ recordItem[fieldName] =
286
+ connectionRecord &&
287
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
288
+ _e.label = 10;
289
+ case 10: return [3 /*break*/, 5];
290
+ case 11: return [3 /*break*/, 18];
291
+ case 12:
254
292
  e_3_1 = _e.sent();
255
293
  e_3 = { error: e_3_1 };
256
- return [3 /*break*/, 16];
257
- case 11:
258
- _e.trys.push([11, , 14, 15]);
259
- if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 13];
294
+ return [3 /*break*/, 18];
295
+ case 13:
296
+ _e.trys.push([13, , 16, 17]);
297
+ if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 15];
260
298
  return [4 /*yield*/, _b.call(records_1)];
261
- case 12:
262
- _e.sent();
263
- _e.label = 13;
264
- case 13: return [3 /*break*/, 15];
265
299
  case 14:
300
+ _e.sent();
301
+ _e.label = 15;
302
+ case 15: return [3 /*break*/, 17];
303
+ case 16:
266
304
  if (e_3) throw e_3.error;
267
305
  return [7 /*endfinally*/];
268
- case 15: return [7 /*endfinally*/];
269
- case 16: return [3 /*break*/, 32];
270
- case 17:
271
- _e.trys.push([17, 23, 24, 29]);
272
- records_2 = __asyncValues(records);
273
- _e.label = 18;
274
- case 18: return [4 /*yield*/, records_2.next()];
306
+ case 17: return [7 /*endfinally*/];
307
+ case 18: return [3 /*break*/, 36];
275
308
  case 19:
276
- if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 22];
309
+ _e.trys.push([19, 27, 28, 33]);
310
+ records_2 = __asyncValues(records);
311
+ _e.label = 20;
312
+ case 20: return [4 /*yield*/, records_2.next()];
313
+ case 21:
314
+ if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 26];
277
315
  recordItem = records_2_1.value;
278
- if (!recordItem[targetName]) return [3 /*break*/, 21];
279
- return [4 /*yield*/, this.db.get(recordItem[targetName], storeName)];
280
- case 20:
316
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 23];
317
+ allPresent = void 0;
318
+ // iterate through all targetnames to make sure they are all present in the recordItem
319
+ allPresent = targetNames.every(function (targetName) {
320
+ return recordItem[targetName] != null;
321
+ });
322
+ // If not present, there is not yet a connected record
323
+ if (!allPresent) {
324
+ return [3 /*break*/, 26];
325
+ }
326
+ keys = targetNames
327
+ .map(function (targetName) { return recordItem[targetName]; })
328
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
329
+ return [4 /*yield*/, this.db.get(keys, storeName)];
330
+ case 22:
281
331
  connectionRecord = _e.sent();
282
332
  recordItem[fieldName] =
283
333
  connectionRecord &&
284
334
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
285
- delete recordItem[targetName];
286
- _e.label = 21;
287
- case 21: return [3 /*break*/, 18];
288
- case 22: return [3 /*break*/, 29];
335
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
336
+ delete recordItem[targetName];
337
+ });
338
+ return [3 /*break*/, 25];
289
339
  case 23:
340
+ if (!recordItem[targetName]) return [3 /*break*/, 25];
341
+ key = recordItem[targetName];
342
+ return [4 /*yield*/, this.db.get(key, storeName)];
343
+ case 24:
344
+ connectionRecord = _e.sent();
345
+ recordItem[fieldName] =
346
+ connectionRecord &&
347
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
348
+ delete recordItem[targetName];
349
+ _e.label = 25;
350
+ case 25: return [3 /*break*/, 20];
351
+ case 26: return [3 /*break*/, 33];
352
+ case 27:
290
353
  e_4_1 = _e.sent();
291
354
  e_4 = { error: e_4_1 };
292
- return [3 /*break*/, 29];
293
- case 24:
294
- _e.trys.push([24, , 27, 28]);
295
- if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 26];
355
+ return [3 /*break*/, 33];
356
+ case 28:
357
+ _e.trys.push([28, , 31, 32]);
358
+ if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 30];
296
359
  return [4 /*yield*/, _c.call(records_2)];
297
- case 25:
360
+ case 29:
298
361
  _e.sent();
299
- _e.label = 26;
300
- case 26: return [3 /*break*/, 28];
301
- case 27:
362
+ _e.label = 30;
363
+ case 30: return [3 /*break*/, 32];
364
+ case 31:
302
365
  if (e_4) throw e_4.error;
303
366
  return [7 /*endfinally*/];
304
- case 28: return [7 /*endfinally*/];
305
- case 29: return [3 /*break*/, 32];
306
- case 30:
367
+ case 32: return [7 /*endfinally*/];
368
+ case 33: return [3 /*break*/, 36];
369
+ case 34:
307
370
  // TODO: Lazy loading
308
- return [3 /*break*/, 32];
309
- case 31:
371
+ return [3 /*break*/, 36];
372
+ case 35:
310
373
  exhaustiveCheck(relationType);
311
- return [3 /*break*/, 32];
312
- case 32: return [3 /*break*/, 2];
313
- case 33: return [3 /*break*/, 40];
314
- case 34:
374
+ return [3 /*break*/, 36];
375
+ case 36: return [3 /*break*/, 2];
376
+ case 37: return [3 /*break*/, 44];
377
+ case 38:
315
378
  e_2_1 = _e.sent();
316
379
  e_2 = { error: e_2_1 };
317
- return [3 /*break*/, 40];
318
- case 35:
319
- _e.trys.push([35, , 38, 39]);
320
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 37];
380
+ return [3 /*break*/, 44];
381
+ case 39:
382
+ _e.trys.push([39, , 42, 43]);
383
+ if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 41];
321
384
  return [4 /*yield*/, _a.call(relations_1)];
322
- case 36:
385
+ case 40:
323
386
  _e.sent();
324
- _e.label = 37;
325
- case 37: return [3 /*break*/, 39];
326
- case 38:
387
+ _e.label = 41;
388
+ case 41: return [3 /*break*/, 43];
389
+ case 42:
327
390
  if (e_2) throw e_2.error;
328
391
  return [7 /*endfinally*/];
329
- case 39: return [7 /*endfinally*/];
330
- case 40: return [2 /*return*/, records.map(function (record) {
392
+ case 43: return [7 /*endfinally*/];
393
+ case 44: return [2 /*return*/, records.map(function (record) {
331
394
  return _this.modelInstanceCreator(modelConstructor, record);
332
395
  })];
333
396
  }
@@ -336,7 +399,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
336
399
  };
337
400
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
338
401
  return __awaiter(this, void 0, void 0, function () {
339
- var storeName, namespaceName, predicates, queryById, hasSort, hasPagination, records;
402
+ var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
340
403
  var _this = this;
341
404
  return __generator(this, function (_a) {
342
405
  switch (_a.label) {
@@ -344,7 +407,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
344
407
  storeName = this.getStorenameForModel(modelConstructor);
345
408
  namespaceName = this.namespaceResolver(modelConstructor);
346
409
  predicates = predicate && ModelPredicateCreator.getPredicates(predicate);
347
- queryById = predicates && this.idFromPredicate(predicates);
410
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
411
+ queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
348
412
  hasSort = pagination && pagination.sort;
349
413
  hasPagination = pagination && pagination.limit;
350
414
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
@@ -352,8 +416,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
352
416
  return __generator(this, function (_a) {
353
417
  switch (_a.label) {
354
418
  case 0:
355
- if (!queryById) return [3 /*break*/, 2];
356
- return [4 /*yield*/, this.getById(storeName, queryById)];
419
+ if (!queryByKey) return [3 /*break*/, 2];
420
+ return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
357
421
  case 1:
358
422
  record = _a.sent();
359
423
  return [2 /*return*/, record ? [record] : []];
@@ -381,12 +445,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
381
445
  });
382
446
  });
383
447
  };
384
- AsyncStorageAdapter.prototype.getById = function (storeName, id) {
448
+ AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
385
449
  return __awaiter(this, void 0, void 0, function () {
386
450
  var record;
387
451
  return __generator(this, function (_a) {
388
452
  switch (_a.label) {
389
- case 0: return [4 /*yield*/, this.db.get(id, storeName)];
453
+ case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
390
454
  case 1:
391
455
  record = _a.sent();
392
456
  return [2 /*return*/, record];
@@ -404,11 +468,33 @@ var AsyncStorageAdapter = /** @class */ (function () {
404
468
  });
405
469
  });
406
470
  };
407
- AsyncStorageAdapter.prototype.idFromPredicate = function (predicates) {
471
+ AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
472
+ var e_5, _a;
408
473
  var predicateObjs = predicates.predicates;
409
- var idPredicate = predicateObjs.length === 1 &&
410
- predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === 'id' && p.operator === 'eq'; });
411
- return idPredicate && idPredicate.operand;
474
+ if (predicateObjs.length !== keys.length) {
475
+ return;
476
+ }
477
+ var keyValues = [];
478
+ var _loop_1 = function (key) {
479
+ var predicateObj = predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
480
+ predicateObj && keyValues.push(predicateObj.operand);
481
+ };
482
+ try {
483
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
484
+ var key = keys_1_1.value;
485
+ _loop_1(key);
486
+ }
487
+ }
488
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
489
+ finally {
490
+ try {
491
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
492
+ }
493
+ finally { if (e_5) throw e_5.error; }
494
+ }
495
+ return keyValues.length === keys.length
496
+ ? keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)
497
+ : undefined;
412
498
  };
413
499
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
414
500
  return __awaiter(this, void 0, void 0, function () {
@@ -462,7 +548,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
462
548
  };
463
549
  AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
464
550
  return __awaiter(this, void 0, void 0, function () {
465
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
551
+ var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, keyValuePath, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
466
552
  return __generator(this, function (_a) {
467
553
  switch (_a.label) {
468
554
  case 0:
@@ -503,10 +589,11 @@ var AsyncStorageAdapter = /** @class */ (function () {
503
589
  model = modelOrModelConstructor;
504
590
  modelConstructor = Object.getPrototypeOf(model)
505
591
  .constructor;
506
- nameSpace = this.namespaceResolver(modelConstructor);
592
+ namespaceName = this.namespaceResolver(modelConstructor);
507
593
  storeName = this.getStorenameForModel(modelConstructor);
508
594
  if (!condition) return [3 /*break*/, 11];
509
- return [4 /*yield*/, this.db.get(model.id, storeName)];
595
+ keyValuePath = this.getIndexKeyValuesPath(model);
596
+ return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
510
597
  case 9:
511
598
  fromDB = _a.sent();
512
599
  if (fromDB === undefined) {
@@ -522,16 +609,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
522
609
  logger.error(msg, { model: fromDB, condition: predicateObjs });
523
610
  throw new Error(msg);
524
611
  }
525
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
526
- .relationTypes;
527
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
612
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
613
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
528
614
  case 10:
529
615
  _a.sent();
530
616
  return [3 /*break*/, 13];
531
617
  case 11:
532
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
533
- .relationTypes;
534
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
618
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
619
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
535
620
  case 12:
536
621
  _a.sent();
537
622
  _a.label = 13;
@@ -550,9 +635,9 @@ var AsyncStorageAdapter = /** @class */ (function () {
550
635
  };
551
636
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
552
637
  var deleteQueue_1, deleteQueue_1_1;
553
- var e_5, _a, e_6, _b;
638
+ var e_6, _a, e_7, _b;
554
639
  return __awaiter(this, void 0, void 0, function () {
555
- var deleteItem, storeName, items, items_1, items_1_1, item, id, e_6_1, e_5_1;
640
+ var deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_7_1, e_6_1;
556
641
  return __generator(this, function (_c) {
557
642
  switch (_c.label) {
558
643
  case 0:
@@ -575,16 +660,16 @@ var AsyncStorageAdapter = /** @class */ (function () {
575
660
  item = items_1_1.value;
576
661
  if (!item) return [3 /*break*/, 7];
577
662
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
578
- id = item['id'];
579
- return [4 /*yield*/, this.db.delete(id, storeName)];
663
+ keyValuesPath = this.getIndexKeyValuesPath(item);
664
+ return [4 /*yield*/, this.db.delete(keyValuesPath, storeName)];
580
665
  case 6:
581
666
  _c.sent();
582
667
  _c.label = 7;
583
668
  case 7: return [3 /*break*/, 4];
584
669
  case 8: return [3 /*break*/, 15];
585
670
  case 9:
586
- e_6_1 = _c.sent();
587
- e_6 = { error: e_6_1 };
671
+ e_7_1 = _c.sent();
672
+ e_7 = { error: e_7_1 };
588
673
  return [3 /*break*/, 15];
589
674
  case 10:
590
675
  _c.trys.push([10, , 13, 14]);
@@ -595,14 +680,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
595
680
  _c.label = 12;
596
681
  case 12: return [3 /*break*/, 14];
597
682
  case 13:
598
- if (e_6) throw e_6.error;
683
+ if (e_7) throw e_7.error;
599
684
  return [7 /*endfinally*/];
600
685
  case 14: return [7 /*endfinally*/];
601
686
  case 15: return [3 /*break*/, 1];
602
687
  case 16: return [3 /*break*/, 23];
603
688
  case 17:
604
- e_5_1 = _c.sent();
605
- e_5 = { error: e_5_1 };
689
+ e_6_1 = _c.sent();
690
+ e_6 = { error: e_6_1 };
606
691
  return [3 /*break*/, 23];
607
692
  case 18:
608
693
  _c.trys.push([18, , 21, 22]);
@@ -613,7 +698,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
613
698
  _c.label = 20;
614
699
  case 20: return [3 /*break*/, 22];
615
700
  case 21:
616
- if (e_5) throw e_5.error;
701
+ if (e_6) throw e_6.error;
617
702
  return [7 /*endfinally*/];
618
703
  case 22: return [7 /*endfinally*/];
619
704
  case 23: return [2 /*return*/];
@@ -631,22 +716,22 @@ var AsyncStorageAdapter = /** @class */ (function () {
631
716
  */
632
717
  AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
633
718
  var relations_2, relations_2_1, models_1, models_1_1, models_2, models_2_1;
634
- var e_7, _a, e_8, _b, e_9, _c;
719
+ var e_8, _a, e_9, _b, e_10, _c;
635
720
  return __awaiter(this, void 0, void 0, function () {
636
- var rel, relationType, modelName, targetName, storeName, index, _d, model, hasOneIndex, hasOneCustomField, value, allRecords, recordToDelete, e_8_1, model, allRecords, childrenArray, e_9_1, e_7_1;
721
+ var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex_1, hasConnectedModelFields, keyValuesPath, values_1, isUnidirectionalConnection, allRecords, recordToDelete, hasOneIndex_2, hasOneCustomField, keyValuesPath, value_1, allRecords, recordToDelete, e_9_1, model, keyValues, allRecords, indices, childrenArray, e_10_1, e_8_1;
637
722
  var _this = this;
638
723
  return __generator(this, function (_e) {
639
724
  switch (_e.label) {
640
725
  case 0:
641
- _e.trys.push([0, 35, 36, 41]);
726
+ _e.trys.push([0, 38, 39, 44]);
642
727
  relations_2 = __asyncValues(relations);
643
728
  _e.label = 1;
644
729
  case 1: return [4 /*yield*/, relations_2.next()];
645
730
  case 2:
646
- if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 34];
731
+ if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 37];
647
732
  rel = relations_2_1.value;
648
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName;
649
- storeName = this.getStorename(nameSpace, modelName);
733
+ relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
734
+ storeName = getStorename(nameSpace, modelName);
650
735
  index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
651
736
  .relationTypes, srcModel) ||
652
737
  // if we were unable to find an index via relationTypes
@@ -656,114 +741,176 @@ var AsyncStorageAdapter = /** @class */ (function () {
656
741
  _d = relationType;
657
742
  switch (_d) {
658
743
  case 'HAS_ONE': return [3 /*break*/, 3];
659
- case 'HAS_MANY': return [3 /*break*/, 17];
660
- case 'BELONGS_TO': return [3 /*break*/, 31];
744
+ case 'HAS_MANY': return [3 /*break*/, 20];
745
+ case 'BELONGS_TO': return [3 /*break*/, 34];
661
746
  }
662
- return [3 /*break*/, 32];
747
+ return [3 /*break*/, 35];
663
748
  case 3:
664
- _e.trys.push([3, 10, 11, 16]);
749
+ _e.trys.push([3, 13, 14, 19]);
665
750
  models_1 = __asyncValues(models);
666
751
  _e.label = 4;
667
752
  case 4: return [4 /*yield*/, models_1.next()];
668
753
  case 5:
669
- if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 9];
754
+ if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 12];
670
755
  model = models_1_1.value;
671
- hasOneIndex = index || 'byId';
672
- hasOneCustomField = targetName in model;
673
- value = hasOneCustomField ? model[targetName] : model.id;
674
- if (!value)
675
- return [3 /*break*/, 9];
756
+ if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
757
+ if (index) {
758
+ hasOneIndex_1 = index.split(IDENTIFIER_KEY_SEPARATOR);
759
+ }
760
+ else if (associatedWith) {
761
+ if (Array.isArray(associatedWith)) {
762
+ hasOneIndex_1 = associatedWith;
763
+ }
764
+ else {
765
+ hasOneIndex_1 = [associatedWith];
766
+ }
767
+ }
768
+ hasConnectedModelFields = targetNames.every(function (targetName) {
769
+ return model.hasOwnProperty(targetName);
770
+ });
771
+ keyValuesPath = this.getIndexKeyValuesPath(model);
772
+ isUnidirectionalConnection = hasOneIndex_1 === associatedWith;
773
+ if (hasConnectedModelFields && isUnidirectionalConnection) {
774
+ // Values will be that of the child model
775
+ values_1 = targetNames.map(function (targetName) { return model[targetName]; });
776
+ }
777
+ else {
778
+ // values will be that of the parent model
779
+ values_1 = keyValuesPath.split(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
780
+ }
781
+ if (values_1.length === 0)
782
+ return [3 /*break*/, 12];
676
783
  return [4 /*yield*/, this.db.getAll(storeName)];
677
784
  case 6:
678
785
  allRecords = _e.sent();
679
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex] === value; });
786
+ recordToDelete = void 0;
787
+ // values === targetNames
788
+ if (hasConnectedModelFields) {
789
+ /**
790
+ * Retrieve record by finding the record where all
791
+ * targetNames are present on the connected model.
792
+ *
793
+ */
794
+ // recordToDelete = allRecords.filter(childItem =>
795
+ // values.every(value => childItem[value] != null)
796
+ // ) as T[];
797
+ recordToDelete = allRecords.filter(function (childItem) {
798
+ return hasOneIndex_1.every(function (index) { return values_1.includes(childItem[index]); });
799
+ });
800
+ }
801
+ else {
802
+ // values === keyValuePath
803
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
804
+ }
680
805
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
681
806
  .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
682
807
  case 7:
683
808
  _e.sent();
684
- _e.label = 8;
685
- case 8: return [3 /*break*/, 4];
686
- case 9: return [3 /*break*/, 16];
809
+ return [3 /*break*/, 11];
810
+ case 8:
811
+ hasOneIndex_2 = index || associatedWith;
812
+ hasOneCustomField = targetName in model;
813
+ keyValuesPath = this.getIndexKeyValuesPath(model);
814
+ value_1 = hasOneCustomField
815
+ ? model[targetName]
816
+ : keyValuesPath;
817
+ if (!value_1)
818
+ return [3 /*break*/, 12];
819
+ return [4 /*yield*/, this.db.getAll(storeName)];
820
+ case 9:
821
+ allRecords = _e.sent();
822
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
823
+ return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
824
+ .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
687
825
  case 10:
688
- e_8_1 = _e.sent();
689
- e_8 = { error: e_8_1 };
690
- return [3 /*break*/, 16];
691
- case 11:
692
- _e.trys.push([11, , 14, 15]);
693
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 13];
694
- return [4 /*yield*/, _b.call(models_1)];
695
- case 12:
696
826
  _e.sent();
697
- _e.label = 13;
698
- case 13: return [3 /*break*/, 15];
827
+ _e.label = 11;
828
+ case 11: return [3 /*break*/, 4];
829
+ case 12: return [3 /*break*/, 19];
830
+ case 13:
831
+ e_9_1 = _e.sent();
832
+ e_9 = { error: e_9_1 };
833
+ return [3 /*break*/, 19];
699
834
  case 14:
700
- if (e_8) throw e_8.error;
701
- return [7 /*endfinally*/];
702
- case 15: return [7 /*endfinally*/];
703
- case 16: return [3 /*break*/, 33];
835
+ _e.trys.push([14, , 17, 18]);
836
+ if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 16];
837
+ return [4 /*yield*/, _b.call(models_1)];
838
+ case 15:
839
+ _e.sent();
840
+ _e.label = 16;
841
+ case 16: return [3 /*break*/, 18];
704
842
  case 17:
705
- _e.trys.push([17, 24, 25, 30]);
843
+ if (e_9) throw e_9.error;
844
+ return [7 /*endfinally*/];
845
+ case 18: return [7 /*endfinally*/];
846
+ case 19: return [3 /*break*/, 36];
847
+ case 20:
848
+ _e.trys.push([20, 27, 28, 33]);
706
849
  models_2 = __asyncValues(models);
707
- _e.label = 18;
708
- case 18: return [4 /*yield*/, models_2.next()];
709
- case 19:
710
- if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 23];
850
+ _e.label = 21;
851
+ case 21: return [4 /*yield*/, models_2.next()];
852
+ case 22:
853
+ if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 26];
711
854
  model = models_2_1.value;
855
+ keyValues = this.getIndexKeyValuesFromModel(model);
712
856
  return [4 /*yield*/, this.db.getAll(storeName)];
713
- case 20:
857
+ case 23:
714
858
  allRecords = _e.sent();
715
- childrenArray = allRecords.filter(function (childItem) { return childItem[index] === model.id; });
859
+ indices = index.split(IDENTIFIER_KEY_SEPARATOR);
860
+ childrenArray = allRecords.filter(function (childItem) {
861
+ return indices.every(function (index) { return keyValues.includes(childItem[index]); });
862
+ });
716
863
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
717
864
  .relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
718
- case 21:
719
- _e.sent();
720
- _e.label = 22;
721
- case 22: return [3 /*break*/, 18];
722
- case 23: return [3 /*break*/, 30];
723
865
  case 24:
724
- e_9_1 = _e.sent();
725
- e_9 = { error: e_9_1 };
726
- return [3 /*break*/, 30];
727
- case 25:
728
- _e.trys.push([25, , 28, 29]);
729
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 27];
730
- return [4 /*yield*/, _c.call(models_2)];
731
- case 26:
732
866
  _e.sent();
733
- _e.label = 27;
734
- case 27: return [3 /*break*/, 29];
867
+ _e.label = 25;
868
+ case 25: return [3 /*break*/, 21];
869
+ case 26: return [3 /*break*/, 33];
870
+ case 27:
871
+ e_10_1 = _e.sent();
872
+ e_10 = { error: e_10_1 };
873
+ return [3 /*break*/, 33];
735
874
  case 28:
736
- if (e_9) throw e_9.error;
875
+ _e.trys.push([28, , 31, 32]);
876
+ if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 30];
877
+ return [4 /*yield*/, _c.call(models_2)];
878
+ case 29:
879
+ _e.sent();
880
+ _e.label = 30;
881
+ case 30: return [3 /*break*/, 32];
882
+ case 31:
883
+ if (e_10) throw e_10.error;
737
884
  return [7 /*endfinally*/];
738
- case 29: return [7 /*endfinally*/];
739
- case 30: return [3 /*break*/, 33];
740
- case 31:
885
+ case 32: return [7 /*endfinally*/];
886
+ case 33: return [3 /*break*/, 36];
887
+ case 34:
741
888
  // Intentionally blank
742
- return [3 /*break*/, 33];
743
- case 32:
744
- exhaustiveCheck(relationType);
745
- return [3 /*break*/, 33];
746
- case 33: return [3 /*break*/, 1];
747
- case 34: return [3 /*break*/, 41];
889
+ return [3 /*break*/, 36];
748
890
  case 35:
749
- e_7_1 = _e.sent();
750
- e_7 = { error: e_7_1 };
751
- return [3 /*break*/, 41];
752
- case 36:
753
- _e.trys.push([36, , 39, 40]);
754
- if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 38];
891
+ exhaustiveCheck(relationType);
892
+ return [3 /*break*/, 36];
893
+ case 36: return [3 /*break*/, 1];
894
+ case 37: return [3 /*break*/, 44];
895
+ case 38:
896
+ e_8_1 = _e.sent();
897
+ e_8 = { error: e_8_1 };
898
+ return [3 /*break*/, 44];
899
+ case 39:
900
+ _e.trys.push([39, , 42, 43]);
901
+ if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 41];
755
902
  return [4 /*yield*/, _a.call(relations_2)];
756
- case 37:
903
+ case 40:
757
904
  _e.sent();
758
- _e.label = 38;
759
- case 38: return [3 /*break*/, 40];
760
- case 39:
761
- if (e_7) throw e_7.error;
905
+ _e.label = 41;
906
+ case 41: return [3 /*break*/, 43];
907
+ case 42:
908
+ if (e_8) throw e_8.error;
762
909
  return [7 /*endfinally*/];
763
- case 40: return [7 /*endfinally*/];
764
- case 41:
910
+ case 43: return [7 /*endfinally*/];
911
+ case 44:
765
912
  deleteQueue.push({
766
- storeName: this.getStorename(nameSpace, srcModel),
913
+ storeName: getStorename(nameSpace, srcModel),
767
914
  items: models.map(function (record) {
768
915
  return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
769
916
  }),
@@ -789,21 +936,25 @@ var AsyncStorageAdapter = /** @class */ (function () {
789
936
  };
790
937
  AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
791
938
  return __awaiter(this, void 0, void 0, function () {
792
- var modelName, namespaceName, storeName, batch, _loop_1, this_1, items_2, items_2_1, item;
793
- var e_10, _a;
939
+ var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
940
+ var e_11, _a;
941
+ var _this = this;
794
942
  return __generator(this, function (_b) {
795
943
  switch (_b.label) {
796
944
  case 0:
797
945
  modelName = modelConstructor.name;
798
946
  namespaceName = this.namespaceResolver(modelConstructor);
799
- storeName = this.getStorename(namespaceName, modelName);
947
+ storeName = getStorename(namespaceName, modelName);
948
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
800
949
  batch = [];
801
- _loop_1 = function (item) {
802
- var id = item.id;
803
- var connectedModels = traverseModel(modelConstructor.name, this_1.modelInstanceCreator(modelConstructor, item), this_1.schema.namespaces[this_1.namespaceResolver(modelConstructor)], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
950
+ _loop_2 = function (item) {
951
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
952
+ var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
953
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
804
954
  var instance = connectedModels.find(function (_a) {
805
955
  var instance = _a.instance;
806
- return instance.id === id;
956
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
957
+ return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
807
958
  }).instance;
808
959
  batch.push(instance);
809
960
  };
@@ -811,17 +962,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
811
962
  try {
812
963
  for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
813
964
  item = items_2_1.value;
814
- _loop_1(item);
965
+ _loop_2(item);
815
966
  }
816
967
  }
817
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
968
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
818
969
  finally {
819
970
  try {
820
971
  if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
821
972
  }
822
- finally { if (e_10) throw e_10.error; }
973
+ finally { if (e_11) throw e_11.error; }
823
974
  }
824
- return [4 /*yield*/, this.db.batchSave(storeName, batch)];
975
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
825
976
  case 1: return [2 /*return*/, _b.sent()];
826
977
  }
827
978
  });