@expo/entity 0.41.0 → 0.43.0

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 (430) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
  3. package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
  4. package/build/AuthorizationResultBasedEntityLoader.js +85 -62
  5. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  6. package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
  7. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  8. package/build/ComposedEntityCacheAdapter.d.ts +7 -6
  9. package/build/ComposedEntityCacheAdapter.js +28 -28
  10. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  11. package/build/ComposedSecondaryEntityCache.d.ts +1 -1
  12. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  13. package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
  14. package/build/EnforcingEntityAssociationLoader.js.map +1 -1
  15. package/build/EnforcingEntityCreator.d.ts +2 -2
  16. package/build/EnforcingEntityDeleter.d.ts +2 -2
  17. package/build/EnforcingEntityLoader.d.ts +104 -18
  18. package/build/EnforcingEntityLoader.js +113 -12
  19. package/build/EnforcingEntityLoader.js.map +1 -1
  20. package/build/EnforcingEntityUpdater.d.ts +2 -2
  21. package/build/Entity.d.ts +10 -10
  22. package/build/Entity.js.map +1 -1
  23. package/build/EntityAssociationLoader.d.ts +3 -3
  24. package/build/EntityCompanion.d.ts +5 -5
  25. package/build/EntityCompanion.js.map +1 -1
  26. package/build/EntityCompanionProvider.d.ts +6 -6
  27. package/build/EntityCompanionProvider.js.map +1 -1
  28. package/build/EntityConfiguration.d.ts +46 -5
  29. package/build/EntityConfiguration.js +39 -1
  30. package/build/EntityConfiguration.js.map +1 -1
  31. package/build/EntityCreator.d.ts +4 -4
  32. package/build/EntityDatabaseAdapter.d.ts +15 -14
  33. package/build/EntityDatabaseAdapter.js +20 -12
  34. package/build/EntityDatabaseAdapter.js.map +1 -1
  35. package/build/EntityDeleter.d.ts +4 -4
  36. package/build/EntityFieldDefinition.d.ts +20 -10
  37. package/build/EntityFieldDefinition.js +3 -1
  38. package/build/EntityFieldDefinition.js.map +1 -1
  39. package/build/EntityFields.d.ts +14 -12
  40. package/build/EntityFields.js.map +1 -1
  41. package/build/EntityLoader.d.ts +5 -5
  42. package/build/EntityLoaderFactory.d.ts +3 -3
  43. package/build/EntityLoaderFactory.js.map +1 -1
  44. package/build/EntityLoaderUtils.d.ts +2 -2
  45. package/build/EntityLoaderUtils.js +27 -1
  46. package/build/EntityLoaderUtils.js.map +1 -1
  47. package/build/EntityMutationInfo.d.ts +2 -2
  48. package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
  49. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  50. package/build/EntityMutationValidator.d.ts +2 -2
  51. package/build/EntityMutatorFactory.d.ts +5 -5
  52. package/build/EntityMutatorFactory.js.map +1 -1
  53. package/build/EntityPrivacyPolicy.d.ts +14 -14
  54. package/build/EntityPrivacyPolicy.js.map +1 -1
  55. package/build/EntitySecondaryCacheLoader.d.ts +4 -4
  56. package/build/EntityUpdater.d.ts +4 -4
  57. package/build/GenericEntityCacheAdapter.d.ts +7 -6
  58. package/build/GenericEntityCacheAdapter.js +13 -14
  59. package/build/GenericEntityCacheAdapter.js.map +1 -1
  60. package/build/GenericSecondaryEntityCache.d.ts +3 -3
  61. package/build/GenericSecondaryEntityCache.js.map +1 -1
  62. package/build/IEntityCacheAdapter.d.ts +17 -16
  63. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  64. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  65. package/build/IEntityGenericCacher.d.ts +15 -5
  66. package/build/ReadonlyEntity.d.ts +8 -8
  67. package/build/ReadonlyEntity.js.map +1 -1
  68. package/build/ViewerContext.d.ts +1 -1
  69. package/build/ViewerScopedEntityCompanion.d.ts +5 -5
  70. package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
  71. package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
  72. package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
  73. package/build/entityUtils.d.ts +1 -1
  74. package/build/entityUtils.js.map +1 -1
  75. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  76. package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
  77. package/build/errors/EntityNotFoundError.d.ts +2 -2
  78. package/build/index.d.ts +7 -7
  79. package/build/index.js +8 -13
  80. package/build/index.js.map +1 -1
  81. package/build/internal/CompositeFieldHolder.d.ts +48 -0
  82. package/build/internal/CompositeFieldHolder.js +116 -0
  83. package/build/internal/CompositeFieldHolder.js.map +1 -0
  84. package/build/internal/CompositeFieldValueMap.d.ts +15 -0
  85. package/build/internal/CompositeFieldValueMap.js +51 -0
  86. package/build/internal/CompositeFieldValueMap.js.map +1 -0
  87. package/build/internal/EntityDataManager.d.ts +16 -16
  88. package/build/internal/EntityDataManager.js +42 -45
  89. package/build/internal/EntityDataManager.js.map +1 -1
  90. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  91. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  92. package/build/internal/EntityLoadInterfaces.d.ts +104 -0
  93. package/build/internal/EntityLoadInterfaces.js +25 -0
  94. package/build/internal/EntityLoadInterfaces.js.map +1 -0
  95. package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
  96. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  97. package/build/internal/ReadThroughEntityCache.d.ts +17 -16
  98. package/build/internal/ReadThroughEntityCache.js +36 -36
  99. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  100. package/build/internal/SingleFieldHolder.d.ts +34 -0
  101. package/build/internal/SingleFieldHolder.js +90 -0
  102. package/build/internal/SingleFieldHolder.js.map +1 -0
  103. package/build/metrics/EntityMetricsUtils.d.ts +2 -1
  104. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  105. package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
  106. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  107. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  108. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  109. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  110. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  111. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  112. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  113. package/build/rules/PrivacyPolicyRule.d.ts +2 -2
  114. package/build/tsconfig.build.tsbuildinfo +1 -0
  115. package/build/utils/EntityPrivacyUtils.d.ts +4 -4
  116. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  117. package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
  118. package/build/utils/collections/SerializableKeyMap.js +60 -0
  119. package/build/utils/collections/SerializableKeyMap.js.map +1 -0
  120. package/build/utils/collections/maps.js +1 -2
  121. package/build/utils/collections/maps.js.map +1 -1
  122. package/build/utils/collections/sets.d.ts +1 -0
  123. package/build/utils/collections/sets.js +7 -0
  124. package/build/utils/collections/sets.js.map +1 -0
  125. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
  126. package/package.json +8 -5
  127. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +56 -49
  128. package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
  129. package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
  130. package/src/ComposedEntityCacheAdapter.ts +55 -46
  131. package/src/ComposedSecondaryEntityCache.ts +5 -2
  132. package/src/EnforcingEntityAssociationLoader.ts +52 -44
  133. package/src/EnforcingEntityCreator.ts +5 -5
  134. package/src/EnforcingEntityDeleter.ts +5 -5
  135. package/src/EnforcingEntityLoader.ts +158 -21
  136. package/src/EnforcingEntityUpdater.ts +5 -5
  137. package/src/Entity.ts +39 -39
  138. package/src/EntityAssociationLoader.ts +6 -6
  139. package/src/EntityCompanion.ts +11 -11
  140. package/src/EntityCompanionProvider.ts +21 -18
  141. package/src/EntityConfiguration.ts +123 -9
  142. package/src/EntityCreator.ts +7 -7
  143. package/src/EntityDatabaseAdapter.ts +51 -28
  144. package/src/EntityDeleter.ts +7 -7
  145. package/src/EntityFieldDefinition.ts +32 -12
  146. package/src/EntityFields.ts +49 -12
  147. package/src/EntityLoader.ts +8 -8
  148. package/src/EntityLoaderFactory.ts +8 -8
  149. package/src/EntityLoaderUtils.ts +39 -10
  150. package/src/EntityMutationInfo.ts +6 -6
  151. package/src/EntityMutationTriggerConfiguration.ts +68 -20
  152. package/src/EntityMutationValidator.ts +4 -4
  153. package/src/EntityMutatorFactory.ts +13 -13
  154. package/src/EntityPrivacyPolicy.ts +50 -26
  155. package/src/EntitySecondaryCacheLoader.ts +6 -6
  156. package/src/EntityUpdater.ts +7 -7
  157. package/src/GenericEntityCacheAdapter.ts +39 -28
  158. package/src/GenericSecondaryEntityCache.ts +6 -3
  159. package/src/IEntityCacheAdapter.ts +45 -25
  160. package/src/IEntityCacheAdapterProvider.ts +3 -3
  161. package/src/IEntityDatabaseAdapterProvider.ts +3 -3
  162. package/src/IEntityGenericCacher.ts +33 -5
  163. package/src/ReadonlyEntity.ts +24 -24
  164. package/src/ViewerContext.ts +5 -5
  165. package/src/ViewerScopedEntityCompanion.ts +7 -7
  166. package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
  167. package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
  168. package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
  169. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +4 -4
  170. package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
  171. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
  172. package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
  173. package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
  174. package/src/__tests__/Entity-test.ts +2 -2
  175. package/src/__tests__/EntityAssociationLoader-test.ts +2 -2
  176. package/src/__tests__/EntityCommonUseCases-test.ts +11 -11
  177. package/src/__tests__/EntityCompanion-test.ts +4 -4
  178. package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
  179. package/src/__tests__/EntityConfiguration-test.ts +85 -6
  180. package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
  181. package/src/__tests__/EntityEdges-test.ts +97 -72
  182. package/src/__tests__/EntityFields-test.ts +2 -2
  183. package/src/__tests__/EntityLoader-test.ts +2 -2
  184. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +11 -11
  185. package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
  186. package/src/__tests__/EntityMutator-test.ts +74 -46
  187. package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
  188. package/src/__tests__/EntityQueryContext-test.ts +1 -1
  189. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +3 -3
  190. package/src/__tests__/EntitySelfReferentialEdges-test.ts +64 -39
  191. package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
  192. package/src/__tests__/ReadonlyEntity-test.ts +3 -3
  193. package/src/__tests__/ViewerContext-test.ts +1 -1
  194. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
  195. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
  196. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
  197. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +12 -12
  198. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +12 -12
  199. package/src/entityUtils.ts +4 -1
  200. package/src/errors/EntityInvalidFieldValueError.ts +5 -5
  201. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  202. package/src/errors/EntityNotFoundError.ts +5 -5
  203. package/src/index.ts +7 -7
  204. package/src/internal/CompositeFieldHolder.ts +218 -0
  205. package/src/internal/CompositeFieldValueMap.ts +78 -0
  206. package/src/internal/EntityDataManager.ts +107 -96
  207. package/src/internal/EntityFieldTransformationUtils.ts +33 -14
  208. package/src/internal/EntityLoadInterfaces.ts +143 -0
  209. package/src/internal/EntityTableDataCoordinator.ts +8 -5
  210. package/src/internal/ReadThroughEntityCache.ts +63 -50
  211. package/src/internal/SingleFieldHolder.ts +131 -0
  212. package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
  213. package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
  214. package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
  215. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
  216. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
  217. package/src/metrics/EntityMetricsUtils.ts +7 -2
  218. package/src/metrics/IEntityMetricsAdapter.ts +6 -0
  219. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
  220. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
  221. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
  222. package/src/rules/PrivacyPolicyRule.ts +4 -4
  223. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
  224. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
  225. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
  226. package/src/utils/EntityPrivacyUtils.ts +72 -30
  227. package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
  228. package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
  229. package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
  230. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
  231. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
  232. package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
  233. package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
  234. package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
  235. package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
  236. package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
  237. package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
  238. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +62 -66
  239. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +29 -25
  240. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
  241. package/src/utils/collections/SerializableKeyMap.ts +84 -0
  242. package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
  243. package/src/utils/collections/__tests__/sets-test.ts +17 -0
  244. package/src/utils/collections/maps.ts +7 -8
  245. package/src/utils/collections/sets.ts +3 -0
  246. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
  247. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  248. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -242
  249. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  250. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  251. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
  252. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  253. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  254. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
  255. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  256. package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  257. package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
  258. package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  259. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  260. package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
  261. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  262. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  263. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
  264. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  265. package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  266. package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
  267. package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  268. package/build/__tests__/Entity-test.d.ts +0 -1
  269. package/build/__tests__/Entity-test.js +0 -94
  270. package/build/__tests__/Entity-test.js.map +0 -1
  271. package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  272. package/build/__tests__/EntityAssociationLoader-test.js +0 -30
  273. package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
  274. package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  275. package/build/__tests__/EntityCommonUseCases-test.js +0 -146
  276. package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
  277. package/build/__tests__/EntityCompanion-test.d.ts +0 -1
  278. package/build/__tests__/EntityCompanion-test.js +0 -77
  279. package/build/__tests__/EntityCompanion-test.js.map +0 -1
  280. package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  281. package/build/__tests__/EntityCompanionProvider-test.js +0 -54
  282. package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
  283. package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
  284. package/build/__tests__/EntityConfiguration-test.js +0 -103
  285. package/build/__tests__/EntityConfiguration-test.js.map +0 -1
  286. package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  287. package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
  288. package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  289. package/build/__tests__/EntityEdges-test.d.ts +0 -1
  290. package/build/__tests__/EntityEdges-test.js +0 -723
  291. package/build/__tests__/EntityEdges-test.js.map +0 -1
  292. package/build/__tests__/EntityFields-test.d.ts +0 -1
  293. package/build/__tests__/EntityFields-test.js +0 -63
  294. package/build/__tests__/EntityFields-test.js.map +0 -1
  295. package/build/__tests__/EntityLoader-test.d.ts +0 -1
  296. package/build/__tests__/EntityLoader-test.js +0 -36
  297. package/build/__tests__/EntityLoader-test.js.map +0 -1
  298. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  299. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -73
  300. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  301. package/build/__tests__/EntityMutator-test.d.ts +0 -1
  302. package/build/__tests__/EntityMutator-test.js +0 -741
  303. package/build/__tests__/EntityMutator-test.js.map +0 -1
  304. package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  305. package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
  306. package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  307. package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
  308. package/build/__tests__/EntityQueryContext-test.js +0 -116
  309. package/build/__tests__/EntityQueryContext-test.js.map +0 -1
  310. package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  311. package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
  312. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  313. package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  314. package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -201
  315. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  316. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  317. package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
  318. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  319. package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
  320. package/build/__tests__/ReadonlyEntity-test.js +0 -211
  321. package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
  322. package/build/__tests__/ViewerContext-test.d.ts +0 -1
  323. package/build/__tests__/ViewerContext-test.js +0 -30
  324. package/build/__tests__/ViewerContext-test.js.map +0 -1
  325. package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  326. package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
  327. package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  328. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  329. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
  330. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  331. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  332. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
  333. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  334. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  335. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
  336. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  337. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  338. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -123
  339. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  340. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  341. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -121
  342. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  343. package/build/__tests__/entityUtils-test.d.ts +0 -1
  344. package/build/__tests__/entityUtils-test.js +0 -87
  345. package/build/__tests__/entityUtils-test.js.map +0 -1
  346. package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  347. package/build/internal/__tests__/EntityDataManager-test.js +0 -373
  348. package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
  349. package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  350. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
  351. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  352. package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  353. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
  354. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  355. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  356. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
  357. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  358. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  359. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
  360. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  361. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  362. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
  363. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  364. package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
  365. package/build/testfixtures/DateIDTestEntity.js +0 -48
  366. package/build/testfixtures/DateIDTestEntity.js.map +0 -1
  367. package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
  368. package/build/testfixtures/SimpleTestEntity.js +0 -48
  369. package/build/testfixtures/SimpleTestEntity.js.map +0 -1
  370. package/build/testfixtures/TestEntity.d.ts +0 -30
  371. package/build/testfixtures/TestEntity.js +0 -93
  372. package/build/testfixtures/TestEntity.js.map +0 -1
  373. package/build/testfixtures/TestEntity2.d.ts +0 -20
  374. package/build/testfixtures/TestEntity2.js +0 -51
  375. package/build/testfixtures/TestEntity2.js.map +0 -1
  376. package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
  377. package/build/testfixtures/TestEntityNumberKey.js +0 -48
  378. package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
  379. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
  380. package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
  381. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
  382. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  383. package/build/testfixtures/TestViewerContext.js +0 -10
  384. package/build/testfixtures/TestViewerContext.js.map +0 -1
  385. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  386. package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -486
  387. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  388. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  389. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -178
  390. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  391. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  392. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
  393. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  394. package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
  395. package/build/utils/collections/__tests__/maps-test.js +0 -120
  396. package/build/utils/collections/__tests__/maps-test.js.map +0 -1
  397. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  398. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
  399. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
  400. package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
  401. package/build/utils/testing/StubCacheAdapter.js +0 -86
  402. package/build/utils/testing/StubCacheAdapter.js.map +0 -1
  403. package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
  404. package/build/utils/testing/StubDatabaseAdapter.js +0 -191
  405. package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
  406. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
  407. package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
  408. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
  409. package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
  410. package/build/utils/testing/StubQueryContextProvider.js +0 -19
  411. package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
  412. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
  413. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
  414. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
  415. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
  416. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
  417. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
  418. package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
  419. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
  420. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
  421. package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
  422. package/build/utils/testing/describeFieldTestCase.js +0 -18
  423. package/build/utils/testing/describeFieldTestCase.js.map +0 -1
  424. package/src/testfixtures/DateIDTestEntity.ts +0 -59
  425. package/src/testfixtures/TestEntityNumberKey.ts +0 -59
  426. package/src/utils/testing/StubCacheAdapter.ts +0 -122
  427. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
  428. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
  429. /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
  430. /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
