@aws-amplify/datastore 3.12.6-next.20 → 3.12.6-next.32

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 (144) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/lib/authModeStrategies/multiAuthStrategy.js +13 -2
  3. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  4. package/lib/datastore/datastore.js +648 -344
  5. package/lib/datastore/datastore.js.map +1 -1
  6. package/lib/predicates/index.js +12 -2
  7. package/lib/predicates/index.js.map +1 -1
  8. package/lib/storage/adapter/AsyncStorageAdapter.js +354 -203
  9. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  10. package/lib/storage/adapter/AsyncStorageDatabase.js +65 -28
  11. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  12. package/lib/storage/adapter/IndexedDBAdapter.js +444 -271
  13. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  14. package/lib/storage/storage.js +93 -28
  15. package/lib/storage/storage.js.map +1 -1
  16. package/lib/sync/datastoreConnectivity.js +9 -0
  17. package/lib/sync/datastoreConnectivity.js.map +1 -1
  18. package/lib/sync/index.js +522 -397
  19. package/lib/sync/index.js.map +1 -1
  20. package/lib/sync/merger.js +13 -6
  21. package/lib/sync/merger.js.map +1 -1
  22. package/lib/sync/outbox.js +77 -71
  23. package/lib/sync/outbox.js.map +1 -1
  24. package/lib/sync/processors/mutation.js +269 -209
  25. package/lib/sync/processors/mutation.js.map +1 -1
  26. package/lib/sync/processors/subscription.js +213 -178
  27. package/lib/sync/processors/subscription.js.map +1 -1
  28. package/lib/sync/processors/sync.js +126 -121
  29. package/lib/sync/processors/sync.js.map +1 -1
  30. package/lib/sync/utils.js +43 -8
  31. package/lib/sync/utils.js.map +1 -1
  32. package/lib/types.js +10 -1
  33. package/lib/types.js.map +1 -1
  34. package/lib/util.js +419 -166
  35. package/lib/util.js.map +1 -1
  36. package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +11 -0
  37. package/lib-esm/authModeStrategies/multiAuthStrategy.js +12 -1
  38. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  39. package/lib-esm/datastore/datastore.d.ts +107 -17
  40. package/lib-esm/datastore/datastore.js +648 -344
  41. package/lib-esm/datastore/datastore.js.map +1 -1
  42. package/lib-esm/index.d.ts +3 -19
  43. package/lib-esm/predicates/index.d.ts +3 -2
  44. package/lib-esm/predicates/index.js +13 -3
  45. package/lib-esm/predicates/index.js.map +1 -1
  46. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +4 -3
  47. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +355 -204
  48. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  49. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +14 -4
  50. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +66 -29
  51. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  52. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +26 -4
  53. package/lib-esm/storage/adapter/IndexedDBAdapter.js +445 -272
  54. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  55. package/lib-esm/storage/adapter/index.d.ts +1 -1
  56. package/lib-esm/storage/storage.d.ts +1 -1
  57. package/lib-esm/storage/storage.js +93 -28
  58. package/lib-esm/storage/storage.js.map +1 -1
  59. package/lib-esm/sync/datastoreConnectivity.d.ts +1 -0
  60. package/lib-esm/sync/datastoreConnectivity.js +10 -1
  61. package/lib-esm/sync/datastoreConnectivity.js.map +1 -1
  62. package/lib-esm/sync/index.d.ts +31 -5
  63. package/lib-esm/sync/index.js +524 -399
  64. package/lib-esm/sync/index.js.map +1 -1
  65. package/lib-esm/sync/merger.d.ts +9 -3
  66. package/lib-esm/sync/merger.js +13 -6
  67. package/lib-esm/sync/merger.js.map +1 -1
  68. package/lib-esm/sync/outbox.d.ts +2 -2
  69. package/lib-esm/sync/outbox.js +78 -72
  70. package/lib-esm/sync/outbox.js.map +1 -1
  71. package/lib-esm/sync/processors/mutation.d.ts +2 -0
  72. package/lib-esm/sync/processors/mutation.js +270 -210
  73. package/lib-esm/sync/processors/mutation.js.map +1 -1
  74. package/lib-esm/sync/processors/subscription.d.ts +2 -0
  75. package/lib-esm/sync/processors/subscription.js +213 -178
  76. package/lib-esm/sync/processors/subscription.js.map +1 -1
  77. package/lib-esm/sync/processors/sync.d.ts +2 -1
  78. package/lib-esm/sync/processors/sync.js +126 -121
  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 +45 -11
  82. package/lib-esm/sync/utils.js.map +1 -1
  83. package/lib-esm/types.d.ts +65 -26
  84. package/lib-esm/types.js +9 -2
  85. package/lib-esm/types.js.map +1 -1
  86. package/lib-esm/util.d.ts +67 -24
  87. package/lib-esm/util.js +419 -166
  88. package/lib-esm/util.js.map +1 -1
  89. package/package.json +13 -7
  90. package/src/authModeStrategies/multiAuthStrategy.ts +12 -1
  91. package/src/datastore/datastore.ts +798 -397
  92. package/src/predicates/index.ts +32 -10
  93. package/src/storage/adapter/AsyncStorageAdapter.ts +309 -93
  94. package/src/storage/adapter/AsyncStorageDatabase.ts +74 -26
  95. package/src/storage/adapter/IndexedDBAdapter.ts +358 -134
  96. package/src/storage/adapter/index.ts +1 -1
  97. package/src/storage/storage.ts +69 -22
  98. package/src/sync/datastoreConnectivity.ts +6 -0
  99. package/src/sync/index.ts +521 -412
  100. package/src/sync/merger.ts +20 -4
  101. package/src/sync/outbox.ts +22 -9
  102. package/src/sync/processors/mutation.ts +188 -150
  103. package/src/sync/processors/subscription.ts +289 -253
  104. package/src/sync/processors/sync.ts +151 -138
  105. package/src/sync/utils.ts +67 -12
  106. package/src/types.ts +182 -30
  107. package/src/util.ts +505 -176
  108. package/build.js +0 -5
  109. package/dist/aws-amplify-datastore.js +0 -83311
  110. package/dist/aws-amplify-datastore.js.map +0 -1
  111. package/dist/aws-amplify-datastore.min.js +0 -168
  112. package/dist/aws-amplify-datastore.min.js.map +0 -1
  113. package/index.js +0 -7
  114. package/lib/authModeStrategies/defaultAuthStrategy.d.ts +0 -2
  115. package/lib/authModeStrategies/index.d.ts +0 -2
  116. package/lib/authModeStrategies/multiAuthStrategy.d.ts +0 -2
  117. package/lib/datastore/datastore.d.ts +0 -66
  118. package/lib/index.d.ts +0 -31
  119. package/lib/predicates/index.d.ts +0 -15
  120. package/lib/predicates/sort.d.ts +0 -8
  121. package/lib/ssr/index.d.ts +0 -3
  122. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +0 -40
  123. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +0 -29
  124. package/lib/storage/adapter/InMemoryStore.d.ts +0 -11
  125. package/lib/storage/adapter/InMemoryStore.native.d.ts +0 -1
  126. package/lib/storage/adapter/IndexedDBAdapter.d.ts +0 -37
  127. package/lib/storage/adapter/getDefaultAdapter/index.d.ts +0 -3
  128. package/lib/storage/adapter/getDefaultAdapter/index.native.d.ts +0 -3
  129. package/lib/storage/adapter/index.d.ts +0 -9
  130. package/lib/storage/storage.d.ts +0 -49
  131. package/lib/sync/datastoreConnectivity.d.ts +0 -15
  132. package/lib/sync/datastoreReachability/index.d.ts +0 -3
  133. package/lib/sync/datastoreReachability/index.native.d.ts +0 -3
  134. package/lib/sync/index.d.ts +0 -63
  135. package/lib/sync/merger.d.ts +0 -11
  136. package/lib/sync/outbox.d.ts +0 -27
  137. package/lib/sync/processors/errorMaps.d.ts +0 -17
  138. package/lib/sync/processors/mutation.d.ts +0 -56
  139. package/lib/sync/processors/subscription.d.ts +0 -31
  140. package/lib/sync/processors/sync.d.ts +0 -27
  141. package/lib/sync/utils.d.ts +0 -41
  142. package/lib/types.d.ts +0 -462
  143. package/lib/util.d.ts +0 -113
  144. package/webpack.config.dev.js +0 -6
