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