@@ -17,15 +17,21 @@ import IEntityMetricsAdapter, {
17
17
  IncrementLoadCountEventType,
18
18
  } from '../../metrics/IEntityMetricsAdapter';
19
19
  import NoOpEntityMetricsAdapter from '../../metrics/NoOpEntityMetricsAdapter';
20
- import TestEntity, { testEntityConfiguration, TestFields } from '../../testfixtures/TestEntity';
21
20
  import {
22
21
  NoCacheStubCacheAdapterProvider,
23
22
  InMemoryFullCacheStubCacheAdapterProvider,
24
- } from '../../utils/testing/StubCacheAdapter';
25
- import StubDatabaseAdapter from '../../utils/testing/StubDatabaseAdapter';
26
- import StubQueryContextProvider from '../../utils/testing/StubQueryContextProvider';
23
+ } from '../../utils/__testfixtures__/StubCacheAdapter';
24
+ import StubDatabaseAdapter from '../../utils/__testfixtures__/StubDatabaseAdapter';
25
+ import StubQueryContextProvider from '../../utils/__testfixtures__/StubQueryContextProvider';
26
+ import TestEntity, {
27
+ testEntityConfiguration,
28
+ TestFields,
29
+ } from '../../utils/__testfixtures__/TestEntity';
30
+ import { CompositeFieldHolder, CompositeFieldValueHolder } from '../CompositeFieldHolder';
27
31
  import EntityDataManager from '../EntityDataManager';