@@ -3,7 +3,7 @@ import { ConsoleLogger as Logger } from '@aws-amplify/core';
3
3
  import AsyncStorageDatabase from './AsyncStorageDatabase';
4
4
  import { ModelPredicateCreator, ModelSortPredicateCreator, } from '../../predicates';
5
5
  import { isPredicateObj, OpType, QueryOne, } from '../../types';
6
- import { exhaustiveCheck, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, sortCompareFunction, } from '../../util';
6
+ import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, exhaustiveCheck, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, sortCompareFunction, keysEqual, getStorename, getIndexKeys, extractPrimaryKeyValues, IDENTIFIER_KEY_SEPARATOR, } from '../../util';
7
7
  var logger = new Logger('DataStore');
8
8
  var AsyncStorageAdapter = /** @class */ (function () {
9
9
  function AsyncStorageAdapter() {
@@ -11,11 +11,19 @@ var AsyncStorageAdapter = /** @class */ (function () {
11
11
  AsyncStorageAdapter.prototype.getStorenameForModel = function (modelConstructor) {
12
12
  var namespace = this.namespaceResolver(modelConstructor);
13
13
  var modelName = modelConstructor.name;
14
- return this.getStorename(namespace, modelName);
14
+ return getStorename(namespace, modelName);
15
15
  };
16
- AsyncStorageAdapter.prototype.getStorename = function (namespace, modelName) {
17
- var storeName = namespace + "_" + modelName;
18
- return storeName;
16
+ // Retrieves primary key values from a model
17
+ AsyncStorageAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
18
+ var modelConstructor = Object.getPrototypeOf(model)
19
+ .constructor;
20
+ var namespaceName = this.namespaceResolver(modelConstructor);
21
+ var keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
22
+ return extractPrimaryKeyValues(model, keys);
23
+ };
24
+ // Retrieves concatenated primary key values from a model
25
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
26
+ return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
19
27
  };
20
28
  AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
21
29
  return __awaiter(this, void 0, void 0, function () {
@@ -62,7 +70,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
62
70
  AsyncStorageAdapter.prototype.save = function (model, condition) {
63
71
  var e_1, _a;
64
72
  return __awaiter(this, void 0, void 0, function () {
65
- 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;
73
+ 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;
66
74
  var _this = this;
67
75
  return __generator(this, function (_b) {
68
76
  switch (_b.label) {
@@ -70,16 +78,18 @@ var AsyncStorageAdapter = /** @class */ (function () {
70
78
  modelConstructor = Object.getPrototypeOf(model)
71
79
  .constructor;
72
80
  storeName = this.getStorenameForModel(modelConstructor);
73
- connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
74
81
  namespaceName = this.namespaceResolver(modelConstructor);
82
+ connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
75
83
  set = new Set();
76
84
  connectionStoreNames = Object.values(connectedModels).map(function (_a) {
77
85
  var modelName = _a.modelName, item = _a.item, instance = _a.instance;
78
- var storeName = _this.getStorename(namespaceName, modelName);
86
+ var storeName = getStorename(namespaceName, modelName);
79
87
  set.add(storeName);
80
- return { storeName: storeName, item: item, instance: instance };
88
+ var keys = getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
89
+ return { storeName: storeName, item: item, instance: instance, keys: keys };
81
90
  });
82
- return [4 /*yield*/, this.db.get(model.id, storeName)];
91
+ keyValuesPath = this.getIndexKeyValuesPath(model);
92
+ return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
83
93
  case 1:
84
94
  fromDB = _b.sent();
85
95
  if (condition && fromDB) {
@@ -102,14 +112,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
102
112
  case 4:
103
113
  if (!(connectionStoreNames_1_1 = _b.sent(), !connectionStoreNames_1_1.done)) return [3 /*break*/, 8];
104
114
  resItem = connectionStoreNames_1_1.value;
105
- storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance;
106
- id = item.id;
107
- return [4 /*yield*/, this.db.get(id, storeName_1)];
115
+ storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
116
+ itemKeyValues = keys.map(function (key) { return item[key]; });
117
+ itemKeyValuesPath = itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
118
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
108
119
  case 5:
109
120
  fromDB_1 = _b.sent();
110
121
  opType = fromDB_1 ? OpType.UPDATE : OpType.INSERT;
111
- if (!(id === model.id || opType === OpType.INSERT)) return [3 /*break*/, 7];
112
- return [4 /*yield*/, this.db.save(item, storeName_1)];
122
+ modelKeyValues = this.getIndexKeyValuesFromModel(model);
123
+ if (!(keysEqual(itemKeyValues, modelKeyValues) ||
124
+ opType === OpType.INSERT)) return [3 /*break*/, 7];
125
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
113
126
  case 6:
114
127
  _b.sent();
115
128
  result.push([instance, opType]);
@@ -141,7 +154,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
141
154
  var records_1, records_1_1, records_2, records_2_1;
142
155
  var e_2, _a, e_3, _b, e_4, _c;
143
156
  return __awaiter(this, void 0, void 0, function () {
144
- 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;
157
+ 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;
145
158
  var _this = this;
146
159
  return __generator(this, function (_e) {
147
160
  switch (_e.label) {
@@ -150,7 +163,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
150
163
  relations = namespace.relationships[srcModelName].relationTypes;
151
164
  connectionStoreNames = relations.map(function (_a) {
152
165
  var modelName = _a.modelName;
153
- return _this.getStorename(namespaceName, modelName);
166
+ return getStorename(namespaceName, modelName);
154
167
  });
155
168
  modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
156
169
  if (connectionStoreNames.length === 0) {
@@ -160,121 +173,171 @@ var AsyncStorageAdapter = /** @class */ (function () {
160
173
  }
161
174
  _e.label = 1;
162
175
  case 1:
163
- _e.trys.push([1, 34, 35, 40]);
176
+ _e.trys.push([1, 38, 39, 44]);
164
177
  relations_1 = __asyncValues(relations);
165
178
  _e.label = 2;
166
179
  case 2: return [4 /*yield*/, relations_1.next()];
167
180
  case 3:
168
- if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 33];
181
+ if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 37];
169
182
  relation = relations_1_1.value;
170
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, relationType = relation.relationType;
171
- storeName = this.getStorename(namespaceName, modelName);
183
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames, relationType = relation.relationType;
184
+ storeName = getStorename(namespaceName, modelName);
172
185
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
173
186
  _d = relationType;
174
187
  switch (_d) {
175
188
  case 'HAS_ONE': return [3 /*break*/, 4];
176
- case 'BELONGS_TO': return [3 /*break*/, 17];
177
- case 'HAS_MANY': return [3 /*break*/, 30];
189
+ case 'BELONGS_TO': return [3 /*break*/, 19];
190
+ case 'HAS_MANY': return [3 /*break*/, 34];
178
191
  }
179
- return [3 /*break*/, 31];
192
+ return [3 /*break*/, 35];
180
193
  case 4:
181
- _e.trys.push([4, 10, 11, 16]);
194
+ _e.trys.push([4, 12, 13, 18]);
182
195
  records_1 = __asyncValues(records);
183
196
  _e.label = 5;
184
197
  case 5: return [4 /*yield*/, records_1.next()];
185
198
  case 6:
186
- if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 9];
199
+ if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 11];
187
200
  recordItem = records_1_1.value;
188
- getByfield = recordItem[targetName] ? targetName : fieldName;
189
- if (!recordItem[getByfield])
190
- return [3 /*break*/, 9];
191
- return [4 /*yield*/, this.db.get(recordItem[getByfield], storeName)];
201
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
202
+ getByFields = [];
203
+ allPresent = void 0;
204
+ // iterate through all targetnames to make sure they are all present in the recordItem
205
+ allPresent = targetNames.every(function (targetName) {
206
+ return recordItem[targetName] != null;
207
+ });
208
+ if (!allPresent) {
209
+ return [3 /*break*/, 11];
210
+ }
211
+ getByFields = targetNames;
212
+ keys = getByFields
213
+ .map(function (getByField) { return recordItem[getByField]; })
214
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
215
+ return [4 /*yield*/, this.db.get(keys, storeName)];
192
216
  case 7:
193
217
  connectionRecord = _e.sent();
194
218
  recordItem[fieldName] =
195
219
  connectionRecord &&
196
220
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
197
- _e.label = 8;
198
- case 8: return [3 /*break*/, 5];
199
- case 9: return [3 /*break*/, 16];
200
- case 10:
221
+ return [3 /*break*/, 10];
222
+ case 8:
223
+ getByfield = recordItem[targetName]
224
+ ? targetName
225
+ : fieldName;
226
+ if (!recordItem[getByfield])
227
+ return [3 /*break*/, 11];
228
+ key = recordItem[getByfield];
229
+ return [4 /*yield*/, this.db.get(key, storeName)];
230
+ case 9:
231
+ connectionRecord = _e.sent();
232
+ recordItem[fieldName] =
233
+ connectionRecord &&
234
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
235
+ _e.label = 10;
236
+ case 10: return [3 /*break*/, 5];
237
+ case 11: return [3 /*break*/, 18];
238
+ case 12:
201
239
  e_3_1 = _e.sent();
202
240
  e_3 = { error: e_3_1 };
203
- return [3 /*break*/, 16];
204
- case 11:
205
- _e.trys.push([11, , 14, 15]);
206
- if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 13];
241
+ return [3 /*break*/, 18];
242
+ case 13:
243
+ _e.trys.push([13, , 16, 17]);
244
+ if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 15];
207
245
  return [4 /*yield*/, _b.call(records_1)];
208
- case 12:
209
- _e.sent();
210
- _e.label = 13;
211
- case 13: return [3 /*break*/, 15];
212
246
  case 14:
247
+ _e.sent();
248
+ _e.label = 15;
249
+ case 15: return [3 /*break*/, 17];
250
+ case 16:
213
251
  if (e_3) throw e_3.error;
214
252
  return [7 /*endfinally*/];
215
- case 15: return [7 /*endfinally*/];
216
- case 16: return [3 /*break*/, 32];
217
- case 17:
218
- _e.trys.push([17, 23, 24, 29]);
219
- records_2 = __asyncValues(records);
220
- _e.label = 18;
221
- case 18: return [4 /*yield*/, records_2.next()];
253
+ case 17: return [7 /*endfinally*/];
254
+ case 18: return [3 /*break*/, 36];
222
255
  case 19:
223
- if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 22];
256
+ _e.trys.push([19, 27, 28, 33]);
257
+ records_2 = __asyncValues(records);
258
+ _e.label = 20;
259
+ case 20: return [4 /*yield*/, records_2.next()];
260
+ case 21:
261
+ if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 26];
224
262
  recordItem = records_2_1.value;
225
- if (!recordItem[targetName]) return [3 /*break*/, 21];
226
- return [4 /*yield*/, this.db.get(recordItem[targetName], storeName)];
227
- case 20:
263
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 23];
264
+ allPresent = void 0;
265
+ // iterate through all targetnames to make sure they are all present in the recordItem
266
+ allPresent = targetNames.every(function (targetName) {
267
+ return recordItem[targetName] != null;
268
+ });
269
+ // If not present, there is not yet a connected record
270
+ if (!allPresent) {
271
+ return [3 /*break*/, 26];
272
+ }
273
+ keys = targetNames
274
+ .map(function (targetName) { return recordItem[targetName]; })
275
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
276
+ return [4 /*yield*/, this.db.get(keys, storeName)];
277
+ case 22:
228
278
  connectionRecord = _e.sent();
229
279
  recordItem[fieldName] =
230
280
  connectionRecord &&
231
281
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
232
- delete recordItem[targetName];
233
- _e.label = 21;
234
- case 21: return [3 /*break*/, 18];
235
- case 22: return [3 /*break*/, 29];
282
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
283
+ delete recordItem[targetName];
284
+ });
285
+ return [3 /*break*/, 25];
236
286
  case 23:
287
+ if (!recordItem[targetName]) return [3 /*break*/, 25];
288
+ key = recordItem[targetName];
289
+ return [4 /*yield*/, this.db.get(key, storeName)];
290
+ case 24:
291
+ connectionRecord = _e.sent();
292
+ recordItem[fieldName] =
293
+ connectionRecord &&
294
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
295
+ delete recordItem[targetName];
296
+ _e.label = 25;
297
+ case 25: return [3 /*break*/, 20];
298
+ case 26: return [3 /*break*/, 33];
299
+ case 27:
237
300
  e_4_1 = _e.sent();
238
301
  e_4 = { error: e_4_1 };
239
- return [3 /*break*/, 29];
240
- case 24:
241
- _e.trys.push([24, , 27, 28]);
242
- if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 26];
302
+ return [3 /*break*/, 33];
303
+ case 28:
304
+ _e.trys.push([28, , 31, 32]);
305
+ if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 30];
243
306
  return [4 /*yield*/, _c.call(records_2)];
244
- case 25:
307
+ case 29:
245
308
  _e.sent();
246
- _e.label = 26;
247
- case 26: return [3 /*break*/, 28];
248
- case 27:
309
+ _e.label = 30;
310
+ case 30: return [3 /*break*/, 32];
311
+ case 31:
249
312
  if (e_4) throw e_4.error;
250
313
  return [7 /*endfinally*/];
251
- case 28: return [7 /*endfinally*/];
252
- case 29: return [3 /*break*/, 32];
253
- case 30:
314
+ case 32: return [7 /*endfinally*/];
315
+ case 33: return [3 /*break*/, 36];
316
+ case 34:
254
317
  // TODO: Lazy loading
255
- return [3 /*break*/, 32];
256
- case 31:
318
+ return [3 /*break*/, 36];
319
+ case 35:
257
320
  exhaustiveCheck(relationType);
258
- return [3 /*break*/, 32];
259
- case 32: return [3 /*break*/, 2];
260
- case 33: return [3 /*break*/, 40];
261
- case 34:
321
+ return [3 /*break*/, 36];
322
+ case 36: return [3 /*break*/, 2];
323
+ case 37: return [3 /*break*/, 44];
324
+ case 38:
262
325
  e_2_1 = _e.sent();
263
326
  e_2 = { error: e_2_1 };
264
- return [3 /*break*/, 40];
265
- case 35:
266
- _e.trys.push([35, , 38, 39]);
267
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 37];
327
+ return [3 /*break*/, 44];
328
+ case 39:
329
+ _e.trys.push([39, , 42, 43]);
330
+ if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 41];
268
331
  return [4 /*yield*/, _a.call(relations_1)];
269
- case 36:
332
+ case 40:
270
333
  _e.sent();
271
- _e.label = 37;
272
- case 37: return [3 /*break*/, 39];
273
- case 38:
334
+ _e.label = 41;
335
+ case 41: return [3 /*break*/, 43];
336
+ case 42:
274
337
  if (e_2) throw e_2.error;
275
338
  return [7 /*endfinally*/];
276
- case 39: return [7 /*endfinally*/];
277
- case 40: return [2 /*return*/, records.map(function (record) {
339
+ case 43: return [7 /*endfinally*/];
340
+ case 44: return [2 /*return*/, records.map(function (record) {
278
341
  return _this.modelInstanceCreator(modelConstructor, record);
279
342
  })];
280
343
  }
@@ -283,7 +346,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
283
346
  };
284
347
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
285
348
  return __awaiter(this, void 0, void 0, function () {
286
- var storeName, namespaceName, predicates, queryById, hasSort, hasPagination, records;
349
+ var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
287
350
  var _this = this;
288
351
  return __generator(this, function (_a) {
289
352
  switch (_a.label) {
@@ -291,7 +354,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
291
354
  storeName = this.getStorenameForModel(modelConstructor);
292
355
  namespaceName = this.namespaceResolver(modelConstructor);
293
356
  predicates = predicate && ModelPredicateCreator.getPredicates(predicate);
294
- queryById = predicates && this.idFromPredicate(predicates);
357
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
358
+ queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
295
359
  hasSort = pagination && pagination.sort;
296
360
  hasPagination = pagination && pagination.limit;
297
361
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
@@ -299,8 +363,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
299
363
  return __generator(this, function (_a) {
300
364
  switch (_a.label) {
301
365
  case 0:
302
- if (!queryById) return [3 /*break*/, 2];
303
- return [4 /*yield*/, this.getById(storeName, queryById)];
366
+ if (!queryByKey) return [3 /*break*/, 2];
367
+ return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
304
368
  case 1:
305
369
  record = _a.sent();
306
370
  return [2 /*return*/, record ? [record] : []];
@@ -328,12 +392,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
328
392
  });
329
393
  });
330
394
  };
331
- AsyncStorageAdapter.prototype.getById = function (storeName, id) {
395
+ AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
332
396
  return __awaiter(this, void 0, void 0, function () {
333
397
  var record;
334
398
  return __generator(this, function (_a) {
335
399
  switch (_a.label) {
336
- case 0: return [4 /*yield*/, this.db.get(id, storeName)];
400
+ case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
337
401
  case 1:
338
402
  record = _a.sent();
339
403
  return [2 /*return*/, record];
@@ -351,11 +415,33 @@ var AsyncStorageAdapter = /** @class */ (function () {
351
415
  });
352
416
  });
353
417
  };
354
- AsyncStorageAdapter.prototype.idFromPredicate = function (predicates) {
418
+ AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
419
+ var e_5, _a;
355
420
  var predicateObjs = predicates.predicates;
356
- var idPredicate = predicateObjs.length === 1 &&
357
- predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === 'id' && p.operator === 'eq'; });
358
- return idPredicate && idPredicate.operand;
421
+ if (predicateObjs.length !== keys.length) {
422
+ return;
423
+ }
424
+ var keyValues = [];
425
+ var _loop_1 = function (key) {
426
+ var predicateObj = predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
427
+ predicateObj && keyValues.push(predicateObj.operand);
428
+ };
429
+ try {
430
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
431
+ var key = keys_1_1.value;
432
+ _loop_1(key);
433
+ }
434
+ }
435
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
436
+ finally {
437
+ try {
438
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
439
+ }
440
+ finally { if (e_5) throw e_5.error; }
441
+ }
442
+ return keyValues.length === keys.length
443
+ ? keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)
444
+ : undefined;
359
445
  };
360
446
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
361
447
  return __awaiter(this, void 0, void 0, function () {
@@ -409,7 +495,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
409
495
  };
410
496
  AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
411
497
  return __awaiter(this, void 0, void 0, function () {
412
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
498
+ var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, keyValuePath, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
413
499
  return __generator(this, function (_a) {
414
500
  switch (_a.label) {
415
501
  case 0:
@@ -450,10 +536,11 @@ var AsyncStorageAdapter = /** @class */ (function () {
450
536
  model = modelOrModelConstructor;
451
537
  modelConstructor = Object.getPrototypeOf(model)
452
538
  .constructor;
453
- nameSpace = this.namespaceResolver(modelConstructor);
539
+ namespaceName = this.namespaceResolver(modelConstructor);
454
540
  storeName = this.getStorenameForModel(modelConstructor);
455
541
  if (!condition) return [3 /*break*/, 11];
456
- return [4 /*yield*/, this.db.get(model.id, storeName)];
542
+ keyValuePath = this.getIndexKeyValuesPath(model);
543
+ return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
457
544
  case 9:
458
545
  fromDB = _a.sent();
459
546
  if (fromDB === undefined) {
@@ -469,16 +556,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
469
556
  logger.error(msg, { model: fromDB, condition: predicateObjs });
470
557
  throw new Error(msg);
471
558
  }
472
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
473
- .relationTypes;
474
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
559
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
560
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
475
561
  case 10:
476
562
  _a.sent();
477
563
  return [3 /*break*/, 13];
478
564
  case 11:
479
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
480
- .relationTypes;
481
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
565
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
566
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
482
567
  case 12:
483
568
  _a.sent();
484
569
  _a.label = 13;
@@ -497,9 +582,9 @@ var AsyncStorageAdapter = /** @class */ (function () {
497
582
  };
498
583
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
499
584
  var deleteQueue_1, deleteQueue_1_1;
500
- var e_5, _a, e_6, _b;
585
+ var e_6, _a, e_7, _b;
501
586
  return __awaiter(this, void 0, void 0, function () {
502
- var deleteItem, storeName, items, items_1, items_1_1, item, id, e_6_1, e_5_1;
587
+ var deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_7_1, e_6_1;
503
588
  return __generator(this, function (_c) {
504
589
  switch (_c.label) {
505
590
  case 0:
@@ -522,16 +607,16 @@ var AsyncStorageAdapter = /** @class */ (function () {
522
607
  item = items_1_1.value;
523
608
  if (!item) return [3 /*break*/, 7];
524
609
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
525
- id = item['id'];
526
- return [4 /*yield*/, this.db.delete(id, storeName)];
610
+ keyValuesPath = this.getIndexKeyValuesPath(item);
611
+ return [4 /*yield*/, this.db.delete(keyValuesPath, storeName)];
527
612
  case 6:
528
613
  _c.sent();
529
614
  _c.label = 7;
530
615
  case 7: return [3 /*break*/, 4];
531
616
  case 8: return [3 /*break*/, 15];
532
617
  case 9:
533
- e_6_1 = _c.sent();
534
- e_6 = { error: e_6_1 };
618
+ e_7_1 = _c.sent();
619
+ e_7 = { error: e_7_1 };
535
620
  return [3 /*break*/, 15];
536
621
  case 10:
537
622
  _c.trys.push([10, , 13, 14]);
@@ -542,14 +627,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
542
627
  _c.label = 12;
543
628
  case 12: return [3 /*break*/, 14];
544
629
  case 13:
545
- if (e_6) throw e_6.error;
630
+ if (e_7) throw e_7.error;
546
631
  return [7 /*endfinally*/];
547
632
  case 14: return [7 /*endfinally*/];
548
633
  case 15: return [3 /*break*/, 1];
549
634
  case 16: return [3 /*break*/, 23];
550
635
  case 17:
551
- e_5_1 = _c.sent();
552
- e_5 = { error: e_5_1 };
636
+ e_6_1 = _c.sent();
637
+ e_6 = { error: e_6_1 };
553
638
  return [3 /*break*/, 23];
554
639
  case 18:
555
640
  _c.trys.push([18, , 21, 22]);
@@ -560,7 +645,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
560
645
  _c.label = 20;
561
646
  case 20: return [3 /*break*/, 22];
562
647
  case 21:
563
- if (e_5) throw e_5.error;
648
+ if (e_6) throw e_6.error;
564
649
  return [7 /*endfinally*/];
565
650
  case 22: return [7 /*endfinally*/];
566
651
  case 23: return [2 /*return*/];
@@ -578,22 +663,22 @@ var AsyncStorageAdapter = /** @class */ (function () {
578
663
  */
579
664
  AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
580
665
  var relations_2, relations_2_1, models_1, models_1_1, models_2, models_2_1;
581
- var e_7, _a, e_8, _b, e_9, _c;
666
+ var e_8, _a, e_9, _b, e_10, _c;
582
667
  return __awaiter(this, void 0, void 0, function () {
583
- 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;
668
+ 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;
584
669
  var _this = this;
585
670
  return __generator(this, function (_e) {
586
671
  switch (_e.label) {
587
672
  case 0:
588
- _e.trys.push([0, 35, 36, 41]);
673
+ _e.trys.push([0, 38, 39, 44]);
589
674
  relations_2 = __asyncValues(relations);
590
675
  _e.label = 1;
591
676
  case 1: return [4 /*yield*/, relations_2.next()];
592
677
  case 2:
593
- if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 34];
678
+ if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 37];
594
679
  rel = relations_2_1.value;
595
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName;
596
- storeName = this.getStorename(nameSpace, modelName);
680
+ relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
681
+ storeName = getStorename(nameSpace, modelName);
597
682
  index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
598
683
  .relationTypes, srcModel) ||
599
684
  // if we were unable to find an index via relationTypes
@@ -603,114 +688,176 @@ var AsyncStorageAdapter = /** @class */ (function () {
603
688
  _d = relationType;
604
689
  switch (_d) {
605
690
  case 'HAS_ONE': return [3 /*break*/, 3];
606
- case 'HAS_MANY': return [3 /*break*/, 17];
607
- case 'BELONGS_TO': return [3 /*break*/, 31];
691
+ case 'HAS_MANY': return [3 /*break*/, 20];
692
+ case 'BELONGS_TO': return [3 /*break*/, 34];
608
693
  }
609
- return [3 /*break*/, 32];
694
+ return [3 /*break*/, 35];
610
695
  case 3:
611
- _e.trys.push([3, 10, 11, 16]);
696
+ _e.trys.push([3, 13, 14, 19]);
612
697
  models_1 = __asyncValues(models);
613
698
  _e.label = 4;
614
699
  case 4: return [4 /*yield*/, models_1.next()];
615
700
  case 5:
616
- if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 9];
701
+ if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 12];
617
702
  model = models_1_1.value;
618
- hasOneIndex = index || 'byId';
619
- hasOneCustomField = targetName in model;
620
- value = hasOneCustomField ? model[targetName] : model.id;
621
- if (!value)
622
- return [3 /*break*/, 9];
703
+ if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
704
+ if (index) {
705
+ hasOneIndex_1 = index.split(IDENTIFIER_KEY_SEPARATOR);
706
+ }
707
+ else if (associatedWith) {
708
+ if (Array.isArray(associatedWith)) {
709
+ hasOneIndex_1 = associatedWith;
710
+ }
711
+ else {
712
+ hasOneIndex_1 = [associatedWith];
713
+ }
714
+ }
715
+ hasConnectedModelFields = targetNames.every(function (targetName) {
716
+ return model.hasOwnProperty(targetName);
717
+ });
718
+ keyValuesPath = this.getIndexKeyValuesPath(model);
719
+ isUnidirectionalConnection = hasOneIndex_1 === associatedWith;
720
+ if (hasConnectedModelFields && isUnidirectionalConnection) {
721
+ // Values will be that of the child model
722
+ values_1 = targetNames.map(function (targetName) { return model[targetName]; });
723
+ }
724
+ else {
725
+ // values will be that of the parent model
726
+ values_1 = keyValuesPath.split(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
727
+ }
728
+ if (values_1.length === 0)
729
+ return [3 /*break*/, 12];
623
730
  return [4 /*yield*/, this.db.getAll(storeName)];
624
731
  case 6:
625
732
  allRecords = _e.sent();
626
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex] === value; });
733
+ recordToDelete = void 0;
734
+ // values === targetNames
735
+ if (hasConnectedModelFields) {
736
+ /**
737
+ * Retrieve record by finding the record where all
738
+ * targetNames are present on the connected model.
739
+ *
740
+ */
741
+ // recordToDelete = allRecords.filter(childItem =>
742
+ // values.every(value => childItem[value] != null)
743
+ // ) as T[];
744
+ recordToDelete = allRecords.filter(function (childItem) {
745
+ return hasOneIndex_1.every(function (index) { return values_1.includes(childItem[index]); });
746
+ });
747
+ }
748
+ else {
749
+ // values === keyValuePath
750
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
751
+ }
627
752
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
628
753
  .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
629
754
  case 7:
630
755
  _e.sent();
631
- _e.label = 8;
632
- case 8: return [3 /*break*/, 4];
633
- case 9: return [3 /*break*/, 16];
756
+ return [3 /*break*/, 11];
757
+ case 8:
758
+ hasOneIndex_2 = index || associatedWith;
759
+ hasOneCustomField = targetName in model;
760
+ keyValuesPath = this.getIndexKeyValuesPath(model);
761
+ value_1 = hasOneCustomField
762
+ ? model[targetName]
763
+ : keyValuesPath;
764
+ if (!value_1)
765
+ return [3 /*break*/, 12];
766
+ return [4 /*yield*/, this.db.getAll(storeName)];
767
+ case 9:
768
+ allRecords = _e.sent();
769
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
770
+ return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
771
+ .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
634
772
  case 10:
635
- e_8_1 = _e.sent();
636
- e_8 = { error: e_8_1 };
637
- return [3 /*break*/, 16];
638
- case 11:
639
- _e.trys.push([11, , 14, 15]);
640
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 13];
641
- return [4 /*yield*/, _b.call(models_1)];
642
- case 12:
643
773
  _e.sent();
644
- _e.label = 13;
645
- case 13: return [3 /*break*/, 15];
774
+ _e.label = 11;
775
+ case 11: return [3 /*break*/, 4];
776
+ case 12: return [3 /*break*/, 19];
777
+ case 13:
778
+ e_9_1 = _e.sent();
779
+ e_9 = { error: e_9_1 };
780
+ return [3 /*break*/, 19];
646
781
  case 14:
647
- if (e_8) throw e_8.error;
648
- return [7 /*endfinally*/];
649
- case 15: return [7 /*endfinally*/];
650
- case 16: return [3 /*break*/, 33];
782
+ _e.trys.push([14, , 17, 18]);
783
+ if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 16];
784
+ return [4 /*yield*/, _b.call(models_1)];
785
+ case 15:
786
+ _e.sent();
787
+ _e.label = 16;
788
+ case 16: return [3 /*break*/, 18];
651
789
  case 17:
652
- _e.trys.push([17, 24, 25, 30]);
790
+ if (e_9) throw e_9.error;
791
+ return [7 /*endfinally*/];
792
+ case 18: return [7 /*endfinally*/];
793
+ case 19: return [3 /*break*/, 36];
794
+ case 20:
795
+ _e.trys.push([20, 27, 28, 33]);
653
796
  models_2 = __asyncValues(models);
654
- _e.label = 18;
655
- case 18: return [4 /*yield*/, models_2.next()];
656
- case 19:
657
- if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 23];
797
+ _e.label = 21;
798
+ case 21: return [4 /*yield*/, models_2.next()];
799
+ case 22:
800
+ if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 26];
658
801
  model = models_2_1.value;
802
+ keyValues = this.getIndexKeyValuesFromModel(model);
659
803
  return [4 /*yield*/, this.db.getAll(storeName)];
660
- case 20:
804
+ case 23:
661
805
  allRecords = _e.sent();
662
- childrenArray = allRecords.filter(function (childItem) { return childItem[index] === model.id; });
806
+ indices = index.split(IDENTIFIER_KEY_SEPARATOR);
807
+ childrenArray = allRecords.filter(function (childItem) {
808
+ return indices.every(function (index) { return keyValues.includes(childItem[index]); });
809
+ });
663
810
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
664
811
  .relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
665
- case 21:
666
- _e.sent();
667
- _e.label = 22;
668
- case 22: return [3 /*break*/, 18];
669
- case 23: return [3 /*break*/, 30];
670
812
  case 24:
671
- e_9_1 = _e.sent();
672
- e_9 = { error: e_9_1 };
673
- return [3 /*break*/, 30];
674
- case 25:
675
- _e.trys.push([25, , 28, 29]);
676
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 27];
677
- return [4 /*yield*/, _c.call(models_2)];
678
- case 26:
679
813
  _e.sent();
680
- _e.label = 27;
681
- case 27: return [3 /*break*/, 29];
814
+ _e.label = 25;
815
+ case 25: return [3 /*break*/, 21];
816
+ case 26: return [3 /*break*/, 33];
817
+ case 27:
818
+ e_10_1 = _e.sent();
819
+ e_10 = { error: e_10_1 };
820
+ return [3 /*break*/, 33];
682
821
  case 28:
683
- if (e_9) throw e_9.error;
822
+ _e.trys.push([28, , 31, 32]);
823
+ if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 30];
824
+ return [4 /*yield*/, _c.call(models_2)];
825
+ case 29:
826
+ _e.sent();
827
+ _e.label = 30;
828
+ case 30: return [3 /*break*/, 32];
829
+ case 31:
830
+ if (e_10) throw e_10.error;
684
831
  return [7 /*endfinally*/];
685
- case 29: return [7 /*endfinally*/];
686
- case 30: return [3 /*break*/, 33];
687
- case 31:
832
+ case 32: return [7 /*endfinally*/];
833
+ case 33: return [3 /*break*/, 36];
834
+ case 34:
688
835
  // Intentionally blank
689
- return [3 /*break*/, 33];
690
- case 32:
691
- exhaustiveCheck(relationType);
692
- return [3 /*break*/, 33];
693
- case 33: return [3 /*break*/, 1];
694
- case 34: return [3 /*break*/, 41];
836
+ return [3 /*break*/, 36];
695
837
  case 35:
696
- e_7_1 = _e.sent();
697
- e_7 = { error: e_7_1 };
698
- return [3 /*break*/, 41];
699
- case 36:
700
- _e.trys.push([36, , 39, 40]);
701
- if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 38];
838
+ exhaustiveCheck(relationType);
839
+ return [3 /*break*/, 36];
840
+ case 36: return [3 /*break*/, 1];
841
+ case 37: return [3 /*break*/, 44];
842
+ case 38:
843
+ e_8_1 = _e.sent();
844
+ e_8 = { error: e_8_1 };
845
+ return [3 /*break*/, 44];
846
+ case 39:
847
+ _e.trys.push([39, , 42, 43]);
848
+ if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 41];
702
849
  return [4 /*yield*/, _a.call(relations_2)];
703
- case 37:
850
+ case 40:
704
851
  _e.sent();
705
- _e.label = 38;
706
- case 38: return [3 /*break*/, 40];
707
- case 39:
708
- if (e_7) throw e_7.error;
852
+ _e.label = 41;
853
+ case 41: return [3 /*break*/, 43];
854
+ case 42:
855
+ if (e_8) throw e_8.error;
709
856
  return [7 /*endfinally*/];
710
- case 40: return [7 /*endfinally*/];
711
- case 41:
857
+ case 43: return [7 /*endfinally*/];
858
+ case 44:
712
859
  deleteQueue.push({
713
- storeName: this.getStorename(nameSpace, srcModel),
860
+ storeName: getStorename(nameSpace, srcModel),
714
861
  items: models.map(function (record) {
715
862
  return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
716
863
  }),
@@ -736,21 +883,25 @@ var AsyncStorageAdapter = /** @class */ (function () {
736
883
  };
737
884
  AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
738
885
  return __awaiter(this, void 0, void 0, function () {
739
- var modelName, namespaceName, storeName, batch, _loop_1, this_1, items_2, items_2_1, item;
740
- var e_10, _a;
886
+ var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
887
+ var e_11, _a;
888
+ var _this = this;
741
889
  return __generator(this, function (_b) {
742
890
  switch (_b.label) {
743
891
  case 0:
744
892
  modelName = modelConstructor.name;
745
893
  namespaceName = this.namespaceResolver(modelConstructor);
746
- storeName = this.getStorename(namespaceName, modelName);
894
+ storeName = getStorename(namespaceName, modelName);
895
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
747
896
  batch = [];
748
- _loop_1 = function (item) {
749
- var id = item.id;
750
- var connectedModels = traverseModel(modelConstructor.name, this_1.modelInstanceCreator(modelConstructor, item), this_1.schema.namespaces[this_1.namespaceResolver(modelConstructor)], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
897
+ _loop_2 = function (item) {
898
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
899
+ var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
900
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
751
901
  var instance = connectedModels.find(function (_a) {
752
902
  var instance = _a.instance;
753
- return instance.id === id;
903
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
904
+ return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
754
905
  }).instance;
755
906
  batch.push(instance);
756
907
  };
@@ -758,17 +909,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
758
909
  try {
759
910
  for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
760
911
  item = items_2_1.value;
761
- _loop_1(item);
912
+ _loop_2(item);
762
913
  }
763
914
  }
764
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
915
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
765
916
  finally {
766
917
  try {
767
918
  if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
768
919
  }
769
- finally { if (e_10) throw e_10.error; }
920
+ finally { if (e_11) throw e_11.error; }
770
921
  }
771
- return [4 /*yield*/, this.db.batchSave(storeName, batch)];
922
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
772
923
  case 1: return [2 /*return*/, _b.sent()];
773
924
  }
774
925
  });