32
+ import { EntityLoadMethodType } from '../EntityLoadInterfaces';
28
33
  import ReadThroughEntityCache from '../ReadThroughEntityCache';
34
+ import { SingleFieldHolder, SingleFieldValueHolder } from '../SingleFieldHolder';
29
35
 
30
36
  const getObjects = (): Map<string, TestFields[]> =>
31
37
  new Map([
@@ -67,7 +73,10 @@ describe(EntityDataManager, () => {
67
73
  testEntityConfiguration,
68
74
  objects,
69
75
  );
70
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
76
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
77
+ testEntityConfiguration,
78
+ dataStore,
79
+ );
71
80
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
72
81
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
73
82
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -83,25 +92,25 @@ describe(EntityDataManager, () => {
83
92
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
84
93
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
85
94
 
86
- const entityDatas = await entityDataManager.loadManyByFieldEqualingAsync(
95
+ const entityDatas = await entityDataManager.loadManyEqualingAsync(
87
96
  queryContext,
88
- 'customIdField',
89
- ['2'],
97
+ new SingleFieldHolder('customIdField'),
98
+ [new SingleFieldValueHolder('2')],
90
99
  );
91
- expect(entityDatas.get('2')).toHaveLength(1);
100
+ expect(entityDatas.get(new SingleFieldValueHolder('2'))).toHaveLength(1);
92
101
 
93
102
  expect(dbSpy).toHaveBeenCalled();
94
103
  expect(cacheSpy).toHaveBeenCalled();
95
104
  dbSpy.mockClear();
96
105
  cacheSpy.mockClear();
97
106
 
98
- const entityDatas2 = await entityDataManager.loadManyByFieldEqualingAsync(
107
+ const entityDatas2 = await entityDataManager.loadManyEqualingAsync(
99
108
  queryContext,
100
- 'testIndexedField',
101
- ['unique2', 'unique3'],
109
+ new SingleFieldHolder('testIndexedField'),
110
+ [new SingleFieldValueHolder('unique2'), new SingleFieldValueHolder('unique3')],
102
111
  );
103
- expect(entityDatas2.get('unique2')).toHaveLength(1);
104
- expect(entityDatas2.get('unique3')).toHaveLength(1);
112
+ expect(entityDatas2.get(new SingleFieldValueHolder('unique2'))).toHaveLength(1);
113
+ expect(entityDatas2.get(new SingleFieldValueHolder('unique3'))).toHaveLength(1);
105
114
 
106
115
  expect(dbSpy).toHaveBeenCalled();
107
116
  expect(cacheSpy).toHaveBeenCalled();
@@ -115,7 +124,10 @@ describe(EntityDataManager, () => {
115
124
  testEntityConfiguration,
116
125
  objects,
117
126
  );
118
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
127
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
128
+ testEntityConfiguration,
129
+ dataStore,
130
+ );
119
131
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
120
132
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
121
133
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -131,25 +143,25 @@ describe(EntityDataManager, () => {
131
143
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
132
144
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
133
145
 
134
- const entityDatas = await entityDataManager.loadManyByFieldEqualingAsync(
146
+ const entityDatas = await entityDataManager.loadManyEqualingAsync(
135
147
  queryContext,
136
- 'customIdField',
137
- ['1'],
148
+ new SingleFieldHolder('customIdField'),
149
+ [new SingleFieldValueHolder('1')],
138
150
  );
139
- expect(entityDatas.get('1')).toHaveLength(1);
151
+ expect(entityDatas.get(new SingleFieldValueHolder('1'))).toHaveLength(1);
140
152
 
141
153
  expect(dbSpy).toHaveBeenCalled();
142
154
  expect(cacheSpy).toHaveBeenCalled();
143
155
  dbSpy.mockClear();
144
156
  cacheSpy.mockClear();
145
157
 
146
- const entityDatas2 = await entityDataManager.loadManyByFieldEqualingAsync(
158
+ const entityDatas2 = await entityDataManager.loadManyEqualingAsync(
147
159
  queryContext,
148
- 'testIndexedField',
149
- ['unique2', 'unique3'],
160
+ new SingleFieldHolder('testIndexedField'),
161
+ [new SingleFieldValueHolder('unique2'), new SingleFieldValueHolder('unique3')],
150
162
  );
151
- expect(entityDatas2.get('unique2')).toHaveLength(1);
152
- expect(entityDatas2.get('unique3')).toHaveLength(1);
163
+ expect(entityDatas2.get(new SingleFieldValueHolder('unique2'))).toHaveLength(1);
164
+ expect(entityDatas2.get(new SingleFieldValueHolder('unique3'))).toHaveLength(1);
153
165
 
154
166
  expect(dbSpy).toHaveBeenCalled();
155
167
  expect(cacheSpy).toHaveBeenCalled();
@@ -163,7 +175,10 @@ describe(EntityDataManager, () => {
163
175
  testEntityConfiguration,
164
176
  objects,
165
177
  );
166
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
178
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
179
+ testEntityConfiguration,
180
+ dataStore,
181
+ );
167
182
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
168
183
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
169
184
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -187,12 +202,16 @@ describe(EntityDataManager, () => {
187
202
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
188
203
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
189
204
 
190
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
191
- 'unique2',
192
- ]);
193
- await entityDataManager2.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
194
- 'unique2',
195
- ]);
205
+ await entityDataManager.loadManyEqualingAsync(
206
+ queryContext,
207
+ new SingleFieldHolder('testIndexedField'),
208
+ [new SingleFieldValueHolder('unique2')],
209
+ );
210
+ await entityDataManager2.loadManyEqualingAsync(
211
+ queryContext,
212
+ new SingleFieldHolder('testIndexedField'),
213
+ [new SingleFieldValueHolder('unique2')],
214
+ );
196
215
 
197
216
  expect(dbSpy).toHaveBeenCalledTimes(1);
198
217
  expect(cacheSpy).toHaveBeenCalledTimes(2);
@@ -207,7 +226,10 @@ describe(EntityDataManager, () => {
207
226
  testEntityConfiguration,
208
227
  objects,
209
228
  );
210
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
229
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
230
+ testEntityConfiguration,
231
+ dataStore,
232
+ );
211
233
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
212
234
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
213
235
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -223,12 +245,16 @@ describe(EntityDataManager, () => {
223
245
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
224
246
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
225
247
 
226
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
227
- 'unique2',
228
- ]);
229
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
230
- 'unique2',
231
- ]);
248
+ await entityDataManager.loadManyEqualingAsync(
249
+ queryContext,
250
+ new SingleFieldHolder('testIndexedField'),
251
+ [new SingleFieldValueHolder('unique2')],
252
+ );
253
+ await entityDataManager.loadManyEqualingAsync(
254
+ queryContext,
255
+ new SingleFieldHolder('testIndexedField'),
256
+ [new SingleFieldValueHolder('unique2')],
257
+ );
232
258
 
233
259
  expect(dbSpy).toHaveBeenCalledTimes(1);
234
260
  expect(cacheSpy).toHaveBeenCalledTimes(1);
@@ -243,7 +269,10 @@ describe(EntityDataManager, () => {
243
269
  testEntityConfiguration,
244
270
  objects,
245
271
  );
246
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
272
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
273
+ testEntityConfiguration,
274
+ dataStore,
275
+ );
247
276
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
248
277
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
249
278
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -259,23 +288,23 @@ describe(EntityDataManager, () => {
259
288
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
260
289
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
261
290
 
262
- const entityData = await entityDataManager.loadManyByFieldEqualingAsync(
291
+ const entityData = await entityDataManager.loadManyEqualingAsync(
263
292
  queryContext,
264
- 'stringField',
265
- ['hello', 'world'],
293
+ new SingleFieldHolder('stringField'),
294
+ [new SingleFieldValueHolder('hello'), new SingleFieldValueHolder('world')],
266
295
  );
267
- const entityData2 = await entityDataManager.loadManyByFieldEqualingAsync(
296
+ const entityData2 = await entityDataManager.loadManyEqualingAsync(
268
297
  queryContext,
269
- 'stringField',
270
- ['hello', 'world'],
298
+ new SingleFieldHolder('stringField'),
299
+ [new SingleFieldValueHolder('hello'), new SingleFieldValueHolder('world')],
271
300
  );
272
301
 
273
302
  expect(dbSpy).toHaveBeenCalledTimes(1);
274
303
  expect(cacheSpy).toHaveBeenCalledTimes(1);
275
304
 
276
305
  expect(entityData).toMatchObject(entityData2);
277
- expect(entityData.get('hello')).toHaveLength(2);
278
- expect(entityData.get('world')).toHaveLength(1);
306
+ expect(entityData.get(new SingleFieldValueHolder('hello'))).toHaveLength(2);
307
+ expect(entityData.get(new SingleFieldValueHolder('world'))).toHaveLength(1);
279
308
 
280
309
  dbSpy.mockReset();
281
310
  cacheSpy.mockReset();
@@ -287,7 +316,10 @@ describe(EntityDataManager, () => {
287
316
  testEntityConfiguration,
288
317
  objects,
289
318
  );
290
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
319
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
320
+ testEntityConfiguration,
321
+ dataStore,
322
+ );
291
323
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
292
324
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
293
325
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -305,13 +337,22 @@ describe(EntityDataManager, () => {
305
337
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
306
338
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
307
339
 
308
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
309
- objectInQuestion['testIndexedField'],
310
- ]);
311
- await entityDataManager.invalidateObjectFieldsAsync(objectInQuestion);
312
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
313
- objectInQuestion['testIndexedField'],
340
+ await entityDataManager.loadManyEqualingAsync(
341
+ queryContext,
342
+ new SingleFieldHolder('testIndexedField'),
343
+ [new SingleFieldValueHolder(objectInQuestion['testIndexedField'])],
344
+ );
345
+ await entityDataManager.invalidateKeyValuePairsAsync([
346
+ [
347
+ new SingleFieldHolder('testIndexedField'),
348
+ new SingleFieldValueHolder(objectInQuestion['testIndexedField']),
349
+ ],
314
350
  ]);
351
+ await entityDataManager.loadManyEqualingAsync(
352
+ queryContext,
353
+ new SingleFieldHolder('testIndexedField'),
354
+ [new SingleFieldValueHolder(objectInQuestion['testIndexedField'])],
355
+ );
315
356
 
316
357
  expect(dbSpy).toHaveBeenCalledTimes(2);
317
358
  expect(cacheSpy).toHaveBeenCalledTimes(2);
@@ -326,7 +367,10 @@ describe(EntityDataManager, () => {
326
367
  testEntityConfiguration,
327
368
  objects,
328
369
  );
329
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
370
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
371
+ testEntityConfiguration,
372
+ dataStore,
373
+ );
330
374
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
331
375
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
332
376
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -344,13 +388,22 @@ describe(EntityDataManager, () => {
344
388
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
345
389
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
346
390
 
347
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
348
- objectInQuestion['testIndexedField'],
349
- ]);
350
- await entityDataManager.invalidateObjectFieldsAsync(objectInQuestion);
351
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', [
352
- objectInQuestion['customIdField'],
391
+ await entityDataManager.loadManyEqualingAsync(
392
+ queryContext,
393
+ new SingleFieldHolder('testIndexedField'),
394
+ [new SingleFieldValueHolder(objectInQuestion['testIndexedField'])],
395
+ );
396
+ await entityDataManager.invalidateKeyValuePairsAsync([
397
+ [
398
+ new SingleFieldHolder('testIndexedField'),
399
+ new SingleFieldValueHolder(objectInQuestion['testIndexedField']),
400
+ ],
353
401
  ]);
402
+ await entityDataManager.loadManyEqualingAsync(
403
+ queryContext,
404
+ new SingleFieldHolder('customIdField'),
405
+ [new SingleFieldValueHolder(objectInQuestion['customIdField'])],
406
+ );
354
407
 
355
408
  expect(dbSpy).toHaveBeenCalledTimes(2);
356
409
  expect(cacheSpy).toHaveBeenCalledTimes(2);
@@ -365,7 +418,10 @@ describe(EntityDataManager, () => {
365
418
  testEntityConfiguration,
366
419
  objects,
367
420
  );
368
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
421
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
422
+ testEntityConfiguration,
423
+ dataStore,
424
+ );
369
425
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
370
426
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
371
427
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -382,14 +438,16 @@ describe(EntityDataManager, () => {
382
438
 
383
439
  const entityDatas = await new StubQueryContextProvider().runInTransactionAsync(
384
440
  async (queryContext) => {
385
- return await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', [
386
- '1',
387
- ]);
441
+ return await entityDataManager.loadManyEqualingAsync(
442
+ queryContext,
443
+ new SingleFieldHolder('customIdField'),
444
+ [new SingleFieldValueHolder('1')],
445
+ );
388
446
  },
389
447
  {},
390
448
  );
391
449
 
392
- expect(entityDatas.get('1')).toHaveLength(1);
450
+ expect(entityDatas.get(new SingleFieldValueHolder('1'))).toHaveLength(1);
393
451
 
394
452
  expect(dbSpy).toHaveBeenCalled();
395
453
  expect(cacheSpy).not.toHaveBeenCalled();
@@ -404,7 +462,10 @@ describe(EntityDataManager, () => {
404
462
  testEntityConfiguration,
405
463
  objects,
406
464
  );
407
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
465
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
466
+ testEntityConfiguration,
467
+ dataStore,
468
+ );
408
469
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
409
470
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
410
471
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -445,7 +506,7 @@ describe(EntityDataManager, () => {
445
506
  });
446
507
 
447
508
  it('handles DB errors as expected', async () => {
448
- const databaseAdapterMock = mock<EntityDatabaseAdapter<TestFields>>();
509
+ const databaseAdapterMock = mock<EntityDatabaseAdapter<TestFields, 'customIdField'>>();
449
510
  when(databaseAdapterMock.fetchManyWhereAsync(anything(), anything(), anything())).thenReject(
450
511
  new Error('DB query failed'),
451
512
  );
@@ -464,7 +525,11 @@ describe(EntityDataManager, () => {
464
525
  const queryContext = new StubQueryContextProvider().getQueryContext();
465
526
 
466
527
  await expect(
467
- entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['2']),
528
+ entityDataManager.loadManyEqualingAsync(
529
+ queryContext,
530
+ new SingleFieldHolder('customIdField'),
531
+ [new SingleFieldValueHolder('2')],
532
+ ),
468
533
  ).rejects.toThrow();
469
534
  });
470
535
 
@@ -477,7 +542,10 @@ describe(EntityDataManager, () => {
477
542
  testEntityConfiguration,
478
543
  objects,
479
544
  );
480
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
545
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
546
+ testEntityConfiguration,
547
+ dataStore,
548
+ );
481
549
  const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
482
550
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
483
551
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -490,7 +558,13 @@ describe(EntityDataManager, () => {
490
558
  );
491
559
  const queryContext = new StubQueryContextProvider().getQueryContext();
492
560
 
493
- await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['1']);
561
+ // make call to loadManyByFieldEqualingAsync to populate cache and dataloader, ensure metrics are recorded
562
+ // for dataloader, cache, and database
563
+ await entityDataManager.loadManyEqualingAsync(
564
+ queryContext,
565
+ new SingleFieldHolder('testIndexedField'),
566
+ [new SingleFieldValueHolder('unique1')],
567
+ );
494
568
  verify(
495
569
  metricsAdapterMock.logDataManagerLoadEvent(
496
570
  objectContaining({
@@ -500,33 +574,84 @@ describe(EntityDataManager, () => {
500
574
  }),
501
575
  ),
502
576
  ).once();
577
+ verify(metricsAdapterMock.incrementDataManagerLoadCount(anything())).thrice();
578
+ verify(
579
+ metricsAdapterMock.incrementDataManagerLoadCount(
580
+ deepEqual({
581
+ type: IncrementLoadCountEventType.DATALOADER,
582
+ fieldValueCount: 1,
583
+ entityClassName: TestEntity.name,
584
+ loadType: EntityLoadMethodType.SINGLE,
585
+ }),
586
+ ),
587
+ ).once();
588
+ verify(
589
+ metricsAdapterMock.incrementDataManagerLoadCount(
590
+ deepEqual({
591
+ type: IncrementLoadCountEventType.CACHE,
592
+ fieldValueCount: 1,
593
+ entityClassName: TestEntity.name,
594
+ loadType: EntityLoadMethodType.SINGLE,
595
+ }),
596
+ ),
597
+ ).once();
598
+ verify(
599
+ metricsAdapterMock.incrementDataManagerLoadCount(
600
+ deepEqual({
601
+ type: IncrementLoadCountEventType.DATABASE,
602
+ fieldValueCount: 1,
603
+ entityClassName: TestEntity.name,
604
+ loadType: EntityLoadMethodType.SINGLE,
605
+ }),
606
+ ),
607
+ ).once();
503
608
 
504
- await entityDataManager.loadManyByFieldEqualityConjunctionAsync(
609
+ resetCalls(metricsAdapterMock);
610
+
611
+ // make second call to loadManyByFieldEqualingAsync, ensure metrics are only recorded for dataloader since
612
+ // entity is in local dataloader
613
+ await entityDataManager.loadManyEqualingAsync(
505
614
  queryContext,
506
- [
507
- {
508
- fieldName: 'customIdField',
509
- fieldValue: '1',
510
- },
511
- ],
512
- {},
615
+ new SingleFieldHolder('testIndexedField'),
616
+ [new SingleFieldValueHolder('unique1')],
513
617
  );
618
+ verify(metricsAdapterMock.incrementDataManagerLoadCount(anything())).once();
514
619
  verify(
515
- metricsAdapterMock.logDataManagerLoadEvent(
516
- objectContaining({
517
- type: EntityMetricsLoadType.LOAD_MANY_EQUALITY_CONJUNCTION,
620
+ metricsAdapterMock.incrementDataManagerLoadCount(
621
+ deepEqual({
622
+ type: IncrementLoadCountEventType.DATALOADER,
623
+ fieldValueCount: 1,
518
624
  entityClassName: TestEntity.name,
519
- count: 1,
625
+ loadType: EntityLoadMethodType.SINGLE,
520
626
  }),
521
627
  ),
522
628
  ).once();
523
629
 
630
+ resetCalls(metricsAdapterMock);
631
+
632
+ // make third call in new data manager but query two keys, ensure only one of the keys is fetched
633
+ // from the database and the other is fetched from the cache
634
+ const entityCache2 = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
635
+ const entityDataManager2 = new EntityDataManager(
636
+ databaseAdapter,
637
+ entityCache2,
638
+ new StubQueryContextProvider(),
639
+ metricsAdapter,
640
+ TestEntity.name,
641
+ );
642
+ await entityDataManager2.loadManyEqualingAsync(
643
+ queryContext,
644
+ new SingleFieldHolder('testIndexedField'),
645
+ [new SingleFieldValueHolder('unique1'), new SingleFieldValueHolder('unique2')],
646
+ );
647
+ verify(metricsAdapterMock.incrementDataManagerLoadCount(anything())).thrice();
524
648
  verify(
525
649
  metricsAdapterMock.incrementDataManagerLoadCount(
526
650
  deepEqual({
527
651
  type: IncrementLoadCountEventType.DATALOADER,
528
- fieldValueCount: 1,
652
+ fieldValueCount: 2,
529
653
  entityClassName: TestEntity.name,
654
+ loadType: EntityLoadMethodType.SINGLE,
530
655
  }),
531
656
  ),
532
657
  ).once();
@@ -534,8 +659,9 @@ describe(EntityDataManager, () => {
534
659
  metricsAdapterMock.incrementDataManagerLoadCount(
535
660
  deepEqual({
536
661
  type: IncrementLoadCountEventType.CACHE,
537
- fieldValueCount: 1,
662
+ fieldValueCount: 2,
538
663
  entityClassName: TestEntity.name,
664
+ loadType: EntityLoadMethodType.SINGLE,
539
665
  }),
540
666
  ),
541
667
  ).once();
@@ -545,6 +671,29 @@ describe(EntityDataManager, () => {
545
671
  type: IncrementLoadCountEventType.DATABASE,
546
672
  fieldValueCount: 1,
547
673
  entityClassName: TestEntity.name,
674
+ loadType: EntityLoadMethodType.SINGLE,
675
+ }),
676
+ ),
677
+ ).once();
678
+
679
+ resetCalls(metricsAdapterMock);
680
+
681
+ await entityDataManager.loadManyByFieldEqualityConjunctionAsync(
682
+ queryContext,
683
+ [
684
+ {
685
+ fieldName: 'testIndexedField',
686
+ fieldValue: 'unique1',
687
+ },
688
+ ],
689
+ {},
690
+ );
691
+ verify(
692
+ metricsAdapterMock.logDataManagerLoadEvent(
693
+ objectContaining({
694
+ type: EntityMetricsLoadType.LOAD_MANY_EQUALITY_CONJUNCTION,
695
+ entityClassName: TestEntity.name,
696
+ count: 1,
548
697
  }),
549
698
  ),
550
699
  ).once();
@@ -574,13 +723,16 @@ describe(EntityDataManager, () => {
574
723
  verify(metricsAdapterMock.incrementDataManagerLoadCount(anything())).never();
575
724
  });
576
725
 
577
- it('throws when a load-by value is null or undefined', async () => {
726
+ it('throws when a single value load-by value is null or undefined', async () => {
578
727
  const objects = getObjects();
579
728
  const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
580
729
  testEntityConfiguration,
581
730
  objects,
582
731
  );
583
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
732
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
733
+ testEntityConfiguration,
734
+ dataStore,
735
+ );
584
736
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
585
737
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
586
738
  const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
@@ -594,13 +746,78 @@ describe(EntityDataManager, () => {
594
746
  const queryContext = new StubQueryContextProvider().getQueryContext();
595
747
 
596
748
  await expect(
597
- entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [null as any]),
749
+ entityDataManager.loadManyEqualingAsync(
750
+ queryContext,
751
+ new SingleFieldHolder('nullableField'),
752
+ [new SingleFieldValueHolder(null as any)],
753
+ ),
598
754
  ).rejects.toThrowError('Invalid load: TestEntity (nullableField = null)');
599
755
 
600
756
  await expect(
601
- entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [
602
- undefined as any,
603
- ]),
757
+ entityDataManager.loadManyEqualingAsync(
758
+ queryContext,
759
+ new SingleFieldHolder('nullableField'),
760
+ [new SingleFieldValueHolder(undefined as any)],
761
+ ),
604
762
  ).rejects.toThrowError('Invalid load: TestEntity (nullableField = undefined)');
605
763
  });
764
+
765
+ it('throws when a composite value load-by value is null or undefined', async () => {
766
+ const objects = getObjects();
767
+ const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
768
+ testEntityConfiguration,
769
+ objects,
770
+ );
771
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
772
+ testEntityConfiguration,
773
+ dataStore,
774
+ );
775
+ const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
776
+ const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
777
+ const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
778
+ const entityDataManager = new EntityDataManager(
779
+ databaseAdapter,
780
+ entityCache,
781
+ new StubQueryContextProvider(),
782
+ new NoOpEntityMetricsAdapter(),
783
+ TestEntity.name,
784
+ );
785
+ const queryContext = new StubQueryContextProvider().getQueryContext();
786
+
787
+ await expect(
788
+ entityDataManager.loadManyEqualingAsync(
789
+ queryContext,
790
+ new CompositeFieldHolder<TestFields, 'customIdField'>([
791
+ 'nullableField',
792
+ 'testIndexedField',
793
+ ]),
794
+ [
795
+ new CompositeFieldValueHolder({
796
+ nullableField: null as any,
797
+ testIndexedField: 'unique1',
798
+ }),
799
+ ],
800
+ ),
801
+ ).rejects.toThrowError(
802
+ 'Invalid load: TestEntity (nullableField,testIndexedField = CompositeFieldValue(nullableField=null,testIndexedField=unique1))',
803
+ );
804
+
805
+ await expect(
806
+ entityDataManager.loadManyEqualingAsync(
807
+ queryContext,
808
+ new CompositeFieldHolder<TestFields, 'customIdField'>([
809
+ 'nullableField',
810
+ 'testIndexedField',
811
+ ]),
812
+ [
813
+ new CompositeFieldValueHolder({
814
+ nullableField: undefined as any,
815
+ testIndexedField: 'unique1',
816
+ }),
817
+ ],
818
+ ),
819
+ ).rejects.toThrowError(
820
+ 'Invalid load: TestEntity (nullableField,testIndexedField = CompositeFieldValue(nullableField=undefined,testIndexedField=unique1))',
821
+ );
822
+ });
606
823
  });
@@ -1,5 +1,5 @@
1
1
  import EntityConfiguration from '../../EntityConfiguration';
2
- import { UUIDField, StringField } from '../../EntityFields';
2
+ import { StringField, UUIDField } from '../../EntityFields';
3
3
  import {
4
4
  getDatabaseFieldForEntityField,
5
5
  transformDatabaseObjectToFields,
@@ -16,12 +16,13 @@ type BlahT = {
16
16
  transformWrite: string;
17
17
  };
18
18
 
19
- const blahEntityConfiguration = new EntityConfiguration<BlahT>({
19
+ const blahEntityConfiguration = new EntityConfiguration<BlahT, 'id'>({
20
20
  idField: 'id',
21
21
  tableName: 'blah_table',
22
22
  schema: {
23
23
  id: new UUIDField({
24
24
  columnName: 'id',
25
+ cache: false,
25
26
  }),
26
27
  cacheable: new StringField({
27
28
  columnName: 'cacheable',