interaqt 0.1.0 → 0.2.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 (321) hide show
  1. package/dist/index.js +10508 -4
  2. package/dist/index.js.map +1 -1
  3. package/dist/runtime/ComputationSourceMap.d.ts +117 -0
  4. package/dist/runtime/ComputationSourceMap.d.ts.map +1 -0
  5. package/dist/runtime/Controller.d.ts +37 -26
  6. package/dist/runtime/Controller.d.ts.map +1 -1
  7. package/dist/runtime/ExternalSynchronizer.d.ts +6 -0
  8. package/dist/runtime/ExternalSynchronizer.d.ts.map +1 -0
  9. package/dist/runtime/MonoSystem.d.ts +29 -17
  10. package/dist/runtime/MonoSystem.d.ts.map +1 -1
  11. package/dist/runtime/Mysql.d.ts +2 -2
  12. package/dist/runtime/PGLite.d.ts +35 -0
  13. package/dist/runtime/PGLite.d.ts.map +1 -0
  14. package/dist/runtime/PostgreSQL.d.ts +2 -2
  15. package/dist/runtime/SQLite.d.ts +3 -3
  16. package/dist/runtime/SQLite.d.ts.map +1 -1
  17. package/dist/runtime/Scheduler.d.ts +28 -61
  18. package/dist/runtime/Scheduler.d.ts.map +1 -1
  19. package/dist/runtime/System.d.ts +18 -224
  20. package/dist/runtime/System.d.ts.map +1 -1
  21. package/dist/runtime/{ActivityCall.d.ts → activity/ActivityCall.d.ts} +6 -7
  22. package/dist/runtime/activity/ActivityCall.d.ts.map +1 -0
  23. package/dist/runtime/activity/ActivityManager.d.ts +44 -0
  24. package/dist/runtime/activity/ActivityManager.d.ts.map +1 -0
  25. package/dist/runtime/{InteractionCall.d.ts → activity/InteractionCall.d.ts} +28 -41
  26. package/dist/runtime/activity/InteractionCall.d.ts.map +1 -0
  27. package/dist/runtime/computations/Any.d.ts +71 -0
  28. package/dist/runtime/computations/Any.d.ts.map +1 -0
  29. package/dist/runtime/computations/Average.d.ts +69 -0
  30. package/dist/runtime/computations/Average.d.ts.map +1 -0
  31. package/dist/runtime/computations/Computation.d.ts +138 -0
  32. package/dist/runtime/computations/Computation.d.ts.map +1 -0
  33. package/dist/runtime/computations/Count.d.ts +73 -0
  34. package/dist/runtime/computations/Count.d.ts.map +1 -0
  35. package/dist/runtime/computations/Custom.d.ts +45 -0
  36. package/dist/runtime/computations/Custom.d.ts.map +1 -0
  37. package/dist/runtime/computations/Every.d.ts +74 -0
  38. package/dist/runtime/computations/Every.d.ts.map +1 -0
  39. package/dist/runtime/computations/MathResolver.d.ts +60 -0
  40. package/dist/runtime/computations/MathResolver.d.ts.map +1 -0
  41. package/dist/runtime/computations/RealTime.d.ts +66 -0
  42. package/dist/runtime/computations/RealTime.d.ts.map +1 -0
  43. package/dist/runtime/{computedDataHandles → computations}/StateMachine.d.ts +31 -22
  44. package/dist/runtime/computations/StateMachine.d.ts.map +1 -0
  45. package/dist/runtime/computations/Summation.d.ts +66 -0
  46. package/dist/runtime/computations/Summation.d.ts.map +1 -0
  47. package/dist/runtime/computations/Transform.d.ts +29 -0
  48. package/dist/runtime/computations/Transform.d.ts.map +1 -0
  49. package/dist/runtime/computations/TransitionFinder.d.ts +11 -0
  50. package/dist/runtime/computations/TransitionFinder.d.ts.map +1 -0
  51. package/dist/runtime/computations/WeightedSummation.d.ts +71 -0
  52. package/dist/runtime/computations/WeightedSummation.d.ts.map +1 -0
  53. package/dist/runtime/computations/index.d.ts +22 -0
  54. package/dist/runtime/computations/index.d.ts.map +1 -0
  55. package/dist/runtime/errors/ActivityErrors.d.ts +40 -0
  56. package/dist/runtime/errors/ActivityErrors.d.ts.map +1 -0
  57. package/dist/runtime/errors/ComputationErrors.d.ts +61 -0
  58. package/dist/runtime/errors/ComputationErrors.d.ts.map +1 -0
  59. package/dist/runtime/errors/ConditionErrors.d.ts +33 -0
  60. package/dist/runtime/errors/ConditionErrors.d.ts.map +1 -0
  61. package/dist/runtime/errors/FrameworkError.d.ts +77 -0
  62. package/dist/runtime/errors/FrameworkError.d.ts.map +1 -0
  63. package/dist/runtime/errors/InteractionErrors.d.ts +21 -0
  64. package/dist/runtime/errors/InteractionErrors.d.ts.map +1 -0
  65. package/dist/runtime/errors/SystemErrors.d.ts +16 -0
  66. package/dist/runtime/errors/SystemErrors.d.ts.map +1 -0
  67. package/dist/runtime/errors/index.d.ts +37 -0
  68. package/dist/runtime/errors/index.d.ts.map +1 -0
  69. package/dist/runtime/index.d.ts +9 -7
  70. package/dist/runtime/index.d.ts.map +1 -1
  71. package/dist/shared/Action.d.ts +38 -0
  72. package/dist/shared/Action.d.ts.map +1 -0
  73. package/dist/shared/Activity.d.ts +178 -0
  74. package/dist/shared/Activity.d.ts.map +1 -0
  75. package/dist/shared/Any.d.ts +82 -0
  76. package/dist/shared/Any.d.ts.map +1 -0
  77. package/dist/shared/Attributive.d.ts +92 -0
  78. package/dist/shared/Attributive.d.ts.map +1 -0
  79. package/dist/shared/Average.d.ts +59 -0
  80. package/dist/shared/Average.d.ts.map +1 -0
  81. package/dist/shared/BoolExp.d.ts +139 -63
  82. package/dist/shared/BoolExp.d.ts.map +1 -1
  83. package/dist/shared/Computation.d.ts +23 -0
  84. package/dist/shared/Computation.d.ts.map +1 -0
  85. package/dist/shared/Condition.d.ts +43 -0
  86. package/dist/shared/Condition.d.ts.map +1 -0
  87. package/dist/shared/Conditions.d.ts +38 -0
  88. package/dist/shared/Conditions.d.ts.map +1 -0
  89. package/dist/shared/Count.d.ts +77 -0
  90. package/dist/shared/Count.d.ts.map +1 -0
  91. package/dist/shared/Custom.d.ts +108 -0
  92. package/dist/shared/Custom.d.ts.map +1 -0
  93. package/dist/shared/Data.d.ts +121 -0
  94. package/dist/shared/Data.d.ts.map +1 -0
  95. package/dist/shared/DataAttributives.d.ts +38 -0
  96. package/dist/shared/DataAttributives.d.ts.map +1 -0
  97. package/dist/shared/Entity.d.ts +96 -0
  98. package/dist/shared/Entity.d.ts.map +1 -0
  99. package/dist/shared/Event.d.ts +36 -0
  100. package/dist/shared/Event.d.ts.map +1 -0
  101. package/dist/shared/Every.d.ts +85 -0
  102. package/dist/shared/Every.d.ts.map +1 -0
  103. package/dist/shared/Gateway.d.ts +36 -0
  104. package/dist/shared/Gateway.d.ts.map +1 -0
  105. package/dist/shared/Interaction.d.ts +108 -0
  106. package/dist/shared/Interaction.d.ts.map +1 -0
  107. package/dist/shared/Payload.d.ts +39 -0
  108. package/dist/shared/Payload.d.ts.map +1 -0
  109. package/dist/shared/PayloadItem.d.ts +85 -0
  110. package/dist/shared/PayloadItem.d.ts.map +1 -0
  111. package/dist/shared/Property.d.ts +83 -0
  112. package/dist/shared/Property.d.ts.map +1 -0
  113. package/dist/shared/RealDictionary.d.ts +94 -0
  114. package/dist/shared/RealDictionary.d.ts.map +1 -0
  115. package/dist/shared/RealTime.d.ts +66 -0
  116. package/dist/shared/RealTime.d.ts.map +1 -0
  117. package/dist/shared/RefContainer.d.ts +89 -0
  118. package/dist/shared/RefContainer.d.ts.map +1 -0
  119. package/dist/shared/Relation.d.ts +140 -0
  120. package/dist/shared/Relation.d.ts.map +1 -0
  121. package/dist/shared/SideEffect.d.ts +45 -0
  122. package/dist/shared/SideEffect.d.ts.map +1 -0
  123. package/dist/shared/StateMachine.d.ts +55 -0
  124. package/dist/shared/StateMachine.d.ts.map +1 -0
  125. package/dist/shared/StateNode.d.ts +45 -0
  126. package/dist/shared/StateNode.d.ts.map +1 -0
  127. package/dist/shared/StateTransfer.d.ts +63 -0
  128. package/dist/shared/StateTransfer.d.ts.map +1 -0
  129. package/dist/shared/Summation.d.ts +59 -0
  130. package/dist/shared/Summation.d.ts.map +1 -0
  131. package/dist/shared/Transform.d.ts +54 -0
  132. package/dist/shared/Transform.d.ts.map +1 -0
  133. package/dist/shared/User.d.ts +10 -0
  134. package/dist/shared/User.d.ts.map +1 -0
  135. package/dist/shared/WeightedSummation.d.ts +82 -0
  136. package/dist/shared/WeightedSummation.d.ts.map +1 -0
  137. package/dist/shared/index.d.ts +35 -9
  138. package/dist/shared/index.d.ts.map +1 -1
  139. package/dist/shared/init.d.ts +3 -0
  140. package/dist/shared/init.d.ts.map +1 -0
  141. package/dist/shared/interfaces.d.ts +72 -0
  142. package/dist/shared/interfaces.d.ts.map +1 -0
  143. package/dist/shared/types.d.ts +77 -0
  144. package/dist/shared/types.d.ts.map +1 -0
  145. package/dist/shared/utils.d.ts +16 -10
  146. package/dist/shared/utils.d.ts.map +1 -1
  147. package/dist/storage/erstorage/AttributeInfo.d.ts +8 -3
  148. package/dist/storage/erstorage/AttributeInfo.d.ts.map +1 -1
  149. package/dist/storage/erstorage/AttributeQuery.d.ts +4 -3
  150. package/dist/storage/erstorage/AttributeQuery.d.ts.map +1 -1
  151. package/dist/storage/erstorage/EntityQueryHandle.d.ts +18 -17
  152. package/dist/storage/erstorage/EntityQueryHandle.d.ts.map +1 -1
  153. package/dist/storage/erstorage/EntityToTableMap.d.ts +27 -5
  154. package/dist/storage/erstorage/EntityToTableMap.d.ts.map +1 -1
  155. package/dist/storage/erstorage/FilteredEntityManager.d.ts +70 -0
  156. package/dist/storage/erstorage/FilteredEntityManager.d.ts.map +1 -0
  157. package/dist/storage/erstorage/LinkInfo.d.ts +10 -3
  158. package/dist/storage/erstorage/LinkInfo.d.ts.map +1 -1
  159. package/dist/storage/erstorage/MatchExp.d.ts +19 -9
  160. package/dist/storage/erstorage/MatchExp.d.ts.map +1 -1
  161. package/dist/storage/erstorage/MergedItemProcessor.d.ts +25 -0
  162. package/dist/storage/erstorage/MergedItemProcessor.d.ts.map +1 -0
  163. package/dist/storage/erstorage/Modifier.d.ts +1 -1
  164. package/dist/storage/erstorage/NewRecordData.d.ts +16 -9
  165. package/dist/storage/erstorage/NewRecordData.d.ts.map +1 -1
  166. package/dist/storage/erstorage/RecordInfo.d.ts +11 -2
  167. package/dist/storage/erstorage/RecordInfo.d.ts.map +1 -1
  168. package/dist/storage/erstorage/RecordQuery.d.ts +9 -8
  169. package/dist/storage/erstorage/RecordQuery.d.ts.map +1 -1
  170. package/dist/storage/erstorage/RecordQueryAgent.d.ts +26 -13
  171. package/dist/storage/erstorage/RecordQueryAgent.d.ts.map +1 -1
  172. package/dist/storage/erstorage/Setup.d.ts +49 -11
  173. package/dist/storage/erstorage/Setup.d.ts.map +1 -1
  174. package/dist/storage/erstorage/util.d.ts.map +1 -1
  175. package/package.json +42 -19
  176. package/README.md +0 -53
  177. package/dist/runtime/ActivityCall.d.ts.map +0 -1
  178. package/dist/runtime/ActivityCall.js +0 -379
  179. package/dist/runtime/ActivityCall.js.map +0 -1
  180. package/dist/runtime/Controller.js +0 -225
  181. package/dist/runtime/Controller.js.map +0 -1
  182. package/dist/runtime/InteractionCall.d.ts.map +0 -1
  183. package/dist/runtime/InteractionCall.js +0 -385
  184. package/dist/runtime/InteractionCall.js.map +0 -1
  185. package/dist/runtime/MonoSystem.js +0 -331
  186. package/dist/runtime/MonoSystem.js.map +0 -1
  187. package/dist/runtime/Mysql.js +0 -171
  188. package/dist/runtime/Mysql.js.map +0 -1
  189. package/dist/runtime/PostgreSQL.js +0 -172
  190. package/dist/runtime/PostgreSQL.js.map +0 -1
  191. package/dist/runtime/SQLite.js +0 -146
  192. package/dist/runtime/SQLite.js.map +0 -1
  193. package/dist/runtime/Scheduler.js +0 -457
  194. package/dist/runtime/Scheduler.js.map +0 -1
  195. package/dist/runtime/System.js +0 -90
  196. package/dist/runtime/System.js.map +0 -1
  197. package/dist/runtime/asyncInteractionContext.js +0 -3
  198. package/dist/runtime/asyncInteractionContext.js.map +0 -1
  199. package/dist/runtime/boolExpression.js +0 -43
  200. package/dist/runtime/boolExpression.js.map +0 -1
  201. package/dist/runtime/computedDataHandles/Any.d.ts +0 -52
  202. package/dist/runtime/computedDataHandles/Any.d.ts.map +0 -1
  203. package/dist/runtime/computedDataHandles/Any.js +0 -152
  204. package/dist/runtime/computedDataHandles/Any.js.map +0 -1
  205. package/dist/runtime/computedDataHandles/Computation.d.ts +0 -108
  206. package/dist/runtime/computedDataHandles/Computation.d.ts.map +0 -1
  207. package/dist/runtime/computedDataHandles/Computation.js +0 -49
  208. package/dist/runtime/computedDataHandles/Computation.js.map +0 -1
  209. package/dist/runtime/computedDataHandles/ComputedDataHandle.d.ts +0 -42
  210. package/dist/runtime/computedDataHandles/ComputedDataHandle.d.ts.map +0 -1
  211. package/dist/runtime/computedDataHandles/ComputedDataHandle.js +0 -4
  212. package/dist/runtime/computedDataHandles/ComputedDataHandle.js.map +0 -1
  213. package/dist/runtime/computedDataHandles/Count.d.ts +0 -45
  214. package/dist/runtime/computedDataHandles/Count.d.ts.map +0 -1
  215. package/dist/runtime/computedDataHandles/Count.js +0 -85
  216. package/dist/runtime/computedDataHandles/Count.js.map +0 -1
  217. package/dist/runtime/computedDataHandles/Every.d.ts +0 -56
  218. package/dist/runtime/computedDataHandles/Every.d.ts.map +0 -1
  219. package/dist/runtime/computedDataHandles/Every.js +0 -178
  220. package/dist/runtime/computedDataHandles/Every.js.map +0 -1
  221. package/dist/runtime/computedDataHandles/StateMachine.d.ts.map +0 -1
  222. package/dist/runtime/computedDataHandles/StateMachine.js +0 -180
  223. package/dist/runtime/computedDataHandles/StateMachine.js.map +0 -1
  224. package/dist/runtime/computedDataHandles/Transform.d.ts +0 -26
  225. package/dist/runtime/computedDataHandles/Transform.d.ts.map +0 -1
  226. package/dist/runtime/computedDataHandles/Transform.js +0 -106
  227. package/dist/runtime/computedDataHandles/Transform.js.map +0 -1
  228. package/dist/runtime/computedDataHandles/TransitionFinder.d.ts +0 -57
  229. package/dist/runtime/computedDataHandles/TransitionFinder.d.ts.map +0 -1
  230. package/dist/runtime/computedDataHandles/TransitionFinder.js +0 -40
  231. package/dist/runtime/computedDataHandles/TransitionFinder.js.map +0 -1
  232. package/dist/runtime/computedDataHandles/WeightedSummation.d.ts +0 -57
  233. package/dist/runtime/computedDataHandles/WeightedSummation.d.ts.map +0 -1
  234. package/dist/runtime/computedDataHandles/WeightedSummation.js +0 -146
  235. package/dist/runtime/computedDataHandles/WeightedSummation.js.map +0 -1
  236. package/dist/runtime/computedDataHandles/index.d.ts +0 -7
  237. package/dist/runtime/computedDataHandles/index.d.ts.map +0 -1
  238. package/dist/runtime/computedDataHandles/index.js +0 -7
  239. package/dist/runtime/computedDataHandles/index.js.map +0 -1
  240. package/dist/runtime/index.js +0 -15
  241. package/dist/runtime/index.js.map +0 -1
  242. package/dist/runtime/server.d.ts +0 -35
  243. package/dist/runtime/server.d.ts.map +0 -1
  244. package/dist/runtime/server.js +0 -171
  245. package/dist/runtime/server.js.map +0 -1
  246. package/dist/runtime/types/boolExpression.js +0 -6
  247. package/dist/runtime/types/boolExpression.js.map +0 -1
  248. package/dist/runtime/util.js +0 -39
  249. package/dist/runtime/util.js.map +0 -1
  250. package/dist/shared/BoolExp.js +0 -252
  251. package/dist/shared/BoolExp.js.map +0 -1
  252. package/dist/shared/activity/Activity.d.ts +0 -465
  253. package/dist/shared/activity/Activity.d.ts.map +0 -1
  254. package/dist/shared/activity/Activity.js +0 -264
  255. package/dist/shared/activity/Activity.js.map +0 -1
  256. package/dist/shared/activity/Condition.d.ts +0 -75
  257. package/dist/shared/activity/Condition.d.ts.map +0 -1
  258. package/dist/shared/activity/Condition.js +0 -51
  259. package/dist/shared/activity/Condition.js.map +0 -1
  260. package/dist/shared/activity/Data.d.ts +0 -115
  261. package/dist/shared/activity/Data.d.ts.map +0 -1
  262. package/dist/shared/activity/Data.js +0 -89
  263. package/dist/shared/activity/Data.js.map +0 -1
  264. package/dist/shared/attributive.d.ts +0 -93
  265. package/dist/shared/attributive.d.ts.map +0 -1
  266. package/dist/shared/attributive.js +0 -59
  267. package/dist/shared/attributive.js.map +0 -1
  268. package/dist/shared/computed.d.ts +0 -607
  269. package/dist/shared/computed.d.ts.map +0 -1
  270. package/dist/shared/computed.js +0 -202
  271. package/dist/shared/computed.js.map +0 -1
  272. package/dist/shared/createClass.d.ts +0 -102
  273. package/dist/shared/createClass.d.ts.map +0 -1
  274. package/dist/shared/createClass.js +0 -276
  275. package/dist/shared/createClass.js.map +0 -1
  276. package/dist/shared/dictionary/Dictionary.d.ts +0 -40
  277. package/dist/shared/dictionary/Dictionary.d.ts.map +0 -1
  278. package/dist/shared/dictionary/Dictionary.js +0 -51
  279. package/dist/shared/dictionary/Dictionary.js.map +0 -1
  280. package/dist/shared/entity/Entity.d.ts +0 -149
  281. package/dist/shared/entity/Entity.d.ts.map +0 -1
  282. package/dist/shared/entity/Entity.js +0 -226
  283. package/dist/shared/entity/Entity.js.map +0 -1
  284. package/dist/shared/index.js +0 -11
  285. package/dist/shared/index.js.map +0 -1
  286. package/dist/shared/user/User.d.ts +0 -21
  287. package/dist/shared/user/User.d.ts.map +0 -1
  288. package/dist/shared/user/User.js +0 -11
  289. package/dist/shared/user/User.js.map +0 -1
  290. package/dist/shared/utils.js +0 -19
  291. package/dist/shared/utils.js.map +0 -1
  292. package/dist/storage/erstorage/AttributeInfo.js +0 -147
  293. package/dist/storage/erstorage/AttributeInfo.js.map +0 -1
  294. package/dist/storage/erstorage/AttributeQuery.js +0 -190
  295. package/dist/storage/erstorage/AttributeQuery.js.map +0 -1
  296. package/dist/storage/erstorage/EntityQueryHandle.js +0 -78
  297. package/dist/storage/erstorage/EntityQueryHandle.js.map +0 -1
  298. package/dist/storage/erstorage/EntityToTableMap.js +0 -262
  299. package/dist/storage/erstorage/EntityToTableMap.js.map +0 -1
  300. package/dist/storage/erstorage/LinkInfo.js +0 -89
  301. package/dist/storage/erstorage/LinkInfo.js.map +0 -1
  302. package/dist/storage/erstorage/MatchExp.js +0 -211
  303. package/dist/storage/erstorage/MatchExp.js.map +0 -1
  304. package/dist/storage/erstorage/Modifier.js +0 -24
  305. package/dist/storage/erstorage/Modifier.js.map +0 -1
  306. package/dist/storage/erstorage/NewRecordData.js +0 -178
  307. package/dist/storage/erstorage/NewRecordData.js.map +0 -1
  308. package/dist/storage/erstorage/RecordInfo.js +0 -111
  309. package/dist/storage/erstorage/RecordInfo.js.map +0 -1
  310. package/dist/storage/erstorage/RecordQuery.js +0 -158
  311. package/dist/storage/erstorage/RecordQuery.js.map +0 -1
  312. package/dist/storage/erstorage/RecordQueryAgent.js +0 -1130
  313. package/dist/storage/erstorage/RecordQueryAgent.js.map +0 -1
  314. package/dist/storage/erstorage/Setup.js +0 -400
  315. package/dist/storage/erstorage/Setup.js.map +0 -1
  316. package/dist/storage/erstorage/util.js +0 -25
  317. package/dist/storage/erstorage/util.js.map +0 -1
  318. package/dist/storage/index.js +0 -13
  319. package/dist/storage/index.js.map +0 -1
  320. package/dist/storage/utils.js +0 -48
  321. package/dist/storage/utils.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sources":["../src/shared/utils.ts","../src/shared/interfaces.ts","../src/shared/Entity.ts","../src/shared/RealDictionary.ts","../src/shared/Property.ts","../src/shared/Relation.ts","../src/shared/Interaction.ts","../src/shared/Activity.ts","../src/shared/BoolExp.ts","../src/shared/Attributive.ts","../src/shared/Condition.ts","../src/shared/Data.ts","../src/shared/Action.ts","../src/shared/Gateway.ts","../src/shared/Event.ts","../src/shared/StateNode.ts","../src/shared/StateTransfer.ts","../src/shared/StateMachine.ts","../src/shared/WeightedSummation.ts","../src/shared/Count.ts","../src/shared/Summation.ts","../src/shared/Average.ts","../src/shared/Every.ts","../src/shared/Any.ts","../src/shared/Transform.ts","../src/shared/RealTime.ts","../src/shared/PayloadItem.ts","../src/shared/Payload.ts","../src/shared/SideEffect.ts","../src/shared/Conditions.ts","../src/shared/DataAttributives.ts","../src/shared/init.ts","../src/shared/Custom.ts","../src/shared/RefContainer.ts","../src/shared/User.ts","../src/runtime/System.ts","../src/runtime/util.ts","../src/storage/utils.ts","../src/storage/erstorage/AttributeInfo.ts","../src/storage/erstorage/MatchExp.ts","../src/storage/erstorage/Modifier.ts","../src/storage/erstorage/RecordQuery.ts","../src/storage/erstorage/AttributeQuery.ts","../src/storage/erstorage/util.ts","../src/storage/erstorage/NewRecordData.ts","../src/storage/erstorage/FilteredEntityManager.ts","../src/storage/erstorage/RecordQueryAgent.ts","../src/storage/erstorage/EntityQueryHandle.ts","../src/storage/erstorage/RecordInfo.ts","../src/storage/erstorage/LinkInfo.ts","../src/storage/erstorage/EntityToTableMap.ts","../src/storage/erstorage/MergedItemProcessor.ts","../src/storage/erstorage/Setup.ts","../src/runtime/errors/FrameworkError.ts","../src/runtime/errors/InteractionErrors.ts","../src/runtime/errors/ActivityErrors.ts","../src/runtime/errors/ComputationErrors.ts","../src/runtime/errors/SystemErrors.ts","../src/runtime/errors/ConditionErrors.ts","../src/runtime/activity/InteractionCall.ts","../src/runtime/activity/ActivityCall.ts","../src/runtime/asyncInteractionContext.ts","../src/runtime/activity/ActivityManager.ts","../src/runtime/computations/Computation.ts","../src/runtime/computations/TransitionFinder.ts","../src/runtime/computations/StateMachine.ts","../src/runtime/computations/WeightedSummation.ts","../src/runtime/computations/Every.ts","../src/runtime/computations/Any.ts","../src/runtime/computations/Count.ts","../src/runtime/computations/Transform.ts","../src/runtime/computations/MathResolver.ts","../src/runtime/computations/RealTime.ts","../src/runtime/computations/Summation.ts","../src/runtime/computations/Average.ts","../src/runtime/computations/Custom.ts","../src/runtime/ComputationSourceMap.ts","../src/runtime/Scheduler.ts","../src/runtime/Controller.ts","../src/runtime/SQLite.ts","../src/runtime/MonoSystem.ts","../src/runtime/PostgreSQL.ts","../src/runtime/PGLite.ts","../src/runtime/Mysql.ts"],"sourcesContent":["import type { IInstance } from \"./interfaces\";\n\n// 工具函数\nexport function isObject(obj: unknown): obj is object {\n return obj !== null && typeof obj === 'object';\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n if (!isObject(obj)) return false;\n \n // 检查原型链\n const proto = Object.getPrototypeOf(obj);\n if (proto === null) return true;\n \n // 检查是否是通过 Object 构造函数创建的\n return proto === Object.prototype || proto === null;\n}\n\n// indexBy 函数 - 将数组转换为以指定属性为键的对象\nexport function indexBy<T extends Record<string, any>>(array: T[], key: keyof T): Record<string, T> {\n const result: Record<string, T> = {};\n for (const item of array) {\n if (item && item[key] !== undefined) {\n result[String(item[key])] = item;\n }\n }\n return result;\n}\n\n// 辅助函数:序列化属性值\nexport function stringifyAttribute(obj: unknown): unknown {\n if (typeof obj === 'function') {\n return `func::${obj.toString()}`;\n } else if (Array.isArray(obj)) {\n // 数组应该原样返回,不进行特殊处理\n return obj;\n } else if (isObject(obj) && !isPlainObject(obj)) {\n return `uuid::${(obj as IInstance).uuid}`;\n } else {\n return obj;\n }\n}\n\n// 辅助函数:深度克隆\nexport function deepClone<T>(obj: T, deepCloneKlass?: boolean): T {\n if (obj === undefined || obj === null || typeof obj !== 'object') return obj;\n if (Array.isArray(obj)) return (obj as unknown[]).map(v => deepClone(v, deepCloneKlass)) as T;\n if (isPlainObject(obj)) {\n return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, deepClone(value, deepCloneKlass)])) as T;\n }\n\n if ((obj as object) instanceof Set) {\n return new Set(Array.from((obj as unknown as Set<unknown>).values()).map(v => deepClone(v, deepCloneKlass))) as T;\n }\n\n if ((obj as object) instanceof Map) {\n return new Map(Array.from((obj as unknown as Map<unknown, unknown>).entries()).map(([k, v]) => [k, deepClone(v, deepCloneKlass)])) as T;\n }\n\n // 如果是类实例\n const instance = obj as unknown as IInstance & { constructor?: { clone?: (obj: unknown, deep: boolean) => unknown } };\n if (deepCloneKlass && instance._type && instance.constructor?.clone) {\n return instance.constructor.clone(obj, deepCloneKlass) as T;\n }\n\n return obj;\n}\n\n// 清理所有实例(用于测试)\nexport function clearAllInstances(...klasses: Array<{ instances: IInstance[] }>) {\n for (const klass of klasses) {\n klass.instances.length = 0;\n }\n}\n\n// 向后兼容性支持:提供一个空的 removeAllInstance 函数\n// 在重构后的代码中,我们不再使用全局实例管理,所以这个函数不做任何事情\nexport function removeAllInstance() {\n // No-op: 在重构后的版本中,实例管理是局部的,不需要全局清理\n}\n\n// KlassByName 兼容层\n// 全局的类注册表\nexport const KlassByName = new Map<string, any>();\n\n// 注册一个重构后的类到 KlassByName\nexport function registerKlass(name: string, klassLike: any) {\n if (klassLike && klassLike.isKlass && klassLike.displayName) {\n KlassByName.set(name, klassLike);\n }\n}\n\n// 序列化所有实例\nexport function stringifyAllInstances(): string {\n const result: string[] = [];\n // 使用 Array.from 来避免迭代问题\n Array.from(KlassByName.entries()).forEach(([, Klass]) => {\n if (Klass.instances && Array.isArray(Klass.instances) && Klass.stringify) {\n result.push(...Klass.instances.map((instance: any) => Klass.stringify(instance)));\n }\n });\n return `[${result.join(',')}]`;\n}\n\n// 从字符串创建实例\nexport function createInstancesFromString(objStr: string) {\n const objects = JSON.parse(objStr);\n return createInstances(objects);\n}\n\n// 创建实例\nexport function createInstances(objects: any[]) {\n const uuidToInstance = new Map<string, any>();\n const unsatisfiedInstances = new Map<any, object>();\n \n objects.forEach(({ type, options = {}, uuid, public: rawProps }: any) => {\n const Klass = KlassByName.get(type);\n if (!Klass) {\n console.warn(`Class ${type} not found in KlassByName`);\n return;\n }\n \n const instance = Klass.create(rawProps || {}, { ...options, uuid });\n uuidToInstance.set(uuid, instance);\n });\n \n return uuidToInstance;\n}\n\n// 导出 createClass 作为空操作\nexport function createClass(meta: any): any {\n console.warn('createClass is deprecated in refactored code');\n return null;\n} ","import { uuidv7 } from 'uuidv7';\n// 基础实例接口\nexport interface IInstance {\n uuid: string;\n _type: string;\n _options?: { uuid?: string };\n}\n\n// 类需要实现的标准接口\nexport interface IKlass<TInstance extends IInstance, TCreateArgs> {\n // 静态属性\n isKlass: true;\n displayName: string;\n instances: TInstance[];\n public: Record<string, unknown>;\n \n // 静态方法\n create(args: TCreateArgs, options?: { uuid?: string }): TInstance;\n stringify(instance: TInstance): string;\n clone(instance: TInstance, deep: boolean): TInstance;\n is(obj: unknown): obj is TInstance;\n check(data: unknown): boolean;\n parse(json: string): TInstance;\n}\n\n// 序列化数据格式\nexport interface SerializedData<T> {\n type: string;\n options?: { uuid?: string };\n uuid: string;\n public: T;\n}\n\n// 基础类实现的抽象类\nexport abstract class BaseKlass<TInstance extends IInstance, TCreateArgs> {\n static isKlass = true as const;\n static instances: IInstance[] = [];\n \n // 子类需要实现的抽象属性\n static displayName: string;\n static public: Record<string, unknown>;\n \n // 通用的 create 方法实现\n static createBase<T extends IInstance>(\n instance: T,\n instances: T[]\n ): T {\n // 检查 uuid 是否重复\n const existing = instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, ${instance._type}`);\n }\n \n instances.push(instance);\n return instance;\n }\n \n // 通用的 is 方法实现\n static isBase<T extends IInstance>(obj: unknown, typeName: string): obj is T {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === typeName;\n }\n \n // 通用的 check 方法实现\n static checkBase(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n}\n\n// 生成 UUID 的辅助函数\nexport function generateUUID(options?: { uuid?: string }): string {\n return options?.uuid || uuidv7();\n}\n\n// 概念相关的类型\nexport interface Concept {\n name: string;\n [key: string]: unknown;\n}\n\nexport interface DerivedConcept extends Concept {\n base?: Concept;\n attributive?: unknown;\n}\n\nexport interface ConceptAlias extends Concept {\n for: Concept[];\n}\n\nexport type ConceptInstance = unknown;\n\n// Interaction 相关类型\nexport type InteractionInstanceType = import('./Interaction.js').InteractionInstance;\n\n// Activity 相关类型别名\nexport type ActivityInstanceType = import('./Activity.js').ActivityInstance;\nexport type ActivityGroupInstanceType = import('./Activity.js').ActivityGroupInstance;\nexport type GatewayInstanceType = import('./Gateway.js').GatewayInstance;\nexport type TransferInstanceType = import('./Activity.js').TransferInstance;\n\n// 其他常用的实例类型别名\nexport type EntityInstanceType = import('./Entity.js').EntityInstance;\nexport type RelationInstanceType = import('./Relation.js').RelationInstance;\nexport type PropertyInstanceType = import('./Property.js').PropertyInstance;\nexport type AttributiveInstanceType = import('./Attributive.js').AttributiveInstance;\nexport type ConditionInstanceType = import('./Condition.js').ConditionInstance; ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { PropertyInstance } from './Property.js';\nimport type { ComputationInstance } from './types.js';\nimport type { RelationInstance } from './Relation.js';\n\nconst validNameFormatExp = /^[a-zA-Z0-9_]+$/;\n\nexport interface EntityInstance extends IInstance {\n name: string;\n properties: PropertyInstance[];\n computation?: ComputationInstance;\n baseEntity?: EntityInstance | RelationInstance; // for Filtered Entity\n matchExpression?: object; // for Filtered Entity\n inputEntities?: EntityInstance[]; // for Merged Entity\n}\n\nexport interface EntityCreateArgs {\n name: string;\n properties?: PropertyInstance[];\n computation?: ComputationInstance;\n baseEntity?: EntityInstance | RelationInstance;\n matchExpression?: object;\n inputEntities?: EntityInstance[]; // for Merged Entity\n}\n\nexport class Entity implements EntityInstance {\n public uuid: string;\n public _type = 'Entity';\n public _options?: { uuid?: string };\n public name: string;\n public properties: PropertyInstance[];\n public computation?: ComputationInstance;\n public baseEntity?: EntityInstance | RelationInstance;\n public matchExpression?: object;\n public inputEntities?: EntityInstance[]; // for Merged Entity\n \n constructor(args: EntityCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.properties = args.properties || [];\n this.computation = args.computation;\n this.baseEntity = args.baseEntity;\n this.matchExpression = args.matchExpression;\n this.inputEntities = args.inputEntities;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Entity';\n static instances: EntityInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n constraints: {\n nameFormat: ({name}: { name: string }) => {\n return validNameFormatExp.test(name);\n }\n }\n },\n properties: {\n type: 'Property' as const,\n collection: true as const,\n required: true as const,\n constraints: {\n eachNameUnique: ({properties}: {properties: PropertyInstance[]}) => {\n const uniqueNames = new Set(properties.map((p: PropertyInstance) => p.name));\n return uniqueNames.size === properties.length;\n }\n },\n defaultValue: () => []\n },\n computation: {\n type: [] as const,\n collection: false as const,\n required: false as const,\n },\n baseEntity: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: false as const,\n },\n matchExpression: {\n type: 'object' as const,\n collection: false as const,\n required: false as const,\n },\n inputEntities: {\n type: 'Entity' as const,\n collection: true as const,\n required: false as const,\n constraints: {\n mergedEntityNoProperties: ({properties, inputEntities}: {properties: PropertyInstance[], inputEntities?: EntityInstance[]}) => {\n // Merged entity should not have any properties defined\n if (inputEntities && inputEntities.length > 0 && properties && properties.length > 0) {\n return false;\n }\n return true;\n }\n }\n }\n };\n \n static create(args: EntityCreateArgs, options?: { uuid?: string }): EntityInstance {\n const instance = new Entity(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Entity`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: EntityInstance): string {\n const args: EntityCreateArgs = {\n name: instance.name,\n properties: instance.properties,\n computation: instance.computation,\n baseEntity: instance.baseEntity,\n matchExpression: instance.matchExpression,\n inputEntities: instance.inputEntities\n };\n \n const data: SerializedData<EntityCreateArgs> = {\n type: 'Entity',\n options: { uuid: instance.uuid },\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: EntityInstance, deep: boolean): EntityInstance {\n const args: EntityCreateArgs = {\n name: instance.name,\n properties: [...instance.properties],\n computation: instance.computation,\n baseEntity: instance.baseEntity,\n matchExpression: instance.matchExpression,\n inputEntities: instance.inputEntities\n };\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is EntityInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Entity';\n }\n \n static check(data: unknown): boolean {\n if (data === null || typeof data !== 'object') return false;\n \n // 如果是完整的 Entity 实例\n if ('_type' in data && (data as IInstance)._type === 'Entity') {\n return true;\n }\n \n // 如果是实体引用(有 id 属性)\n if ('id' in data) {\n return true;\n }\n \n // 如果是新创建的实体数据(至少有一些属性)\n if (Object.keys(data).length > 0) {\n return true;\n }\n \n return false;\n }\n \n static parse(json: string): EntityInstance {\n const data: SerializedData<EntityCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport type { ComputationInstance } from './types.js';\n\nexport enum PropertyTypes {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Timestamp = 'timestamp',\n}\n\nconst validNameFormatExp = /^[a-zA-Z0-9_]+$/;\n\nexport interface DictionaryInstance extends IInstance {\n name: string;\n type: string;\n collection: boolean;\n args?: object;\n defaultValue?: Function;\n computation?: ComputationInstance;\n}\n\nexport interface DictionaryCreateArgs {\n name: string;\n type: string;\n collection?: boolean;\n args?: object;\n defaultValue?: Function;\n computation?: ComputationInstance;\n}\n\nexport class Dictionary implements DictionaryInstance {\n public uuid: string;\n public _type = 'Dictionary';\n public _options?: { uuid?: string };\n public name: string;\n public type: string;\n public collection: boolean;\n public args?: object;\n public defaultValue?: Function;\n public computation?: ComputationInstance;\n \n constructor(args: DictionaryCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.type = args.type;\n this.collection = args.collection ?? false;\n this.args = args.args;\n this.defaultValue = args.defaultValue;\n this.computation = args.computation;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Dictionary';\n static instances: DictionaryInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n constraints: {\n format: ({name}: { name: string }) => {\n return validNameFormatExp.test(name);\n },\n length: ({name}: { name: string }) => {\n return name.length > 1 && name.length < 5;\n }\n }\n },\n type: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n options: Array.from(Object.values(PropertyTypes)),\n },\n collection: {\n type: 'boolean' as const,\n required: true as const,\n collection: false as const,\n defaultValue: () => false\n },\n args: {\n type: 'object' as const,\n required: false as const,\n collection: false as const,\n },\n defaultValue: {\n type: 'function' as const,\n required: false as const,\n collection: false as const,\n },\n computation: {\n collection: false as const,\n type: [] as const,\n required: false as const,\n }\n };\n \n static create(args: DictionaryCreateArgs, options?: { uuid?: string }): DictionaryInstance {\n const instance = new Dictionary(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Dictionary`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: DictionaryInstance): string {\n const args: DictionaryCreateArgs = {\n name: instance.name,\n type: instance.type,\n collection: instance.collection\n };\n if (instance.args !== undefined) args.args = instance.args;\n if (instance.defaultValue !== undefined) args.defaultValue = instance.defaultValue;\n if (instance.computation !== undefined) args.computation = instance.computation;\n \n const data: SerializedData<DictionaryCreateArgs> = {\n type: 'Dictionary',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: DictionaryInstance, deep: boolean): DictionaryInstance {\n const args: DictionaryCreateArgs = {\n name: instance.name,\n type: instance.type,\n collection: instance.collection\n };\n if (instance.args !== undefined) args.args = instance.args;\n if (instance.defaultValue !== undefined) args.defaultValue = instance.defaultValue;\n if (instance.computation !== undefined) args.computation = instance.computation;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is DictionaryInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Dictionary';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): DictionaryInstance {\n const data: SerializedData<DictionaryCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { PropertyTypes } from './RealDictionary.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { ComputationInstance } from './types.js';\n\nconst validNameFormatExp = /^[a-zA-Z0-9_]+$/;\n\nexport interface PropertyInstance extends IInstance {\n name: string;\n type: string;\n collection?: boolean;\n defaultValue?: Function;\n computed?: Function;\n computation?: ComputationInstance;\n}\n\nexport interface PropertyCreateArgs {\n name: string;\n type: string;\n collection?: boolean;\n defaultValue?: Function;\n computed?: Function;\n computation?: ComputationInstance;\n}\n\nexport class Property implements PropertyInstance {\n public uuid: string;\n public _type = 'Property';\n public _options?: { uuid?: string };\n public name: string;\n public type: string;\n public collection?: boolean;\n public defaultValue?: Function;\n public computed?: Function;\n public computation?: ComputationInstance;\n \n constructor(args: PropertyCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.type = args.type;\n this.collection = args.collection;\n this.defaultValue = args.defaultValue;\n this.computed = args.computed;\n this.computation = args.computation;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Property';\n static instances: PropertyInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n constraints: {\n format: ({name}: { name: string }) => {\n return validNameFormatExp.test(name);\n },\n length: ({name}: { name: string }) => {\n return name.length > 1 && name.length < 5;\n }\n }\n },\n type: {\n type: 'string' as const,\n required: true as const,\n options: () => Object.values(PropertyTypes)\n },\n collection: {\n type: 'boolean' as const,\n required: false as const\n },\n defaultValue: {\n type: 'function' as const,\n required: false as const\n },\n computed: {\n type: 'function' as const,\n required: false as const\n },\n computation: {\n type: [] as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: PropertyCreateArgs, options?: { uuid?: string }): PropertyInstance {\n const instance = new Property(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Property`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: PropertyInstance): string {\n const args: PropertyCreateArgs = {\n name: instance.name,\n type: instance.type,\n collection: instance.collection,\n \n \n defaultValue: instance.defaultValue ? stringifyAttribute(instance.defaultValue) as Function : undefined,\n computed: instance.computed || undefined\n };\n \n const data: SerializedData<PropertyCreateArgs> = {\n type: 'Property',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: PropertyInstance, deep: boolean): PropertyInstance {\n const args: PropertyCreateArgs = {\n name: instance.name,\n type: instance.type\n };\n if (instance.collection !== undefined) args.collection = instance.collection;\n if (instance.defaultValue !== undefined) args.defaultValue = instance.defaultValue;\n if (instance.computed !== undefined) args.computed = instance.computed;\n if (instance.computation !== undefined) args.computation = instance.computation;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is PropertyInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Property';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): PropertyInstance {\n const data: SerializedData<PropertyCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.defaultValue && typeof args.defaultValue === 'string' && (args.defaultValue as any).startsWith('func::')) {\n args.defaultValue = new Function('return ' + (args.defaultValue as any).substring(6))();\n }\n if (args.computed && typeof args.computed === 'string' && (args.computed as any).startsWith('func::')) {\n args.computed = new Function('return ' + (args.computed as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { PropertyInstance, Property } from './Property.js';\nimport { EntityInstance } from './Entity.js';\nimport type { ComputationInstance } from './types.js';\n\nexport interface RelationInstance extends IInstance {\n name?: string;\n source: EntityInstance | RelationInstance;\n sourceProperty: string;\n target: EntityInstance | RelationInstance;\n targetProperty: string;\n isTargetReliance: boolean;\n type: string; // '1:1', '1:n', 'n:1', 'n:n'\n computation?: ComputationInstance;\n properties: PropertyInstance[];\n baseRelation?: RelationInstance; // for Filtered Relation\n matchExpression?: object; // for Filtered Relation\n inputRelations?: RelationInstance[]; // for Merged Relation\n}\n\nexport interface RelationCreateArgs {\n name?: string;\n source?: EntityInstance | RelationInstance;\n sourceProperty?: string;\n target?: EntityInstance | RelationInstance;\n targetProperty?: string;\n isTargetReliance?: boolean;\n type?: string;\n computation?: ComputationInstance;\n properties?: PropertyInstance[];\n baseRelation?: RelationInstance;\n matchExpression?: object;\n inputRelations?: RelationInstance[]; // for Merged Relation\n}\n\nexport class Relation implements RelationInstance {\n public uuid: string;\n public _type = 'Relation';\n public _options?: { uuid?: string };\n private _name?: string;\n public source: EntityInstance | RelationInstance;\n public sourceProperty: string;\n public target: EntityInstance | RelationInstance;\n public targetProperty: string;\n public isTargetReliance: boolean;\n public type: string;\n public computation?: ComputationInstance;\n public properties: PropertyInstance[];\n public baseRelation?: RelationInstance;\n public matchExpression?: object;\n public inputRelations?: RelationInstance[]; // for Merged Relation\n \n // Getter for name that returns computed name if _name is undefined\n get name(): string | undefined {\n if (this._name !== undefined) {\n return this._name;\n }\n // Use computed name if available\n return Relation.public.name.computed ? Relation.public.name.computed(this) : undefined;\n }\n \n // Setter for name\n set name(value: string | undefined) {\n this._name = value;\n }\n \n constructor(args: RelationCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n \n // For merged relation\n if (args.inputRelations) {\n // Validate inputRelations\n if (!args.inputRelations || args.inputRelations.length === 0) {\n throw new Error('Merged relation must have at least one inputRelation');\n }\n \n // Merged relation must have sourceProperty and targetProperty\n if (!args.sourceProperty || !args.targetProperty) {\n throw new Error('Merged relation must have sourceProperty and targetProperty');\n }\n \n // Merged relation cannot specify source/target\n if (args.source || args.target) {\n throw new Error('Merged relation cannot specify source or target, they are inherited from inputRelations');\n }\n \n // All input relations must have the same source and target\n const firstRelation = args.inputRelations[0];\n for (let i = 1; i < args.inputRelations.length; i++) {\n const relation = args.inputRelations[i];\n if (relation.source !== firstRelation.source) {\n throw new Error('All inputRelations must have the same source');\n }\n if (relation.target !== firstRelation.target) {\n throw new Error('All inputRelations must have the same target');\n }\n }\n \n this.inputRelations = args.inputRelations;\n this.source = firstRelation.source;\n this.target = firstRelation.target;\n this.sourceProperty = args.sourceProperty;\n this.targetProperty = args.targetProperty;\n this.type = firstRelation.type; // Inherit type from first input relation\n this.isTargetReliance = firstRelation.isTargetReliance;\n this._name = args.name;\n }\n // For filtered relation, inherit from baseRelation\n else if (args.baseRelation) {\n // Filtered relation must have sourceProperty and targetProperty\n if (!args.sourceProperty || !args.targetProperty) {\n throw new Error('Filtered relation must have sourceProperty and targetProperty');\n }\n \n this.baseRelation = args.baseRelation;\n this.matchExpression = args.matchExpression;\n this.source = args.baseRelation.source;\n this.sourceProperty = args.sourceProperty;\n this.target = args.baseRelation.target;\n this.targetProperty = args.targetProperty;\n this.isTargetReliance = args.baseRelation.isTargetReliance;\n this.type = args.baseRelation.type;\n this._name = args.name; // name is optional for filtered relation\n } else {\n // Normal relation, require all fields\n if (!args.source || !args.sourceProperty || !args.target || !args.targetProperty || !args.type) {\n throw new Error('Relation requires source, sourceProperty, target, targetProperty, and type');\n }\n \n this.source = args.source;\n this.sourceProperty = args.sourceProperty;\n this.target = args.target;\n this.targetProperty = args.targetProperty;\n this.type = args.type;\n // Use provided name or leave undefined (will use computed name)\n this._name = args.name;\n }\n \n // Common fields\n this.isTargetReliance = args.isTargetReliance ?? false;\n this.computation = args.computation;\n this.properties = args.properties || [];\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Relation';\n static instances: RelationInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: false as const,\n collection: false as const,\n computed: (relation: RelationInstance) => {\n if (relation.source && relation.target) {\n return `${relation.source.name}_${relation.sourceProperty}_${relation.targetProperty}_${relation.target.name}`;\n }\n return '';\n }\n },\n source: {\n type: ['Entity', 'Relation'] as const,\n required: true as const,\n collection: false as const,\n },\n sourceProperty: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n },\n target: {\n type: ['Entity', 'Relation'] as const,\n required: true as const,\n collection: false as const,\n },\n targetProperty: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n },\n isTargetReliance: {\n type: 'boolean' as const,\n required: true as const,\n collection: false as const,\n defaultValue: () => false\n },\n type: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n },\n computation: {\n type: [] as const,\n collection: false as const,\n required: false as const,\n },\n properties: {\n type: 'Property' as const,\n collection: true as const,\n required: true as const,\n constraints: {\n eachNameUnique: (thisInstance: RelationInstance) => {\n const uniqueNames = new Set(thisInstance.properties.map((p: PropertyInstance) => p.name));\n return uniqueNames.size === thisInstance.properties.length;\n }\n },\n defaultValue: () => []\n },\n baseRelation: {\n type: 'Relation' as const,\n collection: false as const,\n required: false as const,\n },\n matchExpression: {\n type: 'object' as const,\n collection: false as const,\n required: false as const,\n },\n inputRelations: {\n type: 'Relation' as const,\n collection: true as const,\n required: false as const,\n constraints: {\n mergedRelationNoProperties: (thisInstance: RelationInstance) => {\n // Merged relation should not have any properties defined\n if (thisInstance.inputRelations && thisInstance.inputRelations.length > 0 && thisInstance.properties && thisInstance.properties.length > 0) {\n return false;\n }\n return true;\n },\n sameSourceTarget: (thisInstance: RelationInstance) => {\n // All input relations must have the same source and target\n if (thisInstance.inputRelations && thisInstance.inputRelations.length > 1) {\n const firstRelation = thisInstance.inputRelations[0];\n for (let i = 1; i < thisInstance.inputRelations.length; i++) {\n const relation = thisInstance.inputRelations[i];\n if (relation.source !== firstRelation.source || relation.target !== firstRelation.target) {\n return false;\n }\n }\n }\n return true;\n }\n }\n }\n };\n \n static create(args: RelationCreateArgs, options?: { uuid?: string }): RelationInstance {\n const instance = new Relation(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Relation`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: RelationInstance): string {\n const args: RelationCreateArgs = {\n sourceProperty: instance.sourceProperty,\n targetProperty: instance.targetProperty,\n isTargetReliance: instance.isTargetReliance,\n type: instance.type,\n properties: instance.properties\n };\n \n // Only include source and target if not a merged relation\n if (!instance.inputRelations) {\n args.source = instance.source;\n args.target = instance.target;\n }\n \n // Use the private _name field if the instance is a Relation class instance\n const name = (instance as any)._name ?? instance.name;\n if (name !== undefined) args.name = name;\n \n if (instance.computation !== undefined) args.computation = instance.computation;\n if (instance.baseRelation !== undefined) args.baseRelation = instance.baseRelation;\n if (instance.matchExpression !== undefined) args.matchExpression = instance.matchExpression;\n if (instance.inputRelations !== undefined) args.inputRelations = instance.inputRelations;\n \n const data: SerializedData<RelationCreateArgs> = {\n type: 'Relation',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n \n return JSON.stringify(data);\n }\n \n static clone(instance: RelationInstance, deep = false): RelationInstance {\n const args: RelationCreateArgs = {\n sourceProperty: instance.sourceProperty,\n targetProperty: instance.targetProperty,\n isTargetReliance: instance.isTargetReliance,\n type: instance.type,\n properties: instance.properties?.map(p => Property.clone(p, deep))\n };\n \n // Only include source and target if not a merged relation\n if (!instance.inputRelations) {\n args.source = instance.source;\n args.target = instance.target;\n }\n \n // Use the private _name field if the instance is a Relation class instance\n const name = (instance as any)._name ?? instance.name;\n if (name !== undefined) args.name = name;\n \n if (instance.computation !== undefined) args.computation = instance.computation; // Note: This is a reference, not a deep clone\n if (instance.baseRelation !== undefined) args.baseRelation = instance.baseRelation;\n if (instance.matchExpression !== undefined) args.matchExpression = instance.matchExpression;\n if (instance.inputRelations !== undefined) args.inputRelations = instance.inputRelations;\n \n return new Relation(args, instance._options);\n }\n \n static is(obj: unknown): obj is RelationInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Relation';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): RelationInstance {\n const data: SerializedData<RelationCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { ActionInstance } from './Action.js';\nimport { ConditionInstance } from './Condition.js';\nimport { ConditionsInstance } from './Conditions.js';\nimport { AttributiveInstance, AttributivesInstance } from './Attributive.js';\nimport { PayloadInstance } from './Payload.js';\nimport { SideEffectInstance } from './SideEffect.js';\nimport { EntityInstance } from './Entity.js';\nimport { RelationInstance } from './Relation.js';\nimport { QueryInstance } from './Data.js';\n\nexport interface InteractionInstance extends IInstance {\n name: string;\n conditions?: ConditionsInstance | ConditionInstance;\n userAttributives?: AttributivesInstance | AttributiveInstance;\n userRef?: AttributiveInstance;\n action: ActionInstance;\n payload?: PayloadInstance;\n sideEffects?: SideEffectInstance[];\n data?: EntityInstance | RelationInstance;\n query?: QueryInstance;\n}\n\nexport interface InteractionCreateArgs {\n name: string;\n conditions?: ConditionsInstance | ConditionInstance;\n userAttributives?: AttributivesInstance | AttributiveInstance;\n userRef?: AttributiveInstance;\n action: ActionInstance;\n payload?: PayloadInstance;\n sideEffects?: SideEffectInstance[];\n data?: EntityInstance | RelationInstance;\n query?: QueryInstance;\n}\n\nexport class Interaction implements InteractionInstance {\n public uuid: string;\n public _type = 'Interaction';\n public _options?: { uuid?: string };\n public name: string;\n public conditions?: ConditionsInstance | ConditionInstance;\n public userAttributives?: AttributivesInstance | AttributiveInstance;\n public userRef?: AttributiveInstance;\n public action: ActionInstance;\n public payload?: PayloadInstance;\n public sideEffects: SideEffectInstance[];\n public data?: EntityInstance | RelationInstance;\n public query?: QueryInstance;\n \n constructor(args: InteractionCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.conditions = args.conditions;\n this.userAttributives = args.userAttributives;\n this.userRef = args.userRef;\n this.action = args.action;\n this.payload = args.payload;\n this.sideEffects = args.sideEffects || [];\n this.data = args.data;\n this.query = args.query;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Interaction';\n static instances: InteractionInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n collection: false as const,\n required: true as const\n },\n conditions: {\n type: ['Conditions', 'Condition'] as const,\n required: false as const,\n collection: false as const,\n },\n userAttributives: {\n type: ['Attributives', 'Attributive'] as const,\n required: false as const,\n collection: false as const,\n },\n userRef: {\n type: 'Attributive' as const,\n collection: false as const,\n },\n action: {\n type: 'Action' as const,\n collection: false as const,\n required: true as const\n },\n payload: {\n type: 'Payload' as const,\n collection: false as const,\n },\n sideEffects: {\n type: 'SideEffect' as const,\n collection: true as const,\n defaultValue: () => []\n },\n data: {\n type: ['Entity', 'Relation'] as const,\n required: false as const,\n collection: false as const\n },\n query: {\n type: 'Query' as const,\n required: false as const,\n collection: false as const\n }\n };\n \n static create(args: InteractionCreateArgs, options?: { uuid?: string }): InteractionInstance {\n const instance = new Interaction(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Interaction`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: InteractionInstance): string {\n const args: InteractionCreateArgs = {\n name: instance.name,\n action: instance.action\n };\n if (instance.conditions !== undefined) args.conditions = instance.conditions;\n if (instance.userAttributives !== undefined) args.userAttributives = instance.userAttributives;\n if (instance.userRef !== undefined) args.userRef = instance.userRef;\n if (instance.payload !== undefined) args.payload = instance.payload;\n if (instance.sideEffects && instance.sideEffects.length > 0) args.sideEffects = instance.sideEffects;\n\n if (instance.data !== undefined) args.data = instance.data;\n if (instance.query !== undefined) args.query = instance.query;\n \n const data: SerializedData<InteractionCreateArgs> = {\n type: 'Interaction',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: InteractionInstance, deep: boolean): InteractionInstance {\n const args: InteractionCreateArgs = {\n name: instance.name,\n action: instance.action\n };\n if (instance.conditions !== undefined) args.conditions = instance.conditions;\n if (instance.userAttributives !== undefined) args.userAttributives = instance.userAttributives;\n if (instance.userRef !== undefined) args.userRef = instance.userRef;\n if (instance.payload !== undefined) args.payload = instance.payload;\n if (instance.sideEffects && instance.sideEffects.length > 0) args.sideEffects = instance.sideEffects;\n\n if (instance.data !== undefined) args.data = instance.data;\n if (instance.query !== undefined) args.query = instance.query;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is InteractionInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Interaction';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): InteractionInstance {\n const data: SerializedData<InteractionCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport { InteractionInstance } from './Interaction.js';\nimport { GatewayInstance } from './Gateway.js';\nimport { EventInstance } from './Event.js';\n\n// Forward declarations for circular dependencies\nexport interface ActivityInstance extends IInstance {\n name: string;\n interactions: InteractionInstance[];\n gateways: GatewayInstance[];\n transfers: TransferInstance[];\n groups: ActivityGroupInstance[];\n events: EventInstance[];\n}\n\nexport interface ActivityGroupInstance extends IInstance {\n type: string;\n activities?: ActivityInstance[];\n}\n\nexport interface TransferInstance extends IInstance {\n name: string;\n source: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n target: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n}\n\n// Create args interfaces\nexport interface ActivityCreateArgs {\n name: string;\n interactions?: InteractionInstance[];\n gateways?: GatewayInstance[];\n transfers?: TransferInstance[];\n groups?: ActivityGroupInstance[];\n events?: EventInstance[];\n}\n\nexport interface ActivityGroupCreateArgs {\n type: string;\n activities?: ActivityInstance[];\n}\n\nexport interface TransferCreateArgs {\n name: string;\n source: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n target: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n}\n\n// Classes\nexport class Activity implements ActivityInstance {\n public uuid: string;\n public _type = 'Activity';\n public _options?: { uuid?: string };\n public name: string;\n public interactions: InteractionInstance[];\n public gateways: GatewayInstance[];\n public transfers: TransferInstance[];\n public groups: ActivityGroupInstance[];\n public events: EventInstance[];\n \n constructor(args: ActivityCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.interactions = args.interactions || [];\n this.gateways = args.gateways || [];\n this.transfers = args.transfers || [];\n this.groups = args.groups || [];\n this.events = args.events || [];\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Activity';\n static instances: ActivityInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n collection: false as const,\n required: true as const\n },\n interactions: {\n type: 'Interaction' as const,\n collection: true as const,\n defaultValue: () => []\n },\n gateways: {\n type: 'Gateway' as const,\n collection: true as const,\n defaultValue: () => []\n },\n transfers: {\n type: 'Transfer' as const,\n collection: true as const,\n defaultValue: () => []\n },\n groups: {\n type: 'ActivityGroup' as const,\n collection: true as const,\n defaultValue: () => []\n },\n events: {\n type: 'Event' as const,\n collection: true as const,\n defaultValue: () => []\n }\n };\n \n static create(args: ActivityCreateArgs, options?: { uuid?: string }): ActivityInstance {\n const instance = new Activity(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Activity`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: ActivityInstance): string {\n const args: ActivityCreateArgs = {\n name: instance.name,\n interactions: instance.interactions.length > 0 ? instance.interactions.map(i => stringifyAttribute(i) as InteractionInstance) : undefined,\n gateways: instance.gateways.length > 0 ? instance.gateways.map(g => stringifyAttribute(g) as GatewayInstance) : undefined,\n transfers: instance.transfers.length > 0 ? instance.transfers.map(t => stringifyAttribute(t) as TransferInstance) : undefined,\n groups: instance.groups.length > 0 ? instance.groups.map(g => stringifyAttribute(g) as ActivityGroupInstance) : undefined,\n events: instance.events.length > 0 ? instance.events.map(e => stringifyAttribute(e) as EventInstance) : undefined\n };\n \n const data: SerializedData<ActivityCreateArgs> = {\n type: 'Activity',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: ActivityInstance, deep: boolean): ActivityInstance {\n const args: ActivityCreateArgs = {\n name: instance.name\n };\n if (instance.interactions && instance.interactions.length > 0) args.interactions = instance.interactions;\n if (instance.gateways && instance.gateways.length > 0) args.gateways = instance.gateways;\n if (instance.transfers && instance.transfers.length > 0) args.transfers = instance.transfers;\n if (instance.groups && instance.groups.length > 0) args.groups = instance.groups;\n if (instance.events && instance.events.length > 0) args.events = instance.events;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is ActivityInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Activity';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): ActivityInstance {\n const data: SerializedData<ActivityCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\nexport class ActivityGroup implements ActivityGroupInstance {\n public uuid: string;\n public _type = 'ActivityGroup';\n public _options?: { uuid?: string };\n public type: string;\n public activities?: ActivityInstance[];\n \n constructor(args: ActivityGroupCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.type = args.type;\n this.activities = args.activities || [];\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'ActivityGroup';\n static instances: ActivityGroupInstance[] = [];\n \n static public = {\n type: {\n type: 'string' as const,\n required: true as const,\n collection: false as const\n },\n activities: {\n instanceType: {} as unknown as ActivityInstance,\n collection: true as const,\n required: false as const,\n defaultValue: () => []\n }\n };\n \n static create(args: ActivityGroupCreateArgs, options?: { uuid?: string }): ActivityGroupInstance {\n const instance = new ActivityGroup(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, ActivityGroup`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: ActivityGroupInstance): string {\n const args: ActivityGroupCreateArgs = {\n type: instance.type,\n activities: instance.activities && instance.activities.length > 0 \n ? instance.activities.map(a => stringifyAttribute(a) as ActivityInstance)\n : undefined\n };\n \n const data: SerializedData<ActivityGroupCreateArgs> = {\n type: 'ActivityGroup',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: ActivityGroupInstance, deep: boolean): ActivityGroupInstance {\n const args: ActivityGroupCreateArgs = {\n type: instance.type\n };\n if (instance.activities && instance.activities.length > 0) args.activities = instance.activities;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is ActivityGroupInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'ActivityGroup';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): ActivityGroupInstance {\n const data: SerializedData<ActivityGroupCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\nexport class Transfer implements TransferInstance {\n public uuid: string;\n public _type = 'Transfer';\n public _options?: { uuid?: string };\n public name: string;\n public source: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n public target: InteractionInstance | ActivityGroupInstance | GatewayInstance;\n \n constructor(args: TransferCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.source = args.source;\n this.target = args.target;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Transfer';\n static instances: TransferInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n collection: false as const\n },\n source: {\n type: ['Interaction', 'ActivityGroup', 'Gateway'] as const,\n required: true as const,\n collection: false as const\n },\n target: {\n type: ['Interaction', 'ActivityGroup', 'Gateway'] as const,\n required: true as const,\n collection: false as const\n }\n };\n \n static create(args: TransferCreateArgs, options?: { uuid?: string }): TransferInstance {\n const instance = new Transfer(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Transfer`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: TransferInstance): string {\n const data: SerializedData<TransferCreateArgs> = {\n type: 'Transfer',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n name: instance.name,\n source: stringifyAttribute(instance.source) as InteractionInstance | ActivityGroupInstance | GatewayInstance,\n target: stringifyAttribute(instance.target) as InteractionInstance | ActivityGroupInstance | GatewayInstance\n }\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: TransferInstance, deep: boolean): TransferInstance {\n return this.create({\n name: instance.name,\n source: instance.source,\n target: instance.target\n });\n }\n \n static is(obj: unknown): obj is TransferInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Transfer';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): TransferInstance {\n const data: SerializedData<TransferCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// Helper functions\nexport function forEachInteraction(\n activity: ActivityInstance, \n handle: (i: InteractionInstance, g?: ActivityGroupInstance) => void, \n parentGroup?: ActivityGroupInstance\n) {\n activity.interactions.forEach(i => handle(i, parentGroup));\n activity.groups.forEach(group => {\n group.activities?.forEach(sub => forEachInteraction(sub, handle, group));\n });\n}\n\nexport function getInteractions(activity: ActivityInstance): InteractionInstance[] {\n const result: InteractionInstance[] = [];\n forEachInteraction(activity, (i) => result.push(i));\n return result;\n}\n\nexport function findRootActivity(interaction: InteractionInstance): ActivityInstance | null {\n // TODO: Implement this function if needed\n return null;\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute, indexBy } from './utils.js';\nimport { parse as parseStr } from 'acorn';\n\n// BoolAtomData\nexport interface BoolAtomDataInstance extends IInstance {\n type: string;\n data: { content?: Function; [key: string]: unknown };\n}\n\nexport interface BoolAtomDataCreateArgs {\n type?: string;\n data: { content?: Function; [key: string]: unknown };\n}\n\nexport class BoolAtomData implements BoolAtomDataInstance {\n public uuid: string;\n public _type = 'BoolAtomData';\n public _options?: { uuid?: string };\n public type: string;\n public data: { content?: Function; [key: string]: unknown };\n \n constructor(args: BoolAtomDataCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.type = args.type || 'atom';\n this.data = args.data;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'BoolAtomData';\n static instances: BoolAtomDataInstance[] = [];\n \n static public = {\n type: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n defaultValue: () => 'atom'\n },\n data: {\n instanceType: {} as unknown as { content?: Function; [key: string]: unknown },\n required: true as const,\n collection: false as const,\n }\n };\n \n static create(args: BoolAtomDataCreateArgs, options?: { uuid?: string }): BoolAtomDataInstance {\n const instance = new BoolAtomData(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, BoolAtomData`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: BoolAtomDataInstance): string {\n const args: BoolAtomDataCreateArgs = {\n type: instance.type,\n data: stringifyAttribute(instance.data) as { content?: Function; [key: string]: unknown }\n };\n \n const data: SerializedData<BoolAtomDataCreateArgs> = {\n type: 'BoolAtomData',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: BoolAtomDataInstance, deep: boolean): BoolAtomDataInstance {\n const args: BoolAtomDataCreateArgs = {\n data: instance.data\n };\n if (instance.type !== 'atom') args.type = instance.type;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is BoolAtomDataInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'BoolAtomData';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): BoolAtomDataInstance {\n const data: SerializedData<BoolAtomDataCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// BoolExpressionData\nexport interface BoolExpressionDataInstance extends IInstance {\n type: string;\n operator: 'and' | 'or' | 'not';\n left: BoolAtomDataInstance | BoolExpressionDataInstance;\n right?: BoolAtomDataInstance | BoolExpressionDataInstance;\n}\n\nexport interface BoolExpressionDataCreateArgs {\n type?: string;\n operator?: 'and' | 'or' | 'not';\n left: BoolAtomDataInstance | BoolExpressionDataInstance;\n right?: BoolAtomDataInstance | BoolExpressionDataInstance;\n}\n\nexport class BoolExpressionData implements BoolExpressionDataInstance {\n public uuid: string;\n public _type = 'BoolExpressionData';\n public _options?: { uuid?: string };\n public type: string;\n public operator: 'and' | 'or' | 'not';\n public left: BoolAtomDataInstance | BoolExpressionDataInstance;\n public right?: BoolAtomDataInstance | BoolExpressionDataInstance;\n \n constructor(args: BoolExpressionDataCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.type = args.type || 'expression';\n this.operator = args.operator || 'and';\n this.left = args.left;\n this.right = args.right;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'BoolExpressionData';\n static instances: BoolExpressionDataInstance[] = [];\n \n static public = {\n type: {\n type: 'string' as const,\n required: false as const,\n collection: false as const,\n defaultValue: () => 'expression'\n },\n operator: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n options: ['and', 'or', 'not'],\n defaultValue: () => 'and'\n },\n left: {\n instanceType: {} as unknown as { content?: Function; [key: string]: unknown },\n required: true as const,\n collection: false as const,\n },\n right: {\n instanceType: {} as unknown as { content?: Function; [key: string]: unknown },\n required: false as const,\n collection: false as const,\n }\n };\n \n static create(args: BoolExpressionDataCreateArgs, options?: { uuid?: string }): BoolExpressionDataInstance {\n const instance = new BoolExpressionData(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, BoolExpressionData`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: BoolExpressionDataInstance): string {\n const args: BoolExpressionDataCreateArgs = {\n type: instance.type,\n operator: instance.operator,\n left: stringifyAttribute(instance.left) as BoolAtomDataInstance | BoolExpressionDataInstance,\n right: instance.right ? stringifyAttribute(instance.right) as BoolAtomDataInstance | BoolExpressionDataInstance : undefined\n };\n \n const data: SerializedData<BoolExpressionDataCreateArgs> = {\n type: 'BoolExpressionData',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: BoolExpressionDataInstance, deep: boolean): BoolExpressionDataInstance {\n const args: BoolExpressionDataCreateArgs = {\n left: instance.left\n };\n if (instance.type !== 'expression') args.type = instance.type;\n if (instance.operator !== 'and') args.operator = instance.operator;\n if (instance.right !== undefined) args.right = instance.right;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is BoolExpressionDataInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'BoolExpressionData';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): BoolExpressionDataInstance {\n const data: SerializedData<BoolExpressionDataCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// 兼容性类 - 提供原始的 BoolExp API\nexport type AtomData<T> = {\n type: 'atom',\n data: T\n}\n\nexport type BoolExpressionRawData<T> = {\n type: 'expression',\n operator: 'and'|'not'|'or',\n left: ExpressionData<T>\n right? : ExpressionData<T>\n}\n\nexport type EvaluateError<T> = {\n data:T,\n stack: ExpressionData<T>[],\n error: any,\n inverse: boolean\n}\n\nexport type ExpressionData<T> = BoolExpressionRawData<T> | AtomData<T>\n\nexport type AtomHandle<T> = (arg:T) => boolean|string|Promise<boolean|string>\n\ntype MapFn<T, U> = (object: BoolExp<T>, context :string[]) => U | BoolExp<U>\n\nexport class BoolExp<T> {\n public static atom<U>(data: U) {\n return new BoolExp<U>({ type: 'atom', data })\n }\n \n public static and<U>(...atomValues:U[]) {\n const atomValueWithoutUndefined = atomValues.filter(v => !!v)\n const [first, ...rest] = atomValueWithoutUndefined\n return rest.reduce((acc, cur) => acc.and(cur), BoolExp.atom(first))\n }\n \n public static or<U>(...atomValues:U[]) {\n const atomValueWithoutUndefined = atomValues.filter(v => !!v)\n const [first, ...rest] = atomValueWithoutUndefined\n return rest.reduce((acc, cur) => acc.or(cur), BoolExp.atom(first))\n }\n \n constructor(public raw: ExpressionData<T>) {\n if (!raw) {\n throw new Error('BoolExp raw data cannot be undefined')\n }\n }\n \n isAtom() {\n return this.raw.type === 'atom'\n }\n \n get type() {\n return this.raw.type\n }\n \n get left() {\n return new BoolExp<T>((this.raw as BoolExpressionRawData<T>).left)\n }\n \n get right(): BoolExp<T>|undefined {\n return (this.raw as BoolExpressionRawData<T>).right ? new BoolExp<T>((this.raw as BoolExpressionRawData<T>).right!) : undefined\n }\n \n get data() {\n return (this.raw as AtomData<T>).data\n }\n \n // 支持序列化和反序列化\n toValue() {\n return this.raw as AtomData<T>\n }\n \n static fromValue<T>(value: ExpressionData<T>) {\n return new BoolExp<T>(value)\n }\n \n isExpression() {\n return this.raw.type === 'expression'\n }\n \n and(atomValueOrExp: unknown) {\n return new BoolExp<T>({\n type: 'expression',\n operator: 'and',\n left: this.raw,\n right: atomValueOrExp instanceof BoolExp ?\n atomValueOrExp.raw :\n (atomValueOrExp && typeof atomValueOrExp === 'object' && \n (atomValueOrExp as any).type === 'atom' || (atomValueOrExp as any).type === 'expression') ?\n atomValueOrExp as ExpressionData<T>:\n { type: 'atom', data: atomValueOrExp as T}\n })\n }\n \n isAnd() {\n return (this.raw as BoolExpressionRawData<T>).operator === 'and'\n }\n \n isOr() {\n return (this.raw as BoolExpressionRawData<T>).operator === 'or'\n }\n \n isNot() {\n return (this.raw as BoolExpressionRawData<T>).operator === 'not'\n }\n \n or(atomValueOrExp: unknown) {\n return new BoolExp<T>({\n type: 'expression',\n operator: 'or',\n left: this.raw,\n right: (atomValueOrExp instanceof BoolExp) ? atomValueOrExp.raw : { type: 'atom', data: atomValueOrExp as T}\n })\n }\n \n // 取反\n not() {\n return new BoolExp<T>({\n type: 'expression',\n operator: 'not',\n left: this.raw,\n })\n }\n \n map<U>(fn: MapFn<T, U> , context: string[] =[]): BoolExp<U> {\n if (this.isExpression()) {\n const newLeft = this.left.map(fn, ['left'])\n if (this.isNot()) {\n return newLeft.not()\n } else {\n const newRight = this.right!.map(fn, ['right'])\n return this.isAnd() ? newLeft.and(newRight) : newLeft.or(newRight)\n }\n } else {\n const newAtomData = fn(this, context)\n // 可以返回一个新的 expression\n return newAtomData instanceof BoolExp ? newAtomData : BoolExp.atom<U>(newAtomData)\n }\n }\n \n find(matchFn: (atom: T, context:string[]) => boolean, context: unknown[]): T|undefined {\n if(this.isAtom()) {\n const matched = matchFn(this.data, context as string[])\n if (matched) {\n return this.data\n }\n } else {\n const leftMatched = this.left.find(matchFn, context.concat(this))\n if (leftMatched) {\n return leftMatched\n }\n if (this.right) {\n return this.right.find(matchFn, context.concat(this))\n }\n }\n }\n \n evaluate(atomHandle: AtomHandle<T>, stack :ExpressionData<T>[] = [], inverse: boolean = false): true|EvaluateError<T> {\n const currentStack = stack.concat(this.raw)\n\n if (this.isAtom()) {\n const data = (this.raw as AtomData<T>).data\n const resultOrErrorMessage = atomHandle(data)\n if (typeof resultOrErrorMessage === 'string') {\n return { data, inverse, stack, error: resultOrErrorMessage }\n }\n const result = resultOrErrorMessage\n const error: EvaluateError<T> = { data, inverse, stack, error: 'atom evaluate error' }\n return (result && !inverse || !result && inverse) ? true : error\n }\n\n if (this.isOr()) {\n const leftResult = this.left.evaluate(atomHandle, currentStack)\n if (leftResult === true) return true\n return this.right!.evaluate(atomHandle, currentStack)\n }\n\n if (this.isAnd()) {\n const leftResult = this.left.evaluate(atomHandle, currentStack)\n if (leftResult !== true) return leftResult\n\n return this.right!.evaluate(atomHandle, currentStack)\n }\n\n if (this.isNot()) {\n return this.left.evaluate(atomHandle, currentStack, !inverse)\n }\n\n throw new Error(`invalid bool expression type: ${JSON.stringify(this.raw)}`)\n }\n \n async evaluateAsync(atomHandle: AtomHandle<T>, stack :ExpressionData<T>[] = [], inverse: boolean = false): Promise<true|EvaluateError<T>> {\n const currentStack = stack.concat(this.raw)\n\n if (this.isAtom()) {\n const data = (this.raw as AtomData<T>).data\n const result = await atomHandle(data)\n const error: EvaluateError<T> = { data, inverse, stack, error: 'atom evaluate error' }\n return (result && !inverse || !result && inverse) ? true : error\n }\n\n if (this.isOr()) {\n const leftResult = await this.left.evaluateAsync(atomHandle, currentStack)\n if (leftResult === true) return true\n return this.right!.evaluateAsync(atomHandle, currentStack)\n }\n\n if (this.isAnd()) {\n const leftResult = await this.left.evaluateAsync(atomHandle, currentStack)\n if (leftResult !== true) return leftResult\n\n return this.right!.evaluateAsync(atomHandle, currentStack)\n }\n\n if (this.isNot()) {\n return this.left.evaluateAsync(atomHandle, currentStack, !inverse)\n }\n\n throw new Error(`invalid bool expression type: ${JSON.stringify(this.raw)}`)\n }\n}\n\n// Parse 相关的功能\nconst OperatorNames = {\n '&&': 'and',\n '||': 'or', \n '!': 'not'\n} as const;\n\ntype ParseAtomNameToObjectType = (name:string) => unknown;\n\nfunction defaultParse(key:string) {\n return {key}\n}\n\nfunction astNodeToBoolExpressionNode<T>(astNode: any, optionsByName: {[k:string]: any}, parseAtomNameToObject: ParseAtomNameToObjectType): ExpressionData<T> {\n if (astNode.type === \"LogicalExpression\") {\n return {\n type: 'expression',\n operator: OperatorNames[astNode.operator as keyof typeof OperatorNames],\n left: astNodeToBoolExpressionNode(astNode.left, optionsByName, parseAtomNameToObject),\n right: astNodeToBoolExpressionNode(astNode.right, optionsByName, parseAtomNameToObject)\n } as BoolExpressionRawData<T>\n }\n\n if (astNode.type === \"Identifier\") {\n return {\n type: 'atom',\n data: parseAtomNameToObject(astNode.name) as T\n }\n }\n\n if (astNode.type ===\"UnaryExpression\") {\n return {\n type: 'expression',\n operator: 'not',\n left: astNodeToBoolExpressionNode(astNode.argument, optionsByName, parseAtomNameToObject),\n } as BoolExpressionRawData<T>\n }\n\n throw new Error('unknown ast node type')\n}\n\nexport function parse<T>(exp: string, options: unknown[] = [], parseAtomNameToObject: ParseAtomNameToObjectType = defaultParse): BoolExp<T> {\n const optionsByName = indexBy(options as any[], 'name')\n const ast = parseStr(exp, {ecmaVersion: 2020} as any)\n return new BoolExp<T>(\n astNodeToBoolExpressionNode<T>((ast.body[0] as any).expression, optionsByName, parseAtomNameToObject)\n )\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport { BoolAtomDataInstance, BoolExpressionDataInstance } from './BoolExp.js';\n\n// Attributive\nexport interface AttributiveInstance extends IInstance {\n stringContent?: string;\n content: Function;\n name?: string;\n isRef?: boolean;\n}\n\nexport interface AttributiveCreateArgs {\n stringContent?: string;\n content: Function;\n name?: string;\n isRef?: boolean;\n}\n\nexport class Attributive implements AttributiveInstance {\n public uuid: string;\n public _type = 'Attributive';\n public _options?: { uuid?: string };\n public stringContent?: string;\n public content: Function;\n public name?: string;\n public isRef?: boolean;\n \n constructor(args: AttributiveCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.stringContent = args.stringContent;\n this.content = args.content;\n this.name = args.name;\n this.isRef = args.isRef;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Attributive';\n static instances: AttributiveInstance[] = [];\n \n static public = {\n stringContent: {\n type: 'string' as const,\n },\n content: {\n type: 'function' as const,\n required: true as const,\n collection: false as const\n },\n name: {\n type: 'string' as const\n },\n isRef: {\n type: 'boolean' as const\n }\n };\n \n static create(args: AttributiveCreateArgs, options?: { uuid?: string }): AttributiveInstance {\n const instance = new Attributive(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Attributive`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: AttributiveInstance): string {\n const args: AttributiveCreateArgs = {\n content: stringifyAttribute(instance.content) as Function,\n stringContent: instance.stringContent,\n name: instance.name,\n isRef: instance.isRef\n };\n \n const data: SerializedData<AttributiveCreateArgs> = {\n type: 'Attributive',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: AttributiveInstance, deep: boolean): AttributiveInstance {\n const args: AttributiveCreateArgs = {\n content: instance.content\n };\n if (instance.stringContent !== undefined) args.stringContent = instance.stringContent;\n if (instance.name !== undefined) args.name = instance.name;\n if (instance.isRef !== undefined) args.isRef = instance.isRef;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is AttributiveInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Attributive';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): AttributiveInstance {\n const data: SerializedData<AttributiveCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.content && typeof args.content === 'string' && (args.content as any).startsWith('func::')) {\n args.content = new Function('return ' + (args.content as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n}\n\n// Attributives \nexport interface AttributivesInstance extends IInstance {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n}\n\nexport interface AttributivesCreateArgs {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n}\n\nexport class Attributives implements AttributivesInstance {\n public uuid: string;\n public _type = 'Attributives';\n public _options?: { uuid?: string };\n public content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n \n constructor(args: AttributivesCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.content = args.content;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Attributives';\n static instances: AttributivesInstance[] = [];\n \n static public = {\n content: {\n type: ['BoolExpressionData', 'BoolAtomData'] as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: AttributivesCreateArgs, options?: { uuid?: string }): AttributivesInstance {\n const instance = new Attributives(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Attributives`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: AttributivesInstance): string {\n const args: Partial<AttributivesCreateArgs> = {};\n if (instance.content !== undefined) args.content = stringifyAttribute(instance.content) as BoolExpressionDataInstance | BoolAtomDataInstance;\n \n const data: SerializedData<AttributivesCreateArgs> = {\n type: 'Attributives',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: AttributivesInstance, deep: boolean): AttributivesInstance {\n const args: AttributivesCreateArgs = {};\n if (instance.content !== undefined) args.content = instance.content;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is AttributivesInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Attributives';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): AttributivesInstance {\n const data: SerializedData<AttributivesCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// 兼容性函数\nimport { BoolExp, BoolAtomData, BoolExpressionData, type BoolExpressionRawData } from './BoolExp.js';\n\nfunction toAttributives(obj?: BoolExp<AttributiveInstance>): BoolAtomData | BoolExpressionData | undefined {\n if (!obj) return undefined;\n\n if (obj.raw.type === 'atom') {\n return BoolAtomData.create({\n type: 'atom',\n data: obj.raw.data as unknown as { content?: Function; [key: string]: unknown }\n });\n }\n\n const expData = obj.raw as BoolExpressionRawData<AttributiveInstance>;\n return BoolExpressionData.create({\n type: 'expression',\n operator: expData.operator,\n left: toAttributives(obj.left) as BoolAtomData | BoolExpressionData,\n right: toAttributives(obj.right) as BoolAtomData | BoolExpressionData | undefined,\n });\n}\n\nexport function boolExpToAttributives(obj: BoolExp<AttributiveInstance>) {\n return Attributives.create({\n content: toAttributives(obj) as BoolExpressionData\n });\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\n\n// 兼容性函数\nimport { BoolExp, BoolAtomData, BoolExpressionData, type BoolExpressionRawData } from './BoolExp.js';\nimport { Conditions } from './Conditions.js';\n\nexport interface ConditionInstance extends IInstance {\n content: Function;\n name?: string;\n}\n\nexport interface ConditionCreateArgs {\n content: Function;\n name?: string;\n}\n\nexport class Condition implements ConditionInstance {\n public uuid: string;\n public _type = 'Condition';\n public _options?: { uuid?: string };\n public content: Function;\n public name?: string;\n \n constructor(args: ConditionCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.content = args.content;\n this.name = args.name;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Condition';\n static instances: ConditionInstance[] = [];\n \n static public = {\n content: {\n type: 'function' as const,\n required: true as const,\n collection: false as const\n },\n name: {\n type: 'string' as const\n }\n };\n \n static create(args: ConditionCreateArgs, options?: { uuid?: string }): ConditionInstance {\n const instance = new Condition(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Condition`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: ConditionInstance): string {\n const args: ConditionCreateArgs = {\n content: stringifyAttribute(instance.content) as Function,\n name: instance.name\n };\n \n const data: SerializedData<ConditionCreateArgs> = {\n type: 'Condition',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: ConditionInstance, deep: boolean): ConditionInstance {\n const args: ConditionCreateArgs = {\n content: instance.content\n };\n if (instance.name !== undefined) args.name = instance.name;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is ConditionInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Condition';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): ConditionInstance {\n const data: SerializedData<ConditionCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.content && typeof args.content === 'string' && (args.content as any).startsWith('func::')) {\n args.content = new Function('return ' + (args.content as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\n\n// DataAttributive\nexport interface DataAttributiveInstance extends IInstance {\n content: Function;\n name?: string;\n}\n\nexport interface DataAttributiveCreateArgs {\n content: Function;\n name?: string;\n}\n\nexport class DataAttributive implements DataAttributiveInstance {\n public uuid: string;\n public _type = 'DataAttributive';\n public _options?: { uuid?: string };\n public content: Function;\n public name?: string;\n \n constructor(args: DataAttributiveCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.content = args.content;\n this.name = args.name;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'DataAttributive';\n static instances: DataAttributiveInstance[] = [];\n \n static public = {\n content: {\n type: 'function' as const,\n required: true as const,\n collection: false as const\n },\n name: {\n type: 'string' as const\n }\n };\n \n static create(args: DataAttributiveCreateArgs, options?: { uuid?: string }): DataAttributiveInstance {\n const instance = new DataAttributive(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, DataAttributive`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: DataAttributiveInstance): string {\n const args: DataAttributiveCreateArgs = {\n content: stringifyAttribute(instance.content) as Function,\n name: instance.name\n };\n \n const data: SerializedData<DataAttributiveCreateArgs> = {\n type: 'DataAttributive',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: DataAttributiveInstance, deep: boolean): DataAttributiveInstance {\n const args: DataAttributiveCreateArgs = {\n content: instance.content\n };\n if (instance.name !== undefined) args.name = instance.name;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is DataAttributiveInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'DataAttributive';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): DataAttributiveInstance {\n const data: SerializedData<DataAttributiveCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.content && typeof args.content === 'string' && (args.content as any).startsWith('func::')) {\n args.content = new Function('return ' + (args.content as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n}\n\n// QueryItem\nexport interface QueryItemInstance extends IInstance {\n name: string;\n value: string;\n}\n\nexport interface QueryItemCreateArgs {\n name: string;\n value: any;\n}\n\nexport class QueryItem implements QueryItemInstance {\n public uuid: string;\n public _type = 'QueryItem';\n public _options?: { uuid?: string };\n public name: string;\n public value: string;\n \n constructor(args: QueryItemCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.value = args.value;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'QueryItem';\n static instances: QueryItemInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n },\n value: {\n type: 'string' as const,\n required: true as const,\n collection: false as const,\n }\n };\n \n static create(args: QueryItemCreateArgs, options?: { uuid?: string }): QueryItemInstance {\n const instance = new QueryItem(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, QueryItem`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: QueryItemInstance): string {\n const data: SerializedData<QueryItemCreateArgs> = {\n type: 'QueryItem',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n name: instance.name,\n value: instance.value\n }\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: QueryItemInstance, deep: boolean): QueryItemInstance {\n return this.create({\n name: instance.name,\n value: instance.value\n });\n }\n \n static is(obj: unknown): obj is QueryItemInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'QueryItem';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): QueryItemInstance {\n const data: SerializedData<QueryItemCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// Query\nexport interface QueryInstance extends IInstance {\n items: QueryItemInstance[];\n}\n\nexport interface QueryCreateArgs {\n items: QueryItemInstance[];\n}\n\nexport class Query implements QueryInstance {\n public uuid: string;\n public _type = 'Query';\n public _options?: { uuid?: string };\n public items: QueryItemInstance[];\n \n constructor(args: QueryCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.items = args.items;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Query';\n static instances: QueryInstance[] = [];\n \n static public = {\n items: {\n type: 'QueryItem' as const,\n required: true as const,\n collection: true as const,\n }\n };\n \n static create(args: QueryCreateArgs, options?: { uuid?: string }): QueryInstance {\n const instance = new Query(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Query`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: QueryInstance): string {\n const data: SerializedData<QueryCreateArgs> = {\n type: 'Query',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n items: instance.items\n }\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: QueryInstance, deep: boolean): QueryInstance {\n return this.create({\n items: instance.items\n });\n }\n \n static is(obj: unknown): obj is QueryInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Query';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): QueryInstance {\n const data: SerializedData<QueryCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\n\n// Action 实例接口\nexport interface ActionInstance extends IInstance {\n name: string;\n}\n\n// Action 创建参数\nexport interface ActionCreateArgs {\n name: string;\n}\n\n// Action 类定义\nexport class Action implements ActionInstance {\n public uuid: string;\n public _type = 'Action';\n public _options?: { uuid?: string };\n public name: string;\n\n constructor(args: ActionCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n }\n\n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Action';\n static instances: ActionInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const\n }\n };\n\n static create(args: ActionCreateArgs, options?: { uuid?: string }): ActionInstance {\n const instance = new Action(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Action`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n\n static stringify(instance: ActionInstance): string {\n const data: SerializedData<ActionCreateArgs> = {\n type: 'Action',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n name: instance.name\n }\n };\n return JSON.stringify(data);\n }\n\n static clone(instance: ActionInstance, deep: boolean): ActionInstance {\n return this.create({\n name: instance.name\n });\n }\n\n static is(obj: unknown): obj is ActionInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Action';\n }\n\n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n\n static parse(json: string): ActionInstance {\n const data: SerializedData<ActionCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n}\n\n// 导出类型,保持兼容性\nexport type { Action as ActionKlass };\n\n// 导出 GetAction 实例\nexport const GetAction = Action.create({ name: 'get' });\n\n ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\n\n// Gateway 实例接口\nexport interface GatewayInstance extends IInstance {\n name: string;\n}\n\n// Gateway 创建参数\nexport interface GatewayCreateArgs {\n name: string;\n}\n\n// Gateway 类定义\nexport class Gateway implements GatewayInstance {\n public uuid: string;\n public _type = 'Gateway';\n public _options?: { uuid?: string };\n public name: string;\n\n constructor(args: GatewayCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n }\n\n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Gateway';\n static instances: GatewayInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const\n }\n };\n\n static create(args: GatewayCreateArgs, options?: { uuid?: string }): GatewayInstance {\n const instance = new Gateway(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Gateway`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n\n static stringify(instance: GatewayInstance): string {\n const data: SerializedData<GatewayCreateArgs> = {\n type: 'Gateway',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n name: instance.name\n }\n };\n return JSON.stringify(data);\n }\n\n static clone(instance: GatewayInstance, deep: boolean): GatewayInstance {\n return this.create({\n name: instance.name\n });\n }\n\n static is(obj: unknown): obj is GatewayInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Gateway';\n }\n\n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n\n static parse(json: string): GatewayInstance {\n const data: SerializedData<GatewayCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\n\n// Event 实例接口\nexport interface EventInstance extends IInstance {\n name: string;\n}\n\n// Event 创建参数\nexport interface EventCreateArgs {\n name: string;\n}\n\n// Event 类定义\nexport class Event implements EventInstance {\n public uuid: string;\n public _type = 'Event';\n public _options?: { uuid?: string };\n public name: string;\n\n constructor(args: EventCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n }\n\n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Event';\n static instances: EventInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const\n }\n };\n\n static create(args: EventCreateArgs, options?: { uuid?: string }): EventInstance {\n const instance = new Event(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Event`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n\n static stringify(instance: EventInstance): string {\n const data: SerializedData<EventCreateArgs> = {\n type: 'Event',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n name: instance.name\n }\n };\n return JSON.stringify(data);\n }\n\n static clone(instance: EventInstance, deep: boolean): EventInstance {\n return this.create({\n name: instance.name\n });\n }\n\n static is(obj: unknown): obj is EventInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Event';\n }\n\n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n\n static parse(json: string): EventInstance {\n const data: SerializedData<EventCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\n\n// StateNode 实例接口\nexport interface StateNodeInstance extends IInstance {\n name: string;\n computeValue?: (this: any, lastValue: any, event?: any) => unknown;\n}\n\n// StateNode 创建参数\nexport interface StateNodeCreateArgs {\n name: string;\n computeValue?: (this: any, lastValue: any, event?: any) => unknown;\n}\n\n// StateNode 类定义\nexport class StateNode implements StateNodeInstance {\n public uuid: string;\n public _type = 'StateNode';\n public _options?: { uuid?: string };\n public name: string;\n public computeValue?: (this: any, lastValue: any, event?: any) => unknown;\n\n constructor(args: StateNodeCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.computeValue = args.computeValue;\n }\n\n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'StateNode';\n static instances: StateNodeInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n collection: false as const,\n required: true as const\n },\n computeValue: {\n type: 'function' as const,\n required: false as const,\n collection: false as const\n }\n };\n\n static create(args: StateNodeCreateArgs, options?: { uuid?: string }): StateNodeInstance {\n const instance = new StateNode(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, StateNode`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n\n static stringify(instance: StateNodeInstance): string {\n const args: StateNodeCreateArgs = {\n name: instance.name\n };\n if (instance.computeValue !== undefined) args.computeValue = instance.computeValue;\n \n const data: SerializedData<StateNodeCreateArgs> = {\n type: 'StateNode',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n\n static clone(instance: StateNodeInstance, deep: boolean): StateNodeInstance {\n const args: StateNodeCreateArgs = {\n name: instance.name\n };\n if (instance.computeValue !== undefined) args.computeValue = instance.computeValue;\n \n return this.create(args);\n }\n\n static is(obj: unknown): obj is StateNodeInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'StateNode';\n }\n\n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n\n static parse(json: string): StateNodeInstance {\n const data: SerializedData<StateNodeCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { StateNodeInstance } from './StateNode.js';\nimport { InteractionInstance } from './Interaction.js';\n\nexport interface StateTransferInstance extends IInstance {\n trigger: InteractionInstance;\n current: StateNodeInstance;\n next: StateNodeInstance;\n computeTarget?: Function;\n}\n\nexport interface StateTransferCreateArgs {\n trigger: InteractionInstance;\n current: StateNodeInstance;\n next: StateNodeInstance;\n computeTarget?: Function;\n}\n\nexport class StateTransfer implements StateTransferInstance {\n public uuid: string;\n public _type = 'StateTransfer';\n public _options?: { uuid?: string };\n public trigger: InteractionInstance;\n public current: StateNodeInstance;\n public next: StateNodeInstance;\n public computeTarget?: Function;\n \n constructor(args: StateTransferCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.trigger = args.trigger;\n this.current = args.current;\n this.next = args.next;\n this.computeTarget = args.computeTarget;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'StateTransfer';\n static instances: StateTransferInstance[] = [];\n \n static public = {\n trigger: {\n instanceType: {} as unknown as InteractionInstance,\n collection: false as const,\n required: true as const\n },\n current: {\n type: 'StateNode' as const,\n collection: false as const,\n required: true as const\n },\n next: {\n type: 'StateNode' as const,\n collection: false as const,\n required: true as const\n },\n computeTarget: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: StateTransferCreateArgs, options?: { uuid?: string }): StateTransferInstance {\n const instance = new StateTransfer(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, StateTransfer`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: StateTransferInstance): string {\n const args: StateTransferCreateArgs = {\n trigger: instance.trigger,\n current: instance.current,\n next: instance.next\n };\n if (instance.computeTarget !== undefined) args.computeTarget = instance.computeTarget;\n \n const data: SerializedData<StateTransferCreateArgs> = {\n type: 'StateTransfer',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: StateTransferInstance, deep: boolean): StateTransferInstance {\n return this.create({\n trigger: instance.trigger,\n current: instance.current,\n next: instance.next,\n computeTarget: instance.computeTarget\n });\n }\n \n static is(obj: unknown): obj is StateTransferInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'StateTransfer';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): StateTransferInstance {\n const data: SerializedData<StateTransferCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { StateNodeInstance } from './StateNode.js';\nimport { StateTransferInstance } from './StateTransfer.js';\n\nexport interface StateMachineInstance extends IInstance {\n states: StateNodeInstance[];\n transfers: StateTransferInstance[];\n defaultState: StateNodeInstance;\n}\n\nexport interface StateMachineCreateArgs {\n states: StateNodeInstance[];\n transfers: StateTransferInstance[];\n defaultState: StateNodeInstance;\n}\n\nexport class StateMachine implements StateMachineInstance {\n public uuid: string;\n public _type = 'StateMachine';\n public _options?: { uuid?: string };\n public states: StateNodeInstance[];\n public transfers: StateTransferInstance[];\n public defaultState: StateNodeInstance;\n \n constructor(args: StateMachineCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.states = args.states;\n this.transfers = args.transfers;\n this.defaultState = args.defaultState;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'StateMachine';\n static instances: StateMachineInstance[] = [];\n \n static public = {\n states: {\n type: 'StateNode' as const,\n collection: true as const,\n required: true as const\n },\n transfers: {\n type: 'StateTransfer' as const,\n collection: true as const,\n required: true as const\n },\n defaultState: {\n type: 'StateNode' as const,\n collection: false as const,\n required: true as const\n }\n };\n \n static create(args: StateMachineCreateArgs, options?: { uuid?: string }): StateMachineInstance {\n const instance = new StateMachine(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, StateMachine`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: StateMachineInstance): string {\n const data: SerializedData<StateMachineCreateArgs> = {\n type: 'StateMachine',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n states: instance.states,\n transfers: instance.transfers,\n defaultState: instance.defaultState\n }\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: StateMachineInstance, deep: boolean): StateMachineInstance {\n return this.create({\n states: instance.states,\n transfers: instance.transfers,\n defaultState: instance.defaultState\n });\n }\n \n static is(obj: unknown): obj is StateMachineInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'StateMachine';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): StateMachineInstance {\n const data: SerializedData<StateMachineCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { EntityInstance, RelationInstance, AttributeQueryData, DataDependencies } from './types.js';\n\nexport interface WeightedSummationInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n}\n\nexport interface WeightedSummationCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n}\n\nexport class WeightedSummation implements WeightedSummationInstance {\n public uuid: string;\n public _type = 'WeightedSummation';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public callback: Function;\n public attributeQuery?: AttributeQueryData;\n public dataDeps?: DataDependencies;\n \n constructor(args: WeightedSummationCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.callback = args.callback;\n this.attributeQuery = args.attributeQuery;\n this.dataDeps = args.dataDeps;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'WeightedSummation';\n static instances: WeightedSummationInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: false as const\n },\n property: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: true as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n dataDeps: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: WeightedSummationCreateArgs, options?: { uuid?: string }): WeightedSummationInstance {\n const instance = new WeightedSummation(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, WeightedSummation`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: WeightedSummationInstance): string {\n const args: WeightedSummationCreateArgs = {\n record: instance.record,\n property: instance.property,\n direction: instance.direction,\n attributeQuery: instance.attributeQuery ? stringifyAttribute(instance.attributeQuery) as AttributeQueryData : undefined,\n \n \n dataDeps: instance.dataDeps,\n callback: instance.callback ? stringifyAttribute(instance.callback) as Function : (() => 1)\n };\n \n const data: SerializedData<WeightedSummationCreateArgs> = {\n type: 'WeightedSummation',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: WeightedSummationInstance, deep: boolean): WeightedSummationInstance {\n return this.create({\n record: instance.record,\n property: instance.property,\n direction: instance.direction,\n callback: instance.callback,\n attributeQuery: instance.attributeQuery,\n dataDeps: instance.dataDeps\n });\n }\n \n static is(obj: unknown): obj is WeightedSummationInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'WeightedSummation';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): WeightedSummationInstance {\n const data: SerializedData<WeightedSummationCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.callback && typeof args.callback === 'string' && (args.callback as any).startsWith('func::')) {\n args.callback = new Function('return ' + (args.callback as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { EntityInstance, RelationInstance, AttributeQueryData, DataDependencies } from './types.js';\nimport { Entity } from './Entity.js';\nimport { Relation } from './Relation.js';\n\nexport interface CountInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback?: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n}\n\nexport interface CountCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback?: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n}\n\nexport class Count implements CountInstance {\n public uuid: string;\n public _type = 'Count';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public callback?: Function;\n public attributeQuery?: AttributeQueryData;\n public dataDeps?: DataDependencies;\n \n constructor(args: CountCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.callback = args.callback;\n this.attributeQuery = args.attributeQuery;\n this.dataDeps = args.dataDeps;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Count';\n static instances: CountInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: true as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n dataDeps: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: CountCreateArgs, options?: { uuid?: string }): CountInstance {\n const instance = new Count(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Count`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: CountInstance): string {\n const args: CountCreateArgs = {\n record: instance.record,\n direction: instance.direction,\n attributeQuery: instance.attributeQuery ? stringifyAttribute(instance.attributeQuery) as AttributeQueryData : undefined,\n dataDeps: instance.dataDeps,\n callback: instance.callback ? stringifyAttribute(instance.callback) as Function : undefined\n };\n \n const data: SerializedData<CountCreateArgs> = {\n type: 'Count',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: CountInstance, deep: boolean): CountInstance {\n // 对于 Entity 和 Relation,即使是深度克隆,也只克隆引用\n // 因为它们是全局单例管理的\n let record = instance.record;\n if (deep) {\n // 如果是深度克隆,对 Entity 或 Relation 调用它们的 clone 方法\n if (Entity.is(instance.record)) {\n record = Entity.clone(instance.record, deep);\n } else if (Relation.is(instance.record)) {\n record = Relation.clone(instance.record, deep);\n }\n }\n \n return this.create({\n record: record,\n direction: instance.direction,\n callback: instance.callback,\n attributeQuery: instance.attributeQuery,\n dataDeps: instance.dataDeps\n });\n }\n \n static is(obj: unknown): obj is CountInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Count';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): CountInstance {\n const data: SerializedData<CountCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.callback && typeof args.callback === 'string' && (args.callback as any).startsWith('func::')) {\n args.callback = new Function('return ' + (args.callback as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n}","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { EntityInstance, RelationInstance, AttributeQueryData } from './types.js';\n\nexport interface SummationInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n attributeQuery: AttributeQueryData;\n}\n\nexport interface SummationCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n attributeQuery: AttributeQueryData;\n}\n\nexport class Summation implements SummationInstance {\n public uuid: string;\n public _type = 'Summation';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public attributeQuery: AttributeQueryData;\n \n constructor(args: SummationCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.attributeQuery = args.attributeQuery;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Summation';\n static instances: SummationInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: true as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: true as const\n }\n };\n \n static create(args: SummationCreateArgs, options?: { uuid?: string }): SummationInstance {\n const instance = new Summation(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Summation`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: SummationInstance): string {\n const args: SummationCreateArgs = {\n record: instance.record,\n attributeQuery: stringifyAttribute(instance.attributeQuery) as AttributeQueryData\n };\n \n const data: SerializedData<SummationCreateArgs> = {\n type: 'Summation',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: SummationInstance, deep: boolean): SummationInstance {\n return this.create({\n record: instance.record,\n direction: instance.direction,\n attributeQuery: instance.attributeQuery\n });\n }\n \n static is(obj: unknown): obj is SummationInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Summation';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): SummationInstance {\n const data: SerializedData<SummationCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { EntityInstance, RelationInstance, AttributeQueryData } from './types.js';\n\nexport interface AverageInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n attributeQuery: AttributeQueryData;\n}\n\nexport interface AverageCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n attributeQuery: AttributeQueryData;\n}\n\nexport class Average implements AverageInstance {\n public uuid: string;\n public _type = 'Average';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public attributeQuery: AttributeQueryData;\n \n constructor(args: AverageCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.attributeQuery = args.attributeQuery;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Average';\n static instances: AverageInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: true as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: true as const\n }\n };\n \n static create(args: AverageCreateArgs, options?: { uuid?: string }): AverageInstance {\n const instance = new Average(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Average`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: AverageInstance): string {\n const args: AverageCreateArgs = {\n record: instance.record,\n attributeQuery: stringifyAttribute(instance.attributeQuery) as AttributeQueryData\n };\n \n const data: SerializedData<AverageCreateArgs> = {\n type: 'Average',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: AverageInstance, deep: boolean): AverageInstance {\n return this.create({\n record: instance.record,\n direction: instance.direction,\n attributeQuery: instance.attributeQuery\n });\n }\n \n static is(obj: unknown): obj is AverageInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Average';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): AverageInstance {\n const data: SerializedData<AverageCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { EntityInstance, RelationInstance, AttributeQueryData, DataDependencies } from './types.js';\n\nexport interface EveryInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n notEmpty?: boolean;\n}\n\nexport interface EveryCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n notEmpty?: boolean;\n}\n\nexport class Every implements EveryInstance {\n public uuid: string;\n public _type = 'Every';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public callback: Function;\n public attributeQuery?: AttributeQueryData;\n public dataDeps?: DataDependencies;\n public notEmpty?: boolean;\n \n constructor(args: EveryCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.callback = args.callback;\n this.attributeQuery = args.attributeQuery;\n this.dataDeps = args.dataDeps;\n this.notEmpty = args.notEmpty;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Every';\n static instances: EveryInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: true as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: true as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n dataDeps: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n notEmpty: {\n type: 'boolean' as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: EveryCreateArgs, options?: { uuid?: string }): EveryInstance {\n const instance = new Every(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Every`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: EveryInstance): string {\n const args: EveryCreateArgs = {\n record: instance.record,\n attributeQuery: instance.attributeQuery ? stringifyAttribute(instance.attributeQuery) as AttributeQueryData : undefined,\n \n dataDeps: instance.dataDeps,\n callback: instance.callback ? stringifyAttribute(instance.callback) as Function : (() => true)\n };\n \n const data: SerializedData<EveryCreateArgs> = {\n type: 'Every',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: EveryInstance, deep: boolean): EveryInstance {\n const args: EveryCreateArgs = {\n record: instance.record,\n callback: instance.callback\n };\n if (instance.direction !== undefined) args.direction = instance.direction;\n if (instance.attributeQuery !== undefined) args.attributeQuery = instance.attributeQuery;\n if (instance.dataDeps !== undefined) args.dataDeps = instance.dataDeps;\n if (instance.notEmpty !== undefined) args.notEmpty = instance.notEmpty;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is EveryInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Every';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): EveryInstance {\n const data: SerializedData<EveryCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.callback && typeof args.callback === 'string' && (args.callback as any).startsWith('func::')) {\n args.callback = new Function('return ' + (args.callback as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport type { AttributeQueryData, DataDependencies, EntityInstance, RelationInstance } from './types.js';\nimport { stringifyAttribute } from './utils.js';\n\nexport interface AnyInstance extends IInstance {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData; // AttributeQueryData\n dataDeps?: DataDependencies;\n}\n\nexport interface AnyCreateArgs {\n record?: EntityInstance | RelationInstance;\n property?: string;\n direction?: string;\n callback: Function;\n attributeQuery?: AttributeQueryData; // AttributeQueryData\n dataDeps?: DataDependencies;\n}\n\nexport class Any implements AnyInstance {\n public uuid: string;\n public _type = 'Any';\n public _options?: { uuid?: string };\n public record?: EntityInstance | RelationInstance;\n public property?: string;\n public direction?: string;\n public callback: Function;\n public attributeQuery?: AttributeQueryData;\n public dataDeps?: DataDependencies;\n \n constructor(args: AnyCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.property = args.property;\n this.direction = args.direction;\n this.callback = args.callback;\n this.attributeQuery = args.attributeQuery;\n this.dataDeps = args.dataDeps;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Any';\n static instances: AnyInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation'] as const,\n collection: false as const,\n required: false as const\n },\n property: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n direction: {\n type: 'string' as const,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: true as const\n },\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n dataDeps: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: AnyCreateArgs, options?: { uuid?: string }): AnyInstance {\n const instance = new Any(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Any`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: AnyInstance): string {\n const args: AnyCreateArgs = {\n record: instance.record,\n property: instance.property,\n attributeQuery: instance.attributeQuery,\n \n dataDeps: instance.dataDeps,\n callback: instance.callback ? stringifyAttribute(instance.callback) as Function : (() => {})\n };\n \n const data: SerializedData<AnyCreateArgs> = {\n type: 'Any',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: AnyInstance, deep: boolean): AnyInstance {\n return this.create({\n record: instance.record,\n property: instance.property,\n direction: instance.direction,\n callback: instance.callback,\n attributeQuery: instance.attributeQuery,\n dataDeps: instance.dataDeps\n });\n }\n \n static is(obj: unknown): obj is AnyInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Any';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): AnyInstance {\n const data: SerializedData<AnyCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.callback && typeof args.callback === 'string' && (args.callback as any).startsWith('func::')) {\n args.callback = new Function('return ' + (args.callback as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport type { ComputationRecord, AttributeQueryData } from './types.js';\n\nexport interface TransformInstance extends IInstance {\n record: ComputationRecord;\n attributeQuery?: AttributeQueryData;\n callback: Function;\n}\n\nexport interface TransformCreateArgs {\n record: ComputationRecord;\n attributeQuery?: AttributeQueryData;\n callback: Function;\n}\n\nexport class Transform implements TransformInstance {\n public uuid: string;\n public _type = 'Transform';\n public _options?: { uuid?: string };\n public record: ComputationRecord;\n public attributeQuery?: AttributeQueryData;\n public callback: Function;\n \n constructor(args: TransformCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.record = args.record;\n this.attributeQuery = args.attributeQuery;\n this.callback = args.callback;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Transform';\n static instances: TransformInstance[] = [];\n \n static public = {\n record: {\n type: ['Entity', 'Relation', 'Activity', 'Interaction'] as const,\n collection: false as const,\n required: true as const\n },\n attributeQuery: {\n instanceType: {} as unknown as AttributeQueryData,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: true as const\n }\n };\n \n static create(args: TransformCreateArgs, options?: { uuid?: string }): TransformInstance {\n const instance = new Transform(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Transform`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: TransformInstance): string {\n const args: TransformCreateArgs = {\n record: stringifyAttribute(instance.record) as ComputationRecord,\n callback: stringifyAttribute(instance.callback) as Function\n };\n if (instance.attributeQuery !== undefined) args.attributeQuery = stringifyAttribute(instance.attributeQuery) as AttributeQueryData;\n \n const data: SerializedData<TransformCreateArgs> = {\n type: 'Transform',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: TransformInstance, deep: boolean): TransformInstance {\n return this.create({\n record: instance.record,\n attributeQuery: instance.attributeQuery,\n callback: instance.callback\n });\n }\n \n static is(obj: unknown): obj is TransformInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Transform';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): TransformInstance {\n const data = JSON.parse(json) as SerializedData<{\n record: ComputationRecord | string;\n attributeQuery?: AttributeQueryData;\n callback: Function | string;\n }>;\n const args = { ...data.public } as { record: ComputationRecord | string; attributeQuery?: AttributeQueryData; callback: Function | string; };\n \n // 反序列化函数\n if (typeof args.callback === 'string' && args.callback.startsWith('func::')) {\n args.callback = new Function('return ' + args.callback.substring(6))();\n }\n \n return this.create(args as TransformCreateArgs, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport type { AttributeQueryData, DataDependencies } from './types.js';\nimport { stringifyAttribute } from './utils.js';\n\nexport interface RealTimeInstance extends IInstance {\n attributeQuery?: AttributeQueryData; // AttributeQueryData\n dataDeps?: DataDependencies;\n nextRecomputeTime?: Function;\n callback: Function;\n}\n\nexport interface RealTimeCreateArgs {\n attributeQuery?: AttributeQueryData; // AttributeQueryData\n dataDeps?: DataDependencies;\n nextRecomputeTime?: Function;\n callback: Function;\n}\n\nexport class RealTime implements RealTimeInstance {\n public uuid: string;\n public _type = 'RealTimeValue';\n public _options?: { uuid?: string };\n public attributeQuery?: AttributeQueryData;\n public dataDeps?: DataDependencies;\n public nextRecomputeTime?: Function;\n public callback: Function;\n \n constructor(args: RealTimeCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.attributeQuery = args.attributeQuery;\n this.dataDeps = args.dataDeps;\n this.nextRecomputeTime = args.nextRecomputeTime;\n this.callback = args.callback;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'RealTimeValue';\n static instances: RealTimeInstance[] = [];\n \n static public = {\n attributeQuery: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n dataDeps: {\n instanceType: {} as unknown as {[key: string]: unknown},\n collection: false as const,\n required: false as const\n },\n nextRecomputeTime: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n callback: {\n type: 'function' as const,\n collection: false as const,\n required: true as const\n }\n };\n \n static create(args: RealTimeCreateArgs, options?: { uuid?: string }): RealTimeInstance {\n const instance = new RealTime(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, RealTimeValue`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: RealTimeInstance): string {\n const args: Partial<RealTimeCreateArgs> = {\n callback: stringifyAttribute(instance.callback) as Function\n };\n if (instance.attributeQuery !== undefined) args.attributeQuery = stringifyAttribute(instance.attributeQuery) as AttributeQueryData;\n if (instance.dataDeps !== undefined) args.dataDeps = instance.dataDeps;\n if (instance.nextRecomputeTime !== undefined) args.nextRecomputeTime = stringifyAttribute(instance.nextRecomputeTime) as Function;\n \n const data: SerializedData<Partial<RealTimeCreateArgs>> = {\n type: 'RealTimeValue',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: RealTimeInstance, deep: boolean): RealTimeInstance {\n const args: RealTimeCreateArgs = {\n callback: instance.callback\n };\n if (instance.attributeQuery !== undefined) args.attributeQuery = instance.attributeQuery;\n if (instance.dataDeps !== undefined) args.dataDeps = instance.dataDeps;\n if (instance.nextRecomputeTime !== undefined) args.nextRecomputeTime = instance.nextRecomputeTime;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is RealTimeInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'RealTime';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): RealTimeInstance {\n const data = JSON.parse(json) as SerializedData<{\n attributeQuery?: AttributeQueryData;\n dataDeps?: DataDependencies;\n nextRecomputeTime?: Function | string;\n callback: Function | string;\n }>;\n const args = { ...data.public };\n \n // 反序列化函数\n if (typeof args.callback === 'string' && args.callback.startsWith('func::')) {\n args.callback = new Function('return ' + args.callback.substring(6))();\n }\n if (typeof args.nextRecomputeTime === 'string' && args.nextRecomputeTime.startsWith('func::')) {\n args.nextRecomputeTime = new Function('return ' + args.nextRecomputeTime.substring(6))();\n }\n \n return this.create(args as RealTimeCreateArgs, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { AttributiveInstance, AttributivesInstance } from './Attributive.js';\nimport { EntityInstance } from './Entity.js';\n\nexport interface PayloadItemInstance extends IInstance {\n name: string;\n attributives?: AttributivesInstance | AttributiveInstance;\n base?: EntityInstance;\n isRef?: boolean;\n required?: boolean;\n isCollection?: boolean;\n itemRef?: AttributiveInstance | EntityInstance;\n}\n\nexport interface PayloadItemCreateArgs {\n name: string;\n attributives?: AttributivesInstance | AttributiveInstance;\n base?: EntityInstance;\n isRef?: boolean;\n required?: boolean;\n isCollection?: boolean;\n itemRef?: AttributiveInstance | EntityInstance;\n}\n\nexport class PayloadItem implements PayloadItemInstance {\n public uuid: string;\n public _type = 'PayloadItem';\n public _options?: { uuid?: string };\n public name: string;\n public attributives?: AttributivesInstance | AttributiveInstance;\n public base?: EntityInstance;\n public isRef: boolean;\n public required: boolean;\n public isCollection: boolean;\n public itemRef?: AttributiveInstance | EntityInstance;\n \n constructor(args: PayloadItemCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.attributives = args.attributives;\n this.base = args.base;\n this.isRef = args.isRef ?? false;\n this.required = args.required ?? false;\n this.isCollection = args.isCollection ?? false;\n this.itemRef = args.itemRef;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'PayloadItem';\n static instances: PayloadItemInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const\n },\n attributives: {\n type: ['Attributives', 'Attributive'] as const,\n collection: false as const\n },\n base: {\n type: 'Entity' as const,\n required: false as const,\n collection: false as const\n },\n isRef: {\n type: 'boolean' as const,\n collection: false as const,\n defaultValue: () => false\n },\n required: {\n type: 'boolean' as const,\n collection: false as const,\n defaultValue: () => false\n },\n isCollection: {\n type: 'boolean' as const,\n collection: false as const,\n defaultValue: () => false\n },\n itemRef: {\n collection: false as const,\n required: false as const,\n type: ['Attributive', 'Entity'] as const\n }\n };\n \n static create(args: PayloadItemCreateArgs, options?: { uuid?: string }): PayloadItemInstance {\n const instance = new PayloadItem(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, PayloadItem`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: PayloadItemInstance): string {\n const args: PayloadItemCreateArgs = {\n name: instance.name,\n base: instance.base,\n isCollection: instance.isCollection,\n required: instance.required,\n isRef: instance.isRef,\n attributives: instance.attributives\n };\n \n const data: SerializedData<PayloadItemCreateArgs> = {\n type: 'PayloadItem',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: PayloadItemInstance, deep: boolean): PayloadItemInstance {\n const args: PayloadItemCreateArgs = {\n name: instance.name\n };\n if (instance.attributives !== undefined) args.attributives = instance.attributives;\n if (instance.base !== undefined) args.base = instance.base;\n if (instance.isRef !== false) args.isRef = instance.isRef;\n if (instance.required !== false) args.required = instance.required;\n if (instance.isCollection !== false) args.isCollection = instance.isCollection;\n if (instance.itemRef !== undefined) args.itemRef = instance.itemRef;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is PayloadItemInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'PayloadItem';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): PayloadItemInstance {\n const data: SerializedData<PayloadItemCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { PayloadItemInstance } from './PayloadItem.js';\n\nexport interface PayloadInstance extends IInstance {\n items: PayloadItemInstance[];\n}\n\nexport interface PayloadCreateArgs {\n items?: PayloadItemInstance[];\n}\n\nexport class Payload implements PayloadInstance {\n public uuid: string;\n public _type = 'Payload';\n public _options?: { uuid?: string };\n public items: PayloadItemInstance[];\n \n constructor(args: PayloadCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.items = args.items || [];\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Payload';\n static instances: PayloadInstance[] = [];\n \n static public = {\n items: {\n type: 'PayloadItem' as const,\n collection: true as const,\n required: true as const,\n defaultValue: () => []\n }\n };\n \n static create(args: PayloadCreateArgs, options?: { uuid?: string }): PayloadInstance {\n const instance = new Payload(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Payload`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: PayloadInstance): string {\n const data: SerializedData<PayloadCreateArgs> = {\n type: 'Payload',\n options: instance._options,\n uuid: instance.uuid,\n public: {\n items: instance.items\n }\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: PayloadInstance, deep: boolean): PayloadInstance {\n return this.create({\n items: instance.items\n });\n }\n \n static is(obj: unknown): obj is PayloadInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Payload';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): PayloadInstance {\n const data: SerializedData<PayloadCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\n\nexport interface SideEffectInstance extends IInstance {\n name: string;\n handle: Function;\n}\n\nexport interface SideEffectCreateArgs {\n name: string;\n handle: Function;\n}\n\nexport class SideEffect implements SideEffectInstance {\n public uuid: string;\n public _type = 'SideEffect';\n public _options?: { uuid?: string };\n public name: string;\n public handle: Function;\n \n constructor(args: SideEffectCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.handle = args.handle;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'SideEffect';\n static instances: SideEffectInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n required: true as const,\n collection: false as const\n },\n handle: {\n type: 'function' as const,\n required: true as const,\n collection: false as const\n }\n };\n \n static create(args: SideEffectCreateArgs, options?: { uuid?: string }): SideEffectInstance {\n const instance = new SideEffect(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, SideEffect`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: SideEffectInstance): string {\n const args: SideEffectCreateArgs = {\n name: instance.name,\n handle: stringifyAttribute(instance.handle) as Function\n };\n \n const data: SerializedData<SideEffectCreateArgs> = {\n type: 'SideEffect',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: SideEffectInstance, deep: boolean): SideEffectInstance {\n return this.create({\n name: instance.name,\n handle: instance.handle\n });\n }\n \n static is(obj: unknown): obj is SideEffectInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'SideEffect';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): SideEffectInstance {\n const data: SerializedData<SideEffectCreateArgs> = JSON.parse(json);\n const args = data.public;\n \n // 反序列化函数\n if (args.handle && typeof args.handle === 'string' && (args.handle as any).startsWith('func::')) {\n args.handle = new Function('return ' + (args.handle as any).substring(6))();\n }\n \n return this.create(args, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport { BoolAtomDataInstance, BoolExpressionDataInstance, BoolExp, BoolAtomData, BoolExpressionData } from './BoolExp.js';\n\nexport interface ConditionsInstance extends IInstance {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n}\n\nexport interface ConditionsCreateArgs {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance | BoolExp<any>;\n}\n\n// 内部转换函数\nfunction convertBoolExpToData(obj?: BoolExp<any>): BoolAtomData | BoolExpressionData | undefined {\n if (!obj) return undefined;\n\n if (obj.raw.type === 'atom') {\n return BoolAtomData.create({\n type: 'atom',\n data: obj.raw.data as unknown as { content?: Function; [key: string]: unknown }\n });\n }\n\n const expData = obj.raw as any;\n return BoolExpressionData.create({\n type: 'expression',\n operator: expData.operator,\n left: convertBoolExpToData(obj.left) as BoolAtomData | BoolExpressionData,\n right: convertBoolExpToData(obj.right) as BoolAtomData | BoolExpressionData | undefined,\n });\n}\n\nexport class Conditions implements ConditionsInstance {\n public uuid: string;\n public _type = 'Conditions';\n public _options?: { uuid?: string };\n public content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n \n constructor(args: ConditionsCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n // 如果 content 是 BoolExp,转换为正确的格式\n if (args.content && args.content instanceof BoolExp) {\n this.content = convertBoolExpToData(args.content);\n } else {\n this.content = args.content as BoolExpressionDataInstance | BoolAtomDataInstance | undefined;\n }\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Conditions';\n static instances: ConditionsInstance[] = [];\n \n static public = {\n content: {\n type: ['BoolExpressionData', 'BoolAtomData'] as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: ConditionsCreateArgs, options?: { uuid?: string }): ConditionsInstance {\n const instance = new Conditions(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Conditions`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: ConditionsInstance): string {\n const args: Partial<ConditionsCreateArgs> = {};\n if (instance.content !== undefined) args.content = stringifyAttribute(instance.content) as BoolAtomDataInstance | BoolExpressionDataInstance;\n \n const data: SerializedData<ConditionsCreateArgs> = {\n type: 'Conditions',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: ConditionsInstance, deep: boolean): ConditionsInstance {\n const args: ConditionsCreateArgs = {};\n if (instance.content !== undefined) args.content = instance.content;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is ConditionsInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Conditions';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): ConditionsInstance {\n const data: SerializedData<ConditionsCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport { BoolAtomDataInstance, BoolExpressionDataInstance } from './BoolExp.js';\n\nexport interface DataAttributivesInstance extends IInstance {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n}\n\nexport interface DataAttributivesCreateArgs {\n content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n}\n\nexport class DataAttributives implements DataAttributivesInstance {\n public uuid: string;\n public _type = 'DataAttributives';\n public _options?: { uuid?: string };\n public content?: BoolExpressionDataInstance | BoolAtomDataInstance;\n \n constructor(args: DataAttributivesCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.content = args.content;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'DataAttributives';\n static instances: DataAttributivesInstance[] = [];\n \n static public = {\n content: {\n type: ['BoolExpressionData', 'BoolAtomData'] as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: DataAttributivesCreateArgs, options?: { uuid?: string }): DataAttributivesInstance {\n const instance = new DataAttributives(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, DataAttributives`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: DataAttributivesInstance): string {\n const args: Partial<DataAttributivesCreateArgs> = {};\n if (instance.content !== undefined) args.content = stringifyAttribute(instance.content) as BoolAtomDataInstance | BoolExpressionDataInstance;\n \n const data: SerializedData<DataAttributivesCreateArgs> = {\n type: 'DataAttributives',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: DataAttributivesInstance, deep: boolean): DataAttributivesInstance {\n const args: DataAttributivesCreateArgs = {};\n if (instance.content !== undefined) args.content = instance.content;\n \n return this.create(args);\n }\n \n static is(obj: unknown): obj is DataAttributivesInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'DataAttributives';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): DataAttributivesInstance {\n const data: SerializedData<DataAttributivesCreateArgs> = JSON.parse(json);\n return this.create(data.public, data.options);\n }\n} ","// 初始化文件 - 注册所有重构后的类到 KlassByName 以保持向后兼容\n\nimport { KlassByName, registerKlass } from './utils.js';\nimport { Entity } from './Entity.js';\nimport { Relation } from './Relation.js';\nimport { Property } from './Property.js';\nimport { Interaction } from './Interaction.js';\nimport { Activity } from './Activity.js';\nimport { Attributive } from './Attributive.js';\nimport { Condition } from './Condition.js';\nimport { DataAttributive } from './Data.js';\nimport { Action } from './Action.js';\nimport { Gateway } from './Gateway.js';\nimport { Event } from './Event.js';\nimport { StateNode } from './StateNode.js';\nimport { StateTransfer } from './StateTransfer.js';\nimport { StateMachine } from './StateMachine.js';\nimport { WeightedSummation } from './WeightedSummation.js';\nimport { Count } from './Count.js';\nimport { Summation } from './Summation.js';\nimport { Average } from './Average.js';\nimport { Every } from './Every.js';\nimport { Any } from './Any.js';\nimport { Transform } from './Transform.js';\nimport { RealTime } from './RealTime.js';\nimport { PayloadItem } from './PayloadItem.js';\nimport { Payload } from './Payload.js';\nimport { SideEffect } from './SideEffect.js';\nimport { Dictionary } from './RealDictionary.js';\nimport { BoolAtomData, BoolExpressionData } from './BoolExp.js';\nimport { Conditions } from './Conditions.js';\nimport { DataAttributives } from './DataAttributives.js';\n\n// 注册所有类\nconst klassesToRegister = [\n Entity,\n Relation,\n Property,\n Interaction,\n Activity,\n Attributive,\n Condition,\n DataAttributive,\n Action,\n Gateway,\n Event,\n StateNode,\n StateTransfer,\n StateMachine,\n WeightedSummation,\n Count,\n Summation,\n Average,\n Every,\n Any,\n Transform,\n RealTime,\n PayloadItem,\n Payload,\n SideEffect,\n Dictionary,\n BoolAtomData,\n BoolExpressionData,\n Conditions,\n DataAttributives\n];\n\n// 注册每个类\nklassesToRegister.forEach(klass => {\n if (klass && klass.displayName) {\n registerKlass(klass.displayName, klass);\n }\n});\n\n// 导出已填充的 KlassByName\nexport { KlassByName }; ","import { IInstance, SerializedData, generateUUID } from './interfaces.js';\nimport { stringifyAttribute } from './utils.js';\nimport { DataDep } from './Computation.js';\n\nexport interface CustomInstance extends IInstance {\n name: string;\n dataDeps?: { [key: string]: any };\n compute?: Function; // (dataDeps: any, record?: any) => any\n incrementalCompute?: Function; // (lastValue: any, mutationEvent: any, record: any, dataDeps: any) => any\n incrementalPatchCompute?: Function; // (lastValue: any, mutationEvent: any, record: any, dataDeps: any) => any\n createState?: Function; // () => { [key: string]: BoundState }\n getDefaultValue?: Function; // () => any\n asyncReturn?: Function; // (asyncResult: any, dataDeps: any, record?: any) => any\n useLastValue?: boolean;\n}\n\nexport interface CustomCreateArgs {\n name: string;\n dataDeps?: { [key: string]: DataDep };\n compute?: Function;\n incrementalCompute?: Function;\n incrementalPatchCompute?: Function;\n createState?: Function;\n getDefaultValue?: Function;\n asyncReturn?: Function;\n useLastValue?: boolean;\n}\n\nexport class Custom implements CustomInstance {\n public uuid: string;\n public _type = 'Custom';\n public _options?: { uuid?: string };\n public name: string;\n public dataDeps?: { [key: string]: any };\n public compute?: Function;\n public incrementalCompute?: Function;\n public incrementalPatchCompute?: Function;\n public createState?: Function;\n public getDefaultValue?: Function;\n public asyncReturn?: Function;\n public useLastValue?: boolean;\n \n constructor(args: CustomCreateArgs, options?: { uuid?: string }) {\n this._options = options;\n this.uuid = generateUUID(options);\n this.name = args.name;\n this.dataDeps = args.dataDeps;\n this.compute = args.compute;\n this.incrementalCompute = args.incrementalCompute;\n this.incrementalPatchCompute = args.incrementalPatchCompute;\n this.createState = args.createState;\n this.getDefaultValue = args.getDefaultValue;\n this.asyncReturn = args.asyncReturn;\n this.useLastValue = args.useLastValue;\n }\n \n // 静态属性和方法\n static isKlass = true as const;\n static displayName = 'Custom';\n static instances: CustomInstance[] = [];\n \n static public = {\n name: {\n type: 'string' as const,\n collection: false as const,\n required: true as const\n },\n dataDeps: {\n type: 'object' as const,\n collection: false as const,\n required: false as const\n },\n compute: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n incrementalCompute: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n incrementalPatchCompute: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n createState: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n getDefaultValue: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n asyncReturn: {\n type: 'function' as const,\n collection: false as const,\n required: false as const\n },\n useLastValue: {\n type: 'boolean' as const,\n collection: false as const,\n required: false as const\n }\n };\n \n static create(args: CustomCreateArgs, options?: { uuid?: string }): CustomInstance {\n const instance = new Custom(args, options);\n \n // 检查 uuid 是否重复\n const existing = this.instances.find(i => i.uuid === instance.uuid);\n if (existing) {\n throw new Error(`duplicate uuid in options ${instance.uuid}, Custom`);\n }\n \n this.instances.push(instance);\n return instance;\n }\n \n static stringify(instance: CustomInstance): string {\n const args: any = {\n name: instance.name\n };\n if (instance.dataDeps !== undefined) args.dataDeps = stringifyAttribute(instance.dataDeps);\n if (instance.compute !== undefined) args.compute = stringifyAttribute(instance.compute) as Function;\n if (instance.incrementalCompute !== undefined) args.incrementalCompute = stringifyAttribute(instance.incrementalCompute) as Function;\n if (instance.incrementalPatchCompute !== undefined) args.incrementalPatchCompute = stringifyAttribute(instance.incrementalPatchCompute) as Function;\n if (instance.createState !== undefined) args.createState = stringifyAttribute(instance.createState) as Function;\n if (instance.getDefaultValue !== undefined) args.getDefaultValue = stringifyAttribute(instance.getDefaultValue) as Function;\n if (instance.asyncReturn !== undefined) args.asyncReturn = stringifyAttribute(instance.asyncReturn) as Function;\n if (instance.useLastValue !== undefined) args.useLastValue = instance.useLastValue;\n \n const data: SerializedData<any> = {\n type: 'Custom',\n options: instance._options,\n uuid: instance.uuid,\n public: args\n };\n return JSON.stringify(data);\n }\n \n static clone(instance: CustomInstance, deep: boolean): CustomInstance {\n return this.create({\n name: instance.name,\n dataDeps: instance.dataDeps,\n compute: instance.compute,\n incrementalCompute: instance.incrementalCompute,\n incrementalPatchCompute: instance.incrementalPatchCompute,\n createState: instance.createState,\n getDefaultValue: instance.getDefaultValue,\n asyncReturn: instance.asyncReturn,\n useLastValue: instance.useLastValue\n });\n }\n \n static is(obj: unknown): obj is CustomInstance {\n return obj !== null && typeof obj === 'object' && '_type' in obj && (obj as IInstance)._type === 'Custom';\n }\n \n static check(data: unknown): boolean {\n return data !== null && typeof data === 'object' && typeof (data as IInstance).uuid === 'string';\n }\n \n static parse(json: string): CustomInstance {\n const data = JSON.parse(json) as SerializedData<any>;\n const args = { ...data.public };\n \n // 反序列化函数\n const functionFields = ['compute', 'incrementalCompute', 'incrementalPatchCompute', 'createState', 'getDefaultValue', 'asyncReturn'];\n functionFields.forEach(field => {\n if (typeof args[field] === 'string' && args[field].startsWith('func::')) {\n args[field] = new Function('return ' + args[field].substring(6))();\n }\n });\n \n return this.create(args as CustomCreateArgs, data.options);\n }\n} ","import { EntityInstance, Entity } from './Entity.js';\nimport { RelationInstance, Relation } from './Relation.js';\n\n/**\n * RefContainer - A utility class for managing entity and relation reference replacement\n * \n * This class helps replace entities/relations and automatically update all references\n * throughout the object graph without modifying the original objects.\n */\nexport class RefContainer {\n private clonedEntities: Map<EntityInstance, EntityInstance>;\n private clonedRelations: Map<RelationInstance, RelationInstance>;\n private reverseEntityMap: Map<EntityInstance, EntityInstance>; // Map from cloned to original\n private reverseRelationMap: Map<RelationInstance, RelationInstance>; // Map from cloned to original\n private originalEntities: EntityInstance[];\n private originalRelations: RelationInstance[];\n\n constructor(originalEntities: EntityInstance[] = [], originalRelations: RelationInstance[] = []) {\n this.clonedEntities = new Map();\n this.clonedRelations = new Map();\n this.reverseEntityMap = new Map();\n this.reverseRelationMap = new Map();\n this.originalEntities = [...originalEntities];\n this.originalRelations = [...originalRelations];\n \n // Clone all entities and relations immediately if provided\n if (originalEntities.length > 0 || originalRelations.length > 0) {\n this.initializeClones();\n }\n }\n \n /**\n * Initialize clones for all entities and relations\n */\n private initializeClones(): void {\n // Clone all entities\n for (const entity of this.originalEntities) {\n const cloned = Entity.clone(entity, false);\n this.clonedEntities.set(entity, cloned);\n this.reverseEntityMap.set(cloned, entity);\n }\n \n // Clone all relations\n for (const relation of this.originalRelations) {\n const cloned = Relation.clone(relation, false);\n this.clonedRelations.set(relation, cloned);\n this.reverseRelationMap.set(cloned, relation);\n }\n \n // Update all references\n this.updateAllReferences();\n }\n \n /**\n * Add a new entity to the container\n */\n addEntity(entity: EntityInstance): EntityInstance {\n // Check if the entity already exists\n for (const [original] of this.clonedEntities) {\n if (original === entity || original.uuid === entity.uuid) {\n throw new Error(`Entity already exists in container: ${entity.name}`);\n }\n }\n \n // Add to originals\n this.originalEntities.push(entity);\n \n // Clone the entity\n const cloned = Entity.clone(entity, false);\n \n // Update maps\n this.clonedEntities.set(entity, cloned);\n this.reverseEntityMap.set(cloned, entity);\n \n // Update references in the new entity\n this.updateReferencesInObject(cloned);\n \n // Update references to the new entity in existing objects\n // (This is typically not needed for adding, but included for completeness)\n \n return cloned;\n }\n \n /**\n * Add a new relation to the container\n */\n addRelation(relation: RelationInstance): RelationInstance {\n // Check if the relation already exists\n for (const [original] of this.clonedRelations) {\n if (original === relation || original.uuid === relation.uuid) {\n throw new Error(`Relation already exists in container: ${relation.name}`);\n }\n }\n \n // Add to originals\n this.originalRelations.push(relation);\n \n // Clone the relation\n const cloned = Relation.clone(relation, false);\n \n // Update maps\n this.clonedRelations.set(relation, cloned);\n this.reverseRelationMap.set(cloned, relation);\n \n // Update references in the new relation\n this.updateReferencesInObject(cloned);\n \n return cloned;\n }\n \n /**\n * Update references in a single object (entity or relation)\n */\n private updateReferencesInObject(obj: EntityInstance | RelationInstance): void {\n if ('baseEntity' in obj && obj.baseEntity) {\n // It's an entity with baseEntity\n const replacement = this.findReplacement(obj.baseEntity);\n if (replacement) {\n obj.baseEntity = replacement;\n }\n }\n \n if ('inputEntities' in obj && obj.inputEntities) {\n // It's an entity with inputEntities\n obj.inputEntities = obj.inputEntities.map(inputEntity => {\n const replacement = this.findReplacement(inputEntity);\n return (replacement || inputEntity) as EntityInstance;\n });\n }\n \n if ('source' in obj && obj.source) {\n // It's a relation with source\n const replacement = this.findReplacement(obj.source);\n if (replacement) {\n obj.source = replacement;\n }\n }\n \n if ('target' in obj && obj.target) {\n // It's a relation with target\n const replacement = this.findReplacement(obj.target);\n if (replacement) {\n obj.target = replacement;\n }\n }\n \n if ('baseRelation' in obj && obj.baseRelation) {\n // It's a relation with baseRelation\n const replacement = this.findReplacement(obj.baseRelation);\n if (replacement) {\n obj.baseRelation = replacement as RelationInstance;\n }\n }\n\n if('inputRelations' in obj && obj.inputRelations) {\n obj.inputRelations = obj.inputRelations.map(inputRelation => {\n const replacement = this.findReplacement(inputRelation);\n return (replacement || inputRelation) as RelationInstance;\n });\n }\n }\n \n /**\n * Update all references in cloned entities and relations\n */\n private updateAllReferences(): void {\n // Update references in entities\n for (const cloned of this.clonedEntities.values()) {\n // Update baseEntity reference\n if (cloned.baseEntity) {\n const replacement = this.findReplacement(cloned.baseEntity);\n if (replacement) {\n cloned.baseEntity = replacement;\n }\n }\n\n // Update inputEntities references\n if (cloned.inputEntities) {\n cloned.inputEntities = cloned.inputEntities.map(inputEntity => {\n const replacement = this.findReplacement(inputEntity);\n return (replacement || inputEntity) as EntityInstance;\n });\n }\n }\n \n // Update references in relations\n for (const cloned of this.clonedRelations.values()) {\n // Update source reference\n if (cloned.source) {\n const replacement = this.findReplacement(cloned.source);\n if (replacement) {\n cloned.source = replacement;\n }\n }\n\n // Update target reference\n if (cloned.target) {\n const replacement = this.findReplacement(cloned.target);\n if (replacement) {\n cloned.target = replacement;\n }\n }\n\n // Update baseRelation reference\n if (cloned.baseRelation) {\n const replacement = this.findReplacement(cloned.baseRelation);\n if (replacement) {\n cloned.baseRelation = replacement as RelationInstance;\n }\n }\n\n if(cloned.inputRelations) {\n cloned.inputRelations = cloned.inputRelations.map(inputRelation => {\n const replacement = this.findReplacement(inputRelation);\n return (replacement || inputRelation) as RelationInstance;\n });\n }\n }\n }\n\n /**\n * Replace an entity with a new one and update all references immediately\n */\n replaceEntity(newEntity: EntityInstance, oldEntity: EntityInstance): void {\n // Find the original entity key\n let originalKey: EntityInstance | undefined;\n \n // Check if oldEntity is an original entity\n if (this.clonedEntities.has(oldEntity)) {\n originalKey = oldEntity;\n } else {\n // Check if oldEntity is a cloned entity\n originalKey = this.reverseEntityMap.get(oldEntity);\n if (!originalKey) {\n // Try to find by uuid\n for (const [original, cloned] of this.clonedEntities) {\n if (cloned === oldEntity || cloned.uuid === oldEntity.uuid) {\n originalKey = original;\n break;\n }\n }\n }\n }\n \n if (!originalKey) {\n throw new Error(`Entity to be replaced not found in container: ${oldEntity.name}`);\n }\n \n // Get the old cloned entity that we're replacing\n const oldCloned = this.clonedEntities.get(originalKey);\n \n // Clone the new entity\n const clonedNew = newEntity;\n \n // Update the maps\n this.clonedEntities.set(originalKey, clonedNew);\n if (oldCloned) {\n this.reverseEntityMap.delete(oldCloned);\n }\n this.reverseEntityMap.set(clonedNew, originalKey);\n \n // Update all references from the old cloned entity to the new one\n if (oldCloned) {\n this.updateSpecificReferences(oldCloned, clonedNew);\n }\n }\n\n /**\n * Replace a relation with a new one and update all references immediately\n */\n replaceRelation(newRelation: RelationInstance, oldRelation: RelationInstance): void {\n // Find the original relation key\n let originalKey: RelationInstance | undefined;\n \n // Check if oldRelation is an original relation\n if (this.clonedRelations.has(oldRelation)) {\n originalKey = oldRelation;\n } else {\n // Check if oldRelation is a cloned relation\n originalKey = this.reverseRelationMap.get(oldRelation);\n }\n \n if (!originalKey) {\n throw new Error(`Relation to be replaced not found in container: ${oldRelation.name}`);\n }\n \n // Get the old cloned relation that we're replacing\n const oldCloned = this.clonedRelations.get(originalKey);\n \n // Clone the new relation\n const clonedNew = newRelation\n \n // Update the maps\n this.clonedRelations.set(originalKey, clonedNew);\n if (oldCloned) {\n this.reverseRelationMap.delete(oldCloned);\n }\n this.reverseRelationMap.set(clonedNew, originalKey);\n \n // Update all references from the old cloned relation to the new one\n if (oldCloned) {\n this.updateSpecificReferences(oldCloned, clonedNew);\n }\n }\n \n /**\n * Update all references from an old object to a new object\n */\n private updateSpecificReferences(\n oldObj: EntityInstance | RelationInstance,\n newObj: EntityInstance | RelationInstance\n ): void {\n // Update references in all entities\n for (const entity of this.clonedEntities.values()) {\n // Update baseEntity reference\n if (entity.baseEntity === oldObj) {\n entity.baseEntity = newObj as EntityInstance | RelationInstance;\n }\n \n // Update inputEntities references\n if (entity.inputEntities) {\n entity.inputEntities = entity.inputEntities.map(inputEntity => \n inputEntity === oldObj ? (newObj as EntityInstance) : inputEntity\n );\n }\n }\n \n // Update references in all relations\n for (const relation of this.clonedRelations.values()) {\n // Update source reference\n if (relation.source === oldObj) {\n relation.source = newObj as EntityInstance | RelationInstance;\n }\n \n // Update target reference\n if (relation.target === oldObj) {\n relation.target = newObj as EntityInstance | RelationInstance;\n }\n \n // Update baseRelation reference\n if (relation.baseRelation === oldObj) {\n relation.baseRelation = newObj as RelationInstance;\n }\n\n if(relation.inputRelations) {\n relation.inputRelations = relation.inputRelations.map(inputRelation => \n inputRelation === oldObj ? (newObj as RelationInstance) : inputRelation\n );\n }\n }\n }\n \n /**\n * Get entity by name after all replacements\n */\n getEntityByName(name: string): EntityInstance | undefined {\n for (const entity of this.clonedEntities.values()) {\n if (entity.name === name) {\n return entity;\n }\n }\n return undefined;\n }\n\n /**\n * Get relation by name after all replacements\n */\n getRelationByName(name: string): RelationInstance | undefined {\n for (const relation of this.clonedRelations.values()) {\n const relationName = relation.name || `${relation.source.name}_${relation.sourceProperty}_${relation.targetProperty}_${relation.target.name}`;\n if (relationName === name) {\n return relation;\n }\n }\n return undefined;\n }\n\n /**\n * Get all entities and relations after replacement\n */\n getAll(): { entities: EntityInstance[], relations: RelationInstance[] } {\n return {\n entities: Array.from(this.clonedEntities.values()),\n relations: Array.from(this.clonedRelations.values())\n };\n }\n\n /**\n * Unified replace method - automatically determines if it's an entity or relation\n */\n replace(newItem: EntityInstance | RelationInstance, oldItem: EntityInstance | RelationInstance): void {\n if (this.isEntity(newItem) && this.isEntity(oldItem)) {\n this.replaceEntity(newItem as EntityInstance, oldItem as EntityInstance);\n } else if (this.isRelation(newItem) && this.isRelation(oldItem)) {\n this.replaceRelation(newItem as RelationInstance, oldItem as RelationInstance);\n } else {\n throw new Error('Type mismatch: both items must be either entities or relations');\n }\n }\n\n /**\n * Unified getByName method - searches both entities and relations\n */\n getByName(name: string): EntityInstance | RelationInstance | undefined {\n const entity = this.getEntityByName(name);\n if (entity) return entity;\n return this.getRelationByName(name);\n }\n\n /**\n * Unified add method - automatically determines if it's an entity or relation\n */\n add(item: EntityInstance | RelationInstance): EntityInstance | RelationInstance {\n if (this.isEntity(item)) {\n return this.addEntity(item as EntityInstance);\n } else {\n return this.addRelation(item as RelationInstance);\n }\n }\n\n /**\n * Helper method to determine if an item is an entity\n */\n private isEntity(item: EntityInstance | RelationInstance): boolean {\n return !('sourceProperty' in item);\n }\n\n /**\n * Helper method to determine if an item is a relation\n */\n private isRelation(item: EntityInstance | RelationInstance): boolean {\n return 'sourceProperty' in item;\n }\n\n /**\n * Find replacement for an entity or relation in the cloned maps\n */\n private findReplacement(\n obj: EntityInstance | RelationInstance\n ): EntityInstance | RelationInstance | null {\n // First check if this object is already a cloned one\n for (const cloned of this.clonedEntities.values()) {\n if (cloned === obj || cloned.uuid === obj.uuid) {\n return cloned;\n }\n }\n \n for (const cloned of this.clonedRelations.values()) {\n if (cloned === obj || cloned.uuid === obj.uuid) {\n return cloned;\n }\n }\n \n // Then check if it's an original object\n for (const [original, cloned] of this.clonedEntities) {\n if (original === obj || original.uuid === obj.uuid) {\n return cloned;\n }\n }\n \n for (const [original, cloned] of this.clonedRelations) {\n if (original === obj || original.uuid === obj.uuid) {\n return cloned;\n }\n }\n \n return null;\n }\n} ","// User utility functions (not a class)\n\nimport { AttributiveInstance, Attributive } from './Attributive.js';\nimport type { UserRoleType } from './types.js';\n\nexport interface UserRoleAttributiveOptions {\n name?: string;\n isRef?: boolean;\n}\n\nexport interface AttributiveCreateOptions {\n uuid?: string;\n}\n\nexport function createUserRoleAttributive(\n { name, isRef = false }: UserRoleAttributiveOptions, \n options?: AttributiveCreateOptions\n): AttributiveInstance {\n return Attributive.create({\n name,\n content: name ?\n new Function('user', `return user.roles.includes('${name}')`) as (user: UserRoleType) => boolean :\n function anyone() { return true },\n isRef\n }, options);\n} ","import { createClass, Entity, Property } from \"@shared\";\nimport { GlobalBoundState } from \"./computations/Computation.js\";\nimport { RecordBoundState } from \"./computations/Computation.js\";\nimport { EntityInstance, RelationInstance } from \"@shared\";\nimport { DataContext } from \"./computations/Computation.js\";\nimport { InteractionEvent } from \"./activity/InteractionCall.js\";\nexport type SystemCallback = (...arg: any[]) => any\nexport type RecordMutationCallback = (mutationEvents:RecordMutationEvent[]) => Promise<{ events?: RecordMutationEvent[] } |undefined|void>\nexport const SYSTEM_RECORD = '_System_'\nexport const DICTIONARY_RECORD = '_Dictionary_'\nexport type Storage = {\n // 将 entity 映射到表结构的 map\n map: any\n // transaction\n beginTransaction: (transactionName?:string) => Promise<any>\n commitTransaction: (transactionName?:string) => Promise<any>\n rollbackTransaction: (transactionName?:string) => Promise<any>\n\n // kv 存储\n get: (itemName: string, id: string, initialValue?: any) => Promise<any>\n set: (itemName: string, id: string, value: any, events?: RecordMutationEvent[]) => Promise<any>,\n // er存储\n setup: (entities: EntityInstance[], relations: RelationInstance[], createTables?: boolean) => any\n findOne: (entityName: string, ...arg: any[]) => Promise<any>,\n update: (entityName: string, ...arg: any[]) => Promise<any>,\n find: (entityName: string, ...arg: any[]) => Promise<any[]>,\n create: (entityName: string, data:any, events?: RecordMutationEvent[]) => Promise<any>\n delete: (entityName: string, data:any, events?: RecordMutationEvent[]) => Promise<any>\n findOneRelationByName: (relationName: string, ...arg: any[]) => Promise<any>\n findRelationByName: (relationName: string, ...arg: any[]) => Promise<any>\n updateRelationByName: (relationName: string, matchExpressionData: any, rawData: any, events?: RecordMutationEvent[]) => Promise<any>\n removeRelationByName: (relationName: string, matchExpressionData: any, events?: RecordMutationEvent[]) => Promise<any>\n addRelationByNameById: (relationName: string, sourceEntityId: string, targetEntityId: string, rawData?: any, events?: RecordMutationEvent[]) => Promise<any>\n getRelationName: (...arg: any[]) => string\n getEntityName: (...arg: any[]) => string\n listen: (callback: RecordMutationCallback) => any\n destroy: () => Promise<any>\n}\n\nexport type RecordMutationEvent = {\n recordName: string,\n type: 'create' | 'update' | 'delete',\n keys?: string[],\n record?:EntityIdRef & {\n [key: string]: any\n },\n oldRecord?: EntityIdRef & {\n [key: string]: any\n },\n}\n\nexport type SystemLogger = {\n error: (arg: SystemLogType) => any,\n info: (arg: SystemLogType) => any,\n debug: (arg: SystemLogType) => any,\n child:(fixed: object) => SystemLogger,\n}\n\nexport type SystemLogType = {\n label: string,\n message: string,\n [k: string]: any\n}\n\nexport type ComputationState = {dataContext: DataContext, state: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}}\n\nexport interface System {\n conceptClass: Map<string, ReturnType<typeof createClass>>\n storage: Storage\n logger: SystemLogger\n setup: (entities: EntityInstance[], relations: RelationInstance[], states: ComputationState[], install?: boolean) => Promise<any>\n}\n\nexport type EntityIdRef = {\n id: string,\n [ROW_ID_ATTR]? : string,\n [k:string]: any\n}\n\nexport const ID_ATTR = 'id'\nexport const ROW_ID_ATTR = '_rowId'\n\nexport type DatabaseLogger = {\n info: (arg: {type: string, name: string, sql: string, params?: any[]}) => any,\n error: (arg: {type: string, name: string, sql: string, params?: any[], error: string}) => any,\n child:(fixed: object) => DatabaseLogger,\n}\n\n// FIXME 这里应该继承自 storage?\nexport type Database = {\n open: (forceDrop?:boolean) => Promise<any>\n logger: DatabaseLogger\n scheme: (sql:string, name?:string) => Promise<any>\n query: <T extends any>(sql: string, values: any[],name?:string) => Promise<T[]>\n delete: <T extends any>(sql: string, where: any[], name?:string) => Promise<T[]>\n insert: (sql: string, values: any[], name?:string) => Promise<EntityIdRef>\n update: (sql: string, values: any[], idField?: string, name?:string) => Promise<EntityIdRef[]>\n getAutoId: (recordName: string) => Promise<string>,\n parseMatchExpression?: (key: string, value: [string, any], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue:(v: string) => string, genPlaceholder: (name?: string) => string) => any\n getPlaceholder?: () => (name?:string) => string,\n mapToDBFieldType: (type: string, collection?: boolean) => string\n close: () => Promise<any>\n} // activity 数据\n// state 等系统配置数据的实体化\n// FIXME 应该独立到外部\nexport const SystemEntity = Entity.create({\n name: SYSTEM_RECORD,\n properties: [\n Property.create({\n name: 'concept',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'key',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'value',\n type: 'string',\n collection: false,\n })\n ]\n})\n\ntype EntityType = {\n name: string,\n properties: {\n name: string,\n type: string,\n collection: boolean,\n required?: boolean\n }[]\n}\n\ntype InferType<T> = T extends { type: 'string' } ? string :\n T extends { type: 'number' } ? number :\n // 添加更多类型映射\n unknown;\n\nexport type InteractionEventRecord = InteractionEvent & EntityIdRef\n","export function assert(condition: any, message: string ) {\n if (!condition) {\n // if (__DEV__) debugger\n throw new Error(message)\n }\n}\n\nexport function filterMap(map: Map<any, any>, handle: (key: any, value: any) => boolean) {\n return new Map(Array.from(map.entries()).map(([key, value]) => [key, handle(key, value)]))\n}\n\n\nexport function indexBy(arr: any[], key: string) {\n return Object.fromEntries(arr.map(o => [o[key], o]))\n}\n\nexport function mapObject(a: object, fn: (k: string, v: any) => any) {\n return Object.fromEntries(Object.entries(a).map(([k, v]) => [k, fn(k, v)]))\n}\n\nexport async function everyAsync<T>(items: T[], check: (arg:T) => Promise<boolean>) {\n for(let item of items) {\n const result = await check(item)\n if (!result) return false\n }\n return true\n}\n\nexport async function someAsync(arr: any[], handle: (t:any) => Promise<boolean>): Promise<boolean> {\n for(let i of arr) {\n if (await handle(i)) return true\n }\n return false\n}\n\nexport async function everyWithErrorAsync<T, U>(items: T[], check: (arg:T) => Promise<true|U>) : Promise<true|U> {\n for(let item of items) {\n const result = await check(item)\n if (result!== true) return result\n }\n return true\n}","export function assert(condition: any, message: string ) {\n if (!condition) {\n // if (__DEV__) debugger\n throw new Error(message)\n }\n}\n\ntype ObjectContainer = {\n [k:string]: ObjectContainer|any\n}\n\nexport function setByPath(root: ObjectContainer, inputPath: string[], value: any) {\n const path = [...inputPath]\n let pointer = root\n let nextAttr\n const lastAttr = path.pop()!\n while(nextAttr = path.shift()) {\n if (!pointer[nextAttr]) pointer[nextAttr] = {}\n pointer = pointer[nextAttr]\n }\n\n pointer[lastAttr] = value\n return true\n}\n\n\nexport function mapTree(root: ObjectContainer, iteratorKeys: string[], fn: (object: any, context :string[]) => any, context: string[] = []) {\n const result = fn(root, context)\n iteratorKeys.forEach(key => {\n if (result[key]) result[key] = mapTree(result[key] as ObjectContainer, iteratorKeys, fn, context.concat(key))\n })\n\n return result\n}\n\n\nexport function deepMerge(a: ObjectContainer, b: ObjectContainer) {\n const result: any = {}\n const keys = new Set(Object.keys(a).concat(Object.keys(b)))\n keys.forEach(k => {\n if (a[k] && b[k]) {\n assert(typeof a[k] === 'object' && typeof b[k]=== 'object', `${a[k]} or ${b[k]} is not object, cannot deep merge`)\n result[k] = deepMerge(a[k], b[k])\n } else if (a[k]) {\n result[k] = a[k]\n } else {\n result[k] = b[k]\n }\n })\n return result\n}\n\n\nexport function indexBy(arr: any[], key: string) {\nreturn Object.fromEntries(arr.map(o => [o[key], o]))\n}","import {assert} from \"../utils.js\";\nimport {EntityToTableMap, RecordAttribute, ValueAttribute} from \"./EntityToTableMap.js\";\n\nexport class AttributeInfo {\n public data: ValueAttribute | RecordAttribute\n\n constructor(public parentEntityName: string, public attributeName: string, public map: EntityToTableMap, public symmetricDirection?: 'source'|'target') {\n this.data = this.map.getAttributeData(parentEntityName, attributeName)\n assert(!!this.data, `${parentEntityName} has no attribute: ${attributeName}`)\n }\n\n get isRecord() {\n return (this.data as RecordAttribute).isRecord\n }\n\n get isValue() {\n return !(this.data as RecordAttribute).isRecord\n }\n\n get isCollection() {\n return this.isValue && (this.data as ValueAttribute).collection\n }\n\n get isComputed() {\n return this.isValue && (this.data as ValueAttribute).computed\n }\n\n get fieldType() {\n if (this.isRecord) throw new Error('not a value attribute')\n return (this.data as ValueAttribute).fieldType\n }\n\n get computed() {\n if (!this.isComputed) throw new Error('not a computed attribute')\n return (this.data as ValueAttribute).computed\n }\n\n get isManyToOne() {\n if (!this.isRecord) throw new Error('not a entity')\n const data = (this.data as RecordAttribute)\n return data.relType[0] === 'n' && data.relType[1] === '1'\n }\n\n get isManyToMany() {\n if (!this.isRecord) throw new Error('not a entity')\n const data = (this.data as RecordAttribute)\n return data.relType[0] === 'n' && data.relType[1] === 'n'\n }\n\n get isOneToOne() {\n if (!this.isRecord) throw new Error('not a entity')\n const data = (this.data as RecordAttribute)\n return data.relType[0] === '1' && data.relType[1] === '1'\n }\n\n get isOneToMany() {\n if (!this.isRecord) throw new Error('not a entity')\n const data = (this.data as RecordAttribute)\n return data.relType[0] === '1' && data.relType[1] === 'n'\n }\n\n get isXToOne() {\n return this.isManyToOne || this.isOneToOne\n }\n\n get isOneToX() {\n return this.isOneToMany || this.isOneToOne\n }\n\n get isXToMany() {\n return this.isManyToMany || this.isOneToMany\n }\n\n get isReliance() {\n return (this.data as RecordAttribute).isReliance\n }\n\n get recordName() {\n assert(this.isRecord, `${this.attributeName} is not a entity`)\n return (this.data as RecordAttribute).recordName\n }\n\n get table() {\n assert(this.isRecord, `${this.attributeName} is not a entity`)\n return this.map.getRecord((this.data as RecordAttribute).recordName).table\n }\n\n // FIXME 改好\n get field() {\n if (this.isValue) {\n return (this.data as ValueAttribute).field\n } else {\n if (this.isManyToOne && this.isLinkMergedWithParent()) {\n if (this.data.field) return this.data.field\n const linkInfoRecord = this.getLinkInfo().record\n return this.isRecordSource() ? linkInfoRecord.attributes.target.field : linkInfoRecord.attributes.source.field\n }\n }\n }\n\n get linkField() {\n if (this.isRecord && this.isLinkMergedWithParent()) {\n // 如果parent 是 linkRecord, source/target 这样的 field 就是 attribute 上面在管。\n if (this.data.field) return this.data.field\n\n const linkInfoRecord = this.getLinkInfo().record\n return this.isRecordSource() ? linkInfoRecord?.attributes.target.field : linkInfoRecord?.attributes.source.field\n }\n }\n\n get linkName() {\n return (this.data as RecordAttribute).linkName\n }\n\n \n\n isMergedWithParent() {\n return this.getLinkInfo().isCombined()\n }\n\n isLinkMergedWithParent() {\n const linkInfo = this.getLinkInfo()\n return linkInfo.isRelationSource(this.parentEntityName, this.attributeName) ? linkInfo.isMergedToSource() : linkInfo.isMergedToTarget()\n }\n\n isLinkMergedWithAttribute() {\n const linkInfo = this.getLinkInfo()\n return linkInfo.isRelationSource(this.parentEntityName, this.attributeName) ? linkInfo.isMergedToTarget() : linkInfo.isMergedToSource()\n }\n\n isLinkIsolated() {\n const linkInfo = this.getLinkInfo()\n return linkInfo.isIsolated()\n }\n\n isRecordSource() {\n return this.getLinkInfo().isRelationSource(this.parentEntityName, this.attributeName)\n }\n\n isLinkManyToManySymmetric() {\n const linkInfo = this.getLinkInfo()\n return linkInfo.isManyToMany && linkInfo.isSymmetric()\n }\n\n isLinkSourceRelation() {\n const linkInfo = this.getLinkInfo()\n return linkInfo.isSourceRelation()\n }\n\n getReverseInfo() {\n const reverseAttribute = this.map.getReverseAttribute(this.parentEntityName, this.attributeName)\n if (!reverseAttribute) return undefined\n return this.map.getInfo(this.recordName, reverseAttribute)\n }\n\n getLinkInfo() {\n assert(this.isRecord, `only record attribute can get linkInfo`)\n return this.map.getLinkInfo(this.parentEntityName, this.attributeName)\n }\n\n getRecordInfo() {\n assert(this.isRecord, `only record attribute can get linkInfo`)\n return this.map.getRecordInfo(this.recordName)\n }\n\n getAttribute(name:string) {\n return this.map.getInfo(this.recordName, name)\n }\n\n isLinkFiltered() {\n return (this.data as RecordAttribute).isFilteredRelation\n }\n\n getMatchExpression() {\n assert(this.isLinkFiltered(), `only filtered relation can get match expression`)\n return (this.data as RecordAttribute).matchExpression\n }\n\n getBaseAttributeInfo() {\n assert(this.isLinkFiltered(), `only filtered relation can get base attribute info`)\n return new AttributeInfo(this.parentEntityName, (this.data as RecordAttribute).baseRelationAttributeName!, this.map, this.symmetricDirection)\n }\n}","import {BoolExp, BoolExpressionRawData, ExpressionData} from \"@shared\";\nimport {EntityToTableMap, RecordAttribute} from \"./EntityToTableMap.js\";\nimport {assert} from \"../utils.js\";\nimport {RecordQueryTree} from \"./RecordQuery.js\";\nimport {Database} from \"@runtime\";\nimport {PlaceholderGen} from \"./RecordQueryAgent.js\";\nimport { AttributeInfo } from \"./AttributeInfo.js\";\n\nexport type MatchAtom = { key: string, value: [string, any], isReferenceValue?: boolean }\nexport type MatchExpressionData = BoolExp<MatchAtom>\n\nexport type FieldMatchAtom = MatchAtom & {\n isInnerQuery?: boolean,\n // value 类型的\n fieldName?: [string, string],\n fieldValue?: string,\n fieldParams? :any[]\n // entity 类型的\n namePath?: string[],\n isFunctionMatch?: boolean,\n}\n\nexport class MatchExp {\n public static atom(condition: MatchAtom) {\n assert(condition.key !== undefined, 'key cannot be undefined')\n assert(Array.isArray(condition.value) && condition.value.length === 2, 'value must be array')\n assert(condition.value[1] !== undefined, `${condition.key} value cannot be undefined`)\n return BoolExp.atom<MatchAtom>(condition)\n }\n // TODO 支持更复杂的格式\n // object 表达批量的 and\n public static fromObject(condition: { [key: string]: MatchAtom }) {\n let root: BoolExp<MatchAtom> | undefined\n Object.entries(condition).forEach(([key, value]) => {\n if (!root) {\n root = MatchExp.atom({key, value: ['=', value]})\n } else {\n root = root.and({key, value: ['=', value]})\n }\n })\n return root!\n }\n // array 表达批量的 or\n public static fromArray(conditions: MatchAtom[]) {\n const base = conditions[0]\n const rest = conditions.slice(1)\n return rest.reduce((acc, condition) => {\n return acc.or(condition)\n }, MatchExp.atom(base))\n }\n \n /**\n * 从 MatchExpressionData 中提取所有路径\n * @returns 路径数组,每个路径是一个字符串数组\n */\n public static extractPaths(expression: MatchExpressionData): string[][] {\n const paths: string[][] = [];\n \n // MatchExpressionData 是 BoolExp<MatchAtom> 的别名\n const boolExp = expression instanceof BoolExp ? expression : BoolExp.fromValue(expression);\n \n if (boolExp.isExpression()) {\n if (boolExp.left) {\n paths.push(...MatchExp.extractPaths(boolExp.left.raw as MatchExpressionData));\n }\n if (boolExp.right) {\n paths.push(...MatchExp.extractPaths(boolExp.right.raw as MatchExpressionData));\n }\n } else if (boolExp.isAtom()) {\n const matchAtom = boolExp.data as MatchAtom;\n const key = matchAtom.key;\n const pathParts = key.split('.');\n \n // 如果路径包含多个部分(即有关联查询),需要验证\n if (pathParts.length > 1) {\n paths.push(pathParts);\n }\n }\n \n return paths;\n }\n\n public xToOneQueryTree: RecordQueryTree\n public data?: MatchExpressionData\n public entityName: string\n constructor(entityName: string, public map: EntityToTableMap, data?: MatchExpressionData, public contextRootEntity?: string, public fromRelation?: boolean) {\n assert(!data || data instanceof BoolExp, `match data is not a BoolExpression instance, you passed: ${this.data}`)\n const recordInfo = this.map.getRecordInfo(entityName)\n this.entityName = recordInfo.isFilteredEntity || recordInfo.isFilteredRelation ? recordInfo.baseRecordName! : entityName\n const isFiltered = recordInfo.isFilteredEntity || recordInfo.isFilteredRelation\n this.xToOneQueryTree = new RecordQueryTree(this.entityName, this.map)\n let combinedData = data\n if (isFiltered) {\n combinedData = data ? recordInfo.matchExpression!.and(data) : recordInfo.matchExpression\n }\n if (combinedData) {\n this.data = this.convertFilteredRelation(combinedData)\n this.buildQueryTree(this.data, this.xToOneQueryTree)\n }\n }\n convertFilteredRelation(matchData: MatchExpressionData): MatchExpressionData {\n if (matchData.isExpression()) {\n const newLeft = this.convertFilteredRelation(matchData.left)\n const newRight = matchData.right ? this.convertFilteredRelation(matchData.right) : undefined\n const matchExpRawData = matchData.raw as BoolExpressionRawData<MatchAtom>\n return new BoolExp<MatchAtom>({\n type: 'expression',\n operator: matchExpRawData.operator,\n left: newLeft.raw,\n right: newRight?.raw\n })\n } else {\n // variable\n const matchAttributePath = (matchData.data.key as string).split('.')\n const {resolvedPath, matchExpression:matchExpressionInPath} = matchAttributePath.reduce((result, part) => {\n const currentPath = [...result.resolvedPath, part]\n const currentPathInfo = this.map.getInfoByPath(currentPath)\n const currentResolvedPath = result.resolvedPath.concat(currentPathInfo?.isLinkFiltered() ? currentPathInfo.getBaseAttributeInfo().attributeName : part)\n\n let currentMatchExpression = result.matchExpression\n\n if(currentPathInfo?.isLinkFiltered()) {\n const linkInfo = currentPathInfo.getLinkInfo()\n const linkMatchExp = new MatchExp(linkInfo.getResolvedBaseRecordName()!, this.map, linkInfo.getResolvedMatchExpression())\n const reversePath = this.map.getReversePath(currentResolvedPath)\n const rebasePathStart = currentPathInfo.isRecordSource() ? 'source' : 'target'\n const rebasePath = [rebasePathStart, ...reversePath.slice(2)]\n const rebasedLinkMatch = linkMatchExp.rebase(rebasePath.join('.'))\n currentMatchExpression = currentMatchExpression? currentMatchExpression.and(rebasedLinkMatch) : rebasedLinkMatch\n }\n\n\n return {\n path: [...result.path, part],\n resolvedPath: currentResolvedPath,\n matchExpression: currentMatchExpression\n }\n }, {path:[this.entityName], resolvedPath:[this.entityName], matchExpression:undefined} as {path:string[], resolvedPath:string[], matchExpression:MatchExp|undefined})\n\n if( !matchExpressionInPath) {\n return matchData\n }\n\n const baseMatchExpAtom = MatchExp.atom({key:resolvedPath.slice(1).join('.'), value: matchData.data.value})\n return baseMatchExpAtom.and(matchExpressionInPath.data)\n }\n }\n buildQueryTree(matchData: MatchExpressionData, recordQueryTree: RecordQueryTree) {\n if (matchData.isExpression()) {\n if (matchData.left) {\n this.buildQueryTree(matchData.left, recordQueryTree)\n }\n\n if (matchData.right) {\n this.buildQueryTree(matchData.right, recordQueryTree)\n }\n } else {\n // variable\n const matchAttributePath = (matchData.data.key as string).split('.')\n const namePath = [this.entityName].concat(matchAttributePath)\n const attributeInfo = this.map.getInfoByPath(namePath)!\n\n // 直接就是 value 的情况不用管,没有 query 其他的实体。\n // CAUTION 还有最后路径是 entity 但是 match 值是 EXIST 的不用管,因为会生成 exist 子句。只不过这里也不用特别处理,join 的表没用到会自动数据库忽略。\n if ((matchAttributePath.length === 1 && attributeInfo.isValue)) {\n return\n }\n\n const manyToManySymmetricPaths = this.map.spawnManyToManySymmetricPath(namePath)\n if (attributeInfo.isRecord) {\n if (manyToManySymmetricPaths) {\n recordQueryTree.addRecord(manyToManySymmetricPaths[0].slice(1, Infinity))\n recordQueryTree.addRecord(manyToManySymmetricPaths[1].slice(1, Infinity))\n } else {\n recordQueryTree.addRecord(matchAttributePath)\n }\n\n } else {\n if (manyToManySymmetricPaths) {\n recordQueryTree.addField(manyToManySymmetricPaths[0].slice(1, Infinity))\n recordQueryTree.addField(manyToManySymmetricPaths[1].slice(1, Infinity))\n } else {\n // 最后一个是 attribute,所以不在 recordQueryTree 上。\n recordQueryTree.addField(matchAttributePath)\n }\n }\n }\n }\n\n\n getFinalFieldName(matchAttributePath: string[]): [string, string] {\n const namePath = [this.entityName].concat(matchAttributePath.slice(0, -1))\n return this.map.getTableAliasAndFieldName(namePath, matchAttributePath.at(-1)!).slice(0, 2) as [string, string]\n }\n\n getReferenceFieldValue(valueStr: string) {\n const matchAttributePath = valueStr.split('.')\n const [tableAlias, rawFieldName] = this.map.getTableAliasAndFieldName(\n [this.contextRootEntity || this.entityName].concat(matchAttributePath.slice(0, -1)),\n matchAttributePath.at(-1)!\n )\n return `${tableAlias}.${rawFieldName}`\n }\n\n getFinalFieldValue(isReferenceValue: boolean, key: string, value: [string, any], fieldName:string, fieldType: string|undefined, p: PlaceholderGen, db?: Database): [string, any[]] {\n let fieldValue =''\n let fieldParams:any[] = []\n const simpleOp = ['=', '>', '<', '<=', '>=', 'like', '!=']\n\n if (simpleOp.includes(value[0]) || (value[0] === 'not' && value[1] !== null)) {\n fieldValue = `${value[0]} ${p()}`\n fieldParams = [isReferenceValue ? this.getReferenceFieldValue(value[1]) : value[1]]\n } else if((value[0] === 'not' && value[1] === null)) {\n fieldValue = `IS NOT NULL`\n } else if (value[0].toLowerCase() === 'in') {\n assert(!isReferenceValue, 'reference value cannot use IN to match')\n fieldValue = `IN (${value[1].map((x: any) => p()).join(',')})`\n fieldParams = value[1]\n } else if (value[0].toLowerCase() === 'between') {\n fieldValue = `BETWEEN ${p()} AND ${p()}`\n fieldParams = [\n isReferenceValue ? this.getReferenceFieldValue(value[1][0]) : value[1][0],\n isReferenceValue ? this.getReferenceFieldValue(value[1][1]) : value[1][1]\n ]\n } else {\n let result\n if (db) {\n // JSON 操作符写法等由外部具体 db 实现\n // FIXME 如果外部不知 value 的具体格式,又怎么知道这是一个 referenceValue ???这里要重新设计\n result = db.parseMatchExpression?.(key, value, fieldName, fieldType!, isReferenceValue, this.getReferenceFieldValue.bind(this), p)\n }\n\n if (result) {\n fieldValue = result.fieldValue\n fieldParams = result.fieldParams || []\n } else{\n assert(result, `unknown value expression ${JSON.stringify(value)}`)\n\n }\n\n }\n\n return [fieldValue, fieldParams!]\n }\n\n buildFieldMatchExpression(p: PlaceholderGen, db?: Database): BoolExp<FieldMatchAtom> | null {\n if (!this.data) return null\n // 1. 所有 key 要 build 成 field\n // 2. x:n 关系中的 EXIST 要增加查询范围限制,要把 value 中对上层引用也 build 成 field。\n return this.data.map<FieldMatchAtom>((exp: MatchExpressionData) => {\n const matchAttributePath = (exp.data.key as string).split('.')\n const attributeInfo = this.map.getInfoByPath([this.entityName].concat(matchAttributePath))!\n\n const namePath = [this.entityName].concat(matchAttributePath)\n const symmetricPaths = this.map.spawnManyToManySymmetricPath(namePath)\n\n let sourcePath, targetPath\n if (symmetricPaths) {\n // 要去除 头部 的 entity\n sourcePath = symmetricPaths[0].slice(1, Infinity)\n targetPath = symmetricPaths[1].slice(1, Infinity)\n }\n\n\n // 如果结尾是 value\n // 如果极为是 entity,那么后面匹配条件目前只能支持 EXIST。\n // CAUTION 针对关联实体的属性匹配,到这里已经被拍平了,所以结尾是 entity 的情况必定都是函数匹配。\n if (attributeInfo.isValue) {\n // CAUTION 路径中只可能有一个 n:n symmetric 关系。因为路径中有多个的在语义逻辑上就不正确。\n // 有一个的情况还是用在 findRelatedRecords 的时候才有意义。因为它会通过 id 限定关系,而即使是 n:n 的关系,任意两个实体中只会有一个关系数据。所以这个时候能找到唯一的数据,是有意义的。\n\n const fieldNamePath = this.getFinalFieldName(matchAttributePath)\n const [fieldValue, fieldParams] = this.getFinalFieldValue(exp.data.isReferenceValue!, exp.data.key, exp.data.value, fieldNamePath.join('.'), attributeInfo.fieldType, p, db)\n\n if (!symmetricPaths) {\n return {\n ...exp.data,\n fieldName: fieldNamePath,\n fieldValue,\n fieldParams\n }\n }\n\n // 这里一定要再生成一次,应为需要不同的 placeholder。\n const [fieldValue2, fieldParams2] = this.getFinalFieldValue(exp.data.isReferenceValue!, exp.data.key, exp.data.value, fieldNamePath.join('.'), attributeInfo.fieldType, p, db)\n\n // CAUTION 注意这里 length -2 是因为 namePath 里面有 this.entityName\n return BoolExp.atom<FieldMatchAtom>({\n ...exp.data,\n fieldName: this.getFinalFieldName(sourcePath!),\n fieldValue,\n fieldParams\n }).or({\n ...exp.data,\n fieldName: this.getFinalFieldName(targetPath!),\n fieldValue: fieldValue2,\n fieldParams: fieldParams2\n })\n\n } else {\n // CAUTION record 的情况只有可能 n:n 关系\n\n // CAUTION 函数匹配的情况不管了,因为可能未来涉及到使用 cursor 实现更强的功能,这就涉及到查询计划的修改了。统统扔到上层去做。\n // 注意,子查询中也可能对上层的引用,这个也放到上层好像能力有点重叠了。\n if (!symmetricPaths) {\n return {\n ...exp.data,\n namePath,\n isFunctionMatch: true,\n }\n }\n\n const sourceNamePath = [this.entityName].concat(sourcePath!)\n const targetNamePath = [this.entityName].concat(targetPath!)\n assert(sourceNamePath!.length === namePath.length, `symmetric entity match can only be last, ${sourceNamePath} ${namePath}`)\n\n return BoolExp.atom<FieldMatchAtom>({\n ...exp.data,\n namePath:sourceNamePath!,\n isFunctionMatch: true,\n }).or({\n ...exp.data,\n namePath:targetNamePath!,\n isFunctionMatch: true,\n })\n\n }\n })\n\n }\n\n and(condition: MatchAtom|MatchExp): MatchExp {\n if (condition instanceof MatchExp) {\n assert(this.entityName === condition.entityName, `cannot and match exp of different entity: ${this.entityName} and ${condition.entityName}`)\n return new MatchExp(this.entityName, this.map, this.data ? this.data.and(condition.data) : condition.data, this.contextRootEntity)\n } else {\n assert(condition.key !== undefined, 'key cannot be undefined')\n assert(Array.isArray(condition.value) && condition.value.length === 2, 'value must be array')\n assert(condition.value[1] !== undefined, `${condition.key} value cannot be undefined`)\n return new MatchExp(this.entityName, this.map, this.data ? this.data.and(condition) : BoolExp.atom<MatchAtom>(condition), this.contextRootEntity)\n }\n\n }\n\n rebase(attributeName: string) {\n // 验证属性是否存在且是实体关联\n const attributeInfo = this.map.getInfo(this.entityName, attributeName);\n assert(attributeInfo.isRecord, `attribute ${attributeName} is not an entity relation`);\n\n \n const targetEntityName = attributeInfo.recordName;\n const reverseAttribute = this.map.getReverseAttribute(this.entityName, attributeName);\n \n // 统一的路径转换函数\n const transformData = (data: MatchExpressionData | undefined): MatchExpressionData | undefined => {\n if (!data) return undefined;\n \n if (data.isExpression()) {\n const left = transformData(data.left);\n const right = transformData(data.right);\n \n if (!left && !right) return undefined;\n if (!left) return right;\n if (!right) return left;\n \n const operator = (data.raw as any).operator;\n if (operator === 'and') {\n return left.and(right);\n } else if (operator === 'or') {\n return left.or(right);\n } else if (operator === 'not') {\n return left.not();\n }\n } else if (data.isAtom()) {\n const atom = data.data as MatchAtom;\n const keyParts = atom.key.split('.');\n \n // 路径缩短:如果条件以目标属性开头,移除前缀\n if (keyParts[0] === attributeName) {\n const newKey = keyParts.slice(1).join('.');\n return BoolExp.atom<MatchAtom>({\n key: newKey,\n value: atom.value,\n isReferenceValue: atom.isReferenceValue\n });\n }\n \n // 路径增长:为所有其他条件添加反向属性前缀\n const newKey = this.map.getShrinkedAttribute(targetEntityName, `${reverseAttribute}.${atom.key}`)\n return BoolExp.atom<MatchAtom>({\n key: newKey,\n value: atom.value,\n isReferenceValue: atom.isReferenceValue\n });\n }\n \n return undefined;\n };\n \n const transformedData = this.data ? transformData(this.data) : undefined;\n return new MatchExp(targetEntityName, this.map, transformedData, this.contextRootEntity, this.fromRelation);\n }\n}","import {EntityToTableMap} from \"./EntityToTableMap.js\";\n\nexport type ModifierData = {\n orderBy?: {\n [k: string]: 'ASC'|'DESC'\n },\n limit?: number,\n offset?: number\n}\n\nexport class Modifier {\n constructor(public recordName: string, public map: EntityToTableMap, public data: ModifierData, public fromRelation?: boolean) {\n }\n\n get limit() {\n return this.data?.limit\n }\n\n get offset() {\n return this.data?.offset\n }\n\n get orderBy() {\n return Object.entries(this.data?.orderBy || {}).map(([k, v]) => {\n return {\n attribute: k,\n recordName: this.recordName,\n order: v\n }\n })\n }\n}","import {MatchExp, MatchExpressionData} from \"./MatchExp.js\";\nimport {AttributeQuery, AttributeQueryData} from \"./AttributeQuery.js\";\nimport {Modifier, ModifierData} from \"./Modifier.js\";\nimport {EntityToTableMap} from \"./EntityToTableMap.js\";\nimport {AttributeInfo} from \"./AttributeInfo.js\";\nimport {assert} from \"../utils.js\";\nimport {RecursiveContext} from \"./RecordQueryAgent.js\";\n\nexport type RecordQueryData = {\n matchExpression?: MatchExpressionData,\n attributeQuery?: AttributeQueryData,\n modifier?: ModifierData,\n label?: string,\n goto?: string\n exit? : (data:RecursiveContext) => Promise<any>\n}\n\n\nexport class RecordQuery {\n static create(\n recordName: string,\n map: EntityToTableMap,\n data: RecordQueryData,\n contextRootEntity?: string,\n parentRecord?:string,\n attributeName?:string,\n onlyRelationData?: boolean,\n allowNull = false,\n alias?: string\n ) {\n const recordInfo = map.getRecordInfo(recordName)\n const isFiltered = recordInfo.isFilteredEntity || recordInfo.isFilteredRelation\n \n // 使用预计算的值\n let baseRecordName = recordName;\n if (isFiltered ) {\n baseRecordName = recordInfo.data.resolvedBaseRecordName!;\n } \n\n \n // CAUTION 因为合表后可能用关联数据匹配到行。\n const inputMatch = new MatchExp(baseRecordName, map, data.matchExpression, contextRootEntity)\n let matchExpression = allowNull ? inputMatch: inputMatch.and({\n key: 'id',\n value: ['not', null]\n })\n\n // 使用预计算的合并后的 matchExpression\n let resolvedMatchExpression = matchExpression;\n if (isFiltered) {\n resolvedMatchExpression = matchExpression.and(new MatchExp(baseRecordName, map, recordInfo.data.resolvedMatchExpression));\n }\n\n return new RecordQuery(\n baseRecordName,\n map,\n resolvedMatchExpression,\n new AttributeQuery(baseRecordName, map, data.attributeQuery || [], parentRecord, attributeName),\n new Modifier(baseRecordName, map, data.modifier!),\n contextRootEntity,\n parentRecord,\n attributeName,\n onlyRelationData,\n allowNull,\n data.label,\n data.goto,\n data.exit,\n alias\n )\n }\n\n constructor(\n public recordName: string,\n public map: EntityToTableMap,\n public matchExpression: MatchExp,\n public attributeQuery: AttributeQuery,\n public modifier: Modifier,\n public contextRootEntity?: string,\n public parentRecord?:string,\n public attributeName?:string,\n public onlyRelationData?:boolean,\n public allowNull = false,\n public label?: string,\n public goto?: string,\n public exit? : (context: RecursiveContext) => Promise<boolean>,\n // 返回时在父节点中的名字,这是针对使用 filtered relation 名称查询时需要的。\n public alias?: string\n ) {}\n getData(): RecordQueryData {\n return {\n matchExpression: this.matchExpression.data,\n attributeQuery: this.attributeQuery.data,\n modifier: this.modifier.data\n }\n }\n // CAUTION 特别注意这里的参数,不能让用取用原本的 matchExpression, attributeQuery, modifier 里面的 data 传进来。\n // 因为 data 不能代表一切配置,例如 attributeQuery 里面 还有个 shouldQueryParentLinkData 就是保存在 this 上的。\n derive({ matchExpression, attributeQuery, modifier } : { matchExpression?: MatchExp, attributeQuery?: AttributeQuery, modifier?: Modifier}) {\n return new RecordQuery(\n this.recordName,\n this.map,\nmatchExpression||this.matchExpression,\nattributeQuery||this.attributeQuery,\n modifier||this.modifier,\n this.contextRootEntity,\n this.parentRecord,\n this.attributeName,\n this.onlyRelationData,\n this.allowNull,\n this.label,\n this.goto,\n this.exit\n )\n }\n}\n\n\nexport class RecordQueryTree {\n public fields: string[] =[]\n public records: {[k:string]: RecordQueryTree}\n public info? :AttributeInfo\n // 父节点和自己这个几点 link 上的 query\n\n constructor(\n public recordName: string,\n public map: EntityToTableMap,\n public parentRecord?:string,\n public attributeName?: string,\n public data?: {fields: string[], records: {[k:string]: RecordQueryTree}},\n public parent?: RecordQueryTree,\n public parentLinkQueryTree? : RecordQueryTree\n ) {\n assert(!!recordName, 'recordName cannot be empty')\n this.fields = data?.fields || []\n this.records = data?.records || {}\n if (parentRecord) {\n this.info = this.map.getInfo(this.parentRecord!, this.attributeName!)\n }\n }\n\n addField(namePath:string[]) {\n const [name, ...rest] = namePath\n if (namePath.length === 1) {\n this.fields.push(name)\n } else if(name === LINK_SYMBOL){\n if (!this.parentLinkQueryTree) {\n this.parentLinkQueryTree = new RecordQueryTree(this.info!.linkName, this.map)\n }\n\n this.parentLinkQueryTree.addField(rest)\n } else {\n const info = this.map.getInfo(this.recordName, name)\n if (!this.records[name]) this.records[name] = new RecordQueryTree(info.recordName, this.map, this.recordName, name, undefined, this)\n this.records[name].addField(rest)\n }\n }\n addRecord(namePath: string[], subTree?: RecordQueryTree) {\n const [name, ...rest] = namePath\n if (namePath.length === 1) {\n if (name === LINK_SYMBOL) {\n if (!this.parentLinkQueryTree) {\n this.parentLinkQueryTree = new RecordQueryTree(this.info!.linkName, this.map)\n }\n\n if (subTree) this.parentLinkQueryTree = this.parentLinkQueryTree.merge(subTree)\n } else {\n const info = this.map.getInfo(this.recordName, name)\n const newTree = subTree || new RecordQueryTree(info.recordName, this.map, this.recordName, name, undefined, this)\n this.records[name] = this.records[name] ? this.records[name].merge(newTree) : newTree\n }\n } else if(name === LINK_SYMBOL) {\n if (!this.parentLinkQueryTree) {\n this.parentLinkQueryTree = new RecordQueryTree(this.info!.linkName, this.map)\n }\n this.parentLinkQueryTree.addRecord(rest, subTree)\n } else {\n const info = this.map.getInfo(this.recordName, name)\n this.records[name] = new RecordQueryTree(info.recordName, this.map, this.recordName, name, undefined, this)\n this.records[name].addRecord(rest, subTree)\n }\n }\n forEachRecords(handle: (t:RecordQueryTree) => any) {\n Object.values(this.records).forEach(r => handle(r))\n }\n onlyIdField() {\n return this.fields.length === 1 && this.fields[0] === 'id' && !Object.keys(this.records).length\n }\n merge(otherTree: RecordQueryTree): RecordQueryTree {\n // 合并两个 tree,返回一个新的 tree\n const fields = Array.from(new Set([...this.fields, ...otherTree.fields]))\n // 合并 records\n const keys = Array.from(new Set([...Object.keys(this.records), ...Object.keys(otherTree.records)]))\n const records: Record<string, RecordQueryTree> = {}\n\n keys.forEach(key => {\n if (this.records[key] && otherTree.records[key]) {\n records[key] = this.records[key].merge(otherTree.records[key])\n } else if (this.records[key]) {\n records[key] = this.records[key]\n } else {\n records[key] = otherTree.records[key]\n }\n })\n\n let parentLinkQueryTree\n if (this.parentLinkQueryTree && otherTree.parentLinkQueryTree) {\n parentLinkQueryTree = this.parentLinkQueryTree.merge(otherTree.parentLinkQueryTree)\n } else {\n parentLinkQueryTree = this.parentLinkQueryTree || otherTree.parentLinkQueryTree\n }\n\n return new RecordQueryTree(this.recordName, this.map, this.parentRecord, this.attributeName, { fields, records }, this.parent, parentLinkQueryTree)\n }\n getData() {\n const result: {[k:string]: any} = {\n __fields: this.fields\n }\n\n\n this.forEachRecords(record => {\n result[record.attributeName!] = record.getData()\n })\n\n if (this.parentLinkQueryTree) {\n result[LINK_SYMBOL] = this.parentLinkQueryTree.getData()\n }\n return result\n }\n\n}\n\nexport const LINK_SYMBOL = '&'\nexport const ALL_ATTR_SYMBOL = '*'\n\n// export type RecordQueryTree = {\n// _fields?: string[],\n// [k: string]: RecordQueryTree\n// }","import {EntityToTableMap} from \"./EntityToTableMap.js\";\nimport {assert} from \"../utils.js\";\n\nimport {ALL_ATTR_SYMBOL, LINK_SYMBOL, RecordQuery, RecordQueryData, RecordQueryTree} from \"./RecordQuery.js\";\nimport { MatchExp, MatchExpressionData } from \"./MatchExp.js\";\n\nexport type AttributeQueryDataRecordItem = [string, RecordQueryData, boolean?]\nexport type AttributeQueryDataItem = string | AttributeQueryDataRecordItem\nexport type AttributeQueryData = AttributeQueryDataItem[]\n\nexport class AttributeQuery {\n public relatedRecords: RecordQuery[] = []\n public xToManyRecords: RecordQuery[] = []\n public xToOneRecords: RecordQuery[] = []\n public valueAttributes: string[] = []\n\n public fullQueryTree: RecordQueryTree\n public parentLinkRecordQuery?: RecordQuery\n public id = Math.random()\n public static mergeAttributeQueryData(attributeQueryData: AttributeQueryData, otherAttributeQueryData: AttributeQueryData): AttributeQueryData {\n\n const allAttributeQueryData = [...attributeQueryData, ...otherAttributeQueryData]\n\n // 如果是普通字段有相同的就忽略。没有相同的就push。\n // 如果是对象,就要深度合并。\n const propertyAttributes = new Set<string>(allAttributeQueryData.filter(item => typeof item === 'string'))\n\n const recordAttributes: AttributeQueryDataRecordItem[] = allAttributeQueryData.filter(item => typeof item !== 'string')\n\n const recordAttributesByName = recordAttributes.reduce((acc, item) => {\n const [attributeName, subQueryData] = item\n if(acc[attributeName]) {\n acc[attributeName] = { attributeQuery: AttributeQuery.mergeAttributeQueryData(acc[attributeName].attributeQuery!, subQueryData.attributeQuery!) }\n } else {\n acc[attributeName] = subQueryData\n }\n return acc\n }, {} as Record<string, RecordQueryData>)\n\n return [\n ...propertyAttributes, \n ...Object.entries(recordAttributesByName)\n ]\n\n\n }\n public static getAttributeQueryDataForRecord(\n recordName:string, \n map: EntityToTableMap,\n includeSameTableReliance?: boolean,\n includeMergedRecordAttribute?: boolean,\n includeManagedRecordAttributes?: boolean, // link record 的 source/target 字段\n includeNotRelianceCombined?: boolean\n ): AttributeQueryData{\n const inputRecordInfo = map.getRecordInfo(recordName)\n const recordInfo = inputRecordInfo.resolvedBaseRecordName ? map.getRecordInfo(inputRecordInfo.resolvedBaseRecordName) : inputRecordInfo\n let result: AttributeQueryData = recordInfo.valueAttributes.map(info => info.attributeName)\n\n // FIXME 再想想以下几个参数的递归查询,特别是关系上的数据。\n if(includeSameTableReliance) {\n recordInfo.sameTableReliance.forEach(info =>{\n const relianceAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.recordName, map, true, includeMergedRecordAttribute)\n const attributeQueryItem:AttributeQueryDataItem = [\n info.attributeName,\n {\n attributeQuery: [...relianceAttributeQueryData]\n }\n ]\n\n if (!recordInfo.isRelation) {\n const relianceRelationAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.linkName, map, true, includeMergedRecordAttribute)\n attributeQueryItem[1].attributeQuery!.push([LINK_SYMBOL, { attributeQuery: relianceRelationAttributeQueryData }])\n }\n\n result = AttributeQuery.mergeAttributeQueryData(result, [attributeQueryItem])\n })\n }\n\n if (includeNotRelianceCombined){\n recordInfo.notRelianceCombined.forEach(info =>{\n // const relianceAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.recordName, map, true, includeMergedRecordAttribute, true)\n // const relianceRelationAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.linkName, map, true, includeMergedRecordAttribute, true)\n // result.push(\n // [\n // info.attributeName,\n // {\n // attributeQuery: [...relianceAttributeQueryData, [LINK_SYMBOL, { attributeQuery: relianceRelationAttributeQueryData }]]\n // }\n // ]\n // )\n\n const relianceAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.recordName, map, true, includeMergedRecordAttribute)\n const attributeQueryItem:AttributeQueryDataItem = [\n info.attributeName,\n {\n attributeQuery: [...relianceAttributeQueryData]\n }\n ]\n\n if (!recordInfo.isRelation) {\n const relianceRelationAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.linkName, map, true, includeMergedRecordAttribute)\n attributeQueryItem[1].attributeQuery!.push([LINK_SYMBOL, { attributeQuery: relianceRelationAttributeQueryData }])\n }\n\n result = AttributeQuery.mergeAttributeQueryData(result, [attributeQueryItem])\n })\n }\n\n if(includeMergedRecordAttribute) {\n recordInfo.mergedRecordAttributes.forEach(info =>{\n const relianceRelationAttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(info.linkName, map, includeSameTableReliance, true)\n result = AttributeQuery.mergeAttributeQueryData(result, [\n [\n info.attributeName,\n {\n attributeQuery: ['id', [LINK_SYMBOL, { attributeQuery: relianceRelationAttributeQueryData }]]\n }\n ]\n ])\n })\n }\n // link record 的 source/target 字段\n if (includeManagedRecordAttributes) {\n recordInfo.managedRecordAttributes.forEach(info => {\n result = AttributeQuery.mergeAttributeQueryData(result, [\n [\n info.attributeName,\n {\n attributeQuery: ['id']\n }\n ]\n ])\n })\n }\n\n\n return result\n }\n constructor(public recordName: string, public map: EntityToTableMap, public data: AttributeQueryData = [], public parentRecord?: string, public attributeName?: string, public shouldQueryParentLinkData?: boolean) {\n let valueAttributesSet = new Set<string>()\n\n data.forEach((rawItem: AttributeQueryDataItem) => {\n const item = (typeof rawItem === 'string' ? [rawItem, {}, false] : rawItem) as AttributeQueryDataRecordItem\n const [attributeName, subQueryData, onlyRelationData] = item\n\n if (attributeName === LINK_SYMBOL) {\n assert(!!(this.parentRecord && this.attributeName), `parent record and attribute name cannot be empty when query link data, you passed ${this.parentRecord} ${this.attributeName}`)\n const info = this.map.getInfo(this.parentRecord!, this.attributeName!)\n this.parentLinkRecordQuery = RecordQuery.create(info.linkName, this.map, subQueryData as RecordQueryData, undefined)\n return\n }\n\n if (attributeName === ALL_ATTR_SYMBOL) {\n valueAttributesSet = new Set(this.map.getRecordInfo(this.recordName).valueAttributes.map(info => info.attributeName))\n return\n }\n\n const attributeInfo = this.map.getInfo(this.recordName, attributeName)\n if (attributeInfo.isRecord) {\n\n let relatedAttributeName = attributeName\n let relatedSubQueryData = subQueryData as RecordQueryData\n\n\n // 在这里判断 filtered relation\n if(attributeInfo.isLinkFiltered()) {\n // filtered relation 的 attribute。这里需要重新构建 subQueryData,要加上基于关系的 MatchExp。\n relatedAttributeName = attributeInfo.getBaseAttributeInfo().attributeName\n const subMatchExp = (subQueryData as RecordQueryData).matchExpression\n const linkInfo = attributeInfo.getLinkInfo().getBaseLinkInfo()\n const filteredRelationMatchExp = new MatchExp(linkInfo.name, this.map, attributeInfo.getMatchExpression())\n const rebasedMatchExp = filteredRelationMatchExp.rebase(attributeInfo.isRecordSource() ? 'target' : 'source')!\n const mergedMatchExp = subMatchExp ? rebasedMatchExp.and(subMatchExp.data) : rebasedMatchExp\n relatedSubQueryData = {\n ...subQueryData,\n matchExpression: mergedMatchExp.data\n }\n }\n\n const relatedEntity = RecordQuery.create(attributeInfo.recordName, this.map, relatedSubQueryData, undefined, this.recordName, relatedAttributeName, onlyRelationData, false, attributeName)\n\n this.relatedRecords.push(relatedEntity)\n if (attributeInfo.isXToMany) {\n this.xToManyRecords.push(relatedEntity)\n } else if (attributeInfo.isXToOne) {\n this.xToOneRecords.push(relatedEntity)\n }\n\n } else {\n valueAttributesSet.add(attributeName)\n }\n })\n\n this.valueAttributes = Array.from(valueAttributesSet)\n this.fullQueryTree = this.buildFullQueryTree()\n\n }\n\n getValueAndXToOneRecordFields(fieldPath = [this.recordName], nameContext = [this.recordName]): { tableAliasAndField: [string, string], nameContext: string[], attribute: string }[] {\n const queryAttributes = this.valueAttributes.includes('id') ? this.valueAttributes : ['id'].concat(this.valueAttributes)\n const queryFields = queryAttributes.map(attributeName => {\n return {\n tableAliasAndField: this.map.getTableAliasAndFieldName(fieldPath, attributeName).slice(0, 2) as [string, string],\n nameContext,\n attribute: attributeName\n }\n })\n\n this.xToOneRecords.forEach((recordQuery) => {\n const nextFieldPath = fieldPath.concat(recordQuery.attributeName!)\n const nextNameContext = nameContext.concat(recordQuery.alias || recordQuery.attributeName!)\n queryFields.push(\n ...recordQuery.attributeQuery!.getValueAndXToOneRecordFields(nextFieldPath, nextNameContext)\n )\n\n const nextLinkFieldPath = nextFieldPath.concat(LINK_SYMBOL)\n const nextLinkNameContext = nextNameContext.concat(LINK_SYMBOL)\n if (recordQuery.attributeQuery.parentLinkRecordQuery!) {\n queryFields.push(\n ...recordQuery.attributeQuery.parentLinkRecordQuery!.attributeQuery!.getValueAndXToOneRecordFields(nextLinkFieldPath, nextLinkNameContext)\n )\n }\n })\n\n if (this.shouldQueryParentLinkData && this.parentLinkRecordQuery) {\n const reverseAttribute = this.map.getInfo(this.parentRecord!, this.attributeName!).getReverseInfo()?.attributeName!\n const nextFieldPath = fieldPath.concat(reverseAttribute!, LINK_SYMBOL)\n const nextNameContext = nameContext.concat(reverseAttribute!, LINK_SYMBOL)\n const symmetricLinkPaths = this.map.spawnManyToManySymmetricPath(nextFieldPath)\n const nextSymmetricLinkNameContext = this.map.spawnManyToManySymmetricPath(nextNameContext)\n\n if (!symmetricLinkPaths) {\n queryFields.push(\n ...this.parentLinkRecordQuery!.attributeQuery!.getValueAndXToOneRecordFields(nextFieldPath, nextNameContext)\n )\n } else {\n queryFields.push(\n ...this.parentLinkRecordQuery!.attributeQuery!.getValueAndXToOneRecordFields(symmetricLinkPaths[0], nextSymmetricLinkNameContext![0]),\n ...this.parentLinkRecordQuery!.attributeQuery!.getValueAndXToOneRecordFields(symmetricLinkPaths[1], nextSymmetricLinkNameContext![1])\n )\n }\n\n }\n // xToMany 的 onlyRelationData 一起查,这是父亲在处理 findRelatedRecords 的时候传过来的。\n return queryFields\n }\n public get xToOneQueryTree(): RecordQueryTree {\n return this.buildXToOneQueryTree()\n }\n buildXToOneQueryTree() {\n // FIXME 过滤掉 x:1 中递归地情况。\n const result = new RecordQueryTree(this.recordName, this.map, this.parentRecord, this.attributeName)\n this.data.forEach(i => {\n if (!Array.isArray(i)) {\n result.addField([i])\n }\n })\n // CAUTION 我们这里只管 xToOne 的情况,因为 xToMany 都是外部用 id 去做二次查询得到的。不是用 join 语句一次性得到的。\n this.xToOneRecords.forEach((recordQuery) => {\n // CAUTION 注意要排除掉 goto 递归的情况。递归肯定无法一次 join 查出,不管是什么关系。\n if(!recordQuery.goto) {\n result.addRecord([recordQuery.attributeName!], recordQuery.attributeQuery!.xToOneQueryTree)\n }\n })\n\n if (this.shouldQueryParentLinkData && this.parentLinkRecordQuery) {\n // link 也可能使用递归,所以也要排除掉。\n if(!this.parentLinkRecordQuery.goto) {\n const reverseInfo = this.map.getInfo(this.parentRecord!, this.attributeName!).getReverseInfo()\n result.addRecord([reverseInfo?.attributeName!, LINK_SYMBOL], this.parentLinkRecordQuery.attributeQuery!.xToOneQueryTree)\n }\n }\n\n return result\n }\n\n buildFullQueryTree() {\n const result = new RecordQueryTree(this.recordName, this.map, this.parentRecord, this.attributeName)\n this.relatedRecords.forEach((entityQuery) => {\n result.addRecord([entityQuery.attributeName!], entityQuery.attributeQuery!.fullQueryTree)\n })\n return result\n }\n\n withParentLinkData() {\n if (!this.parentLinkRecordQuery) return this\n return new AttributeQuery(this.recordName, this.map, this.data, this.parentRecord, this.attributeName, true)\n }\n\n}","export function flatten<T>(arr: (T|T[])[]) {\n const result: T[] = []\n arr.forEach(i => result.push(...(Array.isArray(i) ? i: [i])))\n return result\n}\nexport async function someAsync<T>(arr: T[], handle: (t:T) => Promise<boolean>): Promise<boolean>\nexport async function someAsync(arr: any[], handle: (t:any) => Promise<boolean>): Promise<boolean> {\n for(let i of arr) {\n if (await handle(i)) return true\n }\n return false\n}\n\nexport function isRelation(relation: any): boolean {\n return relation.source !== undefined && relation.target !== undefined\n}\n\n\n\nexport function indexBy(arr: any[], key: string) {\n return Object.fromEntries(arr.map(o => [o[key], o]))\n}\n\nexport function assert(condition: any, message: string ) {\n if (!condition) {\n // if (__DEV__) debugger\n throw new Error(message)\n }\n}","import { EntityToTableMap, ValueAttribute } from \"./EntityToTableMap.js\";\nimport { flatten } from \"./util.js\";\nimport { AttributeInfo } from \"./AttributeInfo.js\";\nimport { Record } from \"./RecordQueryAgent.js\";\nimport { LINK_SYMBOL } from \"./RecordQuery.js\";\n\nexport type RawEntityData = { [k: string]: any }\n\nexport type FieldAndValue = {\n name: string,\n field: string,\n value: any,\n fieldType?: string\n}\n\nexport class NewRecordData {\n // 关系往自身合并的异表新 record\n public mergedLinkTargetNewRecords: NewRecordData[] = []\n // 关系往自身合并的异表老 record\n public mergedLinkTargetRecordIdRefs: NewRecordData[] = []\n // 关系往自身合并的异表 null 值\n public mergedLinkTargetNullRecords: NewRecordData[] = []\n // 自己跟父亲之间的 relation 的数据\n public linkRecordData?: NewRecordData\n // 三表合一的 record\n public combinedNewRecords : NewRecordData[] = []\n // 三表合一的老 record\n public combinedRecordIdRefs : NewRecordData[] = []\n // 三表合一的 null 值\n public combinedNullRecords: NewRecordData[] = []\n // 往属性方向合并的异表 record\n public differentTableMergedLinkNewRecords: NewRecordData[] = []\n public differentTableMergedLinkRecordIdRefs: NewRecordData[] = []\n public differentTableMergedLinkNullRecords: NewRecordData[] = []\n // 完全关系独立的数据\n public isolatedNewRecords: NewRecordData[] = []\n public isolatedRecordIdRefs: NewRecordData[] = []\n public isolatedNullRecords: NewRecordData[] = []\n // 当时 linkRecord 的时候,source/target 就可能出现在下面\n public entityIdAttributes: AttributeInfo[] = []\n // 不包括虚拟 link\n public relatedEntitiesData: NewRecordData[] = []\n public valueAttributes: AttributeInfo[] = []\n public recordName: string\n // 和当前合表并且是 id 的。说明我们的需要的 row 已经有了,只要update 相应 column 就行了\n public sameRowEntityIdRefs: NewRecordData[] = []\n // recordName 是自己的 recordName, info 是自己作为父亲的 attribute 的 info.\n public defaultValues: { [k: string]: any } = {}\n constructor(public map: EntityToTableMap, public originalRecordName: string, public rawData: RawEntityData, public info?: AttributeInfo, ) {\n const originalRecordInfo = this.map.getRecordInfo(originalRecordName)\n \n // 保存原始传入的 recordName\n \n // 如果是 filtered entity,使用 base record name 作为实际的 recordName\n this.recordName = (originalRecordInfo.isFilteredEntity || originalRecordInfo.isFilteredRelation) ? originalRecordInfo.resolvedBaseRecordName! : originalRecordName\n \n const [valueAttributesInfo, entityAttributesInfo, entityIdAttributes] = this.map.groupAttributes(this.recordName, rawData ? Object.keys(rawData) : [])\n this.relatedEntitiesData = flatten(entityAttributesInfo.map(info =>\n Array.isArray(rawData[info.attributeName]) ?\n rawData[info.attributeName].map((i: RawEntityData) => new NewRecordData(this.map, info.recordName, i, info)):\n new NewRecordData(this.map, info.recordName, rawData[info.attributeName], info)\n ))\n\n this.valueAttributes = valueAttributesInfo\n this.entityIdAttributes = entityIdAttributes\n const recordInfo = this.map.getRecordInfo(this.recordName)\n this.defaultValues = recordInfo.valueAttributes.reduce((acc, attr) => {\n const valueAttr = attr.data as ValueAttribute\n if (!this.rawData?.hasOwnProperty(attr.attributeName) && valueAttr.defaultValue && typeof valueAttr.defaultValue === 'function') {\n acc[attr.attributeName] = valueAttr.defaultValue(rawData, this.originalRecordName)\n }\n return acc\n }, {} as { [k: string]: any })\n\n // TODO 要把那些独立出去的 field 排除出去。\n this.relatedEntitiesData.forEach(newRelatedEntityData => {\n // CAUTION 三表合一的情况(需要排除掉关系的 source、target 是同一实体的情况,这种情况下不算合表)\n if (newRelatedEntityData.info!.isMergedWithParent()) {\n // 三表合一的情况。记录合表的数据到底是有 id ,还是新的。如果是有 id ,说明是要 update 某一行。\n if (newRelatedEntityData.isNull()) {\n this.combinedNullRecords.push(newRelatedEntityData)\n } else if (newRelatedEntityData.isRef()) {\n this.combinedRecordIdRefs.push(newRelatedEntityData)\n } else {\n // 全新的同表的数据\n this.combinedNewRecords.push(newRelatedEntityData)\n }\n\n } else {\n\n // FIXME relatedEntitiesData 是不是要限制下,只允许那些自己能管的。\n // 因为 source/target 这样的合并之后就不规自己管了。这里也不应该处理。\n if (newRelatedEntityData.info!.isLinkMergedWithParent()) {\n if (newRelatedEntityData.isNull()) {\n this.mergedLinkTargetNullRecords.push(newRelatedEntityData)\n } else if (newRelatedEntityData.isRef()) {\n this.mergedLinkTargetRecordIdRefs.push(newRelatedEntityData)\n } else {\n this.mergedLinkTargetNewRecords.push(newRelatedEntityData)\n }\n\n } else if(newRelatedEntityData.info!.isLinkMergedWithAttribute()) {\n // 关系往属性方向合并的\n if( newRelatedEntityData.isNull()) {\n this.differentTableMergedLinkNullRecords.push(newRelatedEntityData)\n } else if (newRelatedEntityData.isRef()) {\n this.differentTableMergedLinkRecordIdRefs.push(newRelatedEntityData)\n } else {\n this.differentTableMergedLinkNewRecords.push(newRelatedEntityData)\n }\n } else {\n // 关系完全独立的\n if (newRelatedEntityData.isNull()) {\n this.isolatedNullRecords.push(newRelatedEntityData)\n } else if (newRelatedEntityData.isRef()) {\n this.isolatedRecordIdRefs.push(newRelatedEntityData)\n } else {\n this.isolatedNewRecords.push(newRelatedEntityData)\n }\n\n }\n\n\n }\n })\n\n if (this.rawData?.[LINK_SYMBOL]) {\n this.linkRecordData = new NewRecordData(this.map, info?.linkName!, this.rawData[LINK_SYMBOL])\n }\n\n }\n\n\n merge(partialNewRawData: RawEntityData) {\n // 重要:使用 originalRecordName 而不是 recordName,以保持原始的 entity name\n // 这对于 filtered entity 特别重要,因为我们需要知道创建时使用的 entity name\n const merged = new NewRecordData(this.map, this.originalRecordName, {...this.rawData, ...partialNewRawData}, this.info)\n // 如果 recordName 和 originalRecordName 不同(filtered entity 的情况),需要同步\n if (this.recordName !== this.originalRecordName) {\n merged.recordName = this.recordName\n }\n return merged\n }\n\n getRef() {\n return {id: this.rawData.id}\n }\n\n\n isRef() {\n return this.rawData?.id !== undefined\n }\n\n isNull() {\n return this.rawData === null\n }\n getData() : Record{\n return {...this.rawData} as Record\n }\n\n getSameRowFieldAndValue(oldRecord: Omit<Record, 'id'> = {}) : FieldAndValue[]{\n\n const newRecord = {...oldRecord, ...this.rawData}\n\n const result: FieldAndValue[] =[]\n const updatedComputedFields = new Set<string>()\n \n // 获取记录的所有 value 属性定义,不仅仅是提供的属性\n const recordInfo = this.map.getRecordInfo(this.recordName)\n const allValueAttributes = new Set<string>()\n \n // 先处理提供的属性\n this.valueAttributes.forEach((info) => {\n allValueAttributes.add(info.attributeName)\n // 处理默认值:如果字段值为 undefined 且有默认值函数,则调用默认值函数\n let value = info.isComputed ? info.computed!(newRecord) : this.rawData[info.attributeName]\n \n // 如果值为 undefined 且有默认值函数,使用默认值\n // 注意:null 是明确的值,不应该被默认值替换\n // ValueAttribute 类型包含 defaultValue 属性\n const valueAttr = info.data as ValueAttribute\n if (value === undefined && valueAttr.defaultValue && typeof valueAttr.defaultValue === 'function') {\n value = valueAttr.defaultValue(this.rawData, this.originalRecordName)\n }\n \n result.push({\n name: info.attributeName,\n field: info.field!,\n value,\n fieldType: info.fieldType!\n })\n if (info.isComputed) {\n updatedComputedFields.add(info.attributeName)\n }\n })\n \n // 处理未提供但有默认值的属性\n recordInfo.valueAttributes.forEach(attr => {\n // 如果属性还未处理且有默认值\n const valueAttr = attr.data as ValueAttribute\n if (!allValueAttributes.has(attr.attributeName) && valueAttr.defaultValue && typeof valueAttr.defaultValue === 'function') {\n // 只有当值未定义时才应用默认值(不处理 null 的情况)\n if (this.rawData[attr.attributeName] === undefined && oldRecord[attr.attributeName] === undefined) {\n const defaultVal = this.defaultValues[attr.attributeName]\n result.push({\n name: attr.attributeName,\n field: attr.field!,\n value: defaultVal,\n fieldType: attr.fieldType!\n })\n }\n }\n })\n\n // CAUTION 因为我们没有标记 computed 依赖于哪些字段,所以任何字段的变化这里都要把 computed attribute 重新计算一遍。\n // CAUTION 只有更新自己的字段和递归更新三表合一的字段是需要岛上 oldRecord 的。因为我们只允许递归更新三表合一的 record。\n recordInfo.valueAttributes.forEach(info => {\n if (info.isComputed && !updatedComputedFields.has(info.attributeName)) {\n const newValue = info.computed!(newRecord)\n if (newValue !== oldRecord[info.attributeName]) {\n result.push({\n name: info.attributeName,\n field: info.field!,\n value: newValue,\n fieldType: info.fieldType!\n })\n }\n }\n })\n\n // source/target 里面记录的 id\n this.entityIdAttributes.forEach(info => {\n result.push({\n name: info.attributeName,\n field:info.linkField!,\n value: this.rawData[info.attributeName].id,\n })\n })\n\n // 往自己合表的关系上的 id 以及关系数据\n this.mergedLinkTargetRecordIdRefs.forEach(recordData => {\n result.push({\n name: recordData.info?.attributeName!,\n field: recordData.info?.linkField!,\n value: recordData.getRef().id,\n })\n\n if (recordData.linkRecordData) {\n result.push(...recordData.linkRecordData.getSameRowFieldAndValue())\n }\n })\n\n // 有 info 说明自己是派生出来的,上层可能在创建的时候通过 & 字段来指定了要创建的关系的 attribute。\n if (this.info && this.linkRecordData && this.info.isLinkMergedWithAttribute()) {\n result.push(...this.linkRecordData.getSameRowFieldAndValue())\n }\n\n // 三表合一的数据\n this.combinedNewRecords.concat(this.combinedRecordIdRefs).forEach(combinedNewRecord => {\n result.push(...combinedNewRecord.getSameRowFieldAndValue(oldRecord[combinedNewRecord.info?.attributeName!]))\n if (combinedNewRecord.linkRecordData) {\n // CAUTION 外部 updateRecord 声明了只有三表合一的数据允许递归更新。所以也要带上 oldRecord,因为 related record 能也有 computed attribute。\n result.push(...combinedNewRecord.linkRecordData.getSameRowFieldAndValue(oldRecord[combinedNewRecord.info?.attributeName!]?.[LINK_SYMBOL]))\n }\n })\n\n return result\n }\n}","import { MatchExpressionData, MatchAtom, MatchExp } from \"./MatchExp.js\"\nimport { BoolExp } from \"@shared\"\nimport { EntityToTableMap } from \"./EntityToTableMap.js\"\nimport { RecordQueryAgent } from \"./RecordQueryAgent.js\"\nimport { RecordQuery } from \"./RecordQuery.js\"\nimport { RecordMutationEvent } from \"@runtime\"\n\nexport interface FilteredEntityDependency {\n filteredEntityName: string\n baseEntityName: string\n matchExpression: MatchExpressionData\n dependencies: {\n entityName: string\n path: string[] // 从 base entity 到依赖 entity 的路径\n attributes: string[] // 依赖的属性列表\n }[]\n}\n\n/**\n * 管理 filtered entity 的所有功能,包括依赖分析、跨实体查询和级联事件处理\n */\nexport class FilteredEntityManager {\n private dependencies: Map<string, FilteredEntityDependency[]> = new Map()\n \n constructor(private map: EntityToTableMap, private queryAgent: RecordQueryAgent) {}\n \n // ============ 依赖管理功能 ============\n \n /**\n * 分析 filtered entity 的过滤条件,提取所有依赖的实体和路径\n */\n analyzeDependencies(filteredEntityName: string, baseEntityName: string, matchExpression: MatchExpressionData): FilteredEntityDependency {\n const dependencies: FilteredEntityDependency['dependencies'] = []\n this.extractDependenciesFromExpression(baseEntityName, matchExpression, dependencies)\n \n const dependency: FilteredEntityDependency = {\n filteredEntityName,\n baseEntityName,\n matchExpression,\n dependencies\n }\n \n // 注册依赖关系\n for (const dep of dependencies) {\n if (!this.dependencies.has(dep.entityName)) {\n this.dependencies.set(dep.entityName, [])\n }\n this.dependencies.get(dep.entityName)!.push(dependency)\n }\n \n // 也注册源实体自身\n if (!this.dependencies.has(baseEntityName)) {\n this.dependencies.set(baseEntityName, [])\n }\n this.dependencies.get(baseEntityName)!.push(dependency)\n \n return dependency\n }\n \n /**\n * 从匹配表达式中提取依赖关系\n */\n private extractDependenciesFromExpression(\n entityName: string, \n expression: MatchExpressionData,\n dependencies: FilteredEntityDependency['dependencies']\n ) {\n // MatchExpressionData 是 BoolExp<MatchAtom> 的别名\n // 使用 BoolExp.fromValue 来获取正确的实例\n const boolExp = BoolExp.fromValue(expression as any)\n \n if (boolExp.isExpression()) {\n if (boolExp.left) {\n this.extractDependenciesFromExpression(entityName, boolExp.left.raw as MatchExpressionData, dependencies)\n }\n if (boolExp.right) {\n this.extractDependenciesFromExpression(entityName, boolExp.right.raw as MatchExpressionData, dependencies)\n }\n } else if (boolExp.isAtom()) {\n const matchAtom = boolExp.data as MatchAtom\n const key = matchAtom.key\n const pathParts = key.split('.')\n \n // 如果路径只有一个部分,说明是源实体自身的属性\n if (pathParts.length === 1) {\n const existing = dependencies.find(d => d.entityName === entityName && d.path.length === 0)\n if (existing) {\n if (!existing.attributes.includes(pathParts[0])) {\n existing.attributes.push(pathParts[0])\n }\n } else {\n dependencies.push({\n entityName,\n path: [],\n attributes: [pathParts[0]]\n })\n }\n } else {\n // 路径包含多个部分,需要解析关联实体\n const fullPath = [entityName].concat(pathParts)\n \n // 获取路径中每个节点的信息\n for (let i = 1; i < fullPath.length - 1; i++) {\n const currentPath = fullPath.slice(0, i + 1)\n const info = this.map.getInfoByPath(currentPath)\n \n if (info && info.isRecord) {\n const depEntityName = info.recordName\n const depPath = pathParts.slice(0, i)\n const attribute = pathParts[pathParts.length - 1]\n \n const existing = dependencies.find(d => \n d.entityName === depEntityName && \n JSON.stringify(d.path) === JSON.stringify(depPath)\n )\n \n if (existing) {\n if (!existing.attributes.includes(attribute)) {\n existing.attributes.push(attribute)\n }\n } else {\n dependencies.push({\n entityName: depEntityName,\n path: depPath,\n attributes: [attribute]\n })\n }\n }\n }\n }\n }\n }\n \n /**\n * 获取某个实体变更时影响的所有 filtered entity\n */\n getAffectedFilteredEntities(entityName: string): FilteredEntityDependency[] {\n return this.dependencies.get(entityName) || []\n }\n \n /**\n * 清除所有依赖关系\n */\n clear() {\n this.dependencies.clear()\n }\n \n // ============ 跨实体查询功能 ============\n \n /**\n * 根据依赖关系和变更的记录,查找所有受影响的源记录\n */\n async findAffectedSourceRecords(\n dependency: FilteredEntityDependency,\n changedEntityName: string,\n changedRecordId: string,\n changedAttributes: string[]\n ): Promise<{ id: string }[]> {\n // 找到这个实体在依赖中的定义\n const depInfo = dependency.dependencies.find(d => d.entityName === changedEntityName)\n if (!depInfo) {\n return []\n }\n \n // 检查变更的属性是否在依赖的属性列表中\n const relevantAttributes = changedAttributes.filter(attr => depInfo.attributes.includes(attr))\n if (relevantAttributes.length === 0) {\n return []\n }\n \n if (depInfo.path.length === 0) {\n // 如果路径为空,说明变更的就是源实体本身\n return [{ id: changedRecordId }]\n }\n \n // 构建反向查询,从变更的实体查找到源实体\n // path 已经是从源实体到目标实体的关系路径\n // 例如:对于 User 依赖 Team.type,path = ['team']\n // 我们需要查找所有 team.id = targetRecordId 的 User\n \n // 构建查询条件:path.id = targetRecordId\n const matchKey = depInfo.path.concat('id').join('.')\n const matchCondition = MatchExp.atom({\n key: matchKey,\n value: ['=', changedRecordId]\n })\n \n // 执行查询\n const query = RecordQuery.create(dependency.baseEntityName, this.map, {\n matchExpression: matchCondition,\n attributeQuery: ['id']\n })\n \n return this.queryAgent.findRecords(query, `find affected source records for ${dependency.baseEntityName}`)\n }\n \n /**\n * 检查记录是否满足 filtered entity 的条件\n */\n async checkRecordMatchesFilter(\n recordId: string,\n entityName: string,\n matchExpression: MatchExpressionData\n ): Promise<boolean> {\n if (!this.queryAgent) {\n throw new Error('QueryAgent not set in FilteredEntityManager')\n }\n \n \n const query = RecordQuery.create(entityName, this.map, {\n matchExpression: matchExpression.and({\n key: 'id',\n value: ['=', recordId]\n }),\n modifier: { limit: 1 }\n })\n \n const results = await this.queryAgent.findRecords(\n query,\n `check if record ${recordId} matches filter condition`\n )\n \n return results.length > 0\n }\n \n // ============ 级联事件处理功能 ============\n \n /**\n * 获取基于指定源实体的所有 filtered entities(包括级联的)\n */\n getFilteredEntitiesForBase(baseEntityName: string): Array<{ name: string, matchExpression: any }> {\n const result: Array<{ name: string, matchExpression: any }> = [];\n const resultSet = new Set<string>();\n const visited = new Set<string>();\n \n const collectFiltered = (entityName: string) => {\n if (visited.has(entityName)) return;\n visited.add(entityName);\n \n const recordInfo = this.map.getRecordInfo(entityName);\n const directFiltered = recordInfo.filteredBy || [];\n \n for (const filtered of directFiltered) {\n // 避免重复添加\n if (!resultSet.has(filtered.name)) {\n resultSet.add(filtered.name);\n \n // 使用预计算的值\n const filteredRecordInfo = this.map.getRecordInfo(filtered.name);\n const combinedExpression = filteredRecordInfo.data.resolvedMatchExpression;\n \n result.push({\n name: filtered.name,\n matchExpression: combinedExpression\n });\n }\n // 递归收集基于这个 filtered entity 的其他 filtered entities\n collectFiltered(filtered.name);\n }\n };\n \n collectFiltered(baseEntityName);\n return result;\n }\n \n /**\n * 更新记录的 filtered entity 标记(主入口方法)\n */\n async updateFilteredEntityFlags(\n entityName: string, \n recordId: string, \n events: RecordMutationEvent[] = [], \n originalRecord?: any, \n isCreation?: boolean, \n changedFields?: string[]\n ): Promise<void> {\n // 对于创建操作,直接检查所有 filtered entities\n if (isCreation && originalRecord) {\n const filteredEntities = this.getFilteredEntitiesForBase(entityName);\n const flags: { [key: string]: boolean } = {};\n \n for (const filteredEntity of filteredEntities) {\n const matchesFilter = await this.checkRecordMatchesFilter(\n recordId,\n entityName,\n filteredEntity.matchExpression\n );\n \n if (matchesFilter) {\n flags[filteredEntity.name] = true;\n events.push({\n type: 'create',\n recordName: filteredEntity.name,\n record: { ...originalRecord, id: recordId }\n });\n }\n }\n \n // 更新 __filtered_entities 字段\n if (Object.keys(flags).length > 0) {\n const recordInfo = this.map.getRecordInfo(entityName);\n const filteredEntitiesAttribute = recordInfo.data.attributes['__filtered_entities'];\n \n if (filteredEntitiesAttribute && (filteredEntitiesAttribute as any).field) {\n const fieldName = (filteredEntitiesAttribute as any).field;\n \n await this.queryAgent.updateRecordDataById(\n entityName,\n { id: recordId },\n [{\n field: fieldName,\n value: JSON.stringify(flags)\n }]\n );\n }\n }\n \n return;\n }\n \n // 获取所有依赖于这个实体的 filtered entity\n const dependencies = this.getAffectedFilteredEntities(entityName)\n \n if (dependencies.length === 0) {\n return\n }\n const changedAttributes = changedFields || (isCreation && originalRecord ? Object.keys(originalRecord) : []);\n \n // 处理每个受影响的 filtered entity\n for (const dependency of dependencies) {\n // 找到所有受影响的源记录\n const affectedSourceRecords = await this.findAffectedSourceRecords(\n dependency,\n entityName,\n recordId,\n changedAttributes\n )\n \n // 更新每个受影响的源记录的 filtered entity 标记\n for (const sourceRecord of affectedSourceRecords) {\n await this.updateSingleFilteredEntityFlag(\n dependency,\n sourceRecord.id,\n events\n )\n }\n }\n }\n isFlagEqual(flag1: { [key: string]: boolean }, flag2: { [key: string]: boolean }): boolean {\n // 只检验 key 为 true 的是否完全相同。为 false 或者 undefined 的 key 不参与比较\n const keys1 = Object.keys(flag1).filter(key => flag1[key] === true);\n const keys2 = Object.keys(flag2).filter(key => flag2[key] === true);\n return keys1.length === keys2.length && keys1.every(key => flag2[key] === true);\n }\n \n /**\n * 更新单个依赖关系的 filtered entity 标记\n */\n private async updateSingleFilteredEntityFlag(\n dependency: FilteredEntityDependency,\n recordId: string,\n events: RecordMutationEvent[]\n ): Promise<void> {\n const recordInfo = this.map.getRecordInfo(dependency.baseEntityName)\n // 获取记录当前的 __filtered_entities 状态\n const currentRecord = await this.queryAgent.findRecords(\n RecordQuery.create(dependency.baseEntityName, this.map, {\n matchExpression: MatchExp.atom({ key: 'id', value: ['=', recordId] }),\n attributeQuery: recordInfo.isRelation ? \n ['*', ['target', {attributeQuery: ['*']}], ['source', {attributeQuery: ['*']}]] : \n ['*']\n }),\n `get current filtered entity flags for ${dependency.baseEntityName}:${recordId}`\n )\n \n if (currentRecord.length === 0) {\n return\n }\n \n const record = currentRecord[0]\n const currentFlags: { [key: string]: boolean } = record.__filtered_entities;\n \n // 检查记录是否满足 filtered entity 的条件\n const matchesFilter = await this.checkRecordMatchesFilter(\n recordId,\n dependency.baseEntityName,\n dependency.matchExpression\n )\n \n const previouslyBelonged = currentFlags[dependency.filteredEntityName] === true\n \n // 如果状态发生变化,生成相应的事件\n if (matchesFilter && !previouslyBelonged) {\n // 记录现在属于这个 filtered entity\n events.push({\n type: 'create',\n recordName: dependency.filteredEntityName,\n record: { ...record }\n })\n \n // 更新标记\n currentFlags[dependency.filteredEntityName] = true\n } else if (!matchesFilter && previouslyBelonged) {\n // 记录不再属于这个 filtered entity\n events.push({\n type: 'delete',\n recordName: dependency.filteredEntityName,\n record: { ...record }\n })\n \n // 更新标记\n currentFlags[dependency.filteredEntityName] = false\n }\n \n // 更新 __filtered_entities 字段\n if (previouslyBelonged !== matchesFilter) {\n // 获取 __filtered_entities 字段的实际数据库字段名\n const recordInfo = this.map.getRecordInfo(dependency.baseEntityName);\n const filteredEntitiesAttribute = recordInfo.data.attributes['__filtered_entities'];\n \n if (filteredEntitiesAttribute && (filteredEntitiesAttribute as any).field) {\n const fieldName = (filteredEntitiesAttribute as any).field;\n \n await this.queryAgent.updateRecordDataById(\n dependency.baseEntityName,\n { id: recordId },\n [{\n field: fieldName,\n value: JSON.stringify(currentFlags)\n }]\n )\n }\n }\n }\n} ","import { EntityIdRef, Database, RecordMutationEvent } from \"@runtime\";\nimport { BoolExp } from \"@shared\";\nimport { EntityToTableMap } from \"./EntityToTableMap.js\";\nimport { assert, setByPath } from \"../utils.js\";\nimport { FieldMatchAtom, MatchAtom, MatchExp, MatchExpressionData } from \"./MatchExp.js\";\nimport { AttributeQuery, AttributeQueryData, AttributeQueryDataRecordItem } from \"./AttributeQuery.js\";\nimport { LINK_SYMBOL, RecordQuery, RecordQueryTree } from \"./RecordQuery.js\";\nimport { NewRecordData, RawEntityData } from \"./NewRecordData.js\";\nimport { Modifier } from \"./Modifier.js\";\n\nimport { FilteredEntityManager } from \"./FilteredEntityManager.js\";\n\n\nexport type JoinTables = {\n for: any\n joinSource: [string, string]\n joinIdField: [string, string]\n joinTarget: [string, string]\n}[]\n\n\n\n\nclass FieldAliasMap {\n aliasToPath: Map<string, string[]> = new Map()\n pathStrToAlias: Map<string, string> = new Map()\n aliasPlaceholder: number=0\n getAlias(path:string[], forceCreate = false) {\n const pathStr = path.join('.')\n const alias = this.pathStrToAlias.get(pathStr)\n if(alias||!forceCreate) return alias\n\n const newAlias = `FIELD_${this.aliasPlaceholder++}`\n this.pathStrToAlias.set(pathStr, newAlias)\n this.aliasToPath.set(newAlias, path)\n return newAlias\n }\n getPath(alias: string) {\n return this.aliasToPath.get(alias)\n }\n}\n\nexport type Record = EntityIdRef & {\n [k: string]: any\n}\n\nexport const ROOT_LABEL = ':root'\n\nexport class RecursiveContext {\n constructor(public label: string, public parent?: RecursiveContext, public stack: any[] = []) {\n\n }\n concat(value: any) {\n return new RecursiveContext(this.label, this.parent, [...this.stack, value])\n }\n\n getStack(key: string) {\n return [...this.stack]\n }\n\n spawn(label: string) {\n return new RecursiveContext(label, this)\n }\n}\n\nclass RecordQueryRef {\n public recordQueryByName = new Map<string, RecordQuery>()\n\n constructor(public recordQuery: RecordQuery) {\n this.set(ROOT_LABEL, recordQuery)\n this.recursiveSaveLabelledRecordQuery(recordQuery)\n }\n\n recursiveSaveLabelledRecordQuery(recordQuery: RecordQuery) {\n recordQuery.attributeQuery?.relatedRecords.forEach((relatedRecordQuery) => {\n if (relatedRecordQuery.label) {\n this.set(relatedRecordQuery.label, relatedRecordQuery)\n this.recursiveSaveLabelledRecordQuery(relatedRecordQuery)\n }\n })\n }\n\n set(key: string, value: any) {\n this.recordQueryByName.set(key, value)\n }\n\n get(key: string) {\n return this.recordQueryByName.get(key)\n }\n\n}\n\nexport type PlaceholderGen = (name?: string) => string\n\nexport class RecordQueryAgent {\n getPlaceholder: () => PlaceholderGen\n private filteredEntityManager: FilteredEntityManager\n \n constructor(public map: EntityToTableMap, public database: Database) {\n this.getPlaceholder = database.getPlaceholder || (() => (name?:string) => `?`)\n this.filteredEntityManager = new FilteredEntityManager(map, this)\n this.initializeFilteredEntityDependencies()\n }\n \n /**\n * 初始化所有 filtered entity 的依赖关系\n */\n private initializeFilteredEntityDependencies() {\n const records = this.map.data.records\n \n for (const [recordName, recordData] of Object.entries(records)) {\n if (recordData.baseRecordName && recordData.matchExpression) {\n // 使用预计算的值\n const rootEntityName = recordData.resolvedBaseRecordName || recordData.baseRecordName;\n const combinedExpression = recordData.resolvedMatchExpression || recordData.matchExpression;\n \n this.filteredEntityManager.analyzeDependencies(\n recordName,\n rootEntityName,\n combinedExpression\n )\n }\n }\n }\n\n // 有 prefix 说明是比人的子查询\n buildXToOneFindQuery(recordQuery: RecordQuery, prefix = '', parentP?:PlaceholderGen): [string, any[], FieldAliasMap] {\n // 从所有条件里面构建出 join clause\n const fieldQueryTree = recordQuery.attributeQuery!.xToOneQueryTree\n\n const matchQueryTree = recordQuery.matchExpression.xToOneQueryTree\n const finalQueryTree = fieldQueryTree.merge(matchQueryTree)\n const joinTables = this.getJoinTables(finalQueryTree, [recordQuery.recordName])\n\n const p = parentP||this.getPlaceholder()\n\n const fieldMatchExp = recordQuery.matchExpression.buildFieldMatchExpression(p, this.database)\n\n const [whereClause, params] = this.buildWhereClause(this.parseMatchExpressionValue(recordQuery.recordName, fieldMatchExp, recordQuery.contextRootEntity, p), prefix, p)\n\n const [selectClause, fieldAliasMap] = this.buildSelectClause(recordQuery.attributeQuery.getValueAndXToOneRecordFields(), prefix)\n const fromClause = this.buildFromClause(recordQuery.recordName, prefix)\n const joinClause = this.buildJoinClause(joinTables, prefix)\n const modifierClause = this.buildModifierClause(recordQuery.modifier, prefix, fieldAliasMap)\n\n return [`\nSELECT\n${selectClause}\nFROM\n${fromClause}\n${joinClause}\nWHERE\n${whereClause}\n\n${modifierClause}\n`,\n params,\n fieldAliasMap\n ]\n\n\n }\n\n buildModifierClause(modifier: Modifier, prefix: string = '', fieldAliasMap: FieldAliasMap) {\n const {limit, offset, orderBy} = modifier\n const clauses = []\n if (orderBy.length) {\n \n clauses.push(`ORDER BY ${orderBy.map(({attribute, recordName, order}) => {\n const fieldPath = [\n `${this.withPrefix(prefix)}${recordName}`,\n attribute\n ]\n const field = fieldAliasMap.getAlias(fieldPath) || fieldPath.join('.')\n return `\"${field}\" ${order}`\n }).join(',')}`)\n }\n\n if (limit) {\n clauses.push(`LIMIT ${limit}`)\n }\n if (offset) {\n clauses.push(`OFFSET ${offset}`)\n }\n\n\n\n return clauses.join('\\n')\n }\n\n\n structureRawReturns(rawReturns: { [k: string]: any }[], JSONFields: string[], fieldAliasMap: FieldAliasMap) {\n return rawReturns.map(rawReturn => {\n const obj = {}\n Object.entries(rawReturn).forEach(([key, value]) => {\n // CAUTION 注意这里去掉了最开始的 entityName\n const attributePath = fieldAliasMap.getPath(key)!.slice(1, Infinity)\n if (attributePath.length === 1 && JSONFields.includes(attributePath[0]) && typeof value === 'string') {\n value = JSON.parse(value)\n }\n if (value !== null) {\n setByPath(obj, attributePath, value)\n }\n })\n return obj\n })\n }\n\n // 查 entity 和 查 relation 都是一样的。具体在 entityQuery 里面区别。\n // TODO 为了性能,也可以把信息丢到客户端,然客户端去结构化???\n\n // CAUTION findRelatedRecords 中的递归调用会使得 includeRelationData 变为 true\n async findRecords(entityQuery: RecordQuery, queryName = '', recordQueryRef?: RecordQueryRef, context: RecursiveContext = new RecursiveContext(ROOT_LABEL)): Promise<Record[]> {\n // 一定在一开始的时候就创建 findContext ,并且是通过直接遍历 entityQuery 拿到原始的 label 的 recordQuery,因为后面\n // 拿不到原始的了,都会带上 parent 的 id,会产生叠加 parent id match 的问题\n if (!recordQueryRef) {\n recordQueryRef = new RecordQueryRef(entityQuery)\n }\n\n if (entityQuery.goto) {\n // 执行用户的手动退出判断。\n if (entityQuery.exit && await entityQuery.exit(context)) {\n return []\n }\n\n\n const gotoQuery = recordQueryRef.get(entityQuery.goto)!\n assert(gotoQuery, `goto ${entityQuery.goto} not found`)\n // 需要把 gotoQuery 和当前 query 中的 matchExpression 合并,因为当前 query 的 matchExpression 有递归的条件,例如 parent.id === xxx。\n const matchExpWithParent = entityQuery.matchExpression.and(gotoQuery.matchExpression!)\n // 统一在这里面处理 gotoQuery 和当前的合并,这样其他的抵用就只需要管好递归中和 parent 的 id 的关系就行了。\n const newQuery = gotoQuery.derive({\n matchExpression: matchExpWithParent\n })\n return this.findRecords(newQuery!, queryName, recordQueryRef, context)\n }\n\n // 检查一下是否已经产生了循环。因为所有的子查询都会以这个函数为入口,所以可以再这里判断。\n if (entityQuery.label && context.label === entityQuery.label && context.stack.length > 1) {\n if (context.stack[0].id === context.stack.at(-1).id) {\n return []\n }\n }\n\n // findRecords 的一个 join 语句里面只能一次性搞定 x:1 的关联实体,以及关系上的 x:1 关联实体。\n // 0. 这里只通过合表或者 join 处理了 x:1 的关联查询,包括了 parentLinkRecordQuery 上字段的查询,以及从 parentLink 发出可以看做是 x:1 的关联字段查询。\n // 这个 x:1 是递归的,把一次性能通过 join 查到的都查了。\n // x:n 的查询是通过二次查询获取的。\n const [querySQL, params, fieldAliasMap] = this.buildXToOneFindQuery(entityQuery, '')\n const records = this.structureRawReturns(await this.database.query(querySQL, params, queryName), this.map.getRecordInfo(entityQuery.recordName).JSONFields, fieldAliasMap) as any[]\n\n // 如果当前的 query 有 label,那么下面任何遍历 record 的地方都要 Push stack。\n const nextRecursiveContext = (entityQuery.label && entityQuery.label !== context.label) ? context.spawn(entityQuery.label) : context\n\n // 第一步的 x:1 的递归形式的查询,相当与一个递归的减掉了所有 x:n 枝干的查询,我们也得递归的把所有 x:n 枝干补出来才行,不只是 parentLink 上的。\n // 1. 补全所有 x:1 查询主干上的 x:n 关联实体及关系查询\n this.completeXToOneLeftoverRecords(entityQuery, records, recordQueryRef, nextRecursiveContext)\n\n \n\n // x:1 关系上的递归 字段查询。因为是递归所以可能不会 join,不会在 buildXToOneFindQuery 里。所以单独查询。\n for (let subEntityQuery of entityQuery.attributeQuery.xToOneRecords) {\n // FIXME 这里的判断逻辑和 goto 耦合太重了?其他地方都是用 关系的类型 去判断的。\n if (subEntityQuery.goto) {\n const info = this.map.getInfo(subEntityQuery.parentRecord!, subEntityQuery.attributeName!)\n const reverseAttributeName = info.getReverseInfo()?.attributeName\n for (let record of records) {\n const matchWithParentId = subEntityQuery.matchExpression.and({\n key: `${reverseAttributeName}.id`,\n value: ['=', record.id]\n })\n const subGotoQueryWithParentMatch = subEntityQuery.derive({\n matchExpression: matchWithParentId\n })\n\n const nextContext = entityQuery.label ? nextRecursiveContext.concat(record) : nextRecursiveContext\n record[subEntityQuery.alias || subEntityQuery.attributeName!] = await this.findRecords(subGotoQueryWithParentMatch, queryName, recordQueryRef, nextContext)\n }\n }\n }\n\n\n // 2. x:1 上的 关系的 x:many关联实体 查询\n for (let subEntityQuery of entityQuery.attributeQuery.xToOneRecords) {\n // x:1 上的关系\n const subLinkRecordQuery = subEntityQuery.attributeQuery.parentLinkRecordQuery\n if (subLinkRecordQuery) {\n // 关系上的 xToMany 查询\n for (let subEntityQueryOfSubLink of subLinkRecordQuery.attributeQuery.xToManyRecords) {\n\n const linkRecordAttributeInfo = this.map.getInfo(subEntityQueryOfSubLink.parentRecord!, subEntityQueryOfSubLink.attributeName!)\n const linkRecordReverseAttributeName = linkRecordAttributeInfo.getReverseInfo()?.attributeName\n\n for (let record of records) {\n // 限制 link.id\n const linkRecordId = record[subEntityQuery.attributeName!][LINK_SYMBOL].id\n const queryOfThisRecord = subEntityQueryOfSubLink.derive({\n matchExpression: subEntityQueryOfSubLink.matchExpression!.and({\n key: `${linkRecordReverseAttributeName}.id`,\n value: ['=', linkRecordId]\n })\n })\n\n const nextContext = entityQuery.label ? nextRecursiveContext.concat(record) : nextRecursiveContext\n\n setByPath(\n record,\n [subEntityQuery.alias || subEntityQuery.attributeName!, LINK_SYMBOL, subEntityQueryOfSubLink.attributeName!],\n await this.findRecords(\n queryOfThisRecord,\n `finding relation data: ${entityQuery.recordName}.${subEntityQuery.attributeName}.&.${subEntityQueryOfSubLink.attributeName}`,\n recordQueryRef,\n nextContext\n )\n )\n }\n }\n }\n }\n\n // 3. x:n 关联实体的查询\n for (let subEntityQuery of entityQuery.attributeQuery.xToManyRecords) {\n // XToMany 的 relationData 是在上面 buildFindQuery 一起查完了的\n if (!subEntityQuery.onlyRelationData) {\n for (let record of records) {\n const nextContext = entityQuery.label ? nextRecursiveContext.concat(record) : nextRecursiveContext\n record[subEntityQuery.alias || subEntityQuery.attributeName!] = await this.findXToManyRelatedRecords(\n entityQuery.recordName,\n subEntityQuery.attributeName!,\n record.id,\n subEntityQuery,\n recordQueryRef,\n nextContext\n )\n }\n }\n }\n return records\n }\n async completeXToOneLeftoverRecords(entityQuery: RecordQuery, records: Record[], recordQueryRef: RecordQueryRef, context: RecursiveContext) {\n // 1. 补全 parentLinkRecordQuery 上的 x:1 关联实体上剩下的 x:n 关联实体的查询\n if (entityQuery.attributeQuery.parentLinkRecordQuery) {\n const info = this.map.getInfo(entityQuery.parentRecord!, entityQuery.attributeName!)\n const reverseAttributeName = info.getReverseInfo()?.attributeName!\n\n for(let xToOneSubQuery of entityQuery.attributeQuery.parentLinkRecordQuery.attributeQuery.xToOneRecords) {\n for(let xToManySubSubQuery of xToOneSubQuery.attributeQuery.xToManyRecords) {\n for(let record of records) {\n const nextContext = entityQuery.label ? context.concat(record) : context\n record[reverseAttributeName][LINK_SYMBOL][xToOneSubQuery.attributeName!][xToManySubSubQuery.attributeName!] = await this.findXToManyRelatedRecords(\n xToManySubSubQuery.parentRecord!,\n xToManySubSubQuery.attributeName!,\n record[reverseAttributeName][LINK_SYMBOL][xToOneSubQuery.attributeName!].id,\n xToManySubSubQuery,\n recordQueryRef,\n nextContext\n )\n }\n }\n }\n }\n\n // 2. 补全 x:1 的关联实体上的 x:n 关联查询\n for(let xToOneSubQuery of entityQuery.attributeQuery.xToOneRecords) {\n for (let xToManySubSubQuery of xToOneSubQuery.attributeQuery.xToManyRecords) {\n for(let record of records) {\n const nextContext = entityQuery.label ? context.concat(record) : context\n record[xToOneSubQuery.attributeName!][xToManySubSubQuery.attributeName!] = await this.findXToManyRelatedRecords(\n xToManySubSubQuery.parentRecord!,\n xToManySubSubQuery.attributeName!,\n record[xToOneSubQuery.attributeName!].id,\n xToManySubSubQuery,\n recordQueryRef,\n nextContext\n )\n }\n }\n\n // 3. 继续递归 complete x:1 关联实体上的 x:1 关联查询\n for(let xToOneSubSubQuery of xToOneSubQuery.attributeQuery.xToOneRecords) {\n for(let record of records) {\n const nextContext = entityQuery.label ? context.concat(record) : context\n await this.completeXToOneLeftoverRecords(xToOneSubSubQuery, [].concat(record[xToOneSubQuery.attributeName!]), recordQueryRef, nextContext)\n }\n }\n }\n }\n\n // CAUTION 任何两个具体的实体之间只能有一条关系,但是可以在关系上有多条数据。1:n 的数据\n\n async findXToManyRelatedRecords(recordName: string, attributeName: string, recordId: string, relatedRecordQuery: RecordQuery, recordQueryRef: RecordQueryRef, context: RecursiveContext) {\n const info = this.map.getInfo(recordName, attributeName)\n const reverseAttributeName = info.getReverseInfo()?.attributeName!\n\n // FIXME 对 n:N 关联实体的查询中,也可能会引用主实体的值,例如:age < '$host.age'。这个时候值已经是确定的了,应该作为 context 传进来,替换掉原本的 matchExpression\n const newMatch = relatedRecordQuery.matchExpression.and({\n key: `${reverseAttributeName}.id`,\n // 这里不能用 EXIST,因为 EXIST 会把 join 变成子查询,而我们还需要关系上的数据,不能用子查询\n value: ['=', recordId]\n })\n\n\n const newAttributeQuery = relatedRecordQuery.attributeQuery.parentLinkRecordQuery ?\n relatedRecordQuery.attributeQuery.withParentLinkData() :\n relatedRecordQuery.attributeQuery\n const newSubQuery = relatedRecordQuery.derive({\n matchExpression: newMatch,\n attributeQuery: newAttributeQuery,\n })\n\n\n // CAUTION 注意这里的第二个参数。因为任何两个具体的实体之间只能有一条关系。所以即使是 n:n 和关系表关联上时,也只有一条关系数据,所以这里可以带上 relation data。\n // 1. 查询 x:n 的实体,以及和父亲的关联关系上的 x:1 的数据\n const data = (await this.findRecords(newSubQuery, `finding related record: ${relatedRecordQuery.parentRecord}.${relatedRecordQuery.attributeName}`, recordQueryRef, context))\n // 1.1 这里再反向处理一下关系数据。因为在上一步 withParentLinkData 查出来的时候是用的是反向的关系名字\n const records = relatedRecordQuery.attributeQuery.parentLinkRecordQuery ? data.map(item => {\n let itemWithParentLinkData: Record\n if (!info.isLinkManyToManySymmetric()) {\n itemWithParentLinkData = {\n ...item,\n [LINK_SYMBOL]: item[reverseAttributeName][LINK_SYMBOL]\n }\n delete itemWithParentLinkData[reverseAttributeName]\n } else {\n // TODO 是不是有更优雅的判断???\n // CAUTION 对称 n:n 关系,和父亲也只有一个方向是有的。\n itemWithParentLinkData = {\n ...item,\n [LINK_SYMBOL]: item[`${reverseAttributeName}:source`]?.[LINK_SYMBOL]?.id ?\n item[`${reverseAttributeName}:source`]?.[LINK_SYMBOL] :\n item[`${reverseAttributeName}:target`]?.[LINK_SYMBOL]\n }\n delete itemWithParentLinkData[`${reverseAttributeName}:source`]\n delete itemWithParentLinkData[`${reverseAttributeName}:target`]\n }\n\n return itemWithParentLinkData\n }) : data\n\n const nextRecursiveContext = (newSubQuery.label && newSubQuery.label !== context.label) ? context.spawn(newSubQuery.label) : context\n\n // 1.2 和父亲的关联关系上的 x:n 的数据\n const parentLinkRecordQuery = relatedRecordQuery.attributeQuery.parentLinkRecordQuery\n if (parentLinkRecordQuery) {\n // 关系上的 xToMany 查询\n for (let subEntityQueryOfLink of parentLinkRecordQuery.attributeQuery.xToManyRecords) {\n for (let record of records) {\n // 应该已经有了和父亲 link 的 id。\n // CAUTION 注意这里用了上面处理过路径\n const linkId = record[LINK_SYMBOL].id\n\n const nextContext = newSubQuery.label ? nextRecursiveContext.concat(record) : nextRecursiveContext\n\n // 查找这个 link 的 x:n 关联实体\n setByPath(\n record,\n [LINK_SYMBOL, subEntityQueryOfLink.attributeName!],\n await this.findXToManyRelatedRecords(\n subEntityQueryOfLink.parentRecord!,\n subEntityQueryOfLink.attributeName!,\n linkId,\n subEntityQueryOfLink,\n recordQueryRef,\n nextContext\n )\n )\n }\n }\n }\n\n return records\n }\n\n // 根据 queryTree 来获得 join table 的信息。因为 queryTree 是树形,所以这里也是个递归结构。\n getJoinTables(queryTree: RecordQueryTree, context: string[] = [], parentInfos?: [string, string, string]): JoinTables {\n // 应该是深度 遍历?\n const result: JoinTables = []\n if (!parentInfos) {\n // context 里面至少会有 entityName 这一个值。\n const parentNamePath = [context[0]]\n const [parentAlias, parentIdField, parentTable] = this.map.getTableAliasAndFieldName(parentNamePath, 'id')\n parentInfos = [parentIdField, parentTable, parentAlias]\n }\n\n const [parentIdField, ...parentTableAndAlias] = parentInfos\n\n\n queryTree.forEachRecords((subQueryTree) => {\n\n const entityAttributeName = subQueryTree.attributeName!\n\n const attributeInfo = subQueryTree.info!\n assert(attributeInfo.isRecord, `${context.concat(entityAttributeName).join('.')} is not a record`)\n\n const currentNamePath = context.concat(entityAttributeName)\n const {\n table: currentTable,\n alias: currentTableAlias,\n linkTable: relationTable,\n linkAlias: relationTableAlias\n } = this.map.getTableAndAliasStack(currentNamePath).at(-1)!\n // CAUTION 特别注意最后一个参数,这是真的要连接实体表的时候就能拿用 shrink 的 id 了。\n const [, idField] = this.map.getTableAliasAndFieldName(currentNamePath, 'id', true)\n // 这里的目的是把 attribute 对应的 record table 找到,并且正确 join 进来。\n // join 本质上是把当前的路径和上一级路径连起来。\n // 这里只处理没有和上一个节点 三表合一 的情况。三表合一的情况不需要 join。复用 alias 就行\n if (!attributeInfo.isMergedWithParent()) {\n if (attributeInfo.isLinkMergedWithParent()) {\n // CAUTION 如果只要获取 id, 不需要 join, map.getTableAliasAndFieldName 会自动解析到合并后的 field 上。\n if (subQueryTree.onlyIdField()) return\n\n result.push({\n for: currentNamePath,\n joinSource: parentTableAndAlias!,\n joinIdField: [attributeInfo.linkField!, idField],\n joinTarget: [currentTable, currentTableAlias]\n })\n } else if (attributeInfo.isLinkMergedWithAttribute()) {\n const reverseAttributeInfo = attributeInfo.getReverseInfo()!\n // 说明记录在对方的 field 里面\n assert(!!reverseAttributeInfo.linkField!, `${reverseAttributeInfo.parentEntityName}.${reverseAttributeInfo.attributeName} has no field`)\n result.push({\n for: currentNamePath,\n joinSource: parentTableAndAlias!,\n // 这里要找当前实体中用什么 attributeName 指向上一个实体\n joinIdField: [parentIdField, reverseAttributeInfo.linkField!],\n joinTarget: [currentTable, currentTableAlias]\n })\n } else {\n // 说明记录在了 relation record 的 source/target 中\n const linkInfo = attributeInfo.getLinkInfo()\n const isCurrentRelationSource =\n attributeInfo.isLinkManyToManySymmetric() ?\n (attributeInfo.symmetricDirection === 'source') :\n linkInfo.isRelationSource(attributeInfo.parentEntityName, attributeInfo.attributeName)\n // 关系表独立\n result.push({\n for: currentNamePath,\n joinSource: parentTableAndAlias!,\n // CAUTION sourceField 是用在合并了情况里面的,指的是 target 在 source 里面的名字!所以这里不能用\n joinIdField: [parentIdField, isCurrentRelationSource ? linkInfo.record.attributes.source.field! : linkInfo.record.attributes.target.field!],\n joinTarget: [relationTable!, relationTableAlias!]\n })\n\n // CAUTION 只有当还要继续获取除 id 的部分时,才要 join 实体表。\n if (!subQueryTree.onlyIdField()) {\n result.push({\n for: currentNamePath,\n joinSource: [relationTable!, relationTableAlias!],\n joinIdField: [isCurrentRelationSource ? linkInfo.record.attributes.target.field! : linkInfo.record.attributes.source.field!, idField],\n joinTarget: [currentTable, currentTableAlias]\n })\n }\n }\n }\n\n\n result.push(...this.getJoinTables(subQueryTree, currentNamePath, [idField!, currentTable!, currentTableAlias!]))\n\n if (subQueryTree.parentLinkQueryTree) {\n\n }\n\n // 处理 link 上的 query。如果只要 id, 那么在上面实体链接的时候就已经有了\n if (subQueryTree.parentLinkQueryTree && !subQueryTree.parentLinkQueryTree.onlyIdField()) {\n // 连接 link 和它的子节点\n const linkNamePath = currentNamePath.concat(LINK_SYMBOL)\n const [, linkIdField] = this.map.getTableAliasAndFieldName(linkNamePath, 'id', true)\n const linkParentInfo: [string, string, string] = [\n linkIdField!,// link 的 idField\n relationTable!, // link 的 tableName\n relationTableAlias!, // link 的 tableAlias\n ]\n\n result.push(...this.getJoinTables(subQueryTree.parentLinkQueryTree, linkNamePath, linkParentInfo))\n\n }\n })\n\n\n return result\n }\n\n withPrefix(prefix = '') {\n return prefix ? `${prefix}___` : ''\n }\n\n buildSelectClause(queryFields: ReturnType<AttributeQuery[\"getValueAndXToOneRecordFields\"]>, prefix = ''): [string, FieldAliasMap] {\n\n const fieldAliasMap= new FieldAliasMap()\n\n if (!queryFields.length) return ['1', fieldAliasMap]\n\n // CUATION 这里创建 fieldAliasMap 是因为有的数据库里标识符有长度限制,例如 PGLite限制为63,由于alias 是拼出来的路径,很可能会过长。\n let aliasPlaceholder = 0\n // CAUTION 所有 entity 都要 select id\n const aliasClauses= queryFields.map(({tableAliasAndField, attribute, nameContext}) => {\n const path = [\n `${this.withPrefix(prefix)}${nameContext[0]}`,\n ...nameContext.slice(1, Infinity),\n attribute\n ]\n const aliasName = fieldAliasMap.getAlias(path, true)\n return (\n `\"${this.withPrefix(prefix)}${tableAliasAndField[0]}\".\"${tableAliasAndField[1]}\" AS \"${aliasName}\"`\n ) \n })\n \n return [aliasClauses.join(',\\n'), fieldAliasMap]\n }\n\n buildFromClause(entityName: string, prefix = '') {\n const recordInfo = this.map.getRecordInfo(entityName)\n return `\"${recordInfo.table}\" AS \"${this.withPrefix(prefix)}${entityName}\"`\n }\n\n buildJoinClause(joinTables: JoinTables, prefix = '') {\n return joinTables.map(({joinSource, joinIdField, joinTarget}) => {\n return `LEFT JOIN \"${joinTarget[0]}\" AS \n\"${this.withPrefix(prefix)}${joinTarget[1]}\" ON \n\"${this.withPrefix(prefix)}${joinSource[1]}\".\"${joinIdField[0]}\" = \"${this.withPrefix(prefix)}${joinTarget[1]}\".\"${joinIdField[1]}\"\n`\n }).join('\\n')\n }\n\n buildWhereClause(fieldMatchExp: BoolExp<FieldMatchAtom> | null, prefix = '', p: PlaceholderGen): [string, any[]] {\n let sql = ``\n const values = []\n if (!fieldMatchExp) return [`1=${p()}`, [1]]\n\n if (fieldMatchExp.isAtom()) {\n if (fieldMatchExp.data.isInnerQuery) {\n sql = fieldMatchExp.data.fieldValue!\n values.push(...fieldMatchExp.data.fieldParams!)\n } else {\n sql = `\"${this.withPrefix(prefix)}${fieldMatchExp.data.fieldName![0]}\".\"${fieldMatchExp.data.fieldName![1]}\" ${fieldMatchExp.data.fieldValue}`\n values.push(...fieldMatchExp.data.fieldParams!)\n }\n } else {\n if (fieldMatchExp.isAnd()) {\n const [leftSql, leftValues] = this.buildWhereClause(fieldMatchExp.left, prefix, p)\n const [rightSql, rightValues] = this.buildWhereClause(fieldMatchExp.right!, prefix, p)\n sql = `(${leftSql} AND ${rightSql})`\n values.push(...leftValues, ...rightValues)\n } else if (fieldMatchExp.isOr()) {\n const [leftSql, leftValues] = this.buildWhereClause(fieldMatchExp.left, prefix, p)\n const [rightSql, rightValues] = this.buildWhereClause(fieldMatchExp.right!, prefix, p)\n sql = `(${leftSql} OR ${rightSql})`\n values.push(...leftValues, ...rightValues)\n } else {\n const [leftSql, leftValues] = this.buildWhereClause(fieldMatchExp.left, prefix, p)\n sql = `NOT (${leftSql})`\n values.push(...leftValues)\n }\n }\n return [sql, values]\n }\n\n // 把 match 中的 exist 创建成子 sql\n parseMatchExpressionValue(entityName: string, fieldMatchExp: BoolExp<FieldMatchAtom> | null, contextRootEntity: string|undefined, p: PlaceholderGen): BoolExp<FieldMatchAtom> | null {\n if (!fieldMatchExp) return null\n\n return fieldMatchExp.map((exp: BoolExp<FieldMatchAtom>, context: string[]) => {\n assert(Array.isArray(exp.data.value), `match value is not a array ${context.join('.')}`)\n\n if (!exp.data.isFunctionMatch) return {...exp.data}\n\n assert(exp.data.value[0].toLowerCase() === 'exist', `we only support Exist function match on entity for now. yours: ${exp.data.key} ${exp.data.value[0]} ${exp.data.value[1]}`)\n\n const info = this.map.getInfoByPath(exp.data.namePath!)!\n const {alias: currentAlias} = this.map.getTableAndAliasStack(exp.data.namePath!).at(-1)!\n const reverseAttributeName = this.map.getReverseAttribute(info.parentEntityName, info.attributeName)\n\n // 注意这里去掉了 namePath 里面根部的 entityName,因为后面计算 referenceValue 的时候会加上。\n const parentAttributeNamePath = exp.data.namePath!.slice(1, -1)\n\n const existEntityQuery = RecordQuery.create(info.recordName, this.map, {\n matchExpression: MatchExp.atom({\n key: `${reverseAttributeName}.id`,\n value: ['=', parentAttributeNamePath.concat('id').join('.')],\n isReferenceValue: true\n }).and(exp.data.value[1])\n },\n // 如果上层还有,就继承上层的,如果没有, context 就只这一层。这个变量是用来给 matchExpression 里面的 value 来引用上层的值的。\n // 例如查询用户,要求他存在一个朋友的父母的年龄是小于这个用户。对朋友的父母的年龄匹配中,就需要引用最上层的 alias。\n contextRootEntity || entityName\n )\n\n const [innerQuerySQL, innerParams] = this.buildXToOneFindQuery(existEntityQuery, currentAlias, p)\n\n return {\n ...exp.data,\n isInnerQuery: true,\n fieldValue: `\nEXISTS (\n${innerQuerySQL}\n)\n`,\n fieldParams: innerParams,\n }\n })\n }\n\n\n async createRecordDependency(newRecordData: NewRecordData, events?: RecordMutationEvent[]): Promise<NewRecordData> {\n const newRecordDataWithDeps: { [k: string]: EntityIdRef } = {}\n // 处理往自身合并的需要新建的关系和 record\n for (let mergedLinkTargetRecord of newRecordData.mergedLinkTargetNewRecords.concat(newRecordData.mergedLinkTargetRecordIdRefs)) {\n let newDepIdRef\n if (!mergedLinkTargetRecord.isRef()) {\n newDepIdRef = await this.createRecord(mergedLinkTargetRecord, `create merged link dep record ${newRecordData.recordName}.${mergedLinkTargetRecord.info?.attributeName}`, events)\n } else {\n newDepIdRef = mergedLinkTargetRecord.getRef()\n }\n newRecordDataWithDeps[mergedLinkTargetRecord.info!.attributeName] = newDepIdRef\n\n if (mergedLinkTargetRecord.linkRecordData) {\n // 为 link 也要把 dependency 准备好。\n const newLinkRecordData = mergedLinkTargetRecord.linkRecordData.merge({\n [mergedLinkTargetRecord.info!.isRecordSource() ? 'target' : 'source']: newDepIdRef\n })\n // 所有 Link dep 也准备好了\n const newLinkRecordDataWithDep = await this.createRecordDependency(newLinkRecordData)\n\n newRecordDataWithDeps[mergedLinkTargetRecord.info!.attributeName][LINK_SYMBOL] = newLinkRecordDataWithDep.getData()\n }\n }\n\n // 处理和我三表合一的 link record 的 dependency\n for (let combinedRecord of newRecordData.combinedNewRecords.concat(newRecordData.combinedRecordIdRefs)) {\n if (combinedRecord.linkRecordData) {\n const newLinkRecordDataWithDep = await this.createRecordDependency(combinedRecord.linkRecordData, events)\n newRecordDataWithDeps[combinedRecord.info!.attributeName!] = {\n // 注意这里原本的数据不能丢,因为下面的 merge 不是深度 merge。\n ...combinedRecord.getData() as EntityIdRef,\n [LINK_SYMBOL]: newLinkRecordDataWithDep.getData()\n }\n }\n }\n\n // 返回追备好 link 数据和准备好 record 数据的新 newRecordData\n return newRecordData.merge(newRecordDataWithDeps)\n }\n\n async createRecord(newEntityData: NewRecordData, queryName?: string, events?: RecordMutationEvent[]): Promise<EntityIdRef> {\n const newEntityDataWithDep = await this.createRecordDependency(newEntityData, events)\n const newRecordIdRef = await this.insertSameRowData(newEntityDataWithDep, queryName, events)\n\n const relianceResult = await this.handleCreationReliance(newEntityDataWithDep.merge(newRecordIdRef), events)\n\n // 合并所有数据以获得完整的记录\n const fullRecord = Object.assign({}, newEntityData.getData(), newRecordIdRef, relianceResult);\n\n // 处理 filtered entity - 检查新创建的记录是否属于任何 filtered entity\n // 传递 isCreation = true 表示这是创建操作,只生成事件但不持久化 __filtered_entities\n await this.filteredEntityManager.updateFilteredEntityFlags(newEntityData.recordName, newRecordIdRef.id, events, fullRecord, true)\n\n // 更新 relianceResult 的信息到\n return Object.assign(newRecordIdRef, relianceResult)\n }\n\n // CAUTION 因为这里分配了 id,并且所有的判断逻辑都在,所以事件也放在这里处理,而不是真实插入或者更新数据的时候。\n async preprocessSameRowData(newEntityData: NewRecordData, isUpdate = false, events?: RecordMutationEvent[], oldRecord?: Record): Promise<NewRecordData> {\n const newRawDataWithNewIds = newEntityData.getData()\n // CAUTION 特别注意,我们是支持数据使用 外部 id,例如使用外部用户系统的时候,它的 id 就是外部分配的。\n // 还有一种情况是 relocate record 的时候也用了这个函数,这个时候也是不要重新分配 id 的!\n // 也正是因为如此,所以我们通过一个参数 isUpdate 显式声明到底是不是 update,不能用有没有 id 来判断!\n if (!isUpdate && !newRawDataWithNewIds.id) {\n // 为自己分配 id,一定要在最前面,因为后面记录link 事件的地方一定要有 target/source 的 id\n newRawDataWithNewIds.id = await this.database.getAutoId(newEntityData.recordName)\n } else if(isUpdate && !newRawDataWithNewIds.id) {\n // 因为用户传进来的 update 字段里面可能没有 id 字段,所以这里要加上。\n // newRawDataWithNewIds 用在了后面的 event 里面,保证有 id 才正确。外部可能会从 event 里面读。\n newRawDataWithNewIds.id = oldRecord!.id\n }\n\n if (!isUpdate) {\n events?.push({\n type: 'create',\n recordName: newEntityData.recordName,\n record: {\n ...newEntityData.defaultValues,\n ...newRawDataWithNewIds\n }\n })\n } else {\n // 可能只是更新关系,所以这里一定要有自身的 value 才算是 update 自己\n if (newEntityData.valueAttributes.length) {\n events?.push({\n type: 'update',\n recordName: newEntityData.recordName,\n record: {...newEntityData.getData()!, id: oldRecord!.id},\n oldRecord: oldRecord\n })\n }\n }\n\n // 1. 先为三表合一的新数据分配 id\n for (let record of newEntityData.combinedNewRecords) {\n newRawDataWithNewIds[record.info!.attributeName] = {\n ...newRawDataWithNewIds[record.info!.attributeName],\n id: await this.database.getAutoId(record.info!.recordName!),\n }\n events?.push({\n type: 'create',\n recordName: record.recordName,\n record: newRawDataWithNewIds[record.info!.attributeName]\n })\n }\n\n // 2. 为我要新建 三表合一、或者我 mergedLink 的 的 关系 record 分配 id.\n for (let record of newEntityData.mergedLinkTargetNewRecords.concat(newEntityData.mergedLinkTargetRecordIdRefs, newEntityData.combinedNewRecords)) {\n if (newRawDataWithNewIds[record.info!.attributeName].id !== oldRecord?.[record.info!.attributeName]?.id) {\n newRawDataWithNewIds[record.info!.attributeName][LINK_SYMBOL] = {\n ...(newRawDataWithNewIds[record.info!.attributeName][LINK_SYMBOL] || {}),\n id: await this.database.getAutoId(record.info!.linkName!),\n }\n\n const linkRecord = {...newRawDataWithNewIds[record.info!.attributeName][LINK_SYMBOL]}\n linkRecord[record.info!.isRecordSource() ? 'target' : 'source'] = record.getData()\n linkRecord[record.info!.isRecordSource() ? 'source' : 'target'] = {...newRawDataWithNewIds}\n delete linkRecord.target[LINK_SYMBOL]\n delete linkRecord.source[LINK_SYMBOL]\n\n\n events?.push({\n type: 'create',\n recordName: record.info!.linkName,\n record: linkRecord\n })\n }\n }\n\n // FIXME 如果不同,才需要 merge。现在不知道为什么 relation 和 source 记录上出现了个 & 关系数据。\n const newEntityDataWithIds = newEntityData.merge(newRawDataWithNewIds)\n\n // 2. 处理需要 flashOut 的数据\n // TODO create 的情况下,有没可能不需要 flashout 已有的数据,直接更新到已有的 combined record 的行就行了。\n const flashOutRecordRasData: { [k: string]: RawEntityData } = await this.flashOutCombinedRecordsAndMergedLinks(\n newEntityData,\n events,\n `finding combined records for ${newEntityData.recordName} to flash out, for ${isUpdate ? 'updating' : 'creation'} with data ${JSON.stringify(newEntityDataWithIds.getData())}`\n )\n\n return newEntityDataWithIds.merge(flashOutRecordRasData)\n }\n\n async flashOutCombinedRecordsAndMergedLinks(newEntityData: NewRecordData, events?: RecordMutationEvent[], reason = ''): Promise<{ [k: string]: RawEntityData }> {\n const result: { [k: string]: RawEntityData } = {}\n // CAUTION 这里是从 newEntityData 里读,不是从 newEntityDataWithIds,那里面是刚分配id 的,还没数据。\n let match: MatchExpressionData | undefined\n // 这里的目的是抢夺 combined record 上的所有数据,那么一定穷尽 combined record 的同表数据才行。\n const attributeQuery: AttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(newEntityData.recordName, this.map, true, true, false, true)\n for (let combinedRecordIdRef of newEntityData.combinedRecordIdRefs) {\n const attributeIdMatchAtom: MatchAtom = {\n key: `${combinedRecordIdRef.info!.attributeName!}.id`,\n value: ['=', combinedRecordIdRef.getRef().id]\n }\n if (!match) {\n match = MatchExp.atom(attributeIdMatchAtom)\n } else {\n match = match.or(attributeIdMatchAtom)\n }\n }\n\n const recordQuery = RecordQuery.create(newEntityData.recordName, this.map, {\n matchExpression: match,\n attributeQuery: attributeQuery,\n }, undefined, undefined, undefined, false, true)\n\n const recordsWithCombined = await this.findRecords(recordQuery, reason, undefined)\n\n\n // const hasNoConflict = recordsWithCombined.length === 1 && !recordsWithCombined[0].id\n // 开始 merge 数据,并记录 unLink 事件\n for (let recordWithCombined of recordsWithCombined) {\n for (let combinedRecordIdRef of newEntityData.combinedRecordIdRefs) {\n if (recordWithCombined[combinedRecordIdRef.info?.attributeName!]) {\n\n // TODO 如果没有冲突的话,可以不用删除原来的数据。外面直接更新这一行就行了\n //1. 删掉 combined 原来的所有同行数据\n await this.deleteRecordSameRowData(combinedRecordIdRef.recordName, [{id: recordWithCombined[combinedRecordIdRef.info?.attributeName!].id}])\n\n //2. 如果是抢夺,要记录一下事件。\n if (recordWithCombined.id) {\n events?.push({\n type: 'delete',\n recordName: combinedRecordIdRef.info!.linkName!,\n record: recordWithCombined[combinedRecordIdRef.info?.attributeName!][LINK_SYMBOL],\n })\n }\n\n //3. merge 数据并建立定的关系。\n assert(!result[combinedRecordIdRef.info?.attributeName!], `should not have same combined record, conflict attribute: ${combinedRecordIdRef.info?.attributeName!}`)\n result[combinedRecordIdRef.info?.attributeName!] = {\n ...recordWithCombined[combinedRecordIdRef.info?.attributeName!]\n }\n // 相当于新建了关系。如果不是虚拟link 就要记录。\n // TODO 要给出一个明确的 虚拟 link record 的差异\n if (!combinedRecordIdRef.info!.isLinkSourceRelation()) {\n result[combinedRecordIdRef.info?.attributeName!][LINK_SYMBOL] = {\n id: await this.database.getAutoId(combinedRecordIdRef.info!.linkName!),\n }\n events?.push({\n type: 'create',\n recordName: combinedRecordIdRef.info!.linkName,\n record: result[combinedRecordIdRef.info?.attributeName!][LINK_SYMBOL]\n })\n }\n }\n }\n }\n\n return result\n }\n\n async relocateCombinedRecordDataForLink(linkName: string, matchExpressionData: MatchExpressionData, moveSource = false, events?: RecordMutationEvent[]) {\n const attributeQuery: AttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(linkName, this.map, true, true, true, true)\n const moveAttribute = moveSource ? 'source' : 'target'\n\n const records = await this.findRecords(RecordQuery.create(linkName, this.map, {\n matchExpression: matchExpressionData,\n attributeQuery: attributeQuery\n }), `finding combined records for relocate ${linkName}.${moveAttribute}`, undefined)\n\n const toMoveRecordInfo = this.map.getLinkInfoByName(linkName)[moveSource ? 'sourceRecordInfo' : 'targetRecordInfo']\n\n // 1. 把这些数据删除,在下面重新插入到新行\n await this.deleteRecordSameRowData(toMoveRecordInfo.name, records.map(r => r[moveAttribute]))\n\n // 2. 重新插入到新行\n for (let record of records) {\n const toMoveRecordData = new NewRecordData(this.map, toMoveRecordInfo.name, record[moveAttribute])\n await this.insertSameRowData(toMoveRecordData, undefined)\n\n // 3. 增加 delete 关系的事件\n events?.push({\n type: 'delete',\n recordName: linkName,\n record: record\n })\n }\n\n\n }\n\n async insertSameRowData(newEntityData: NewRecordData, queryName?: string, events?: RecordMutationEvent[]): Promise<EntityIdRef> {\n // 由于我们可以抢夺别人的关联实体,所以会产生一个 unlink 事件,所以 events 要传进去。\n const newEntityDataWithIdsWithFlashOutRecords = await this.preprocessSameRowData(newEntityData, false, events)\n // 3. 插入新行。\n const sameRowNewFieldAndValue = newEntityDataWithIdsWithFlashOutRecords.getSameRowFieldAndValue()\n const p = this.getPlaceholder()\n const recordInfo = this.map.getRecordInfo(newEntityData.recordName)\n const result = await this.database.insert(`\nINSERT INTO \"${recordInfo.table}\"\n(${sameRowNewFieldAndValue.map(f => `\"${f.field}\"`).join(',')})\nVALUES\n(${sameRowNewFieldAndValue.map(f => p()).join(',')}) \n`, sameRowNewFieldAndValue.map(f => this.prepareFieldValue(f.value, f.fieldType!)), queryName) as EntityIdRef\n\n return Object.assign(result, newEntityDataWithIdsWithFlashOutRecords.getData())\n }\n\n prepareFieldValue(value: any, fieldType?: string) {\n if (fieldType?.toLowerCase() === 'json') {\n return JSON.stringify(value)\n }\n return value\n }\n\n\n async handleCreationReliance(newEntityData: NewRecordData, events?: RecordMutationEvent[]): Promise<object> {\n const currentIdRef = newEntityData.getRef()\n const newIdRefs: { [k: string]: EntityIdRef | EntityIdRef[] } = {}\n // 1. 处理关系往 attribute 方向合并的新数据\n for (let record of newEntityData.differentTableMergedLinkNewRecords) {\n const reverseAttribute = record.info?.getReverseInfo()?.attributeName!\n const newRecordDataWithMyId = record.merge({\n [reverseAttribute]: currentIdRef\n })\n const newRecordIdRef = await this.createRecord(newRecordDataWithMyId, `create record ${newEntityData.recordName}.${record.info?.attributeName}`, events)\n if (record.info!.isXToMany) {\n if (!newIdRefs[record.info!.attributeName]) {\n newIdRefs[record.info!.attributeName!] = []\n }\n newIdRefs[record.info!.attributeName].push({\n ...newRecordIdRef,\n [LINK_SYMBOL]: newRecordIdRef[reverseAttribute][LINK_SYMBOL]\n })\n } else {\n newIdRefs[record.info!.attributeName] = {\n ...newRecordIdRef,\n [LINK_SYMBOL]: newRecordIdRef[reverseAttribute][LINK_SYMBOL]\n }\n }\n }\n\n // 2. 处理关系往 attribute 方向合并的老数据\n for (let record of newEntityData.differentTableMergedLinkRecordIdRefs) {\n const reverseInfo = record.info!.getReverseInfo()!\n const idMatch = MatchExp.atom({\n key: 'id',\n value: ['=', record.getRef().id]\n })\n const newData = {\n [reverseInfo!.attributeName]: currentIdRef,\n [LINK_SYMBOL]: record.getData()[LINK_SYMBOL]\n }\n const [updatedRecord] = await this.updateRecord(reverseInfo.parentEntityName, idMatch, new NewRecordData(this.map, reverseInfo.parentEntityName, newData), events)\n if (record.info!.isXToMany) {\n if (!newIdRefs[record.info!.attributeName]) {\n newIdRefs[record.info!.attributeName!] = []\n }\n newIdRefs[record.info!.attributeName].push({\n ...updatedRecord,\n [LINK_SYMBOL]: updatedRecord[reverseInfo!.attributeName][LINK_SYMBOL]\n })\n } else {\n newIdRefs[record.info!.attributeName] = {\n ...updatedRecord,\n [LINK_SYMBOL]: updatedRecord[reverseInfo!.attributeName][LINK_SYMBOL]\n }\n }\n }\n\n // 3. 处理完全独立的新数据和关系\n for (let record of newEntityData.isolatedNewRecords) {\n const newRecordIdRef = await this.createRecord(record, `create isolated related record ${newEntityData.recordName}.${record.info?.attributeName}`, events)\n\n\n const linkRawData: RawEntityData = record.linkRecordData?.getData() || {}\n Object.assign(linkRawData, {\n source: record.info!.isRecordSource() ? currentIdRef : newRecordIdRef,\n target: record.info!.isRecordSource() ? newRecordIdRef : currentIdRef\n })\n const newLinkData = new NewRecordData(this.map, record.info!.linkName, linkRawData)\n const newLinkRecord = await this.createRecord(newLinkData, `create isolated related link record ${newEntityData.recordName}.${record.info?.attributeName}`, events)\n\n if (record.info!.isXToMany) {\n if (!newIdRefs[record.info!.attributeName]) {\n newIdRefs[record.info!.attributeName!] = []\n }\n newIdRefs[record.info!.attributeName].push({\n ...newRecordIdRef,\n [LINK_SYMBOL]: newLinkRecord\n })\n } else {\n newIdRefs[record.info!.attributeName] = {\n ...newRecordIdRef,\n [LINK_SYMBOL]: newLinkRecord\n }\n }\n }\n\n // 4. 处理完全独立的老数据和的关系。\n for (let key in newEntityData.isolatedRecordIdRefs) {\n const record = newEntityData.isolatedRecordIdRefs[key]\n // 针对 x:1 关系要先删除原来的关系\n if (record.info!.isXToOne) {\n const match = MatchExp.atom({\n key: record.info?.isRecordSource() ? 'target.id' : 'source.id',\n value: ['=', record.getRef().id]\n })\n await this.unlink(record.info!.linkName, match, false, 'unlink xToOne old link', events)\n }\n const linkRawData: RawEntityData = record.linkRecordData?.getData() || {}\n Object.assign(linkRawData, {\n source: record.info!.isRecordSource() ? currentIdRef : record.getRef(),\n target: record.info!.isRecordSource() ? record.getRef() : currentIdRef\n })\n const newLinkData = new NewRecordData(this.map, record.info!.linkName, linkRawData)\n const newLinkRecord = await this.createRecord(newLinkData, `create isolated related link record of old related ${newEntityData.recordName}.${record.info?.attributeName}`, events)\n\n if (record.info!.isXToMany) {\n if (!newIdRefs[record.info!.attributeName]) {\n newIdRefs[record.info!.attributeName!] = []\n }\n (newIdRefs[record.info!.attributeName] as Record[])![key] = {\n ...record.getData(),\n [LINK_SYMBOL]: newLinkRecord\n }\n } else {\n newIdRefs[record.info!.attributeName] = {\n ...record.getData(),\n [LINK_SYMBOL]: newLinkRecord\n }\n }\n }\n\n return newIdRefs\n }\n\n\n // CAUTION 除了 1:1 并且合表的关系,不能递归更新 relatedEntity,如果是传入了,说明是建立新的关系。\n async updateRecordDataById(entityName: string, idRef: EntityIdRef, columnAndValue: {\n field: string,\n value: string\n }[]): Promise<EntityIdRef> {\n if (!columnAndValue.length) {\n return idRef\n }\n const p = this.getPlaceholder()\n const entityInfo = this.map.getRecordInfo(entityName);\n await this.database.update(`\nUPDATE \"${entityInfo.table}\"\nSET ${columnAndValue.map(({field}) => `\"${field}\" = ${p()}`).join(',')}\nWHERE \"${entityInfo.idField}\" = (${p()})\n `, [...columnAndValue.map(({field, value}) => value), idRef.id], entityInfo.idField, `update record ${entityName} by id`)\n // 注意这里,使用要返回匹配的类,虽然可能没有更新数据。这样才能保证外部的逻辑比较一致。\n return idRef\n }\n\n async updateSameRowData(entityName: string, matchedEntity: Record, newEntityDataWithDep: NewRecordData, events?: RecordMutationEvent[]) {\n \n\n // 跟自己合表实体的必须先断开关联,也就是移走。不然下面 updateRecordData 的时候就会把数据删除。\n const sameRowEntityNullOrRefOrNewData = newEntityDataWithDep.combinedRecordIdRefs.concat(\n newEntityDataWithDep.combinedNewRecords, \n newEntityDataWithDep.combinedNullRecords, \n newEntityDataWithDep.mergedLinkTargetNullRecords,\n newEntityDataWithDep.mergedLinkTargetRecordIdRefs,\n )\n // 1. 删除旧的关系。出现null 或者新的管理数据,说明是建立新的关系,也要先删除关系。\n for (let newRelatedEntityData of sameRowEntityNullOrRefOrNewData) {\n const linkInfo = newRelatedEntityData.info!.getLinkInfo()\n const updatedEntityLinkAttr = linkInfo.isRelationSource(entityName, newRelatedEntityData.info!.attributeName) ? 'source' : 'target'\n if ((newRelatedEntityData.isRef() && matchedEntity[newRelatedEntityData.info?.attributeName!]?.id === newRelatedEntityData.getData().id)) {\n // 放过原来就是同样 related entity 的场景。可能是编程中为了方便没做检查,把原本的写了进来。\n continue\n }\n\n await this.unlink(\n linkInfo.name,\n MatchExp.atom({\n key: `${updatedEntityLinkAttr}.id`,\n value: ['=', matchedEntity.id],\n }),\n !linkInfo.isRelationSource(entityName, newRelatedEntityData.info!.attributeName),\n `unlink ${newRelatedEntityData.info?.parentEntityName} ${newRelatedEntityData.info?.attributeName} for update ${entityName}`,\n events\n )\n }\n\n // 2. 分配 id,处理需要 flash out 的数据等,事件也是这里面记录的。这里面会有抢夺关系,所以也可能会有删除事件。\n const newEntityDataWithIdsWithFlashOutRecords = await this.preprocessSameRowData(newEntityDataWithDep, true, events, matchedEntity)\n const allSameRowData = newEntityDataWithIdsWithFlashOutRecords.getSameRowFieldAndValue(matchedEntity)\n const columnAndValue = allSameRowData.map(({field, value}: { field: string, value: string }) => (\n {\n field,\n /// TODO value 要考虑引用自身或者 related entity 其他 field 的情况?例如 age+5\n // value: JSON.stringify(value)\n value: value\n }\n ))\n\n // 3. 真实处理数据,这里面没有记录事件,事件是上面处理的。、\n await this.updateRecordDataById(entityName, matchedEntity, columnAndValue)\n return newEntityDataWithIdsWithFlashOutRecords\n }\n\n async handleUpdateReliance(entityName: string, matchedEntity: EntityIdRef, newEntityData: NewRecordData, events?: RecordMutationEvent[]) {\n\n\n // CAUTION update 里面的表达关联实体的语义统统认为是 replace。如果用户想要表达 xToMany 的情况下新增关系,应该自己拆成两步进行。既先更新数据,再用 addLink 去增加关系。\n // 1. 断开自己和原来关联实体的关系。这里只要处理依赖我的,或者关系独立的,因为我依赖的在应该在 updateSameRowData 里面处理了。\n const otherTableEntitiesData = newEntityData.differentTableMergedLinkRecordIdRefs.concat(\n newEntityData.differentTableMergedLinkNewRecords,\n newEntityData.differentTableMergedLinkNullRecords,\n newEntityData.isolatedRecordIdRefs,\n newEntityData.isolatedNewRecords,\n newEntityData.isolatedNullRecords\n )\n\n\n // CAUTION 由于 xToMany 的数组情况会平铺处理,所以这里可能出现两次,所以这里记录一下排重\n const removedLinkName = new Set()\n for (let relatedEntityData of otherTableEntitiesData) {\n const linkInfo = relatedEntityData.info!.getLinkInfo()\n if (removedLinkName.has(linkInfo.name)) {\n continue\n }\n\n removedLinkName.add(linkInfo.name)\n const updatedEntityLinkAttr = linkInfo.isRelationSource(entityName, relatedEntityData.info!.attributeName) ? 'source' : 'target'\n await this.unlink(\n linkInfo.name,\n MatchExp.atom({\n key: `${updatedEntityLinkAttr}.id`,\n value: ['=', matchedEntity.id],\n }),\n !linkInfo.isRelationSource(entityName, relatedEntityData.info!.attributeName),\n 'unlink old reliance for update',\n events,\n )\n }\n\n const result: Record = {id: matchedEntity.id}\n // 2. 建立新关系\n // 处理和其他实体更新关系的情况。\n for (let newRelatedEntityData of otherTableEntitiesData) {\n // 跳过已显式设置为 null 的关系属性\n if (newEntityData.rawData[newRelatedEntityData.info?.attributeName!] === null) {\n continue;\n }\n \n // 这里只处理没有三表合并的场景。因为三表合并的数据在 sameTableFieldAndValues 已经有了\n // 这里只需要处理 1)关系表独立 或者 2)关系表往另一个方向合了的情况。因为往本方向和的情况已经在前面 updateEntityData 里面处理了\n let finalRelatedEntityRef: Record\n\n if (newRelatedEntityData.isRef()) {\n finalRelatedEntityRef = newRelatedEntityData.getRef()\n } else {\n finalRelatedEntityRef = await this.createRecord(newRelatedEntityData, `create new related record for update ${newEntityData.recordName}.${newRelatedEntityData.info?.attributeName}`, events)\n }\n\n // FIXME 这里没有在更新的时候一次性写入,而是又通过 addLinkFromRecord 建立的关系。需要优化\n const linkRecord = await this.addLinkFromRecord(entityName, newRelatedEntityData.info?.attributeName!, matchedEntity.id, finalRelatedEntityRef.id, undefined, events)\n\n if (newRelatedEntityData.info!.isXToMany) {\n if (!result[newRelatedEntityData.info!.attributeName!]) {\n result[newRelatedEntityData.info!.attributeName!] = []\n }\n result[newRelatedEntityData.info!.attributeName!].push({\n ...finalRelatedEntityRef,\n [LINK_SYMBOL]: linkRecord,\n })\n } else {\n result[newRelatedEntityData.info!.attributeName!] = {\n ...finalRelatedEntityRef,\n [LINK_SYMBOL]: linkRecord,\n }\n }\n\n }\n\n return result\n }\n\n // 修改TODO注释以反映已实现的功能\n async updateRecord(entityName: string, matchExpressionData: MatchExpressionData, newEntityData: NewRecordData, events?: RecordMutationEvent[]) {\n // 现在支持在 update 字段的同时,使用 null 来删除关系\n // FIXME update 的 attributeQuery 应该按需查询,现在查询的记录太多\n\n const updateRecordQuery = RecordQuery.create(entityName, this.map, {\n matchExpression: matchExpressionData,\n attributeQuery: AttributeQuery.getAttributeQueryDataForRecord(entityName, this.map, true, true, true, true)\n })\n \n const matchedEntities = await this.findRecords(updateRecordQuery, `find record for updating ${entityName}`, undefined)\n // 注意下面使用的都是 updateRecordQuery 的 recordName,而不是 entityName,因为 RecordQuery 会根据 recordName 来判断是否是 filtered entity。\n const result: Record[] = []\n for (let matchedEntity of matchedEntities) {\n // 1. 创建我依赖的\n const newEntityDataWithDep = await this.createRecordDependency(newEntityData, events)\n // 2. 把同表的实体移出去,为新同表 Record 建立 id;可能有要删除的 reliance\n const newEntityDataWithIdsWithFlashOutRecords = await this.updateSameRowData(updateRecordQuery.recordName, matchedEntity, newEntityDataWithDep, events)\n // 3. 更新依赖我的和关系表独立的\n const relianceUpdatedResult = await this.handleUpdateReliance(updateRecordQuery.recordName, matchedEntity, newEntityData, events)\n\n // 处理 filtered entity - 检查更新后的记录是否属于任何 filtered entity\n // 传递原始的 matchedEntity,它包含更新前的 __filtered_entities 状态\n // 以及实际更改的字段\n const changedFields = Object.keys(newEntityData.getData())\n await this.filteredEntityManager.updateFilteredEntityFlags(updateRecordQuery.recordName, matchedEntity.id, events, matchedEntity, false, changedFields)\n\n result.push({...newEntityData.getData(), ...newEntityDataWithIdsWithFlashOutRecords.getData(), ...relianceUpdatedResult})\n }\n\n return result\n }\n\n async deleteRecord(recordName: string, matchExp: MatchExpressionData, events?: RecordMutationEvent[], inSameRowDataOp = false) {\n const deleteQuery = RecordQuery.create(recordName, this.map, {\n matchExpression: matchExp,\n attributeQuery: AttributeQuery.getAttributeQueryDataForRecord(\n recordName,\n this.map,\n true,\n true,\n true,\n true\n )\n })\n const records = await this.findRecords(deleteQuery, `find record for deleting ${recordName}`, undefined)\n\n // 注意下面使用的都是 deleteQuery 的 recordName,而不是 entityName,因为 RecordQuery 会根据 recordName 来判断是否是 filtered entity。\n // CAUTION 我们应该先删除关系,再删除关联实体。按照下面的顺序就能保证事件顺序的正确。\n if (records.length) {\n // 删除关系数据(独立表或者关系在另一边的关系数据)\n await this.deleteNotReliantSeparateLinkRecords(deleteQuery.recordName, records, events)\n // 删除依赖我的实体(其他表中的)。注意, reliance 只可能是 1:x,不可能多个 n 个 record 被1个 reliace 依赖。\n // 为什么这里要单独计算 events, 是因为 1:1 并且刚好关系数据分配到了当前 record 上 时,关系事件顺序会不正确了。\n const relianceEvents: RecordMutationEvent[] = []\n await this.deleteDifferentTableReliance(deleteQuery.recordName, records, relianceEvents)\n // 删除自身、有生命周期依赖的合表 record、合表到当前 record 的关系数据。\n const sameRowRecordEvents: RecordMutationEvent[] = []\n await this.deleteRecordSameRowData(deleteQuery.recordName, records, sameRowRecordEvents, inSameRowDataOp)\n\n // 1. recordEvents 除了最后一个外全都是关系删除事件。\n // 2. relianceEvents 中都是 reliance 删除事件,可能包含关系删除事件。\n // 3. 最后 recordEvents 是 record 删除事件。\n const relationEvents = sameRowRecordEvents.slice(0, sameRowRecordEvents.length - records.length)\n const recordEvents = sameRowRecordEvents.slice(sameRowRecordEvents.length - records.length)\n events?.push(...relationEvents, ...relianceEvents, ...recordEvents)\n }\n\n return records\n }\n\n // 这里会把通表的 reliance,以及 reliance 的 reliance 都删除掉。\n // this method will delete all the reliance of the record, and the reliance of the reliance.\n async deleteRecordSameRowData(recordName: string, records: EntityIdRef[], events?: RecordMutationEvent[], inSameRowDataOp = false) {\n const recordInfo = this.map.getRecordInfo(recordName)\n\n for (let record of records) {\n if (!inSameRowDataOp) {\n const recordWithSameRowDataQuery = RecordQuery.create(\n recordName,\n this.map,\n {\n matchExpression: MatchExp.atom({\n key: `id`,\n value: ['=', record.id]\n }),\n attributeQuery: AttributeQuery.getAttributeQueryDataForRecord(recordName, this.map, true, true, true, true),\n modifier: {limit: 1}\n }\n )\n const recordWithSameRowData = await this.findRecords(recordWithSameRowDataQuery, `find record with same row data for delete ${recordName}`, undefined)\n const hasSameRowData = recordInfo.notRelianceCombined.some(info => {\n return !!recordWithSameRowData[0]?.[info.attributeName]?.id\n })\n // 存在合表的1:1关系,且不是 reliance。当前 record 删了,其他数据仍然要留下。\n if (hasSameRowData) {\n // 存在同行 record,只能用 update\n const p = this.getPlaceholder()\n const fields = recordInfo.sameRowFields\n await this.database.update(`\nUPDATE \"${recordInfo.table}\"\nSET ${fields.map(field => `\"${field}\" = ${p()}`).join(',')}\nWHERE \"${recordInfo.idField}\" = ${p()}\n`, [...fields.map(field => null), record.id], recordInfo.idField, `use update to delete ${recordName} because of sameRowData`)\n\n } else {\n // 不存在同行数据 record ,可以 delete row\n const p = this.getPlaceholder()\n await this.database.delete(`\nDELETE FROM \"${recordInfo.table}\"\nWHERE \"${recordInfo.idField}\" = ${p()}\n`, [record.id], `delete record ${recordInfo.name} as row`)\n }\n }\n \n // 1. 一定先删除递归处理同表的 reliance tree\n for (let relianceInfo of recordInfo.sameTableReliance) {\n // 只要真正存在这个数据才要删除\n if (record[relianceInfo.attributeName]?.id) {\n // 和 reliance 的 link record 的事件\n events?.push({\n type: 'delete',\n recordName: relianceInfo.linkName,\n record: {\n ...record[relianceInfo.attributeName][LINK_SYMBOL],\n [relianceInfo.isRecordSource() ? 'source' : 'target']: {\n id: record.id\n },\n [relianceInfo.isRecordSource() ? 'target' : 'source']: {\n id: record[relianceInfo.attributeName].id\n }\n },\n })\n\n await this.handleDeletedRecordReliance(relianceInfo.recordName, record[relianceInfo.attributeName]!, events)\n }\n }\n\n // 2. 接着先记录关系删除事件,再记录 record 删除事件。\n recordInfo.mergedRecordAttributes.forEach(attributeInfo => {\n if (record[attributeInfo.attributeName]?.id) {\n // 记录和自己合并的 link 事件\n events?.push({\n type: 'delete',\n recordName: attributeInfo.linkName,\n // CAUTION 注意这里一定要增加 link 上对于原始 record 的引用。外部计算的时候可能需要,那时可能 record 也删了查询不到了。\n record: {\n ...record[attributeInfo.attributeName][LINK_SYMBOL],\n [attributeInfo.isRecordSource() ? 'source' : 'target']: {\n id: record.id\n },\n [attributeInfo.isRecordSource() ? 'target' : 'source']: {\n id: record[attributeInfo.attributeName].id\n }\n },\n })\n }\n })\n\n recordInfo.notRelianceCombined.forEach(attributeInfo => {\n if (recordInfo.isRelation && (attributeInfo.attributeName === 'target' || attributeInfo.attributeName === 'source')) return\n if (record[attributeInfo.attributeName]?.id === undefined) return\n // 记录和自己合并的 link 事件\n events?.push({\n type: 'delete',\n recordName: attributeInfo.linkName,\n // CAUTION 注意这里一定要增加 link 上对于原始 record 的引用。外部计算的时候可能需要,那时可能 record 也删了查询不到了。\n record: {\n ...record[attributeInfo.attributeName][LINK_SYMBOL],\n [attributeInfo.isRecordSource() ? 'source' : 'target']: {\n id: record.id\n },\n [attributeInfo.isRecordSource() ? 'target' : 'source']: {\n id: record[attributeInfo.attributeName].id\n }\n },\n })\n })\n }\n \n // 处理 filtered entity 的删除事件\n for (let record of records) {\n const filteredEntities = this.filteredEntityManager.getFilteredEntitiesForBase(recordName);\n if (filteredEntities.length > 0 && record.__filtered_entities) {\n // __filtered_entities 可能已经被解析为对象\n const currentFlags = typeof record.__filtered_entities === 'string' \n ? JSON.parse(record.__filtered_entities) \n : record.__filtered_entities;\n for (const filteredEntity of filteredEntities) {\n if (currentFlags[filteredEntity.name] === true) {\n // 记录属于这个 filtered entity,生成删除事件\n events?.push({\n type: 'delete',\n recordName: filteredEntity.name,\n record: { ...record }\n });\n }\n }\n }\n }\n \n events?.push(...records.map(record => ({\n type: 'delete',\n recordName: recordName,\n record,\n }) as RecordMutationEvent))\n }\n\n async handleDeletedRecordReliance(recordName: string, record: EntityIdRef, events?: RecordMutationEvent[]) {\n\n // 删除独立表或者关系在另一边的关系数据\n await this.deleteNotReliantSeparateLinkRecords(recordName, [record], events)\n // 删除依赖我的实体\n await this.deleteDifferentTableReliance(recordName, [record], events)\n // 删除自身以及有生命周期依赖的合表 record\n await this.deleteRecordSameRowData(recordName, [record], events, true)\n return record\n }\n\n async deleteNotReliantSeparateLinkRecords(recordName: string, records: EntityIdRef[], events?: RecordMutationEvent[]) {\n const recordInfo = this.map.getRecordInfo(recordName)\n for (let info of recordInfo.differentTableRecordAttributes) {\n if (!info.isReliance) {\n const key = info.isRecordSource() ? 'source.id' : 'target.id'\n const newMatch = MatchExp.atom({\n key,\n value: ['in', records.map(r => r.id)]\n })\n // 关系事件上全部都要增加原始 record 的引用。注意不能给所有 events 都去加,因为删除 link 时也可能有关联实体被删除事件。\n // 只有最后哪些 events 是删除 link 的事件。\n await this.deleteRecord(info.linkName, newMatch, events)\n }\n }\n }\n\n async deleteDifferentTableReliance(recordName: string, records: EntityIdRef[], events?: RecordMutationEvent[]) {\n const recordInfo = this.map.getRecordInfo(recordName)\n const recordsById = events ? new Map(records.map(r => [r.id, r])) : undefined\n\n for (let info of recordInfo.differentTableReliance) {\n const matchInIds = MatchExp.atom({\n key: `${info.getReverseInfo()?.attributeName!}.id`,\n value: ['in', records.map(r => r.id)]\n })\n await this.deleteRecord(info.recordName, matchInIds, events)\n if (events) {\n // 删除关系时,要增加上当前 record 的引用。\n // TODO 这里需要更加高效的方法\n events.forEach(event => {\n if (event.recordName === info.linkName) {\n const record = recordsById!.get(event.record![info.isRecordSource() ? 'source' : 'target'].id)\n if (record) {\n event.record![info.isRecordSource() ? 'source' : 'target'] = record\n }\n }\n })\n }\n }\n }\n\n\n addLinkFromRecord(entity: string, attribute: string, entityId: string, relatedEntityId: string, attributes: RawEntityData = {}, events?: RecordMutationEvent[]) {\n const linkInfo = this.map.getLinkInfo(entity, attribute)\n const isEntitySource = linkInfo.isRelationSource(entity, attribute)\n\n const sourceId = isEntitySource ? entityId : relatedEntityId\n const targetId = isEntitySource ? relatedEntityId : entityId\n\n return this.addLink(linkInfo.name, sourceId, targetId, attributes, !linkInfo.isRelationSource(entity, attribute), events)\n }\n\n async addLink(linkName: string, sourceId: string, targetId: string, attributes: RawEntityData = {}, moveSource = false, events?: RecordMutationEvent[]) {\n const existRecord = (await this.findRecords(RecordQuery.create(linkName, this.map, {\n matchExpression: MatchExp.atom({key: 'source.id', value: ['=', sourceId]}).and({\n key: 'target.id',\n value: ['=', targetId]\n }),\n modifier: {\n limit: 1\n }\n }), `check if link exist for add link ${linkName}`, undefined))[0]\n\n assert(!existRecord, `cannot create ${linkName} for ${sourceId} ${targetId}, link already exist`)\n\n const linkInfo = this.map.getLinkInfoByName(linkName)\n if (!linkInfo.isCombined() && !linkInfo.isMerged() && (linkInfo.isManyToOne || linkInfo.isOneToMany)) {\n // n 方向要 unlink ?\n const unlinkAttr = linkInfo.isManyToOne ? 'source.id' : 'target.id'\n const unlinkId = linkInfo.isManyToOne ? sourceId : targetId\n const match = MatchExp.atom({\n key: unlinkAttr,\n value: ['=', unlinkId]\n })\n await this.unlink(linkName, match, false, 'unlink combined record for add new link', events)\n }\n\n const newLinkData = new NewRecordData(this.map, linkInfo.name, {\n source: {id: sourceId},\n target: {id: targetId},\n ...attributes\n })\n\n return this.createRecord(newLinkData, `create link record ${linkInfo.name}`, events)\n }\n\n\n async unlink(linkName: string, matchExpressionData: MatchExpressionData, moveSource = false, reason = '', events?: RecordMutationEvent[]) {\n const linkInfo = this.map.getLinkInfoByName(linkName)\n assert(!linkInfo.isTargetReliance, `cannot unlink reliance data, you can only delete record, ${linkName}`)\n\n if (linkInfo.isCombined()) {\n return this.relocateCombinedRecordDataForLink(linkName, matchExpressionData, moveSource, events)\n }\n\n return this.deleteRecord(linkName, matchExpressionData, events)\n\n }\n\n // 查找树形结构的两个数据间的 path\n async findPath(recordName: string, attributePathStr: string, startRecordId: string, endRecordId: string, limitLength?: number): Promise<Record[] | undefined> {\n const attributePathAndLast = attributePathStr.split('.')\n const endAttribute = attributePathAndLast.at(-1)!\n const attributePath = attributePathAndLast.slice(0, -1)\n const match = MatchExp.atom({\n key: 'id',\n value: ['=', startRecordId]\n })\n const attributeQuery: AttributeQueryData = AttributeQuery.getAttributeQueryDataForRecord(recordName, this.map, true, true, false, true)\n const recursiveLabel = attributePathStr\n // 第一次使用路径先产生 label\n let base = attributeQuery\n for (let attr of attributePath) {\n base.push([attr, {attributeQuery: ['*']}])\n base = (base.at(-1)! as AttributeQueryDataRecordItem)[1].attributeQuery!\n }\n base.push([endAttribute, {label: recursiveLabel, attributeQuery: ['*']}])\n base = (base.at(-1)! as AttributeQueryDataRecordItem)[1].attributeQuery!\n // 第二次使用路径产生 goto\n for (let attr of attributePath) {\n base.push([attr, {attributeQuery: ['*']}])\n base = (base.at(-1)! as AttributeQueryDataRecordItem)[1].attributeQuery!\n }\n let foundPath: Record[] | undefined\n const exit = async (context: RecursiveContext) => {\n if (foundPath) return true\n\n if (context.stack.at(-1)?.id === endRecordId) {\n foundPath = [...context.stack]\n return true\n }\n }\n base.push([endAttribute, {goto: recursiveLabel, exit}])\n\n\n const record = (await this.findRecords(RecordQuery.create(recordName, this.map, {\n matchExpression: match,\n attributeQuery\n }), `find records for path ${recordName}.${attributePathStr}`))[0]\n\n // 如果找到了,把头也放进去。让数据格式整齐。\n return foundPath ? [record, ...foundPath] : undefined\n }\n\n}\n\n\n\n","import { EntityToTableMap, RecordMapItem } from \"./EntityToTableMap.js\";\nimport { MatchExp, MatchExpressionData } from \"./MatchExp.js\";\nimport { ModifierData } from \"./Modifier.js\";\nimport { AttributeQueryData } from \"./AttributeQuery.js\";\nimport { assert } from \"../utils.js\";\nimport { RecordQuery } from \"./RecordQuery.js\";\nimport { NewRecordData, RawEntityData } from \"./NewRecordData.js\";\nimport { RecordQueryAgent } from \"./RecordQueryAgent.js\";\nimport { EntityIdRef, Database, RecordMutationEvent, ID_ATTR } from \"@runtime\";\nimport { Record } from \"./RecordQueryAgent.js\";\nimport { RecordInfo } from \"./RecordInfo.js\";\n\nexport class EntityQueryHandle {\n agent: RecordQueryAgent\n\n constructor(public map: EntityToTableMap, public database: Database) {\n this.agent = new RecordQueryAgent(map, database)\n }\n\n async findOne(entityName: string, matchExpression?: MatchExpressionData, modifier: ModifierData = {}, attributeQuery?: AttributeQueryData) {\n const limitedModifier = {\n ...modifier,\n limit: 1\n }\n\n return (await this.find(entityName, matchExpression, limitedModifier, attributeQuery))[0]\n }\n\n async find(entityName: string, matchExpressionData?: MatchExpressionData, modifierData?: ModifierData, attributeQueryData: AttributeQueryData = []): Promise<Record[]> {\n assert(this.map.getRecord(entityName), `cannot find entity ${entityName}`)\n const entityQuery = RecordQuery.create(\n entityName,\n this.map,\n {\n matchExpression: matchExpressionData,\n attributeQuery: attributeQueryData,\n modifier: modifierData\n },\n )\n\n return this.agent.findRecords(entityQuery, `finding ${entityName} from handle`)\n }\n\n async create(entityName: string, rawData: RawEntityData, events?: RecordMutationEvent[]): Promise<EntityIdRef> {\n assert(rawData[ID_ATTR] === null || rawData[ID_ATTR] === undefined, `${ID_ATTR} should be null or undefined when creating new record`)\n const newEntityData = new NewRecordData(this.map, entityName, rawData)\n return this.agent.createRecord(newEntityData, `create record ${entityName} from handle`, events)\n }\n\n // CAUTION 不能递归更新 relate entity 的 value,如果传入了 related entity 的值,说明是建立新的联系。\n async update(entity: string, matchExpressionData: MatchExpressionData, rawData: RawEntityData, events?: RecordMutationEvent[]) {\n const newEntityData = new NewRecordData(this.map, entity, rawData)\n return this.agent.updateRecord(entity, matchExpressionData, newEntityData, events)\n }\n\n async delete(entityName: string, matchExpressionData: MatchExpressionData,events?: RecordMutationEvent[]) {\n return this.agent.deleteRecord(entityName, matchExpressionData, events)\n }\n\n async addRelationByNameById(relationName: string, sourceEntityId: string, targetEntityId: string, rawData: RawEntityData = {}, events?: RecordMutationEvent[]) {\n assert(!!relationName && !!sourceEntityId && targetEntityId!!, `relationName: ${relationName} sourceEntityId:${sourceEntityId} targetEntityId:${targetEntityId} all cannot be empty`)\n return this.agent.addLink(relationName, sourceEntityId, targetEntityId, rawData, false, events)\n }\n\n async addRelationById(entity: string, attribute: string, entityId: string, attributeEntityId: string, relationData?: RawEntityData, events?: RecordMutationEvent[]) {\n return this.agent.addLinkFromRecord(entity, attribute, entityId, attributeEntityId, relationData, events)\n }\n\n async updateRelationByName(relationName: string, matchExpressionData: MatchExpressionData, rawData: RawEntityData, events?: RecordMutationEvent[]) {\n assert(!rawData.source && !rawData.target, 'Relation can only update attributes. Use addRelation/removeRelation to update source/target.')\n return this.agent.updateRecord(relationName, matchExpressionData, new NewRecordData(this.map, relationName, rawData), events)\n }\n\n async removeRelationByName(relationName: string, matchExpressionData: MatchExpressionData, events?: RecordMutationEvent[]) {\n return this.agent.unlink(relationName, matchExpressionData, false, `remove relation ${relationName}`, events)\n }\n\n async findRelationByName(relationName: string, matchExpressionData?: MatchExpressionData, modifierData?: ModifierData, attributeQueryData: AttributeQueryData = []) {\n return this.find(relationName, matchExpressionData, modifierData, attributeQueryData)\n }\n\n async findOneRelationByName(relationName: string, matchExpressionData: MatchExpressionData, modifierData: ModifierData = {}, attributeQueryData: AttributeQueryData = []) {\n const limitedModifier = {\n ...modifierData,\n limit: 1\n }\n\n return (await this.findRelationByName(relationName, matchExpressionData, limitedModifier, attributeQueryData))[0]\n }\n\n async findPath(entity: string, attribute: string, entityId: string, ancestorId: string) {\n return this.agent.findPath(entity, attribute, entityId, ancestorId)\n }\n\n createMatchFromAtom(...arg: Parameters<(typeof MatchExp)[\"atom\"]>) {\n return MatchExp.atom(...arg)\n }\n getRelationName(entity: string, attribute: string): string {\n return this.map.getInfo(entity, attribute).linkName\n }\n getEntityName(entity: string, attribute: string): string {\n const info = this.map.getInfo(entity, attribute)\n return info.recordName\n }\n}","import {AttributeInfo} from \"./AttributeInfo.js\";\nimport {EntityToTableMap, RecordAttribute, RecordMapItem, ValueAttribute} from \"./EntityToTableMap.js\";\n\nexport class RecordInfo {\n data: RecordMapItem\n\n constructor(public name: string, public map: EntityToTableMap) {\n this.data = this.map.data.records[name]!\n }\n\n get isRelation() {\n return this.data.isRelation\n }\n\n get combinedRecords() {\n return this.strictRecordAttributes.filter(info => {\n return info.isMergedWithParent()\n })\n }\n\n get table() {\n return this.data.table\n }\n\n get idField() {\n return this.data.attributes.id.field\n }\n\n get JSONFields() {\n return Object.entries(this.data.attributes).filter(([, attribute]) => {\n return !(attribute as RecordAttribute).isRecord && ((attribute as ValueAttribute ).collection || (attribute as ValueAttribute).type === 'object' || (attribute as ValueAttribute).type === 'json')\n }).map(([attributeName]) => attributeName)\n }\n\n get sameRowFields(): string[] {\n // 自身的value 字段\n const valueFields = this.valueAttributes.map(info => info.field!)\n\n // 和自己合并的关系字段\n const linkFields = this.strictRecordAttributes.filter(info => {\n return info.isLinkMergedWithParent()\n }).map(info => {\n return info.getLinkInfo().recordInfo.sameRowFields\n })\n\n // 当自身是一个关系 record 时,它的 source/target 虽然是 record attribute,但字段是由我来管辖的。\n const managedRecordAttributeFields = this.managedRecordAttributes.map(info => {\n return info.linkField!\n })\n\n const relianceFields = this.sameTableReliance.map(info => {\n return info.getRecordInfo().sameRowFields\n })\n\n\n return valueFields.concat(...linkFields, ...managedRecordAttributeFields, ...relianceFields)\n }\n // 合并了 link 字段的 record\n get mergedRecordAttributes() {\n return this.strictRecordAttributes.filter(info => {\n return info.isLinkMergedWithParent()\n })\n }\n get allFields(): string[] {\n return Object.values(this.data.attributes).map(a => a.field!).filter(x => x)\n }\n\n // 当自身是一个关系 record 时,它的 source/target 虽然是 record attribute,但字段是由我来管辖的。\n get managedRecordAttributes() {\n return Object.keys(this.data.attributes).filter(attribute => {\n const attributeData = this.data.attributes[attribute] as RecordAttribute\n return attributeData.isRecord && attributeData.field\n }).map(attribute => {\n return new AttributeInfo(this.name, attribute, this.map)\n })\n }\n\n get strictRecordAttributes() {\n return Object.keys(this.data.attributes).filter(attribute => {\n const attributeData = this.data.attributes[attribute] as RecordAttribute\n // CAUTION linkRecord 中有 field 就不能算了。比如 source/target\n return attributeData.isRecord && !attributeData.field && !attributeData.isFilteredRelation\n }).map(attribute => {\n return new AttributeInfo(this.name, attribute, this.map)\n })\n }\n get differentTableRecordAttributes() {\n // CAUTION 特别注意不能用 table 判断,因为可能是同一个实体的关系,这种情况 table 会相等,但含义并不是合表\n // return this.strictRecordAttributes.filter(info => info.table !== this.table)\n return this.strictRecordAttributes.filter(info => {\n return !(info.isMergedWithParent() || info.isLinkMergedWithParent())\n })\n }\n\n\n get reliance(): AttributeInfo[] {\n return Object.keys(this.data.attributes).filter(attribute => {\n return (this.data.attributes[attribute] as RecordAttribute).isReliance\n }).map(attribute => {\n return new AttributeInfo(this.name, attribute, this.map)\n })\n }\n\n get notRelianceCombined() :AttributeInfo[] {\n return this.combinedRecords.filter(info => {\n return !info.isReliance\n })\n }\n\n get differentTableReliance(): AttributeInfo[] {\n return this.reliance.filter(info => {\n return info.table !== this.table\n })\n }\n\n get sameTableReliance(): AttributeInfo[] {\n return this.reliance.filter(info => {\n return info.table === this.table\n })\n }\n\n get valueAttributes() {\n return Object.entries(this.data.attributes).filter(([, attribute]) => {\n return !(attribute as RecordAttribute).isRecord\n }).map(([attributeName]) => {\n return new AttributeInfo(this.name, attributeName, this.map)\n })\n }\n\n getAttributeInfo(attribute: string) {\n return new AttributeInfo(this.name, attribute, this.map)\n }\n\n get baseRecordName() {\n return this.data.baseRecordName\n }\n\n get matchExpression() {\n return this.data.matchExpression\n }\n\n get filteredBy() {\n return this.data.filteredBy?.map(name => new RecordInfo(name, this.map))\n }\n\n get isFilteredEntity() {\n return this.data?.isFilteredEntity\n }\n\n get isFilteredRelation() {\n return this.data?.isFilteredRelation\n }\n\n get baseRelationName() {\n return this.data?.baseRelationName\n }\n\n get resolvedBaseRecordName() {\n return this.data?.resolvedBaseRecordName\n }\n\n get resolvedMatchExpression() {\n return this.data?.resolvedMatchExpression\n }\n}","import {RecordInfo} from \"./RecordInfo.js\";\nimport {assert} from \"../utils.js\";\nimport {EntityToTableMap, LinkMapItem, RecordMapItem} from \"./EntityToTableMap.js\";\n\nexport class LinkInfo {\n constructor(public name: string, public data: LinkMapItem, public map: EntityToTableMap, public isFromSource: boolean = true) {\n }\n\n get isManyToOne() {\n return this.data.relType[0] === 'n' && this.data.relType[1] === '1'\n }\n\n get isManyToMany() {\n return this.data.relType[0] === 'n' && this.data.relType[1] === 'n'\n }\n\n get isOneToOne() {\n return this.data.relType[0] === '1' && this.data.relType[1] === '1'\n }\n\n get isOneToMany() {\n return this.data.relType[0] === '1' && this.data.relType[1] === 'n'\n }\n\n get isXToOne() {\n return this.isManyToOne || this.isOneToOne\n }\n\n get isOneToX() {\n return this.isOneToMany || this.isOneToOne\n }\n\n get isXToMany() {\n return this.isManyToMany || this.isOneToMany\n }\n\n get sourceRecord() {\n return this.data.sourceRecord\n }\n\n get sourceRecordInfo() {\n return new RecordInfo(this.data.sourceRecord, this.map)\n }\n\n get targetRecordInfo() {\n return new RecordInfo(this.data.targetRecord, this.map)\n }\n\n get targetRecord() {\n return this.data.targetRecord\n }\n\n get sourceProperty() {\n return this.data.sourceProperty\n }\n\n get targetProperty() {\n return this.data.targetProperty\n }\n\n get record(): RecordMapItem {\n return this.map.getRecord(this.name)!\n }\n get recordInfo(): RecordInfo {\n return this.map.getRecordInfo(this.name)\n }\n\n get table() {\n return this.record?.table\n }\n\n get isTargetReliance() {\n return this.data.isTargetReliance\n }\n\n isMerged() {\n return !!this.data.mergedTo\n }\n\n isSourceRelation() {\n return !! this.data.isSourceRelation\n }\n\n isMergedToSource() {\n return this.data.mergedTo === 'source'\n }\n\n isMergedToTarget() {\n return this.data.mergedTo === 'target'\n }\n\n isCombined() {\n return this.data.mergedTo === 'combined'\n }\n isIsolated() {\n return !this.data.mergedTo\n }\n\n isSymmetric() {\n return this.data.sourceRecord === this.data.targetRecord && this.data.sourceProperty === this.data.targetProperty\n }\n isRelationSource(recordName: string, attribute: string) {\n return this.data.sourceRecord === recordName && this.data.sourceProperty === attribute\n }\n\n getAttributeName(recordName: string, attribute: string) {\n assert(!!recordName && !!attribute, `${recordName}, ${attribute} cannot be empty`)\n return this.isRelationSource(recordName, attribute) ? ['source', 'target'] : ['target', 'source']\n }\n\n isFilteredRelation() {\n return this.data.isFilteredRelation\n }\n\n getBaseLinkInfo() {\n assert(this.isFilteredRelation(), `only filtered relation can get base link info`)\n const baseLinkName = this.data.baseLinkName!\n return new LinkInfo(baseLinkName, this.map.data.links[baseLinkName], this.map)\n }\n \n getMatchExpression() {\n if (this.isFilteredRelation()) {\n return this.data.matchExpression\n } else {\n throw new Error(`${this.name} is not a filtered relation`)\n }\n }\n\n getResolvedMatchExpression() {\n assert(this.isFilteredRelation(), `only filtered relation can get resolved match expression`)\n return this.data.resolvedMatchExpression\n }\n\n getResolvedBaseRecordName() {\n assert(this.isFilteredRelation(), `only filtered relation can get resolved record name`)\n return this.data.resolvedBaseRecordName\n }\n}","import { assert } from \"../utils.js\";\nimport { AttributeInfo } from \"./AttributeInfo.js\";\nimport { RecordInfo } from \"./RecordInfo.js\";\nimport { LinkInfo } from \"./LinkInfo.js\";\nimport { LINK_SYMBOL } from \"./RecordQuery.js\";\nimport { MatchExpressionData } from \"./MatchExp.js\";\n\n\nexport type ValueAttribute = {\n name: string,\n //entityType\n type: string,\n collection?: boolean,\n\n // 没有的话就继承上面的\n table?: string,\n field: string,\n // 数据库字段类型\n fieldType?: string,\n computed?: (record: any) => any,\n defaultValue?: (record: any, recordName: string) => any\n}\n\n\n\nexport type RecordAttribute = {\n type: 'id',\n isRecord: true,\n linkName: string,\n attributeName: string,\n // 下面三个是为了方便读取的缓存字段\n isSource? : boolean,\n relType: ['1'|'n', '1'|'n'],\n recordName: string,\n // 这个 field 是指如果合表了,那么它在实体表里面的名字。\n // 这个是从 EntityMapItemData 的 sourceField 或者 targetField 复制过来的。\n table?: string,\n field? : string\n // 当attribute是 target,并且关系上有 targetIsReliance 时为 true\n isReliance? : boolean\n // filtered relation 相关\n isFilteredRelation?: boolean,\n matchExpression?: any\n baseRelationAttributeName?: string,\n resolvedMatchExpression?: MatchExpressionData,\n resolvedBaseRecordName?: string\n}\n\nexport type RecordMapItem = {\n // id 所在的 table。不一定有 fields 也在,fields 可能会因为各种优化拆出去。\n table: string,\n attributes: {\n [k:string]: ValueAttribute|RecordAttribute\n }\n isRelation? :boolean,\n // filtered entity 相关\n isFilteredEntity?: boolean,\n baseRecordName? : string,\n matchExpression?: MatchExpressionData,\n resolvedBaseRecordName?: string,\n resolvedMatchExpression?: MatchExpressionData,\n filteredBy? : string[],\n // filtered relation 相关\n isFilteredRelation?: boolean,\n baseRelationName?: string\n}\n\ntype RecordMap = {\n [k:string]: RecordMapItem\n}\n\nexport type LinkMapItem = {\n relType: [string, string]\n sourceRecord: string,\n sourceProperty: string,\n targetRecord: string,\n targetProperty: string|undefined,\n // 用来判断这个 relation 是不是 virtual 的,是的话为 true.\n isSourceRelation?: boolean,\n // 这个 link 是否有个对应的 record. 当这个 link 是根据 Relation 创建的时候就有这个。\n // 它等同于 isSourceRelation 为 true 时 sourceRecord\n recordName?: string,\n mergedTo? : 'source'|'target'|'combined',\n table?: string,\n // CAUTION 特别注意,这里的 sourceField 和 targetField 和 sourceProperty 一样,是指站在 source 的角度去看,存的是关联实体(target)的 id. 不要搞成了自己的 id 。\n // 当发生表合并时,他们表示的是在合并的表里面的 field。根据往合并情况不同,sourceField/targetField 都可能不存在。\n sourceField?: string,\n targetField?: string,\n // 连接两个生命周期依赖的实体的,只能 target 依赖 source。\n isTargetReliance?: boolean\n // filtered relation 相关\n isFilteredRelation?: boolean,\n matchExpression?: any\n baseLinkName?: string,\n resolvedBaseRecordName?: string,\n resolvedMatchExpression?: MatchExpressionData\n}\n\ntype LinkMap = {\n [k:string]: LinkMapItem\n}\n\nexport type MapData = {\n records: RecordMap\n links: LinkMap\n}\n\ntype TableAndAliasStack = {\n table:string,\n alias: string,\n record: RecordMapItem,\n isLinkRecord: boolean,\n linkTable?:string,\n linkAlias?:string,\n link?: LinkMapItem,\n path: string[]\n}[]\n\nexport class EntityToTableMap {\n constructor(public data: MapData) {}\n getRecord(recordName:string) {\n return this.data.records[recordName]\n }\n getAttributeAndSymmetricDirection(rawAttributeName:string): [string, 'source'|'target'|undefined] {\n return rawAttributeName.includes(':') ? rawAttributeName.split(':') as [string, 'source'|'target'] : [rawAttributeName, undefined]\n }\n getAttributeData(recordName:string, attributeName: string) {\n return this.data.records[recordName].attributes[this.getAttributeAndSymmetricDirection(attributeName)[0]]\n }\n getRecordInfo(recordName:string) {\n return new RecordInfo(recordName, this)\n }\n getInfo(entityName: string, attribute: string) : AttributeInfo{\n const result = this.getInfoByPath([entityName, ...(attribute.split('.'))])\n\n assert(!!result,\n `cannot find attribute \"${attribute}\" in \"${entityName}\". attributes: ${this.data.records[entityName] && Object.keys(this.data.records[entityName]?.attributes)}`\n )\n return result!\n }\n getLinkInfo(recordName: string, rawAttribute: string) {\n const attribute = this.getAttributeAndSymmetricDirection(rawAttribute)[0]\n const {linkName, isSource} = (this.data.records[recordName].attributes[attribute] as RecordAttribute)\n assert(!!linkName, `cannot find relation ${recordName} ${attribute}`)\n return new LinkInfo(linkName, this.data.links[linkName], this, !!isSource)\n }\n getLinkInfoByName(linkName: string) {\n assert(!!this.data.links[linkName], `cannot find link ${linkName}`)\n return new LinkInfo(linkName, this.data.links[linkName], this)\n }\n\n getInfoByPath(namePath: string[]): AttributeInfo|undefined {\n const [entityName, ...attributivePath] = namePath\n assert(this.data.records[entityName], `entity ${entityName} not found`)\n assert(attributivePath.length > 0, 'getInfoByPath should have a name path.')\n let currentEntity = entityName\n let parentEntity: string|undefined\n let lastAttribute: string|undefined\n let attributeData: ValueAttribute|RecordAttribute|undefined\n\n let rawCurrentAttribute:string\n let lastSymmetricDirection\n const stack = []\n while(rawCurrentAttribute = attributivePath.shift()!) {\n stack.push(rawCurrentAttribute)\n // 路径中可能有 symmetric 的方向\n const [currentAttribute, symmetricDirection] = this.getAttributeAndSymmetricDirection(rawCurrentAttribute)\n lastSymmetricDirection = symmetricDirection\n\n // 增加了 & 的影响\n if (currentAttribute === LINK_SYMBOL) {\n assert(!!parentEntity && !!lastAttribute, `reading link in wrong path ${stack.join('.')}`)\n parentEntity = (this.data.records[parentEntity!].attributes[lastAttribute!] as RecordAttribute).linkName\n lastAttribute = undefined\n currentEntity = (attributeData! as RecordAttribute).linkName\n attributeData = undefined\n } else {\n let data = this.data.records[currentEntity]\n // 递归查找根源实体\n while (data.isFilteredRelation || data.isFilteredEntity) {\n if (data.isFilteredRelation) {\n data = this.data.records[data.baseRelationName!]\n } else if (data.isFilteredEntity) {\n data = this.data.records[data.baseRecordName!]\n }\n }\n attributeData = data!.attributes[currentAttribute!] as RecordAttribute\n assert(!!attributeData, `attribute ${currentAttribute} not found in ${currentEntity}. namePath: ${namePath.join('.')}`)\n parentEntity = currentEntity\n currentEntity = (attributeData as RecordAttribute).isRecord ? (attributeData as RecordAttribute).recordName : ''\n lastAttribute = currentAttribute\n }\n }\n\n if (!parentEntity || !lastAttribute) return undefined\n return new AttributeInfo( parentEntity!, lastAttribute!, this, lastSymmetricDirection!)\n }\n getTableAndAliasStack(namePath: string[]): TableAndAliasStack {\n const [rootEntityName, ...relationPath] = namePath\n let lastEntityData: RecordMapItem = this.data.records[rootEntityName]\n let lastTable:string = lastEntityData.table\n let lastTableAlias:string = rootEntityName\n\n let relationTable:string\n let relationTableAlias:string\n let isLinkRecord = false\n let info: AttributeInfo|undefined\n\n const result: TableAndAliasStack = [{\n // 最后一张表名\n table: lastTable,\n // 最后一张表 alias,\n alias: lastTableAlias,\n // 最后表代表的 entity 数据,\n record: lastEntityData,\n isLinkRecord,\n // 上一张表和最后一张表的关联表(如果是 relation 和 entity 的连接,这个link 就是虚拟的,table 是空,因为肯定是个合并的),\n // linkTable: relationTable,\n // 上一张表和最后一张表的关联表的 alias.\n // linkAlias: relationTableAlias,\n // link: currentLink,\n path: [rootEntityName]\n }]\n\n for(let i = 0; i<relationPath.length; i++) {\n // 对称关系要说明方向,不然 join 表的时候两个方向都用的同一个 alias,逻辑错误。它的格式是 'xxx:source' 或者 ‘xxx:target’\n const [currentAttributeName, symmetricDirection] = this.getAttributeAndSymmetricDirection(relationPath[i])\n\n const path = [rootEntityName, ...relationPath.slice(0, i+1)]\n // 如果是读 link 上的数据\n if (currentAttributeName === LINK_SYMBOL) {\n\n // 先把上一个 Pop 出来。\n const {linkTable, linkAlias, path} = result.pop()!\n assert(!isLinkRecord, `last attribute in path is a link, cannot read link of a link ${path.join('.')}`)\n lastTable = linkTable!\n lastTableAlias = linkAlias!\n lastEntityData = this.data.records[info!.linkName]\n isLinkRecord = true\n relationTable = ''\n relationTableAlias = ''\n info = undefined\n } else {\n info = this.getInfoByPath(path)!\n const currentEntityAttribute = lastEntityData.attributes[currentAttributeName!] as RecordAttribute\n assert(info.isRecord, `${relationPath.slice(0, i+1).join('.')} is not a entity attribute`)\n\n const currentEntityData = this.data.records[currentEntityAttribute.recordName] as RecordMapItem\n\n // 处理 symmetric 中的:\n const currentTableAlias = `${lastTableAlias}_${currentAttributeName}${symmetricDirection ? `_${symmetricDirection.toUpperCase()}` : ''}`\n\n // CAUTION 一定要先处理 linkAlias,因为依赖于上一次 tableAlias。\n if (info.isMergedWithParent() || info.isLinkMergedWithParent()) {\n // 和上一个表同名。当前表也就是上一个\n relationTableAlias = lastTableAlias\n // link 没有合并的情况也要生成新的 alias。否则就和 lastTableAlias 同名\n } else if (info.isLinkIsolated()){\n // link 表独立,给个新名字\n // CAUTION symmetric 路径要手动指定关系\n relationTableAlias = `REL_${currentTableAlias}`\n } else {\n // link 表合并了,名字和当前一样。\n relationTableAlias = currentTableAlias\n }\n\n\n // CAUTION 只要不是合表的,就要生成新的 alias.\n if (!info.isMergedWithParent()) {\n lastTableAlias = currentTableAlias\n }\n\n lastTable = info.table\n lastEntityData = currentEntityData\n\n // TODO 找到 relationTable ,生成 relationTableName\n // relation table 有三种情况: 独立的/往n 方向合表了,与 1:1 合成一张表了。\n relationTable = info.getLinkInfo()?.table\n // relationTable 的 alias 始终保持和 tableAlias 一致的规律\n isLinkRecord = false\n }\n\n result.push({\n table: lastTable,\n alias: lastTableAlias,\n record: lastEntityData,\n isLinkRecord,\n linkTable: relationTable,\n linkAlias: relationTableAlias!,\n path\n })\n }\n\n return result\n }\n\n getTableAliasAndFieldName(namePath: string[], attributeName: string, dontShrink = false): [string, string,string] {\n const stack = this.getTableAndAliasStack(namePath)\n const {table, alias, record, path, linkAlias, linkTable, isLinkRecord} = stack.at(-1)!\n\n const attrInfo = (!isLinkRecord && stack.length > 1) ? this.getInfoByPath(path) : null\n const canShrinkIdPath =\n !dontShrink &&\n attributeName === 'id' &&\n !isLinkRecord &&\n namePath.length > 1 &&\n (attrInfo?.isLinkMergedWithParent() || attrInfo?.isLinkIsolated())\n\n // 获取 id 时,可以直接从关系表上获得,不需要额外的 table\n if (canShrinkIdPath) {\n if (attrInfo?.isLinkMergedWithParent()) {\n // 和父亲合并了,应该用父亲的 alias 和 表上用于记录关系 id 的 field\n const {alias: parentAlias, table: parentTable} = stack.at(-2)!\n return [parentAlias, attrInfo!.linkField!, parentTable]\n } else {\n // isolated。应该用关系表上的记录 id 的 source/target 字段\n const linkInfoRecord = attrInfo!.getLinkInfo().record\n const fieldName = attrInfo?.isLinkManyToManySymmetric() ?\n (attrInfo?.symmetricDirection === 'source' ? linkInfoRecord?.attributes.target!.field! : linkInfoRecord?.attributes.source!.field!) :\n (attrInfo!.isRecordSource() ? linkInfoRecord?.attributes.target!.field! : linkInfoRecord?.attributes.source!.field!)\n\n return [linkAlias!, fieldName, linkTable!]\n }\n } else {\n const fieldName = record.attributes[this.getAttributeAndSymmetricDirection(attributeName)[0]].field\n return [alias, fieldName!, table]\n }\n }\n findManyToManySymmetricPath( namePath: string[]): string[]|undefined {\n const result = [namePath[0]]\n let found = false\n // 注意是从 1 开始的。\n for(let i = 1; i< namePath.length; i++) {\n result.push(namePath[i])\n const info = this.getInfoByPath(namePath.slice(0, i+1))\n if (info?.isRecord && info.isLinkManyToManySymmetric()) {\n found = true\n break\n }\n }\n\n // 用 found 来判断,这样即使是最后一个也算找到了。\n return found ? result: undefined\n }\n spawnManyToManySymmetricPath( namePath: string[] ): [string[], string[]] | undefined {\n const foundPath = this.findManyToManySymmetricPath(namePath)\n if (!foundPath) return undefined\n const head = foundPath.slice(0, -1)\n const splitPoint = foundPath.at(-1)\n const rest = namePath.slice(foundPath.length, Infinity)\n\n return [\n [...head, `${splitPoint}:source`, ...rest],\n [...head, `${splitPoint}:target`, ...rest],\n ]\n }\n\n getReverseAttribute(entityName: string, attribute: string) : string {\n assert(this.data.records[entityName], `entity ${entityName} not found`)\n const record = this.data.records[entityName]\n if (record.isRelation) {\n assert(attribute ==='source' || attribute ==='target', `wrong attribute ${attribute} for relation ${entityName}`)\n const linkData = this.data.links[entityName]\n if (attribute === 'source') {\n return `${linkData.sourceProperty!}.&`\n } else {\n return `${linkData.targetProperty!}.&`\n }\n } else {\n const relationName = (this.data.records[entityName].attributes[attribute] as RecordAttribute).linkName\n const relationData = this.data.links[relationName]\n if (relationData.sourceRecord === entityName && relationData.sourceProperty === attribute) {\n return relationData.targetProperty!\n } else if (relationData.targetRecord === entityName && relationData.targetProperty === attribute) {\n return relationData.sourceProperty\n } else {\n assert(false, `wrong relation data ${entityName}.${attribute}`)\n return ''\n }\n }\n \n }\n getReversePath(namePath: string[]): string[] {\n const namePaths = new Array(namePath.length-1).fill(0).map((_, i) => namePath.slice(0, i+2))\n const attributeInfos = namePaths.map(p => this.getInfoByPath(p)).reverse()\n\n assert(attributeInfos[0]?.isRecord, `last attribute in path is not a record ${namePath.join('.')}`)\n // 考虑了路径上有 & 的问题\n const result:string[] = [attributeInfos[0]!.recordName!]\n let linkSymbolOccur = false\n for (const info of attributeInfos) {\n if (linkSymbolOccur) {\n result.push(info!.isRecordSource() ? 'source' : 'target')\n linkSymbolOccur = false\n } else {\n if (info) {\n result.push(info!.getReverseInfo()!.attributeName)\n } else {\n // FIXME 这里判断非常不严谨。目前只有 & 出现的时候,才会出现 undefined。\n linkSymbolOccur = true\n }\n }\n }\n return result\n }\n groupAttributes(entityName: string, attributeNames: string[]) : [AttributeInfo[], AttributeInfo[], AttributeInfo[]]{\n assert(this.data.records[entityName], `entity ${entityName} not found`)\n const valueAttributes: AttributeInfo[] = []\n const entityIdAttributes: AttributeInfo[] = []\n const entityAttributes: AttributeInfo[] = []\n attributeNames.forEach(attributeName => {\n if (this.data.records[entityName].attributes[attributeName]) {\n const info = this.getInfo(entityName, attributeName)\n if (info.isValue ) {\n valueAttributes.push(info)\n } else {\n // link record 的 source/target 字段有 field\n // if (info.isLinkSourceRelation()) {\n if (this.data.records[entityName].attributes[attributeName].field) {\n entityIdAttributes.push(info)\n } else {\n entityAttributes.push(info)\n }\n }\n }\n })\n\n return [valueAttributes, entityAttributes, entityIdAttributes]\n }\n // 获取压缩后的路径\n getShrinkedAttribute(entityName:string, attributeName: string):string {\n // 将路径分割成数组\n const pathParts = attributeName.split('.');\n const result: string[] = [];\n let currentEntity = entityName;\n let previousEntity = entityName; // 保存前一个实体名称\n let i = 0;\n \n while (i < pathParts.length) {\n const part = pathParts[i];\n \n // 如果当前部分是 & 符号\n if (part === LINK_SYMBOL && i > 0 && i < pathParts.length - 1) {\n const previousAttr = result[result.length - 1];\n const nextPart = pathParts[i + 1];\n \n // 如果下一个部分是 source 或 target\n if (nextPart === 'source' || nextPart === 'target') {\n // 使用前一个实体来获取关系信息\n const relationInfo = this.getInfo(previousEntity, previousAttr);\n \n if (relationInfo.isRecord) {\n // 获取关系的详细信息\n const linkInfo = relationInfo.getLinkInfo().data;\n \n // 确定关系属性指向的实体\n let relationPointsTo: string;\n if (relationInfo.isRecordSource()) {\n // 如果是 source,则指向关系的 target\n relationPointsTo = linkInfo.targetRecord;\n } else {\n // 如果不是 source,则指向关系的 source\n relationPointsTo = linkInfo.sourceRecord;\n }\n \n // 确定 source/target 指向的实体\n let sourceTargetPointsTo: string;\n if (nextPart === 'source') {\n sourceTargetPointsTo = linkInfo.sourceRecord;\n } else {\n sourceTargetPointsTo = linkInfo.targetRecord;\n }\n \n // 如果两者指向相同的实体,可以压缩\n if (relationPointsTo === sourceTargetPointsTo) {\n // 跳过 & 和 source/target\n i += 2;\n // currentEntity 保持为 relationPointsTo\n // previousEntity 不变,因为我们没有添加新的属性到结果\n continue;\n } else {\n // 如果不能压缩,更新 currentEntity 为 source/target 指向的实体\n currentEntity = sourceTargetPointsTo;\n previousEntity = currentEntity; // 更新 previousEntity\n currentEntity = '';\n previousEntity = ''; // 更新 previousEntity\n result.push(part);\n result.push(nextPart);\n i += 2;\n continue;\n }\n }\n } else {\n currentEntity = '';\n previousEntity = ''; \n }\n \n // 如果不能压缩,保留 & 符号\n result.push(part);\n i++;\n } else if (part !== LINK_SYMBOL) {\n // 保存当前实体作为前一个实体\n previousEntity = currentEntity;\n \n // 更新当前实体\n if(currentEntity) {\n const info = this.getInfo(currentEntity, part);\n if (info.isRecord) {\n currentEntity = info.recordName;\n }\n }\n // try {\n // const info = this.getInfo(currentEntity, part);\n // if (info.isRecord) {\n // currentEntity = info.recordName;\n // }\n // } catch (e) {\n // // 忽略错误\n // }\n \n result.push(part);\n i++;\n } else {\n // 其他情况(比如 & 在开头或结尾)\n result.push(part);\n i++;\n }\n }\n \n return result.join('.');\n }\n}","import { EntityInstance, RelationInstance, PropertyInstance, Property, Entity, Relation, RefContainer } from \"@shared\";\nimport { MatchExp } from \"./MatchExp.js\";\nimport { assert } from \"../utils.js\";\n\nexport type MergedItem = EntityInstance | RelationInstance;\nexport type InputItem = EntityInstance | RelationInstance;\n\nexport interface MergedItemConfig<T extends MergedItem> {\n name: string;\n inputItems: T[];\n inputFieldName: string;\n}\n\n/**\n * 统一处理 merged entity 和 merged relation 的处理器\n */\nexport function buildEntityTree(entities: EntityInstance[]) {\n const tree = new Map<string, string[]>()\n for (const entity of entities) {\n if (entity.inputEntities) {\n tree.set(entity.name, entity.inputEntities.map(inputEntity => inputEntity.name))\n } else if(entity.baseEntity) {\n const leafSet = tree.get(entity.baseEntity.name!) || []\n leafSet.push(entity.name)\n tree.set(entity.baseEntity.name!, leafSet)\n }\n }\n return tree\n }\n \nexport function buildRelationTree(relations: RelationInstance[]) {\n const tree = new Map<string, string[]>()\n for (const relation of relations) {\n const relationName = relation.name || \n `${relation.source.name}_${relation.sourceProperty}_${relation.targetProperty}_${relation.target.name}`;\n if (relation.inputRelations) {\n const inputRelationNames = relation.inputRelations.map(inputRelation => {\n return inputRelation.name!\n });\n tree.set(relationName, inputRelationNames)\n } else if(relation.baseRelation) {\n const baseRelationName = relation.baseRelation.name || \n `${relation.baseRelation.source.name}_${relation.baseRelation.sourceProperty}_${relation.baseRelation.targetProperty}_${relation.baseRelation.target.name}`;\n const leafSet = tree.get(baseRelationName) || []\n leafSet.push(relationName)\n tree.set(baseRelationName, leafSet)\n }\n }\n return tree\n }\n/**\n * 统一处理所有 merged items (entities 和 relations)\n */\nexport function processMergedItems(\n entities: EntityInstance[],\n relations: RelationInstance[],\n ): { entities: EntityInstance[], relations: RelationInstance[] } {\n const refContainer = new RefContainer(entities, relations);\n const entityTree = buildEntityTree(entities);\n const relationTree = buildRelationTree(relations);\n \n // 处理 merged entities\n processMergedItemsOfType(\n entities,\n refContainer,\n entityTree,\n 'entity'\n );\n \n // 处理 merged relations\n processMergedItemsOfType(\n relations,\n refContainer,\n relationTree,\n 'relation'\n );\n \n return refContainer.getAll();\n }\n \n/**\n * 处理特定类型的 merged items\n */\nfunction processMergedItemsOfType<T extends MergedItem>(\n items: T[],\n refContainer: RefContainer,\n itemTree: Map<string, string[]>,\n itemType: 'entity' | 'relation'\n ): void {\n // 过滤出有 input items 的项\n const mergedItems = items.filter(item => {\n const inputItems = getInputItems(item);\n return inputItems && inputItems.length > 0;\n });\n \n if (mergedItems.length === 0) {\n return;\n }\n \n \n \n // 处理每个 merged item\n for (const mergedItem of mergedItems) {\n processSingleMergedItem(\n mergedItem,\n refContainer,\n itemType,\n itemTree\n );\n }\n }\n \n/**\n * 处理单个 merged item\n */\nfunction processSingleMergedItem<T extends MergedItem>(\n mergedItem: T,\n refContainer: RefContainer,\n itemType: 'entity' | 'relation',\n itemTree: Map<string, string[]>\n ): void {\n // 构建 leaf to input map\n\n const isEntity = itemType === 'entity';\n const itemName = getItemName(mergedItem);\n const inputTypeFieldName = `__${itemName}_input_${itemType}`;\n \n \n const itemToTransform = isEntity? refContainer.getEntityByName(mergedItem.name!) : refContainer.getRelationByName(mergedItem.name!);\n \n // 转换 merged item\n const [transformedItem, virtualBaseItem] = transformMergedItem(\n itemToTransform!,\n inputTypeFieldName,\n itemTree,\n refContainer\n );\n \n // 替换原 item\n refContainer.replace(transformedItem, mergedItem);\n if (virtualBaseItem !== transformedItem) {\n refContainer.add(virtualBaseItem);\n }\n\n // 获取 input items(对于 entity 需要更新)\n const inputItems = getInputItems(mergedItem);\n // 处理 input items。让所有 input item 都是 virtual base item 的 filtered item。\n if (inputItems) {\n for (const inputItem of inputItems) {\n processInputItem(\n inputItem,\n virtualBaseItem!,\n inputTypeFieldName,\n refContainer,\n isEntity\n );\n }\n }\n }\n \n/**\n * 处理单个 input item\n */\nfunction processInputItem(\n inputItem: MergedItem,\n virtualBaseItem: MergedItem,\n inputTypeFieldName: string,\n refContainer: RefContainer,\n isEntity: boolean\n ): void {\n const [filteredItem, baseItem] = createFilteredItemFromInput(\n inputItem,\n virtualBaseItem,\n inputTypeFieldName\n );\n \n // Relation 特殊处理:检查是否就是 input 本身\n if (!isEntity && filteredItem === inputItem) {\n return;\n }\n \n // 获取 base item 的名称\n const baseItemName = getItemName(baseItem);\n \n // 查找并替换已存在的 item\n const existingItem = isEntity \n ? refContainer.getEntityByName(baseItemName)\n : refContainer.getRelationByName(baseItemName);\n \n if (existingItem) {\n refContainer.replace(filteredItem, existingItem);\n }\n }\n \n/**\n * 构建从子孙 item 到 input item 的映射关系\n * 用于处理嵌套的 merged/filtered items\n */\nfunction buildLeafToInputMap<T extends MergedItem>(\n item: T,\n itemTree: Map<string, string[]>\n ): Map<string, string[]> {\n const leafToInputMap = new Map<string, string[]>();\n \n const inputItems = getInputItems(item);\n if (inputItems && inputItems.length > 0) {\n for (const inputItem of inputItems) {\n const itemName = getItemName(inputItem);\n const leafSet = [...(itemTree.get(itemName) || [])];\n const inputItemNames = leafToInputMap.get(itemName) || [];\n inputItemNames.push(itemName);\n leafToInputMap.set(itemName, inputItemNames);\n \n // 递归处理所有子孙 items\n while (leafSet.length) {\n const leafItem = leafSet.shift()!;\n const leafInputItemNames = leafToInputMap.get(leafItem) || [];\n leafInputItemNames.push(...inputItemNames);\n leafToInputMap.set(leafItem, leafInputItemNames);\n const childSet = itemTree.get(leafItem) || [];\n leafSet.push(...childSet);\n }\n }\n }\n \n return leafToInputMap;\n }\n \n/**\n * 创建用于记录 input type 的特殊字段\n */\nfunction createInputTypeProperty(\n inputFieldName: string,\n mergedItem: MergedItem,\n itemTree: Map<string, string[]>\n ): PropertyInstance {\n const leafToInputMap = buildLeafToInputMap(mergedItem, itemTree);\n \n return Property.create({\n name: inputFieldName,\n type: 'json',\n defaultValue: (record: any, entityName: string) => {\n const inputItems = getInputItems(mergedItem);\n const inputCandidates = leafToInputMap.get(entityName) || [];\n const inputNames = inputCandidates.filter(name => \n inputItems.some(input => getItemName(input) === name)\n );\n return inputNames.length > 0 ? inputNames : [entityName];\n }\n });\n }\n \n/**\n * 合并所有 input items 的 properties\n */\nfunction mergeProperties(\n mergedItem: MergedItem,\n itemTree: Map<string, string[]>,\n refContainer: RefContainer\n ): PropertyInstance[] {\n // 收到的 itemName 有三种:\n // 1. 就是当前的 input item 的 name。\n // 2. 如果当前 input item 被 filtered 了,那么可能是 filtered item 的 name。\n // 3. 如果当前 input item 是 merged item,那么一定子 input entity 的 name。\n\n // defaultValue 的取值情况:\n // 1. inputEntity 是个普通 entity,那就在当前 record 上获取 defaultValue。\n // 2. inputEntity 是个 filtered entity,那就在 root base entity 上获取 defaultValue。\n // 3. inputEntity 是个 merged entity,那就在子孙 input entity 的 root base entity(可能就是子孙自己,取决于它是不是 filtered) 上获取 defaultValue。\n // 4. inputEntity 如果是个 merged entity,并且 prop 是用来区分 input item 的,那 defaultValue 就是应该是 transform 时构造出来的。\n \n const inputItems = getInputItems(mergedItem);\n const mergedProperties: PropertyInstance[] = [];\n const itemPropertyMap = new Map<string, {[key: string]: PropertyInstance}>();\n const mergedPropertyMap: {[k: string]: PropertyInstance} = {};\n \n // 收集所有同名 properties。\n // 如果这个 item 已经是 filtered item,那么就从 base item 获取 properties。\n for (const inputItem of inputItems) {\n let sourceItem = inputItem;\n \n // 如果是 filtered item,需要从 base item 获取 properties\n if (isEntity(sourceItem)) {\n while ((sourceItem as EntityInstance).baseEntity && sourceItem.properties.length === 0) {\n sourceItem = (sourceItem as EntityInstance).baseEntity as EntityInstance;\n }\n } else if (isRelation(sourceItem)) {\n while ((sourceItem as RelationInstance).baseRelation && sourceItem.properties.length === 0) {\n sourceItem = (sourceItem as RelationInstance).baseRelation as RelationInstance;\n }\n }\n\n const propertyMap = Object.fromEntries(sourceItem.properties.map(prop => [prop.name, prop]));\n itemPropertyMap.set(inputItem.name!, propertyMap);\n\n // 合并 property map\n Object.assign(mergedPropertyMap, propertyMap);\n\n const isInputItemMergedItem = (inputItem as EntityInstance).inputEntities || (inputItem as RelationInstance).inputRelations;\n // 递归处理所有子孙节点 \n const childItemNames = [...(itemTree.get(inputItem.name!) || [])];\n while(childItemNames.length) {\n const childItemName = childItemNames.shift()!;\n if (!isInputItemMergedItem) {\n // 如果不是 merged item, 就只有 filtered item 了,所有 filtered item 的 property map 都是继承自 source item 的。\n itemPropertyMap.set(childItemName, propertyMap);\n } else {\n // merged item 的 sub 是自己的。\n const childItem = refContainer.getEntityByName(childItemName) || refContainer.getRelationByName(childItemName);\n const isChildInputItemMergedItem = (childItem as EntityInstance).inputEntities || (childItem as RelationInstance).inputRelations;\n if (!isChildInputItemMergedItem) {\n const childItemPropertyMap = Object.fromEntries(childItem!.properties.map(prop => [prop.name, prop]));\n itemPropertyMap.set(childItemName, childItemPropertyMap);\n // 继续合并\n Object.assign(mergedPropertyMap, childItemPropertyMap);\n }\n }\n childItemNames.push(...(itemTree.get(childItemName) || []));\n }\n }\n \n // 为每个 property 创建合并版本\n for (const propName of Object.keys(mergedPropertyMap)) {\n \n const mergedProp = Property.clone(mergedPropertyMap[propName], true);\n \n // 创建新的 defaultValue\n mergedProp.defaultValue = (record: any, itemName: string) => {\n // 从 itemPropertyMap 中找 defaultValue\n const property = itemPropertyMap.get(itemName)?.[propName];\n if (property?.defaultValue) {\n return property.defaultValue(record, itemName);\n }\n \n return undefined;\n };\n \n mergedProperties.push(mergedProp);\n }\n \n return mergedProperties;\n }\n \n/**\n * 转换 merged item(entity 或 relation)\n */\nfunction transformMergedItem<T extends MergedItem>(\n mergedItem: T,\n inputFieldName: string,\n itemTree: Map<string, string[]>,\n refContainer: RefContainer\n ): [T, T] {\n \n // 创建 input type property\n const inputTypeProperty = createInputTypeProperty(\n inputFieldName,\n mergedItem,\n itemTree\n );\n \n // 合并 properties。\n // 特别注意这里,虽然用户在创建 merged entity 或 relation 时,不能指定 properties,\n // 但是 computation 可能有往记录上绑定 state 的需求。\n const mergedProperties = [\n ...mergeProperties(\n mergedItem,\n itemTree,\n refContainer\n ),\n inputTypeProperty,\n ...mergedItem.properties,\n ]\n \n if (isEntity(mergedItem)) {\n // Entity 的处理\n const entity = refContainer.getEntityByName(mergedItem.name!)!;\n const transformedEntity = Entity.create({\n name: entity.name,\n });\n \n let virtualBaseEntity: undefined | EntityInstance = undefined;\n \n // 如果有 filtered input entity,则需要创建虚拟的 base entity\n if (entity.inputEntities?.some(inputEntity => inputEntity.baseEntity)) {\n virtualBaseEntity = Entity.create({\n name: `${entity.name}_base`,\n properties: mergedProperties,\n });\n transformedEntity.baseEntity = virtualBaseEntity;\n // 任意一个 input entity 都符合\n transformedEntity.matchExpression = MatchExp.fromArray(\n entity.inputEntities!.map(inputEntity => ({\n key: inputFieldName,\n value: ['contains', inputEntity.name]\n }))\n );\n } else {\n transformedEntity.properties = mergedProperties;\n }\n \n return [transformedEntity as T, (virtualBaseEntity || transformedEntity) as T];\n } else {\n // Relation 的处理\n const relation = refContainer.getRelationByName(mergedItem.name!)!;\n const transformedRelation = Relation.create({\n name: relation.name,\n source: relation.source,\n sourceProperty: relation.sourceProperty,\n target: relation.target,\n targetProperty: relation.targetProperty,\n type: relation.type,\n isTargetReliance: relation.isTargetReliance\n });\n \n let virtualBaseRelation: undefined | RelationInstance = undefined;\n \n // 如果有 filtered input relation,则需要创建虚拟的 base relation\n if (relation.inputRelations?.some(inputRelation => inputRelation.baseRelation)) {\n const baseRelationName = relation.name || \n `${relation.source.name}_${relation.sourceProperty}_${relation.targetProperty}_${relation.target.name}`;\n \n virtualBaseRelation = Relation.create({\n name: `__${baseRelationName}_base`,\n source: relation.source,\n sourceProperty: `__${relation.sourceProperty}_base`,\n target: relation.target,\n targetProperty: `__${relation.targetProperty}_base`,\n type: relation.type,\n isTargetReliance: relation.isTargetReliance,\n properties: mergedProperties\n });\n \n transformedRelation.baseRelation = virtualBaseRelation;\n transformedRelation.sourceProperty = relation.sourceProperty;\n transformedRelation.targetProperty = relation.targetProperty;\n \n // 任意一个 input relation 都符合\n transformedRelation.matchExpression = MatchExp.fromArray(\n relation.inputRelations!.map(inputRelation => {\n const inputRelationName = getItemName(inputRelation);\n return {\n key: inputFieldName,\n value: ['contains', inputRelationName]\n };\n })\n );\n } else {\n transformedRelation.properties = mergedProperties;\n }\n \n return [transformedRelation as T, (virtualBaseRelation || transformedRelation) as T];\n }\n }\n \n/**\n * 从 input item 创建 filtered item\n */\nexport function createFilteredItemFromInput<T extends MergedItem>(\n inputItem: T,\n baseItem: T,\n inputFieldName: string\n ): [T, T] {\n if (isEntity(inputItem)) {\n // Entity 的处理\n const inputEntity = inputItem as EntityInstance;\n const baseEntity = baseItem as EntityInstance;\n \n // 如果 input entity 已经是 filtered entity,需要找到它的 root base entity\n let rootBase = inputEntity;\n if (inputEntity.baseEntity) {\n while ((rootBase as EntityInstance).baseEntity) {\n rootBase = (rootBase as EntityInstance).baseEntity as EntityInstance;\n }\n }\n \n // 创建新的 filtered entity\n const filteredEntity = Entity.clone(rootBase as EntityInstance, true);\n filteredEntity.baseEntity = baseEntity;\n filteredEntity.matchExpression = MatchExp.atom({\n key: inputFieldName,\n value: ['contains', inputEntity.name]\n });\n \n return [filteredEntity as T, rootBase as T];\n } else {\n // Relation 的处理\n const inputRelation = inputItem as RelationInstance;\n const baseRelation = baseItem as RelationInstance;\n const inputRelationName = getItemName(inputRelation);\n \n // 如果 input relation 已经是 filtered relation,直接返回\n if (inputRelation.baseRelation) {\n return [inputRelation as T, getRootBaseRelation(inputRelation) as T];\n } else {\n // 创建一个 filtered relation\n const filteredRelation = Relation.create({\n name: inputRelationName,\n baseRelation: baseRelation,\n sourceProperty: inputRelation.sourceProperty,\n targetProperty: inputRelation.targetProperty,\n matchExpression: MatchExp.atom({\n key: inputFieldName,\n value: ['contains', inputRelationName]\n })\n });\n \n return [filteredRelation as T, inputRelation as T];\n }\n }\n }\n \n/**\n * 获取 relation 的根 base relation\n */\nfunction getRootBaseRelation(relation: RelationInstance): RelationInstance {\n let current = relation;\n while (current.baseRelation) {\n current = current.baseRelation;\n }\n return current;\n }\n \n// 辅助方法\nfunction isEntity(item: MergedItem): item is EntityInstance {\n return 'inputEntities' in item || !('sourceProperty' in item);\n }\n \nfunction isRelation(item: MergedItem): item is RelationInstance {\n return 'sourceProperty' in item;\n }\n \nfunction getInputItems(item: MergedItem): MergedItem[] {\n if (isEntity(item)) {\n return (item as EntityInstance).inputEntities || [];\n } else {\n return (item as RelationInstance).inputRelations || [];\n }\n }\n \nfunction getItemName(item: MergedItem): string {\n if (isEntity(item)) {\n return (item as EntityInstance).name;\n } else {\n const relation = item as RelationInstance;\n return relation.name!\n }\n }\n","import { LinkMapItem, MapData, RecordAttribute, RecordMapItem, ValueAttribute } from \"./EntityToTableMap.js\";\nimport { assert } from \"../utils.js\";\nimport { EntityInstance, RelationInstance, PropertyInstance, RefContainer } from \"@shared\";\nimport { ID_ATTR, ROW_ID_ATTR, Database } from \"@runtime\";\nimport { isRelation } from \"./util.js\";\nimport { MatchExpressionData, MatchExp } from \"./MatchExp.js\";\nimport { Entity, Property, Relation } from \"@shared\";\nimport { BoolExp } from \"@shared\";\nimport { processMergedItems } from \"./MergedItemProcessor.js\";\n\n// Define the types we need\n\ntype ColumnData = {\n name:string,\n type:string,\n fieldType?:string,\n collection?:boolean,\n notNull?: boolean,\n defaultValue?: (record: any, recordName: string) => any\n attribute?: ValueAttribute\n}\n\n\nexport type TableData = {\n [k:string]: {\n columns: {[k:string]: ColumnData},\n hasId?: boolean\n }\n}\n\nexport type MergeLinks = string[]\n\n\nexport class DBSetup {\n private fieldNameMap: Map<string, string> = new Map()\n private usedFieldNames: Set<string> = new Set()\n private fieldCounter: number = 1\n public recordToTableMap = new Map<string,string>()\n public tableToRecordsMap = new Map<string, Set<string>>()\n public mergeLog: any[] = []\n public tables:TableData = {}\n public map: MapData = { links: {}, records: {}}\n constructor(\n public entities: EntityInstance[],\n public relations: RelationInstance[],\n public database?: Database,\n public mergeLinks: MergeLinks = []\n ) {\n this.buildMap()\n this.buildTables()\n }\n createRecordToTable(item:string, table:string) {\n this.recordToTableMap.set(item, table)\n assert(!this.tableToRecordsMap.get(table), `create table for ${item} ${table} failed, ${table} already exist.`)\n this.tableToRecordsMap.set(table, new Set([item]))\n }\n // CAUTION 把一个 item 拉过来,等于把它所有同表的 item 拉过来\n joinTables(joinTargetRecord:string, record:string, link: string): string[]| undefined {\n\n assert(joinTargetRecord !== record, `join entity should not equal, ${record}`)\n const moveTable = this.recordToTableMap.get(record)!\n const joinTargetTable = this.recordToTableMap.get(joinTargetRecord)!\n const joinTargetSameTableRecords = this.tableToRecordsMap.get(joinTargetTable)!\n assert(!!moveTable && !!joinTargetTable, `table not exists for ${record} ${moveTable} to join ${joinTargetRecord} ${joinTargetTable}`)\n if (moveTable == joinTargetTable) return\n\n const sameTableRecordsToMove = this.tableToRecordsMap.get(moveTable)!\n\n // 0 检测是否有环。CAUTION 就是检测 joinTargetTable 里面是否已经有了重复的。\n\n const conflicts: string[] = []\n sameTableRecordsToMove.forEach(sameTableRecordToMove => {\n // TODO 还要提供 merge 的关系信息?\n if (joinTargetSameTableRecords.has(sameTableRecordToMove)) conflicts.push(sameTableRecordToMove)\n })\n\n if (conflicts.length) {\n this.mergeLog.push({ joinTargetRecord, record, link, conflicts })\n return conflicts\n }\n\n\n // 1. 清空原来 table 里的 records\n this.tableToRecordsMap.set(moveTable, new Set())\n // 2. 移除的 record 对 table 的指针也都修改过来\n sameTableRecordsToMove.forEach(sameTableRecord => this.recordToTableMap.set(sameTableRecord, joinTargetTable))\n\n // 3. 新 table 合并数据\n this.tableToRecordsMap.set(joinTargetTable, new Set(Array.from(joinTargetSameTableRecords).concat(Array.from(sameTableRecordsToMove))))\n\n // 4. 记录 log\n this.mergeLog.push({ joinTargetRecord, record, link })\n }\n combineRecordTable(mergeTarget: string, toMerge: string, link: string,) {\n let linkConflict\n // target/toMerge 一定是不同实体才能merge 所以这里可以用这个判断方向\n const virtualLinkName = (this.map.records[link].attributes.source as RecordAttribute).linkName\n linkConflict = this.joinTables(mergeTarget, link, virtualLinkName)\n\n if (linkConflict) return linkConflict\n\n return this.joinTables(mergeTarget, toMerge, link)\n }\n renameTableWithJoinedEntities(originTableName: string) {\n const records = Array.from(this.tableToRecordsMap.get(originTableName)!)\n if (!records.length) return\n\n // CAUTION 有合并的情况的话,里面一定有 entity,只用 entity 的名字。除非TableName 始终只用其中 的 entity 名字\n const entities = records.filter(recordName => !this.map.records[recordName].isRelation )\n const newTableName = entities.length ? entities.join('_') : originTableName\n\n this.tableToRecordsMap.delete(originTableName)\n this.tableToRecordsMap.set(newTableName, new Set(records))\n\n records.forEach(record => {\n this.recordToTableMap.set(record, newTableName)\n })\n }\n\n\n resolveBaseSourceEntityAndFilter(entity: EntityInstance) {\n const entityWithProps = entity\n let baseEntity = (entityWithProps as any).baseEntity\n let matchExpression = (entityWithProps as any).matchExpression\n assert((baseEntity && matchExpression) || (!baseEntity && !matchExpression), `matchExpression is required for ${entityWithProps.name}`)\n if (!(baseEntity && matchExpression)) return\n\n while(baseEntity.baseEntity) {\n baseEntity = baseEntity.baseEntity\n matchExpression = matchExpression.and(baseEntity.filter)\n }\n\n return { baseEntity, matchExpression }\n }\n\n /**\n * 验证 filtered entity 的过滤条件中的路径不包含 x:n 关系\n */\n private validateFilteredEntityPaths(entityName: string, matchExpression: MatchExpressionData) {\n const paths = MatchExp.extractPaths(matchExpression);\n \n for (const path of paths) {\n this.validateSinglePath(entityName, path);\n }\n }\n \n /**\n * 验证单个路径不包含 x:n 关系\n */\n private validateSinglePath(entityName: string, pathParts: string[]) {\n let currentEntity = entityName;\n \n // 遍历路径的每个部分(除了最后一个,最后一个是属性)\n for (let i = 0; i < pathParts.length - 1; i++) {\n const attribute = pathParts[i];\n \n // 获取这个属性的信息\n const entityData = this.map.records[currentEntity];\n if (!entityData) {\n throw new Error(`Entity ${currentEntity} not found in map`);\n }\n \n const attributeData = entityData.attributes[attribute];\n if (!attributeData || !(attributeData as any).isRecord) {\n throw new Error(`Attribute ${attribute} is not a relation in entity ${currentEntity}`);\n }\n \n // 检查关系类型\n const relType = (attributeData as any).relType;\n if (relType && (relType[1] === 'n')) {\n throw new Error(\n `Filtered entity '${this.currentFilteredEntityName}' contains an invalid path: ` +\n `'${pathParts.join('.')}'. The relation '${currentEntity}.${attribute}' is a ${relType[0]}:${relType[1]} relation. ` +\n `Filtered entities do not support paths with 'x:n' relationships for performance reasons.`\n );\n }\n \n // 移动到下一个实体\n currentEntity = (attributeData as any).recordName;\n }\n }\n \n private currentFilteredEntityName?: string;\n /**\n * 递归收集所有依赖于给定实体的 filtered entities(包括级联的)\n */\n private collectAllFilteredEntities(entity: EntityInstance | RelationInstance): (EntityInstance | RelationInstance)[] {\n const directFiltered = [...this.entities, ...this.relations].filter(e => \n (e as any).baseEntity === entity || (e as any).baseRelation === entity\n );\n \n const allFiltered: (EntityInstance | RelationInstance)[] = [...directFiltered];\n \n // 递归查找基于 filtered entity 的其他 filtered entities\n for (const filtered of directFiltered) {\n allFiltered.push(...this.collectAllFilteredEntities(filtered));\n }\n \n return allFiltered;\n }\n createRecord(entity: EntityInstance | RelationInstance, isRelation? :boolean) {\n const attributes: {[k:string]: Omit<ValueAttribute, 'field'>} = Object.fromEntries(entity.properties.map((property:PropertyInstance) => {\n const prop = property\n return [\n prop.name,\n {\n name: prop.name,\n type: prop.type,\n computed: prop.computed as ((record: any) => any) | undefined,\n collection: prop.collection,\n defaultValue: prop.defaultValue as (() => any) | undefined,\n fieldType: this.database!.mapToDBFieldType(prop.type, prop.collection)\n }\n ];\n }));\n\n\n if (isRelation) {\n assert(!attributes.source && !attributes.target, 'source and target is reserved name for relation attributes')\n }\n\n // 自动补充\n attributes[ID_ATTR] = {\n name: ID_ATTR,\n type: 'id',\n fieldType: this.database!.mapToDBFieldType('pk')\n }\n\n // 使用递归方法收集所有依赖的 filtered entities\n const filteredBy = this.collectAllFilteredEntities(entity);\n \n if (filteredBy.length) {\n attributes['__filtered_entities'] = {\n name: '__filtered_entities',\n type: 'json',\n fieldType: this.database!.mapToDBFieldType('json') || 'JSON',\n collection: false,\n computed: undefined,\n // JSON 字段的默认值应该返回对象,在写入数据库时会自动序列化\n defaultValue: () => ({})\n };\n }\n\n return {\n table: entity.name,\n attributes,\n isRelation,\n filteredBy: filteredBy.length ? filteredBy.map(e => e.name) : undefined,\n } as RecordMapItem\n }\n createFilteredEntityRecord(entity: EntityInstance) {\n // 使用递归方法收集所有依赖的 filtered entities\n const filteredBy = this.collectAllFilteredEntities(entity);\n const { baseEntity, matchExpression } = entity\n\n const { resolvedBaseRecordName, resolvedMatchExpression } = this.resolveRootBaseRecordNameAndMatchExpression(entity)\n \n // 获取实际的表名\n // 如果 base entity 已经在 map.records 中,使用它的 table\n // 否则使用 resolvedBaseRecordName\n let tableName = resolvedBaseRecordName;\n if (resolvedBaseRecordName && this.map.records[resolvedBaseRecordName]) {\n tableName = this.map.records[resolvedBaseRecordName].table || resolvedBaseRecordName;\n }\n\n return {\n table: tableName,\n isFilteredEntity: !!baseEntity,\n attributes: {},\n baseRecordName: baseEntity?.name,\n matchExpression: matchExpression,\n resolvedBaseRecordName,\n resolvedMatchExpression,\n filteredBy: filteredBy.length ? filteredBy.map(e => e.name) : undefined,\n } as RecordMapItem\n }\n createFilteredRelationRecord(relation: RelationInstance) {\n const attributes: {[k:string]: Omit<ValueAttribute, 'field'>} = Object.fromEntries(relation.properties.map((property:PropertyInstance) => {\n const prop = property\n return [\n prop.name,\n {\n name: prop.name,\n type: prop.type,\n computed: prop.computed as ((record: any) => any) | undefined,\n collection: prop.collection,\n defaultValue: prop.defaultValue as (() => any) | undefined,\n fieldType: this.database!.mapToDBFieldType(prop.type, prop.collection)\n }\n ];\n }));\n\n\n assert(!attributes.source && !attributes.target, 'source and target is reserved name for relation attributes')\n\n // 使用递归方法收集所有依赖的 filtered entities\n const filteredBy = this.collectAllFilteredEntities(relation);\n const { matchExpression, baseRelation } = relation\n const { resolvedBaseRecordName, resolvedMatchExpression } = this.resolveRootBaseRecordNameAndMatchExpression(relation)\n\n return {\n table: resolvedBaseRecordName,\n attributes,\n baseRecordName: baseRelation!.name,\n matchExpression: matchExpression,\n resolvedBaseRecordName,\n resolvedMatchExpression,\n filteredBy: filteredBy.length ? filteredBy.map(e => e.name) : undefined,\n // 添加 filtered relation 的标记\n isFilteredRelation:true,\n baseRelationName: baseRelation!.name\n } as RecordMapItem\n }\n resolveRootBaseRecordNameAndMatchExpression(entity: EntityInstance | RelationInstance) {\n const { baseEntity, baseRelation, matchExpression } = entity as any\n // 计算 resolved 字段\n let resolvedBaseRecordName: string | undefined;\n let resolvedMatchExpression: MatchExpressionData | undefined;\n \n // 递归查找最底层的源实体/关系\n let currentEntity = baseEntity! || baseRelation!;\n let currentMatchExpression = matchExpression || (entity as any).matchExpression;\n const matchExpressions: MatchExpressionData[] = [currentMatchExpression];\n \n while ((currentEntity as any).baseEntity || (currentEntity as any).baseRelation) {\n const nextEntity = (currentEntity as any).baseEntity || (currentEntity as any).baseRelation;\n const nextMatchExpression = (currentEntity as any).matchExpression;\n if (nextMatchExpression) {\n matchExpressions.push(nextMatchExpression);\n }\n currentEntity = nextEntity;\n }\n \n resolvedBaseRecordName = currentEntity.name;\n \n // 合并所有 matchExpression\n if (matchExpressions.length > 0) {\n resolvedMatchExpression = matchExpressions[0];\n for (let i = 1; i < matchExpressions.length; i++) {\n resolvedMatchExpression = resolvedMatchExpression.and(matchExpressions[i]);\n }\n }\n return { resolvedBaseRecordName, resolvedMatchExpression }\n }\n createLink(relationName: string, relation: RelationInstance) {\n\n return {\n table: relationName,\n relType: relation.type.split(':'),\n sourceRecord: relation.source.name,\n sourceProperty: relation.sourceProperty,\n targetRecord: relation.target.name,\n targetProperty: relation.targetProperty,\n recordName: relationName,\n isTargetReliance: relation.isTargetReliance,\n matchExpression: relation.matchExpression,\n } as LinkMapItem\n }\n createFilteredLink(relationName: string, relation: RelationInstance) {\n const { resolvedBaseRecordName, resolvedMatchExpression } = this.resolveRootBaseRecordNameAndMatchExpression(relation)\n\n return {\n table: relationName,\n relType: relation.type.split(':'),\n sourceRecord: relation.source.name,\n sourceProperty: relation.sourceProperty,\n targetRecord: relation.target.name,\n targetProperty: relation.targetProperty,\n recordName: relationName,\n isTargetReliance: relation.isTargetReliance,\n isFilteredRelation: !!relation.baseRelation,\n matchExpression: relation.matchExpression,\n baseLinkName: relation.baseRelation?.name,\n resolvedBaseRecordName,\n resolvedMatchExpression\n } as LinkMapItem\n } \n //虚拟 link\n createLinkOfRelationAndEntity(relationEntityName: string, relationName: string, relation: RelationInstance, isSource: boolean) {\n const relationWithProps = relation \n const [sourceRelType, targetRelType] = relationWithProps.type.split(':');\n return {\n table: undefined, // 虚拟 link 没有表\n attributes: {},\n sourceRecord: relationEntityName,\n sourceProperty: isSource ? 'source' : 'target',\n targetRecord: isSource ? relationWithProps.source.name: relationWithProps.target.name,\n // targetRecord: isSource ? relation.source.name: relation.target.name,\n targetProperty: undefined, // 不能从 entity 来获取关系表\n relType: [isSource ? targetRelType : sourceRelType,'1'],\n isSourceRelation: true,\n mergedTo: 'combined',\n } as LinkMapItem\n }\n getRelationNameOfRelationAndEntity(relationName: string, isSource: boolean) {\n return `${relationName}_${isSource? 'source' :'target'}`\n }\n\n \n\n buildMap() {\n // 0. 预处理:将 merged entity 和 merged relation 转化为 filtered entity/relation\n this.processMergedItems();\n \n // 1. 按照范式生成基础 entity record\n this.entities.forEach(entity => {\n assert(!this.map.records[entity.name], `entity name ${entity.name} is duplicated`)\n this.map.records[entity.name] = entity.baseEntity ? this.createFilteredEntityRecord(entity) : this.createRecord(entity)\n // 记录一下 entity 和 表的关系。后面用于合并的时候做计算。\n if(!entity.baseEntity) {\n this.createRecordToTable(entity.name, this.map.records[entity.name].table)\n }\n })\n\n // 2. 生成 relation record 以及所有的 link\n this.relations.forEach(relation => {\n const sourceName = relation.source.name\n const targetName = relation.target.name\n const relationName = relation.name || `${sourceName}_${relation.sourceProperty}_${relation.targetProperty}_${targetName}`\n assert(!this.map.records[relationName], `relation name ${relationName} is duplicated`)\n this.map.records[relationName] = relation.baseRelation ? this.createFilteredRelationRecord(relation) : this.createRecord(relation, true)\n // 记录 relation 里面的 Entity 和 Entity 的关系\n this.map.links[relationName] = relation.baseRelation ? this.createFilteredLink(relationName, relation) : this.createLink(relationName, relation)\n // 记录 relation 和实体之间的关系。这个关系是单向的,只能从 relation 发起。\n const virtualSourceRelationName = this.getRelationNameOfRelationAndEntity(relationName, true)\n this.map.links[virtualSourceRelationName] = this.createLinkOfRelationAndEntity(relationName, virtualSourceRelationName, relation, true)\n const virtualTargetRelationName = this.getRelationNameOfRelationAndEntity(relationName, false)\n this.map.links[virtualTargetRelationName] = this.createLinkOfRelationAndEntity(relationName, virtualTargetRelationName, relation, false)\n if(!relation.baseRelation) {\n this.createRecordToTable(relationName, this.map.records[relationName].table)\n }\n })\n\n // 3. 根据 Link 补充 record attribute 到 record 里面。方便之后的查询。\n Object.entries(this.map.links).forEach(([relation, relationData]) => {\n assert(!relationData.isSourceRelation || (relationData.sourceProperty === 'source' || relationData.sourceProperty === 'target'), 'virtual relation sourceProperty should only be source/target')\n \n // 检查是否是 filtered relation\n const relationRecord = this.map.records[relation]\n const isFilteredRelation = relationRecord && !!relationRecord.baseRelationName\n const sourceLink = isFilteredRelation ? this.map.links[relationRecord.baseRelationName!]! : undefined\n \n\n this.map.records[relationData.sourceRecord].attributes[relationData.sourceProperty] = {\n type: 'id',\n isRecord:true,\n relType: relationData.relType,\n recordName: relationData.targetRecord,\n linkName: relation,\n attributeName: relationData.sourceProperty,\n isSource: true,\n // CAUTION 这里是表示这个 target 是 reliance\n isReliance: relationData.isTargetReliance,\n // 标记这是一个 filtered relation\n isFilteredRelation: isFilteredRelation,\n matchExpression: isFilteredRelation?relationData.matchExpression: undefined,\n baseRelationAttributeName: isFilteredRelation? sourceLink?.sourceProperty: undefined,\n resolvedMatchExpression: isFilteredRelation? relationRecord.resolvedMatchExpression: undefined,\n resolvedBaseRecordName: isFilteredRelation? relationRecord?.resolvedBaseRecordName: undefined\n } as RecordAttribute\n\n // CAUTION 关联查询时,不可能出现从实体来获取一个关系的情况,语义不正确。\n assert(!(relationData.isSourceRelation && relationData.targetProperty), 'virtual relation should not have targetProperty')\n if (relationData.targetProperty) {\n this.map.records[relationData.targetRecord].attributes[relationData.targetProperty] = {\n type: 'id',\n isRecord:true,\n // CAUTION 这里翻转了!在 AttributeInfo 中方便判断。不能用 Array.reverse(),因为不会返回新数组。\n relType: [relationData.relType[1], relationData.relType[0]],\n recordName: relationData.sourceRecord,\n linkName: relation,\n attributeName: relationData.targetProperty,\n isSource:false,\n // 标记这是一个 filtered relation\n isFilteredRelation: isFilteredRelation,\n matchExpression: isFilteredRelation?relationData.matchExpression: undefined,\n baseRelationAttributeName: isFilteredRelation? sourceLink?.targetProperty: undefined\n } as RecordAttribute\n }\n })\n\n // 4. 验证所有 filtered entity 的路径\n this.entities.forEach(entity => {\n const entityWithProps = entity as any;\n if (entityWithProps.baseEntity && entityWithProps.matchExpression) {\n this.currentFilteredEntityName = entityWithProps.name;\n this.validateFilteredEntityPaths(entityWithProps.baseEntity.name, entityWithProps.matchExpression);\n }\n });\n\n this.mergeRecords()\n this.assignTableAndField()\n\n }\n /**\n * 统一处理 merged entities 和 merged relations\n */\n private processMergedItems() {\n const result = processMergedItems(\n this.entities,\n this.relations,\n );\n \n this.entities = result.entities;\n this.relations = result.relations;\n }\n\n mergeRecords() {\n // 基本合表策略:\n // 1. 从用户指定的 mergeLinks 里面开始合并三表合一\n // 2. reliance 三表合一。这里有一个不能有链的检测。\n // 3. 剩余的 x:1 关系只合并关系表。\n\n // 合并后要做的事:\n // 1) 修改 links 里面的数据。以里面的 mergeTo 作为判断标准\n\n // TODO 可能有 reliance 实体声明自己不合并。\n // 0. 做好数据准备,先把 reliance 关系和 非 reliance 的 xToOne 找出来等待处理。CAUTION oneToOneReliance 肯定不是 symmetric ?\n const oneToOneRelianceLinks = Object.fromEntries(Object.entries(this.map.links).filter(([, linkData]) => {\n return !linkData.isSourceRelation && linkData.relType[0] === '1' && linkData.relType[1] === '1' && linkData.isTargetReliance\n }))\n\n const xToOneNotRelianceLinks = Object.fromEntries(Object.entries(this.map.links).filter(([, linkData]) => {\n // CAUTION 一定要过滤掉虚拟 link\n return !linkData.isSourceRelation && !linkData.isTargetReliance &&\n (\n (linkData.relType[0] === '1' && linkData.relType[1] === '1') ||\n (linkData.relType[0] === 'n' && linkData.relType[1] === '1') ||\n (linkData.relType[0] === '1' && linkData.relType[1] === 'n')\n )\n }))\n\n const mergedLinks: LinkMapItem[] = []\n\n // 1. 遍历用户指定的 merge 路径。\n this.mergeLinks.forEach(path => {\n const [rootRecord, ...attributePath] = path.split('.')\n let currentRecord = rootRecord\n for(let i = 0; i < attributePath.length; i++ ) {\n const currentAttribute = attributePath[i]\n const attributeData = (this.map.records[currentRecord].attributes[currentAttribute]! as RecordAttribute)\n const linkName = attributeData.linkName\n const linkData = this.map.links[linkName]\n const {relType, sourceRecord, targetRecord} = linkData\n assert(\n relType[0] === '1' && relType[1] === '1' && sourceRecord !== targetRecord,\n `only 1:1 can merge: ${rootRecord}.${attributePath.slice(0, i+1).join('.')}`\n )\n const recordToMove = sourceRecord === currentRecord ? targetRecord : sourceRecord\n const conflicts = this.combineRecordTable(currentRecord, recordToMove, linkName)\n if (conflicts) {\n throw new Error(`conflict found when join ${linkName}, ${conflicts.join(',')} already merged with ${currentRecord}`)\n }\n\n // 成功要修改 map 的数据\n linkData.mergedTo = 'combined'\n mergedLinks.push(linkData)\n // 路径下一个\n currentRecord = attributeData.recordName\n // 处理完了 在上面的 links 里面删除这个 link\n delete oneToOneRelianceLinks[linkName]\n delete xToOneNotRelianceLinks[linkName]\n }\n })\n\n\n // 2. reliance 三表合一。这里有一个不能有链的检测。\n Object.values(oneToOneRelianceLinks).forEach(linkData => {\n if(linkData.isFilteredRelation) return\n const { sourceRecord, targetRecord, recordName: linkRecord} = linkData\n // 只是尝试。有冲突就不会处理\n const conflicts = this.combineRecordTable(sourceRecord, targetRecord, linkRecord!)\n if (!conflicts) {\n linkData.mergedTo = 'combined'\n mergedLinks.push(linkData)\n } else {\n // 改为 尝试 merge link\n const linkToRecordLinkName = (this.map.records[linkRecord!].attributes.source! as RecordAttribute).linkName\n const linkConflicts = this.joinTables(sourceRecord, linkRecord!, linkToRecordLinkName!)\n if (!linkConflicts) {\n this.mergeLog.push(conflicts)\n linkData.mergedTo = 'source'\n mergedLinks.push(linkData)\n }\n }\n })\n\n // CAUTION 这些关系里面没有虚拟关系。上面过滤掉了。\n // FIXME 还要加上 reliance 不是 1:1 的?\n // 3. 剩余的 x:1 关系只合并关系表。\n Object.values(xToOneNotRelianceLinks).forEach(linkData => {\n if(linkData.isFilteredRelation) return\n const { relType, sourceRecord, targetRecord, recordName: linkRecord} = linkData\n const mergeWithSource = relType[1] !== 'n'\n const mergeTarget = mergeWithSource ? sourceRecord : targetRecord\n const linkToRecordLinkName = (this.map.records[linkRecord!].attributes[mergeWithSource ? 'source': 'target']! as RecordAttribute).linkName\n // 只是尝试。有冲突就不会处理\n const linkConflicts = this.joinTables(mergeTarget, linkRecord!, linkToRecordLinkName!)\n if (!linkConflicts) {\n linkData.mergedTo = mergeWithSource ? 'source' : 'target'\n mergedLinks.push(linkData)\n }\n })\n\n\n // 4. 先给所有的 virtualLink 赋予默认 的 mergeTo,下一步再按照实际情况修改该\n Object.values(this.map.links).forEach(linkData => {\n if(linkData.isFilteredRelation) return\n\n if (linkData.isSourceRelation) {\n linkData.mergedTo = 'source'\n }\n })\n\n // 4.1 给 virtualLink 也更新 map\n mergedLinks.forEach(mergedLinkData => {\n if (mergedLinkData.mergedTo === 'combined' || mergedLinkData.mergedTo === 'source') {\n const sourceLinkName = (this.map.records[mergedLinkData.recordName!].attributes.source as RecordAttribute).linkName\n this.map.links[sourceLinkName].mergedTo = 'combined'\n }\n\n if (mergedLinkData.mergedTo === 'combined' || mergedLinkData.mergedTo === 'target') {\n const sourceLinkName = (this.map.records[mergedLinkData.recordName!].attributes.target as RecordAttribute).linkName\n this.map.links[sourceLinkName].mergedTo = 'combined'\n }\n })\n\n\n // TODO 独立字段的处理\n }\n assignTableAndField() {\n // 1. 给所有的 record 分配表(表名重命名过了)\n const originTableNames = Array.from(this.tableToRecordsMap.keys())\n for(let originTableName of originTableNames) {\n this.renameTableWithJoinedEntities(originTableName)\n }\n\n // 2. 给所有 record 分配 table,给 value 字段分配 field\n Object.entries(this.map.records).forEach(([recordName, record]) => {\n // 对于 filtered entities,不要覆盖它们的 table\n // 因为它们不在 recordToTableMap 中\n if (!record.isFilteredEntity && !record.isFilteredRelation) {\n record.table = this.recordToTableMap.get(recordName)!\n }\n Object.entries(record.attributes).forEach(([attributeName, attributeData]) => {\n if ((attributeData as RecordAttribute).isRecord) return\n const valueAttributeData = attributeData as ValueAttribute\n valueAttributeData.field = this.generateShortFieldName(`${recordName}_${attributeName}`)\n valueAttributeData.fieldType = this.database!.mapToDBFieldType(valueAttributeData.type, valueAttributeData.collection)\n })\n })\n\n // 2.1 给所有 relation record 的 table 信息同步到 map.link 上\n Object.entries(this.map.links).forEach(([linkName, link]) => {\n if (link.isSourceRelation) return\n link.table = this.recordToTableMap.get(linkName)!\n })\n\n // 3. 开始决定合表后的 source/target 字段分配。这里只要处理作为 relation 的 record 的 source/target 字段\n // CAUTION 因为后面无论是处理 join 还是其他的,都是从 record 上去找字段。不是从 link 中\n Object.entries(this.map.records).forEach(([recordName, record]) => {\n if( !record.isRelation) return\n const link = this.map.links[recordName]\n const sourceAttribute = record.attributes.source as ValueAttribute\n const targetAttribute = record.attributes.target as ValueAttribute\n if (!link.mergedTo ) {\n sourceAttribute.field = this.generateShortFieldName(`${recordName}_source`)\n sourceAttribute.fieldType = this.database!.mapToDBFieldType(sourceAttribute.type, false)\n\n targetAttribute.field = this.generateShortFieldName(`${recordName}_target`)\n targetAttribute.fieldType = this.database!.mapToDBFieldType(targetAttribute.type, false)\n } else if (link.mergedTo === 'source') {\n // field 名字以 sourceRecord 里面的称呼为主\n targetAttribute.field = this.generateShortFieldName(`${link.sourceRecord}_${link.sourceProperty}`)\n targetAttribute.fieldType = this.database!.mapToDBFieldType(targetAttribute.type, false)\n\n } else if (link.mergedTo === 'target') {\n sourceAttribute.field = this.generateShortFieldName(`${link.targetRecord}_${link.targetProperty}`)\n sourceAttribute.fieldType = this.database!.mapToDBFieldType(sourceAttribute.type, false)\n\n } else {\n // combined 情况\n // const sourceRecord = this.map.records[link.sourceRecord]\n // const targetRecord = this.map.records[link.targetRecord]\n // record.attributes.source.field = sourceRecord.attributes[ID_ATTR].field\n // record.attributes.target.field = targetRecord.attributes[ID_ATTR].field\n }\n })\n }\n buildTables() {\n // 先添加 valueAttributes 的字段。\n Object.entries(this.map.records).forEach(([recordName, record]) => {\n if (!this.tables[record.table]) {\n this.tables[record.table] = { columns: {\n [ROW_ID_ATTR]: {\n name: ROW_ID_ATTR,\n type: 'pk',\n fieldType: this.database!.mapToDBFieldType('pk'),\n }\n }}\n }\n\n // 有分配 field 的都说明在这张表内\n Object.entries(record.attributes).forEach(([attributeName, attribute]) => {\n if (!attribute.field || this.tables[record.table].columns[attribute.field]) return\n if(!(attribute as ValueAttribute).fieldType) {\n throw new Error(`fieldType not found for ${(attribute as ValueAttribute).field} ${(attribute as ValueAttribute).type}`)\n }\n const valueAttribute = attribute as ValueAttribute\n this.tables[record.table].columns[valueAttribute.field] = {\n name: valueAttribute.field,\n type: valueAttribute.type,\n fieldType: valueAttribute.fieldType,\n defaultValue: valueAttribute.defaultValue,\n attribute: valueAttribute,\n }\n })\n })\n\n }\n\n createTableSQL() {\n return Object.keys(this.tables).map(tableName => {\n const sql = (\n `\nCREATE TABLE \"${tableName}\" (\n${Object.values(this.tables[tableName].columns).map(column => {\n let sql = ` \"${column.name}\" ${column.fieldType}`;\n // 移除 DEFAULT 子句生成,改为程序控制\n // defaultValue 将在创建记录时由程序处理\n return sql;\n}).join(',')}\n)\n`)\n return sql\n })\n }\n createTables() {\n return Promise.all(this.createTableSQL().map(sql => {\n return this.database!.scheme(sql)\n }))\n }\n\n /**\n * Generate a shortened field name using auto-increment number\n * @param originalName The original long field name\n * @returns A shortened field name that is unique\n */\n private generateShortFieldName(originalName: string): string {\n // If already shortened, return the existing one\n if (this.fieldNameMap.has(originalName)) {\n return this.fieldNameMap.get(originalName)!\n }\n\n // Extract meaningful prefix from the original name\n const parts = originalName.split('_')\n let prefix = ''\n \n // Try to create a meaningful prefix from the first parts\n if (parts.length >= 2) {\n // Take first few characters from each part\n prefix = parts.slice(0, 2).map(p => p.substring(0, 3).toLowerCase()).join('_')\n } else {\n prefix = originalName.substring(0, 6).toLowerCase()\n }\n\n // Generate field name with auto-increment number\n const shortName = `${prefix}_${this.fieldCounter}`\n this.fieldCounter++\n\n this.fieldNameMap.set(originalName, shortName)\n this.usedFieldNames.add(shortName)\n \n return shortName\n }\n}\n\n\n","/**\n * Base class for all framework errors\n * Provides comprehensive error context, serialization capabilities, and chain of errors support\n */\nexport abstract class FrameworkError extends Error {\n public readonly timestamp: Date\n public readonly errorId: string\n public readonly errorType: string\n public readonly context: Record<string, any>\n public readonly causedBy?: Error\n public readonly stackTrace?: string\n\n constructor(\n message: string,\n options: {\n errorType?: string\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(`${message}. Caused by: ${options.causedBy?.message}`)\n \n this.name = this.constructor.name\n this.timestamp = new Date()\n this.errorId = this.generateErrorId()\n this.errorType = options.errorType || this.constructor.name\n this.context = options.context || {}\n this.causedBy = options.causedBy\n this.stackTrace = this.stack\n\n // Maintain proper error prototype chain\n Object.setPrototypeOf(this, new.target.prototype)\n }\n\n private generateErrorId(): string {\n return `${this.constructor.name}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n }\n\n /**\n * Get the full error chain\n */\n public getErrorChain(): Error[] {\n const chain: Error[] = [this]\n let current = this.causedBy\n while (current) {\n chain.push(current)\n if (current instanceof FrameworkError) {\n current = current.causedBy\n } else {\n break\n }\n }\n return chain\n }\n\n /**\n * Get formatted error message with context\n */\n public getDetailedMessage(): string {\n let message = `[${this.errorType}] ${this.message}`\n \n if (Object.keys(this.context).length > 0) {\n message += `\\nContext: ${JSON.stringify(this.context, null, 2)}`\n }\n\n if (this.causedBy) {\n message += `\\nCaused by: ${this.causedBy.message}`\n }\n\n return message\n }\n\n /**\n * Serialize error for JSON transmission\n */\n public toJSON(): Record<string, any> {\n return {\n name: this.name,\n message: this.message,\n errorType: this.errorType,\n errorId: this.errorId,\n timestamp: this.timestamp.toISOString(),\n context: this.context,\n // 这里只展示了两层。下面 getFormattedError 展示所有层。\n causedBy: this.causedBy ? {\n name: this.causedBy.name,\n message: this.causedBy.message,\n stack: this.causedBy.stack\n } : undefined,\n stack: this.stackTrace,\n formattedError: this.getFormattedError()\n }\n }\n\n /**\n * Get formatted error for console output (concise version)\n */\n private getFormattedError(): string {\n const chain = this.getErrorChain();\n let output = `[${this.errorType}] ${this.message}`;\n \n // Add important context\n const importantContext = ['entityName', 'propertyName', 'interactionName', 'computationName', 'handleName', 'depName']\n .filter(key => this.context[key])\n .map(key => `${key}: ${this.context[key]}`)\n .join(', ');\n \n if (importantContext) {\n output += ` (${importantContext})`;\n }\n \n // Add error chain\n if (chain.length > 1) {\n output += '\\n\\nCaused by:';\n for (let i = 1; i < chain.length; i++) {\n const err = chain[i];\n output += `\\n ${' '.repeat(i-1)}→ ${err.constructor.name}: ${err.message}`;\n }\n }\n \n // Add root cause stack (first 5 lines)\n const rootCause = chain[chain.length - 1];\n if (rootCause.stack) {\n output += '\\n\\nStack trace:';\n const stackLines = rootCause.stack.split('\\n').slice(0, 6);\n stackLines.forEach(line => {\n output += '\\n ' + line;\n });\n if (rootCause.stack.split('\\n').length > 6) {\n output += '\\n ... (truncated)';\n }\n }\n \n return output;\n }\n\n /**\n * Convert to string with detailed information\n */\n public toString(): string {\n // Use the formatted error for consistency across all output methods\n return this.getFormattedError();\n }\n\n /**\n * Custom JSON.stringify behavior\n */\n public [Symbol.toStringTag](): string {\n return JSON.stringify(this.toJSON(), null, 2)\n }\n\n /**\n * Custom inspect method for Node.js console.log/error\n * This method is automatically called when the error is logged\n */\n public [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.getFormattedError();\n }\n\n /**\n * For browser compatibility - valueOf is called when converting to primitive\n */\n public valueOf(): string {\n return this.getFormattedError();\n }\n\n /**\n * Check if error is of specific type\n */\n public static isType<T extends FrameworkError>(error: any, ErrorClass: new (...args: any[]) => T): error is T {\n return error instanceof ErrorClass\n }\n\n /**\n * Find error of specific type in error chain\n */\n public findInChain<T extends FrameworkError>(ErrorClass: new (...args: any[]) => T): T | null {\n const chain = this.getErrorChain()\n for (const error of chain) {\n if (error instanceof ErrorClass) {\n return error as T\n }\n }\n return null\n }\n}\n\n/**\n * Error severity levels\n */\nexport enum ErrorSeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical'\n}\n\n/**\n * Error categories for classification\n */\nexport enum ErrorCategory {\n VALIDATION = 'validation',\n PERMISSION = 'permission',\n COMPUTATION = 'computation',\n STORAGE = 'storage',\n INTERACTION = 'interaction',\n ACTIVITY = 'activity',\n SYSTEM = 'system',\n CONFIGURATION = 'configuration'\n}\n","import { FrameworkError, ErrorSeverity, ErrorCategory } from './FrameworkError.js'\n\n/**\n * Interaction execution errors\n */\nexport class InteractionExecutionError extends FrameworkError {\n public readonly interactionName?: string\n public readonly userId?: string\n public readonly payload?: any\n public readonly executionPhase?: string\n public readonly severity: ErrorSeverity\n\n constructor(\n message: string,\n options: {\n interactionName?: string\n userId?: string\n payload?: any\n executionPhase?: string\n severity?: ErrorSeverity\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n errorType: options.context?.errorType || 'InteractionExecutionError',\n context: {\n category: ErrorCategory.INTERACTION,\n interactionName: options.interactionName,\n userId: options.userId,\n payload: options.payload,\n executionPhase: options.executionPhase,\n ...options.context\n },\n causedBy: options.causedBy\n })\n\n this.interactionName = options.interactionName\n this.userId = options.userId\n this.payload = options.payload\n this.executionPhase = options.executionPhase\n this.severity = options.severity || ErrorSeverity.HIGH\n }\n}","import { FrameworkError, ErrorSeverity, ErrorCategory } from './FrameworkError.js'\n\n/**\n * Base class for all activity-related errors\n */\nexport class ActivityError extends FrameworkError {\n public readonly activityName?: string\n public readonly activityId?: string\n public readonly activityInstanceId?: string\n public readonly currentState?: any\n public readonly severity: ErrorSeverity\n\n constructor(\n message: string,\n options: {\n activityName?: string\n activityId?: string\n activityInstanceId?: string\n currentState?: any\n severity?: ErrorSeverity\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n errorType: options.context?.errorType || 'ActivityError',\n context: {\n category: ErrorCategory.ACTIVITY,\n activityName: options.activityName,\n activityId: options.activityId,\n activityInstanceId: options.activityInstanceId,\n currentState: options.currentState,\n ...options.context\n },\n causedBy: options.causedBy\n })\n\n this.activityName = options.activityName\n this.activityId = options.activityId\n this.activityInstanceId = options.activityInstanceId\n this.currentState = options.currentState\n this.severity = options.severity || ErrorSeverity.MEDIUM\n }\n}\n\n/**\n * Activity state management errors\n */\nexport class ActivityStateError extends ActivityError {\n public readonly expectedState?: string\n public readonly actualState?: string\n public readonly stateTransition?: string\n\n constructor(\n message: string,\n options: {\n expectedState?: string\n actualState?: string\n stateTransition?: string\n activityName?: string\n activityId?: string\n activityInstanceId?: string\n currentState?: any\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n ...options,\n severity: ErrorSeverity.HIGH,\n context: {\n errorType: 'ActivityStateError',\n expectedState: options.expectedState,\n actualState: options.actualState,\n stateTransition: options.stateTransition\n }\n })\n\n this.expectedState = options.expectedState\n this.actualState = options.actualState\n this.stateTransition = options.stateTransition\n }\n}","import { FrameworkError, ErrorSeverity, ErrorCategory } from './FrameworkError.js'\n\n/**\n * Base class for all computation-related errors\n */\nexport class ComputationError extends FrameworkError {\n public readonly handleName?: string\n public readonly computationName?: string\n public readonly dataContext?: any\n public readonly computationPhase?: string\n public readonly severity: ErrorSeverity\n\n constructor(\n message: string,\n options: {\n handleName?: string\n computationName?: string\n dataContext?: any\n computationPhase?: string\n severity?: ErrorSeverity\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n errorType: options.context?.errorType || 'ComputationError',\n context: {\n category: ErrorCategory.COMPUTATION,\n handleName: options.handleName,\n computationName: options.computationName,\n dataContext: options.dataContext,\n computationPhase: options.computationPhase,\n ...options.context\n },\n causedBy: options.causedBy\n })\n\n this.handleName = options.handleName\n this.computationName = options.computationName\n this.dataContext = options.dataContext\n this.computationPhase = options.computationPhase\n this.severity = options.severity || ErrorSeverity.MEDIUM\n }\n}\n\n/**\n * Computation state management errors\n */\nexport class ComputationStateError extends ComputationError {\n public readonly stateKey?: string\n public readonly stateValue?: any\n public readonly expectedStateType?: string\n public readonly actualStateType?: string\n\n constructor(\n message: string,\n options: {\n stateKey?: string\n stateValue?: any\n expectedStateType?: string\n actualStateType?: string\n handleName?: string\n computationName?: string\n dataContext?: any\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n ...options,\n severity: ErrorSeverity.HIGH,\n context: {\n errorType: 'ComputationStateError',\n stateKey: options.stateKey,\n stateValue: options.stateValue,\n expectedStateType: options.expectedStateType,\n actualStateType: options.actualStateType\n }\n })\n\n this.stateKey = options.stateKey\n this.stateValue = options.stateValue\n this.expectedStateType = options.expectedStateType\n this.actualStateType = options.actualStateType\n }\n}\n\n/**\n * Computation data dependency errors\n */\nexport class ComputationDataDepError extends ComputationError {\n public readonly depName?: string\n public readonly depType?: string\n public readonly missingData?: boolean\n public readonly invalidData?: boolean\n\n constructor(\n message: string,\n options: {\n depName?: string\n depType?: string\n missingData?: boolean\n invalidData?: boolean\n handleName?: string\n computationName?: string\n dataContext?: any\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n ...options,\n severity: ErrorSeverity.MEDIUM,\n context: {\n errorType: 'ComputationDataDepError',\n depName: options.depName,\n depType: options.depType,\n missingData: options.missingData,\n invalidData: options.invalidData\n }\n })\n\n this.depName = options.depName\n this.depType = options.depType\n this.missingData = options.missingData\n this.invalidData = options.invalidData\n }\n}","import { FrameworkError, ErrorSeverity, ErrorCategory } from './FrameworkError.js'\n\n/**\n * Scheduler errors\n */\nexport class SchedulerError extends FrameworkError {\n public readonly schedulingPhase?: string\n public readonly failedComputations?: string[]\n public readonly severity: ErrorSeverity\n\n constructor(\n message: string,\n options: {\n schedulingPhase?: string\n failedComputations?: string[]\n context?: Record<string, any>\n causedBy?: Error\n } = {}\n ) {\n super(message, {\n errorType: options.context?.errorType || 'SchedulerError',\n context: {\n category: ErrorCategory.SYSTEM,\n schedulingPhase: options.schedulingPhase,\n failedComputations: options.failedComputations,\n ...options.context\n },\n causedBy: options.causedBy\n })\n\n this.schedulingPhase = options.schedulingPhase\n this.failedComputations = options.failedComputations\n this.severity = ErrorSeverity.HIGH\n }\n}","import { FrameworkError, ErrorSeverity, ErrorCategory } from './FrameworkError.js'\nimport { EvaluateError, ConditionInstance } from '@shared'\n\n/**\n * Base class for all condition and permission related errors\n */\nexport class ConditionError extends FrameworkError {\n public readonly type: string // For backward compatibility with existing tests\n public readonly error?: EvaluateError<ConditionInstance> | any // For backward compatibility\n public readonly checkType: 'user' | 'payload' | 'condition' | 'attributive' | 'concept'\n public readonly fieldName?: string\n public readonly payload?: any\n public readonly evaluationError?: EvaluateError<ConditionInstance> | any\n public readonly severity: ErrorSeverity\n\n constructor(\n message: string,\n options: {\n checkType: 'user' | 'payload' | 'condition' | 'attributive' | 'concept'\n fieldName?: string\n payload?: any\n evaluationError?: EvaluateError<ConditionInstance> | any\n severity?: ErrorSeverity\n context?: Record<string, any>\n causedBy?: Error\n type?: string // For backward compatibility\n }\n ) {\n super(message, {\n errorType: options.context?.errorType || 'ConditionError',\n context: {\n category: ErrorCategory.PERMISSION,\n checkType: options.checkType,\n fieldName: options.fieldName,\n payload: options.payload,\n evaluationError: options.evaluationError,\n ...options.context\n },\n causedBy: options.causedBy\n })\n\n this.checkType = options.checkType\n this.fieldName = options.fieldName\n this.payload = options.payload\n this.evaluationError = options.evaluationError\n this.error = options.evaluationError // For backward compatibility\n this.type = options.type || message // For backward compatibility\n this.severity = options.severity || ErrorSeverity.HIGH\n }\n\n /**\n * Helper factory methods for common condition error scenarios\n */\n static userCheckFailed(error: any, context?: Record<string, any>): ConditionError {\n return new ConditionError('User check failed', {\n checkType: 'user',\n evaluationError: error,\n severity: ErrorSeverity.HIGH,\n context,\n type: 'check user failed' // For backward compatibility\n })\n }\n\n static payloadValidationFailed(fieldName: string, message: string, payload?: any, error?: any): ConditionError {\n const fullMessage = `${fieldName} ${message}`\n return new ConditionError(`Payload validation failed for field '${fieldName}': ${message}`, {\n checkType: 'payload',\n fieldName,\n payload,\n evaluationError: error,\n severity: ErrorSeverity.MEDIUM,\n type: fullMessage // For backward compatibility\n })\n }\n\n static conditionCheckFailed(error: EvaluateError<ConditionInstance>, context?: Record<string, any>): ConditionError {\n return new ConditionError(`Condition check failed: ${error.data.name}`, {\n checkType: 'condition',\n evaluationError: error,\n severity: ErrorSeverity.HIGH,\n context,\n type: 'condition check failed' // For backward compatibility\n })\n }\n\n static attributiveCheckFailed(fieldName: string, message: string, payload?: any, error?: any): ConditionError {\n const fullMessage = `${fieldName} ${message}`\n return new ConditionError(`Attributive check failed for field '${fieldName}': ${message}`, {\n checkType: 'attributive',\n fieldName,\n payload,\n evaluationError: error,\n severity: ErrorSeverity.MEDIUM,\n type: fullMessage // For backward compatibility\n })\n }\n\n static conceptCheckFailed(fieldName: string, error: any): ConditionError {\n return new ConditionError(`Concept check failed for field '${fieldName}'`, {\n checkType: 'concept',\n fieldName,\n evaluationError: error,\n severity: ErrorSeverity.MEDIUM,\n type: `${fieldName} check concept failed` // For backward compatibility\n })\n }\n}\n","import {\n AttributiveInstance, ConditionInstance, EntityInstance,\n Attributive,\n Attributives,\n BoolExp,\n BoolExpressionRawData,\n Concept,\n ConceptAlias,\n ConceptInstance, Conditions,\n DerivedConcept,\n Entity,\n Relation,\n ExpressionData,\n GetAction,\n InteractionInstanceType,\n EvaluateError\n} from \"@shared\";\nimport { MatchAtom, MatchExp, MatchExpressionData } from \"@storage\";\nimport { RecordMutationEvent, System } from \"../System.js\";\nimport { assert, everyWithErrorAsync, someAsync } from \"../util.js\";\nimport { ActivityCall } from \"./ActivityCall.js\";\nimport { Controller, InteractionContext } from \"../Controller.js\";\nimport { ConditionError } from \"../errors/index.js\";\n\nexport type EventQuery = {\n match?: MatchExpressionData,\n modifier?: Record<string, unknown>,\n attributeQuery?: string[],\n}\n\n\nexport type EventPayload = {\n [k: string]: unknown\n}\n\nexport type InteractionEvent = {\n interactionName: string,\n interactionId: string,\n user: EventUser,\n query: EventQuery,\n payload: EventPayload,\n activityId?: string,\n}\n\nexport type InteractionEventArgs = {\n user: EventUser,\n query?: EventQuery,\n payload?: EventPayload,\n activityId?: string,\n}\n\nexport type EventUser = {\n id: string,\n [k: string]: unknown\n}\n\n\ntype ConceptCheckStack = {\n type: string,\n values: {\n [k: string]: unknown\n }\n}\n\n\nexport type ConceptCheckResponse = AtomError |true\n\ntype AtomError = {\n name: string,\n type: string,\n stack?: ConceptCheckStack[],\n content?: string,\n error?: unknown\n}\n\n\n\n\ntype SideEffectResult = {\n result?: unknown,\n error?: unknown\n}\n\nexport type InteractionCallResponse= {\n error?: unknown,\n // 获取数据的 interaction 返回的数据\n data?: unknown,\n event?: InteractionEvent\n // interaction 中产生的 record create/update 等行为\n effects?: RecordMutationEvent[]\n sideEffects?: {\n [k: string]: SideEffectResult\n }\n // interaction 附加产生的上下文,例如 activityId\n context?: {\n [k: string]: unknown\n }\n}\n\n\ntype HandleAttributive = (attributive: AttributiveInstance) => Promise<boolean>\n\ntype AttributiveType = {\n content: (attributiveTarget: unknown, event: InteractionEventArgs | undefined) => Promise<boolean> | boolean\n name: string\n}\n\ntype CheckUserRef = (attributive: AttributiveInstance, eventUser: EventUser, activityId: string) => Promise<boolean>\n\nexport class InteractionCall {\n system: System\n constructor(public interaction: InteractionInstanceType, public controller: Controller, public activitySeqCall?: ActivityCall) {\n this.system = controller.system\n }\n async checkAttributive(inputAttributive: any, interactionEvent: InteractionEventArgs|undefined, attributiveTarget: any) {\n const attributive = inputAttributive as unknown as AttributiveType\n if (attributive.content) {\n // CAUTION! 第一参数应该是 User 它描述的 User(其实就是 event.user) 然后才是 event! this 指向当前,用户可以用 this.system 里面的东西来做任何查询操作\n // const testFn = new Function('attributiveTarget', 'event', `return (${attributive.content}).call(this, attributiveTarget, event)`)\n const testFn = attributive.content\n let result\n try {\n result = await testFn.call(this.controller, attributiveTarget, interactionEvent)\n } catch(e) {\n result = false\n }\n\n\n if ( result === undefined ) {\n console.warn(`attributive ${attributive.name} returned undefined, maybe not implemented, we will return true for now`)\n return true\n }\n return result\n } else {\n console.warn(`${attributive.name} not implemented`)\n }\n return true\n }\n async checkMixedAttributive(attributiveData: AttributiveInstance, instance: ConceptInstance) {\n // const attributiveByName = indexBy((UserAttributive.instances as any[]).concat(Entity.instances), 'name')\n return Promise.resolve(true)\n }\n createHandleAttributive(AttributiveClass: typeof Attributive| typeof Attributive, interactionEvent: InteractionEventArgs, target: any) {\n return (attributive: AttributiveInstance) => {\n return this.checkAttributive(attributive, interactionEvent, target)\n }\n }\n async checkUser(interactionEvent: InteractionEventArgs, activityId? :string, checkUserRef?:CheckUserRef) {\n let res: ConceptCheckResponse|true\n if (!this.interaction.userAttributives ) return true\n\n const userAttributiveCombined =\n Attributives.is(this.interaction.userAttributives) ?\n BoolExp.fromValue<AttributiveInstance>(\n this.interaction.userAttributives!.content! as ExpressionData<AttributiveInstance>\n ) :\n BoolExp.atom<AttributiveInstance>(\n this.interaction.userAttributives as AttributiveInstance\n )\n\n const checkHandle = (attributive: AttributiveInstance) => {\n if (attributive.isRef) {\n return checkUserRef!(attributive, interactionEvent.user, activityId!)\n } else {\n return this.checkAttributive(attributive, interactionEvent, interactionEvent.user)\n }\n }\n res = await this.checkAttributives(userAttributiveCombined, checkHandle, [])\n\n if (res === true) return res\n\n throw ConditionError.userCheckFailed(res)\n }\n // 用来check attributive 形容的后面的 target 到底是不是那个概念的实例。\n async checkConcept(instance: ConceptInstance, concept: Concept, attributives?: BoolExpressionRawData<AttributiveInstance>, stack: ConceptCheckStack[] = []): Promise<ConceptCheckResponse> {\n const currentStack = stack.concat({type: 'concept', values: {attributives, concept}})\n\n const conceptRes = await this.isConcept(instance, concept, currentStack)\n if (conceptRes !== true) return conceptRes\n\n if (attributives) {\n const handleAttributives = (attributive: AttributiveInstance) => this.checkMixedAttributive(attributive, instance)\n const attrMatchRes = await this.checkAttributives(BoolExp.fromValue<AttributiveInstance>(attributives as ExpressionData<AttributiveInstance>), handleAttributives , currentStack)\n if (attrMatchRes !== true) return attrMatchRes\n }\n\n return true\n }\n async isConcept(instance: ConceptInstance, concept: Concept, stack: ConceptCheckStack[] = []): Promise<ConceptCheckResponse> {\n const currentStack = stack.concat({type: 'isConcept', values: {concept}})\n\n if (this.isDerivedConcept(concept)) {\n const derivedConcept = concept as DerivedConcept;\n if (derivedConcept.attributive) {\n return this.checkConcept(instance, derivedConcept.base!, derivedConcept.attributive as BoolExpressionRawData<AttributiveInstance>, currentStack);\n } else {\n // 如果没有 attributive,只检查 base\n return this.isConcept(instance, derivedConcept.base!, currentStack);\n }\n }\n\n if (this.isConceptAlias(concept)) {\n const errors: AtomError[] = []\n\n const somePassed = await someAsync((concept as ConceptAlias).for, async (concept: Concept) => {\n const checkRes = await this.isConcept(instance, concept)\n if (checkRes === true) {\n return true\n } else {\n errors.push(checkRes as AtomError)\n return false\n }\n })\n\n if (somePassed) {\n return true\n } else {\n return {name: concept.name, type: 'conceptAlias', stack: currentStack, error: errors}\n }\n } else {\n // TODO 好像废弃了,再检查一下,attributive 的check 直接就在 checkAttributive 做了\n // CAUTION 这里的 concept 是 Role/Entity 的实例. 例如 UserRole/AdminRole,实体例如 Post/Profile\n if (Attributive.is(concept)) {\n // Role\n return (await this.checkAttributive(concept, undefined, instance)) ? true : {name: concept.name, type: 'conceptCheck', stack: currentStack, error: 'role check error'}\n }\n\n // Entity 或者其他具备 check 能力的\n const constructorCheck = (concept.constructor as any)?.check\n if (constructorCheck) {\n return constructorCheck(instance as object) ? true : {name: concept.name, type: 'conceptCheck', stack: currentStack, error: 'constructor check error'}\n }\n\n // 对于重构后的代码,检查是否是 Entity 或其他具有静态 check 方法的类\n if (concept.constructor && typeof (concept.constructor as any).check === 'function') {\n const checkResult = (concept.constructor as any).check(instance)\n return checkResult ? true : {name: concept.name || '', type: 'conceptCheck', stack: currentStack, error: 'constructor check error'}\n }\n\n // 对于 Entity 实例,检查传入的数据是否匹配\n if (Entity.is(concept)) {\n // 简单检查:确保 instance 至少有 id 属性\n if (instance && typeof instance === 'object' && 'id' in instance) {\n return true\n }\n // 如果没有 id,检查是否是新创建的数据\n if (instance && typeof instance === 'object') {\n return true\n }\n return {name: concept.name || '', type: 'conceptCheck', stack: currentStack, error: 'invalid entity data'}\n }\n\n // 对于 Entity 实例,简单检查数据是否有效\n if (instance && typeof instance === 'object') {\n // 基本的检查:确保对象至少有一些属性\n return true\n }\n\n // instanceCheck\n if (typeof concept === 'function') {\n return instance instanceof concept ? true : {name: (concept as Function).name, type: 'conceptCheck', stack: currentStack, error: 'instanceof check error'}\n }\n\n console.warn(`unknown concept ${concept}, cannot check ${instance}. pass.`)\n return true\n }\n }\n isDerivedConcept(concept: Concept) {\n return !!(concept as DerivedConcept).base\n }\n isConceptAlias(concept: Concept) {\n return !!(concept as ConceptAlias).for\n }\n\n async checkAttributives(attributives: BoolExp<AttributiveInstance>, handleAttributive: HandleAttributive, stack: ConceptCheckStack[] = []) : Promise<ConceptCheckResponse>{\n const result = await attributives.evaluateAsync(handleAttributive)\n return result === true ? true : {name: '', type: 'matchAttributives', stack, error: result}\n }\n async checkPayload(interactionEvent: InteractionEventArgs) {\n const payloadDefs = this.interaction.payload?.items || []\n\n // 检查是否存在传了没定义的字段的情况。\n const payloadKeys = Object.keys(interactionEvent.payload || {})\n for(let payloadKey of payloadKeys) {\n if (!payloadDefs.some(payloadDef => payloadDef.name === payloadKey)) {\n throw new Error(`${payloadKey} in payload is not defined in interaction ${this.interaction.name}`)\n }\n }\n \n for(let payloadDef of payloadDefs) {\n\n const payloadItem = interactionEvent.payload![payloadDef.name!]\n if (payloadDef.required && !payloadItem) {\n throw ConditionError.payloadValidationFailed(payloadDef.name!, 'missing', interactionEvent.payload)\n }\n\n if (!payloadItem) return\n\n\n if (payloadDef.isCollection && !Array.isArray(payloadItem)) {\n throw ConditionError.payloadValidationFailed(payloadDef.name!, 'data is not array', payloadItem)\n }\n\n if (payloadDef.isCollection) {\n if (payloadDef.isRef && !((payloadItem as unknown[]) as {id: string}[]).every(item => !!item.id)) {\n throw ConditionError.payloadValidationFailed(payloadDef.name!, 'data not every is ref', payloadItem)\n }\n } else {\n if (payloadDef.isRef && !(payloadItem as {id: string}).id) {\n throw ConditionError.payloadValidationFailed(payloadDef.name!, 'data is not a ref', payloadItem)\n }\n }\n\n\n // Only check concept if base is defined (for entity references)\n if (payloadDef.base) {\n if (payloadDef.isCollection) {\n const result = await everyWithErrorAsync(payloadItem as unknown[],(item => this.checkConcept(item, payloadDef.base as unknown as Concept)))\n if (result !== true) {\n throw ConditionError.conceptCheckFailed(payloadDef.name!, result)\n }\n } else {\n const result = await this.checkConcept(payloadItem, payloadDef.base as unknown as Concept)\n if (result !== true) {\n throw ConditionError.conceptCheckFailed(payloadDef.name!, result)\n }\n }\n }\n\n let fullPayloadItem: unknown | unknown[] = payloadItem\n if (payloadDef.isRef) {\n const itemMatch = payloadDef.isCollection ?\n MatchExp.atom({\n key: 'id',\n value: ['in', ((payloadItem as unknown[]) as {id: string}[]).map((item) => item.id)]\n }) :\n MatchExp.atom({\n key: 'id',\n value: ['=', (payloadItem as {id: string}).id]\n })\n\n fullPayloadItem = payloadDef.isCollection ?\n await this.system.storage.find(payloadDef.base!.name!, itemMatch, undefined, ['*']) :\n await this.system.storage.findOne(payloadDef.base!.name!, itemMatch, undefined, ['*'])\n }\n\n // TODO deprecate\n if (payloadDef.attributives) {\n const attributives = Attributives.is(payloadDef.attributives) ?\n new BoolExp<AttributiveInstance>(payloadDef.attributives.content as BoolExpressionRawData<AttributiveInstance>) :\n BoolExp.atom<AttributiveInstance>(payloadDef.attributives as AttributiveInstance)\n\n // 作为整体是否合法应该放到 condition 里面做\n if (payloadDef.isCollection) {\n const result = await everyWithErrorAsync(fullPayloadItem as unknown[], (item => {\n const handleAttribute = this.createHandleAttributive(\n Attributive,\n interactionEvent,\n item\n )\n\n return this.checkAttributives(attributives, handleAttribute)\n }))\n\n if (result !== true) {\n throw ConditionError.attributiveCheckFailed(payloadDef.name!, 'not every item match attribute', fullPayloadItem, result)\n }\n } else {\n const handleAttribute = this.createHandleAttributive(\n Attributive,\n interactionEvent,\n fullPayloadItem\n )\n const result = await this.checkAttributives(attributives, handleAttribute)\n if (result !== true ) {\n throw ConditionError.attributiveCheckFailed(payloadDef.name!, 'not match attributive', fullPayloadItem, result)\n }\n }\n }\n }\n }\n\n async checkCondition(interactionEvent: InteractionEventArgs) {\n if (this.interaction.conditions ) {\n const conditions = Conditions.is(this.interaction.conditions) ?\n new BoolExp<ConditionInstance>(this.interaction.conditions.content as BoolExpressionRawData<ConditionInstance>) :\n BoolExp.atom<ConditionInstance>(this.interaction.conditions as ConditionInstance)\n\n\n const handleAttribute = async (condition: ConditionInstance) => {\n if (!condition) return true\n\n if (condition.content) {\n const testFn = condition.content\n let result\n try {\n result = await testFn.call(this.controller, interactionEvent)\n } catch(e) {\n console.warn(`check function throw`, e)\n result = false\n }\n\n if ( result === undefined ) {\n console.warn(`condition ${condition.name} returned undefined, maybe not implemented, we will return true for now`)\n return true\n }\n return result\n } else {\n console.warn(`${condition.name} not implemented`)\n }\n return true\n }\n\n const result = await conditions.evaluateAsync(handleAttribute)\n if (result !== true ) {\n throw ConditionError.conditionCheckFailed(result)\n }\n }\n }\n // CAUTION sideEffect 是并行的。如果要串行,用户应该自己写在一个里面\n async runEffects(eventArgs: InteractionEventArgs, activityId: string|undefined, response: InteractionCallResponse) {\n const sideEffects = this.interaction.sideEffects || []\n\n const sideEffectsPromise = sideEffects.map(sideEffect => (async () => {\n let result\n let error\n try {\n result = await sideEffect.handle.call(this.controller, eventArgs, activityId)\n } catch (e) {\n error = e\n }\n return [sideEffect.name, {result, error}] as [string, SideEffectResult]\n })())\n\n const results = await Promise.all(sideEffectsPromise)\n for (let [name, {result, error}] of results) {\n assert(!response.sideEffects![name], `sideEffect ${name} already exists`)\n response.sideEffects![name] = {result, error}\n }\n }\n isGetInteraction() {\n return this.interaction.action === GetAction\n }\n async saveEvent(interactionEvent: InteractionEvent, effects: any[]) {\n // 为 payload 里面的新数据保存起来\n return await this.controller.activityManager.saveEvent(interactionEvent, effects)\n }\n async retrieveData(interactionEvent: InteractionEventArgs) {\n let data: any\n if (Entity.is(this.interaction.data) || Relation.is(this.interaction.data)) {\n const recordName = (this.interaction.data as EntityInstance).name!\n const {modifier: fixedModifier, attributeQuery: fixedAttributeQuery} = Object.fromEntries(\n this.interaction.query?.items?.map(item => [(item as any).name, (item as any).value as any]) || [])\n const modifier = {...(interactionEvent.query?.modifier||{}), ...(fixedModifier||{})}\n // TODO 怎么判断 attributeQuery 是在 fixed 的q范围里面????\n const attributeQuery = interactionEvent.query?.attributeQuery || []\n data = await this.system.storage.find(recordName, interactionEvent.query?.match, modifier, attributeQuery)\n // } else if (Computation.is(this.interaction.data)){\n // const { content: computation } = this.interaction.data as KlassInstance<typeof Computation>\n // data= await computation.call(this.controller, match, interactionEvent.query, interactionEvent )\n } else {\n assert(false,`unknown data type ${this.interaction.data}`)\n }\n\n return data\n }\n async check(interactionEventArgs: InteractionEventArgs, activityId?: string, checkUserRef?: CheckUserRef, context?: InteractionContext): Promise<InteractionCallResponse[\"error\"]> {\n let error\n try {\n if (!this.controller.ignorePermission) {\n await this.checkCondition(interactionEventArgs)\n }\n await this.checkUser(interactionEventArgs, activityId, checkUserRef)\n await this.checkPayload(interactionEventArgs)\n } catch(e) {\n error = e\n }\n return error\n }\n\n async call(interactionEventArgs: InteractionEventArgs, activityId?: string, checkUserRef?: CheckUserRef, context?: InteractionContext): Promise<InteractionCallResponse> {\n const response: InteractionCallResponse = {\n sideEffects: {},\n effects: []\n }\n\n response.error = await this.check(interactionEventArgs, activityId, checkUserRef, context)\n\n if (!response.error) {\n const event = {\n interactionName: this.interaction.name,\n interactionId: this.interaction.uuid,\n user: interactionEventArgs.user,\n query: interactionEventArgs.query || {},\n payload: interactionEventArgs.payload||{},\n args: interactionEventArgs,\n activity: {\n id: activityId,\n }\n }\n\n await this.saveEvent(event, response.effects!)\n response.event = event\n // effect\n await this.runEffects(interactionEventArgs, activityId, response)\n if (this.isGetInteraction()) {\n response.data = await this.retrieveData(interactionEventArgs)\n }\n }\n\n return response\n }\n}\n","import {\n ActivityGroup,\n ActivityGroupInstance as ActivityGroupInstanceType,\n ActivityInstance as ActivityInstanceType,\n Attributive,\n AttributiveInstance,\n Gateway,\n GatewayInstance as GatewayInstanceType,\n InteractionInstance as InteractionInstanceType,\n TransferInstance as TransferInstanceType\n} from \"@shared\";\nimport { assert } from \"../util.js\";\nimport { System } from \"../System.js\";\nimport { InteractionCall, InteractionCallResponse, EventUser, InteractionEventArgs } from \"./InteractionCall.js\";\nimport { MatchExp } from \"@storage\";\nimport { Controller } from \"../Controller.js\";\n\n\nexport type Seq = {\n head: InteractionNode|ActivityGroupNode,\n tail: InteractionNode|ActivityGroupNode\n}\n\nexport type InteractionLikeNodeBase = {\n uuid: string\n next: GraphNode|null,\n prev?: GraphNode,\n parentSeq: Seq\n}\n\nexport type InteractionNode = {\n content: InteractionInstanceType,\n parentGroup?: ActivityGroupNode\n} & InteractionLikeNodeBase\n\n\nexport type ActivityGroupNode = {\n content: ActivityGroupInstanceType,\n parentGroup?: ActivityGroupNode\n childSeqs?: Seq[],\n} & InteractionLikeNodeBase\n\n\n\nexport type GatewayNode = {\n uuid: string\n content: GatewayInstanceType,\n prev: GraphNode[],\n next: GraphNode[],\n}\n\nexport type GraphNode = InteractionNode|ActivityGroupNode|GatewayNode\n\n\nexport type ActivitySeqStateData = {\n current?: InteractionStateData\n}\n\nexport type InteractionStateData = {\n uuid: string,\n children?: ActivitySeqStateData[]\n}\n\n\n\nclass ActivitySeqState {\n public static createInitialState(headNode: InteractionLikeNodeBase) :ActivitySeqStateData {\n return {\n current: InteractionState.createInitialState(headNode)\n }\n }\n public current?: InteractionState\n public static create(data:ActivitySeqStateData, graph: ActivityCall, parent?: InteractionState) {\n const seqState = new ActivitySeqState(graph, parent)\n if (data.current) seqState.current = InteractionState.create(data.current, graph, seqState)\n return seqState\n }\n\n constructor(public graph: ActivityCall, public parent?: InteractionState) {}\n isInteractionAvailable(uuid: string) : boolean{\n if (!this.current) return false\n if (this.current?.children) {\n return Object.values(this.current.children).some(child => child.isInteractionAvailable(uuid))\n } else {\n return this.current.node!.uuid === uuid\n }\n }\n findStateNode(uuid:string) : InteractionState|undefined{\n // 全部执行完了\n if (!this.current) return undefined\n\n if (this.current?.node!.uuid === uuid) return this.current!\n // 如果有 children 匹配 children\n return (this.current!.children as ActivitySeqState[])?.find(child => child.findStateNode(uuid))?.current\n }\n transferToNext(uuid: string) {\n const node = this.graph.getNodeByUUID(uuid) as InteractionLikeNodeBase\n delete this.current\n // TODO 一路执行 gateway\n if (node.next) {\n const nextState = InteractionState.createInitialState(node.next as InteractionLikeNodeBase)\n this.current = InteractionState.create(nextState, this.graph, this)\n }\n\n this.parent?.onChange(uuid, node.next?.uuid)\n }\n toJSON() {\n return {\n current: this.current?.toJSON()\n }\n }\n}\n\n\n\nclass InteractionState {\n public static GroupStateNodeType = new Map<string, typeof InteractionState>()\n public isGroup?: boolean\n\n public children?: ActivitySeqState[]\n public static createInitialState(node: InteractionLikeNodeBase) {\n const state : InteractionStateData = {uuid: node.uuid}\n if (ActivityGroup.is((node as ActivityGroupNode).content)) {\n state.children = (node as ActivityGroupNode).childSeqs!.map(seqNode => ActivitySeqState.createInitialState(seqNode.head))\n }\n return state\n }\n public static create(data:InteractionStateData, graph: ActivityCall, parent?: ActivitySeqState) {\n const node = graph.getNodeByUUID(data.uuid)! as ActivityGroupNode\n const isGroup = ActivityGroup.is((node as ActivityGroupNode).content)\n\n if (isGroup) {\n const GroupStateNode = InteractionState.GroupStateNodeType.get(node!.content.type!)!\n const groupState = new GroupStateNode(node!, graph, parent)\n\n groupState.isGroup = true\n groupState.children = data?.children?.map((v) => {\n return ActivitySeqState.create(v, graph, groupState)\n })\n return groupState\n } else {\n return new InteractionState(node!, graph, parent)\n }\n }\n // CAUTION 这里 this.node 兼容了 state root 伪造成 ActivityStateNode\n constructor(public node:InteractionLikeNodeBase|null, public graph: ActivityCall, public parent?: ActivitySeqState) {}\n toJSON(): any {\n return {\n uuid: this.node!.uuid,\n children: this.children?.map((child) => child.toJSON())\n }\n }\n // 以下是为 group 而存在的\n onChange(childPrevUUID: string, childNextUUID?: string) {}\n isGroupCompleted() {\n // TODO\n // @ts-ignore\n return this.children?.every((childSeq) => !childSeq.current)\n }\n complete() {\n this.parent!.transferToNext(this.node!.uuid)\n }\n\n}\n\n\n// 用这个对象来做 state 计算, ActivitySeq 只是一个入口,提供基本的 图 的能力\nclass ActivityState{\n public root: ActivitySeqState\n public static createInitialState(headNode: InteractionLikeNodeBase) {\n return ActivitySeqState.createInitialState(headNode)\n }\n constructor(data: ActivitySeqStateData, public graph: ActivityCall) {\n this.root = ActivitySeqState.create(data, this.graph)\n }\n isInteractionAvailable(uuid:string) {\n return this.root.isInteractionAvailable(uuid)\n }\n completeInteraction(uuid: string) {\n // 这里默认肯定已经检查过 available 的问题了。\n\n // 1. interaction 完成,自身的 activity 要转移到下一个 interaction 去\n // 2. transfer 中会自动调用所在的 group,看它有没有什么要操作的。\n // 3. 如果 group 整个完成了,就要往上再递归。\n const stateNode = this.root.findStateNode(uuid)!\n stateNode.complete()\n return true\n }\n toJSON() {\n return this.root.toJSON()\n }\n}\n\n\n\nexport class ActivityCall {\n static cache = new Map<ActivityInstanceType, ActivityCall>()\n static from = (activity: ActivityInstanceType, controller: Controller) => {\n let graph = ActivityCall.cache.get(activity)\n if (!graph) {\n graph = new ActivityCall(activity, controller)\n ActivityCall.cache.set(activity, graph)\n }\n return graph\n }\n graph:Seq\n uuidToNode = new Map<string, GraphNode>()\n uuidToInteractionCall = new Map<string, InteractionCall>()\n interactionCallByName = new Map<string, InteractionCall>()\n rawToNode = new Map<InteractionInstanceType|ActivityGroupInstanceType|GatewayInstanceType, GraphNode>()\n system: System\n constructor(public activity: ActivityInstanceType, public controller: Controller) {\n this.system = controller.system\n this.graph = this.buildGraph(activity)\n }\n buildGraph(activity: ActivityInstanceType, parentGroup?: ActivityGroupNode) : Seq {\n const rawGatewayToNode = new Map<GatewayInstanceType, GatewayNode>()\n const seq = {}\n\n for(let interaction of activity.interactions!) {\n const node: InteractionNode = { content: interaction, next: null, uuid: interaction.uuid, parentGroup, parentSeq: seq as Seq, }\n this.uuidToNode.set(interaction.uuid, node)\n this.rawToNode.set(interaction, node)\n const interactionCall = new InteractionCall(interaction, this.controller, this)\n this.uuidToInteractionCall.set(interaction.uuid, interactionCall)\n if (interaction.name!) {\n this.interactionCallByName.set(interaction.name, interactionCall)\n }\n }\n\n for(let gateway of activity.gateways!) {\n const node: GatewayNode = { content: gateway, next: [], prev: [], uuid: gateway.uuid }\n this.uuidToNode.set(gateway.uuid, node)\n this.rawToNode.set(gateway, node)\n }\n\n for(let group of activity.groups!) {\n const node: ActivityGroupNode = {\n uuid: group.uuid,\n content: group,\n next: null,\n parentSeq: seq as Seq,\n parentGroup\n }\n // 每个 group 下都是多个 sub activityGraph\n node.childSeqs = group.activities?.map(sub => this.buildGraph(sub, node))\n this.uuidToNode.set(group.uuid, node)\n this.rawToNode.set(group, node)\n }\n\n // 开始计算图中的 start 和 end\n const candidateStart = new Set<InteractionInstanceType|ActivityGroupInstanceType>([...Object.values(activity.interactions!), ...Object.values(activity.groups!)])\n const candidateEnd = new Set<InteractionInstanceType|ActivityGroupInstanceType>([...Object.values(activity.interactions!), ...Object.values(activity.groups!)])\n\n activity.transfers?.forEach((transfer:TransferInstanceType) => {\n const sourceNode = (this.rawToNode.get(transfer.source as InteractionInstanceType) || rawGatewayToNode.get(transfer.source as InteractionInstanceType))!\n const targetNode = (this.rawToNode.get(transfer.target as InteractionInstanceType) || rawGatewayToNode.get(transfer.target as GatewayInstanceType))!\n\n assert(!!sourceNode, `cannot find source ${(transfer.source as InteractionInstanceType).name!}`)\n assert(!!targetNode, `cannot find target ${(transfer.source as InteractionInstanceType).name!}`)\n // CAUTION gateway 的 next 是个数组。其他的都是只有一个指向\n if (Gateway.is(sourceNode)) {\n (sourceNode as GatewayNode).next.push(targetNode)\n } else {\n sourceNode.next = targetNode\n }\n\n if (Gateway.is(targetNode)) {\n (targetNode as GatewayNode).prev.push(sourceNode)\n } else {\n targetNode.prev = sourceNode\n }\n\n candidateEnd.delete(transfer.source as InteractionInstanceType)\n candidateStart.delete(transfer.target as InteractionInstanceType)\n })\n\n // 自定结算 head 和 tail\n if (candidateStart.size !== 1 ) throw new Error(`start node must one, current: ${candidateStart.size}`)\n if (candidateEnd.size !== 1 ) throw new Error(`end node must be one, current: ${candidateEnd.size}`)\n\n Object.assign((seq as Seq), {\n head : this.rawToNode.get([...candidateStart.values()][0]!) as InteractionNode|ActivityGroupNode,\n tail : this.rawToNode.get([...candidateEnd.values()][0]!) as InteractionNode|ActivityGroupNode\n })\n\n return seq as Seq\n }\n async create() {\n const initialStateData = ActivityState.createInitialState(this.graph.head)\n\n const activity = await this.controller.activityManager.createActivity({\n name: this.activity.name,\n uuid: this.activity.uuid,\n state: initialStateData,\n refs: {},\n })\n return {\n activityId: activity.id,\n state: initialStateData\n }\n }\n getNodeByUUID(uuid: string) {\n return this.uuidToNode.get(uuid)\n }\n async getState(activityId: string) {\n // return this.system.storage.get('ActivityState', activityId)\n return (await this.getActivity(activityId))?.state\n }\n async getActivity(activityId: string) {\n const match = MatchExp.atom({\n key: 'id',\n value: ['=', activityId],\n })\n return (await this.controller.activityManager.getActivity(match))[0]\n }\n async setActivity(activityId: string, value: any) {\n const match = MatchExp.atom({\n key: 'id',\n value: ['=', activityId],\n })\n return await this.controller.activityManager.updateActivity(match, value)\n }\n async setState(activityId: string, state: any) {\n const match = MatchExp.atom({\n key: 'id',\n value: ['=', activityId],\n })\n return await this.controller.activityManager.updateActivity(match, {state: state})\n }\n isStartNode(uuid: string) {\n const node = this.uuidToNode.get(uuid) as InteractionLikeNodeBase\n return node.parentSeq.head === node\n }\n isEndNode(uuid: string) {\n const node = this.uuidToNode.get(uuid) as InteractionLikeNodeBase\n return node.parentSeq.tail === node\n }\n\n isActivityHead(interaction: InteractionInstanceType, head: InteractionLikeNodeBase = this.graph.head): boolean {\n if (ActivityGroup.is(this.graph.head.content)) {\n // group 是个控制单元,控制的是结束不是开始,所以任何一个头都可以算头。\n return !!(this.graph.head as ActivityGroupNode).childSeqs?.some(seq => this.isActivityHead(interaction, seq.head))\n } else {\n return interaction === this.graph.head.content\n }\n }\n\n async callInteraction(inputActivityId: string|undefined, uuid: string, interactionEventArgs: InteractionEventArgs) : Promise<InteractionCallResponse>{\n const interactionCall = this.uuidToInteractionCall.get(uuid)!\n\n let activityId = inputActivityId\n\n // 如果 不是头,就要立刻去找 state 并且校验。\n if (this.isActivityHead(interactionCall.interaction) ) {\n if ( !activityId){\n // 如果 是头,那么要等 interactionCall 的 check 过了才创建 state\n const error = await interactionCall.check(interactionEventArgs, inputActivityId, this.checkUserRef)\n if (error) return { error }\n\n activityId = (await this.create()).activityId\n }\n } else {\n if(!inputActivityId) return { error: 'activityId must be provided for non-head interaction of an activity'}\n }\n\n const state = new ActivityState(await this.getState(activityId!), this)\n if(!state.isInteractionAvailable(uuid)) return { error: `interaction ${uuid} not available`}\n\n const result = await interactionCall.call(interactionEventArgs, activityId!, this.checkUserRef)\n if (result.error) {\n return result\n }\n\n // 如果有 ref,要保存下来,方便后面 interactionCall 的时候通过 checkUserRef 去取\n await this.saveUserRefs(activityId!, interactionCall, interactionEventArgs)\n\n const stateCompleteResult = state.completeInteraction(uuid)\n assert(stateCompleteResult, 'change activity state failed')\n // 完成了。存新的 state。\n const nextState = state.toJSON()\n // await this.system.storage.set('ActivityState', activityId, nextState)\n await this.setActivity( activityId!, {'state':nextState})\n\n\n return {\n ...result,\n context: {\n activityId,\n nextState\n }\n }\n }\n // TODO 我们没有处理 interaction 循环的情况\n async saveUserRefs(activityId: string, interactionCall: InteractionCall, interactionEventArgs: InteractionEventArgs) {\n // const refs = await this.system.storage.get('ActivityRefs', activityId, {})!\n const refs = (await this.getActivity(activityId))?.refs! || {}\n if (interactionCall.interaction.userRef?.name) {\n refs[interactionCall.interaction.userRef?.name] = interactionEventArgs.user.id\n }\n\n interactionCall.interaction.payload?.items!.forEach((payloadDef) => {\n if (Attributive.is(payloadDef.itemRef) && payloadDef.itemRef?.name && interactionEventArgs.payload![payloadDef.name!]) {\n const payloadItem = interactionEventArgs.payload![payloadDef.name!]\n if (payloadDef.isCollection) {\n if(!refs[payloadDef.itemRef!.name!]) refs[payloadDef.itemRef!.name!] = []\n\n refs[payloadDef.itemRef!.name!].push((payloadItem as {id: string}).id)\n } else {\n refs[payloadDef.itemRef!.name!] = (payloadItem as {id: string}).id\n }\n }\n })\n\n // await this.system.storage.set('ActivityRefs', activityId, refs)\n await this.setActivity( activityId, {refs})\n }\n\n checkUserRef = async (attributive: AttributiveInstance, eventUser: EventUser, activityId: string): Promise<boolean> => {\n assert(attributive.isRef, 'attributive must be ref')\n const refs = (await this.getActivity(activityId))?.refs\n return refs[attributive.name!] === eventUser.id\n }\n}\n\n\nclass AnyActivityStateNode extends InteractionState{\n onChange(childPrevUUID: string, childNextUUID? : string) {\n if (this.graph.isStartNode(childPrevUUID)) {\n if (childNextUUID) {\n return {\n children: this.children!.filter(childSeq => childSeq.current?.node!.uuid === childNextUUID)\n }\n } else {\n // 说明就只有一个,并且走到头了\n this.complete()\n }\n }\n }\n}\n\nInteractionState.GroupStateNodeType.set('any', AnyActivityStateNode)\n\n\n\nclass EveryActivityStateNode extends InteractionState{\n onChange(childPrevUUID: string, childNextUUID? : string) {\n // 每个 children 都 end 了。自己变成 end\n if (this.isGroupCompleted()) {\n this.complete()\n }\n }\n}\nInteractionState.GroupStateNodeType.set('every', EveryActivityStateNode)\n\n\n\n\nclass RaceActivityStateNode extends InteractionState{\n onChange(childPrevUUID: string, childNextUUID? : string) {\n // 有一个 end 了,自己变成 end\n if (this.graph.isEndNode(childPrevUUID)) {\n this.complete()\n }\n }\n}\nInteractionState.GroupStateNodeType.set('race', RaceActivityStateNode)\n\n\nclass ProgrammaticActivityStateNode extends InteractionState{\n // 可以根据 group 上的具体配置逻辑,来动态决定。\n}\nInteractionState.GroupStateNodeType.set('program', ProgrammaticActivityStateNode)\n","import { AsyncLocalStorage } from 'async_hooks';\n\nexport const asyncInteractionContext = new AsyncLocalStorage();\n","import { ActivityInstance, InteractionInstance, IInstance } from \"@shared\";\nimport { RecordMutationEvent, SystemLogger } from \"../System.js\";\nimport {\n Entity, Property,\n Relation\n} from \"@shared\";\nimport { ActivityCall } from \"./ActivityCall.js\";\nimport { InteractionCall, InteractionCallResponse, InteractionEvent } from \"./InteractionCall.js\";\nimport { InteractionEventArgs } from \"./InteractionCall.js\";\nimport { assert } from \"../util.js\";\nimport { asyncInteractionContext } from \"../asyncInteractionContext.js\";\nimport { Controller, InteractionContext, RecordMutationSideEffect } from \"../Controller.js\";\nimport { MatchExpressionData } from \"../../storage/index.js\";\nimport {\n ActivityError,\n ActivityStateError,\n InteractionExecutionError,\n ErrorUtils\n} from \"../errors/index.js\";\n\n\nexport const INTERACTION_RECORD = '_Interaction_'\nexport const ACTIVITY_RECORD = '_Activity_'\n\n// event 的实体化\nexport const InteractionEventEntity = Entity.create({\n name: INTERACTION_RECORD,\n properties: [\n Property.create({\n name: 'interactionId',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'interactionName',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'payload',\n type: 'object',\n collection: false,\n }),\n Property.create({\n name: 'user',\n type: 'object',\n collection: false,\n }),\n Property.create({\n name: 'query',\n type: 'object',\n collection: false,\n }),\n ]\n})\n\n\nexport const ActivityStateEntity = Entity.create({\n name: ACTIVITY_RECORD,\n properties: [\n Property.create({\n name: 'name',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'uuid',\n type: 'string',\n collection: false,\n }),\n Property.create({\n name: 'state',\n type: 'object',\n collection: false,\n }),\n Property.create({\n name: 'refs',\n type: 'object',\n collection: false,\n })\n ]\n})\n\nexport const ActivityInteractionRelation = Relation.create({\n name: 'activityInteraction',\n source: ActivityStateEntity,\n sourceProperty: 'interaction',\n target: InteractionEventEntity,\n targetProperty: 'activity',\n type: '1:n',\n})\n\n\nexport class ActivityManager {\n public activityCalls = new Map<string, ActivityCall>()\n public activityCallsByName = new Map<string, ActivityCall>()\n public interactionCallsByName = new Map<string, InteractionCall>()\n public interactionCalls = new Map<string, InteractionCall>()\n\n constructor(\n private controller: Controller,\n activities: ActivityInstance[],\n interactions: InteractionInstance[]\n ) {\n\n this.controller.entities.push(ActivityStateEntity, InteractionEventEntity)\n this.controller.relations.push(ActivityInteractionRelation)\n\n // Initialize activity calls\n activities.forEach(activity => {\n const activityCall = new ActivityCall(activity, controller)\n this.activityCalls.set(activity.uuid, activityCall)\n if (activity.name) {\n assert(!this.activityCallsByName.has(activity.name), `activity name ${activity.name} is duplicated`)\n this.activityCallsByName.set(activity.name, activityCall)\n }\n })\n\n // Initialize interaction calls\n interactions.forEach(interaction => {\n const interactionCall = new InteractionCall(interaction, controller)\n this.interactionCalls.set(interaction.uuid, interactionCall)\n if (interaction.name) {\n assert(!this.interactionCallsByName.has(interaction.name), `interaction name ${interaction.name} is duplicated`)\n this.interactionCallsByName.set(interaction.name, interactionCall)\n }\n })\n }\n\n async callInteraction(interactionName: string, interactionEventArgs: InteractionEventArgs): Promise<InteractionCallResponse> {\n const context = asyncInteractionContext.getStore() as InteractionContext\n const logger = this.controller.system.logger.child(context?.logContext || {})\n\n try {\n const interactionCall = this.interactionCallsByName.get(interactionName)\n if (!interactionCall) {\n const error = new InteractionExecutionError(`Cannot find interaction for ${interactionName}`, {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'interaction-lookup'\n })\n throw error\n }\n\n logger.info({label: \"interaction\", message: interactionCall.interaction.name})\n await this.controller.system.storage.beginTransaction(interactionCall.interaction.name)\n let unknownError: any\n let result: InteractionCallResponse\n try {\n result = await interactionCall.call(interactionEventArgs)\n } catch(e) {\n unknownError = e\n // Create structured error with context\n const contextualError = new InteractionExecutionError('Interaction execution failed', {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'interaction-execution',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n \n result = {\n error: contextualError,\n effects: [],\n sideEffects: {},\n data: undefined,\n event: undefined,\n }\n } finally {\n if (unknownError||result!.error) {\n if (unknownError) {\n console.error(unknownError)\n logger.error({label: \"systemError\", message: 'unknownError', error: unknownError})\n }\n logger.error({label: \"interaction\", message: interactionCall.interaction.name, error: result!.error})\n await this.controller.system.storage.rollbackTransaction(interactionCall.interaction.name)\n } else {\n await this.controller.system.storage.commitTransaction(interactionCall.interaction.name)\n await this.runRecordChangeSideEffects(result!, logger)\n }\n }\n\n return result\n } catch (e) {\n // Top-level error handling for unexpected errors\n const error = new InteractionExecutionError('Unexpected error during interaction call', {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'top-level',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n\n async callActivityInteraction(activityName: string, interactionName: string, activityId: string | undefined, interactionEventArgs: InteractionEventArgs): Promise<InteractionCallResponse> {\n const context = asyncInteractionContext.getStore() as InteractionContext\n const logger = this.controller.system.logger.child(context?.logContext || {})\n\n try {\n const activityCall = this.activityCallsByName.get(activityName)\n if (!activityCall) {\n const error = new ActivityError(`Cannot find activity for ${activityName}`, {\n activityName,\n context: {\n interactionName,\n activityId,\n userId: interactionEventArgs.user?.id\n }\n })\n throw error\n }\n\n logger.info({label: \"activity\", message: activityCall.activity.name})\n await this.controller.system.storage.beginTransaction(activityCall.activity.name)\n \n // 获取 interaction UUID 通过名称\n const interactionCall = activityCall.interactionCallByName.get(interactionName)\n if (!interactionCall) {\n const error = new InteractionExecutionError(`Cannot find interaction ${interactionName} in activity ${activityName}`, {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'activity-interaction-lookup',\n context: { activityName, activityId }\n })\n await this.controller.system.storage.rollbackTransaction(activityCall.activity.name)\n throw error\n }\n \n const result = await activityCall.callInteraction(activityId, interactionCall.interaction.uuid, interactionEventArgs)\n if (result.error) {\n logger.error({label: \"activity\", message: activityCall.activity.name})\n await this.controller.system.storage.rollbackTransaction(activityCall.activity.name)\n } else {\n await this.controller.system.storage.commitTransaction(activityCall.activity.name)\n await this.runRecordChangeSideEffects(result, logger)\n }\n\n return result\n } catch (e) {\n const error = new ActivityError('Unexpected error during activity interaction call', {\n activityName,\n context: {\n interactionName,\n activityId,\n userId: interactionEventArgs.user?.id\n },\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n\n private async runRecordChangeSideEffects(result: InteractionCallResponse, logger: SystemLogger) {\n const mutationEvents = result.effects as RecordMutationEvent[]\n for(let event of mutationEvents || []) {\n const sideEffects = this.controller.recordNameToSideEffects.get(event.recordName)\n if (sideEffects) {\n if (!result.sideEffects) {\n result.sideEffects = {}\n }\n for(let sideEffect of sideEffects) {\n try {\n if (sideEffect instanceof RecordMutationSideEffect) {\n result.sideEffects[sideEffect.name] = {\n result: await sideEffect.content(event),\n }\n } else {\n // Handle IInstance case - check if it has the required properties\n const instanceSideEffect = sideEffect as IInstance & { name?: string; content?: (event: RecordMutationEvent) => Promise<unknown> };\n if (instanceSideEffect.name && typeof instanceSideEffect.content === 'function') {\n result.sideEffects[instanceSideEffect.name] = {\n result: await instanceSideEffect.content(event),\n }\n }\n }\n } catch (e){\n let effectName = 'unknown';\n if (sideEffect instanceof RecordMutationSideEffect) {\n effectName = sideEffect.name;\n } else {\n const instanceSideEffect = sideEffect as IInstance & { name?: string };\n effectName = instanceSideEffect.name || 'unknown';\n }\n logger.error({label: \"recordMutationSideEffect\", message: effectName})\n result.sideEffects[effectName] = {\n error: e\n }\n }\n }\n }\n }\n }\n async createActivity(activity: {\n name: string;\n uuid: string;\n state: unknown;\n refs: unknown;\n [key: string]: unknown;\n }) {\n return this.controller.system.storage.create(ACTIVITY_RECORD, {\n ...activity,\n state: activity.state,\n refs: activity.refs,\n })\n }\n async updateActivity(match: MatchExpressionData, activity: {\n name?: string;\n uuid?: string;\n state?: unknown;\n refs?: unknown;\n [key: string]: unknown;\n }) {\n const data = {\n ...activity\n }\n delete data.state\n delete data.refs\n if (activity.state) {\n data.state = activity.state\n }\n if (activity.refs) {\n data.refs = activity.refs\n }\n return this.controller.system.storage.update(ACTIVITY_RECORD, match, data)\n }\n async getActivity(query?: MatchExpressionData) {\n return (await this.controller.system.storage.find(ACTIVITY_RECORD, query, undefined, ['*'])).map(activity => ({\n ...activity,\n state: activity.state,\n refs: activity.refs,\n }))\n }\n async saveEvent(event: InteractionEvent, mutationEvents: RecordMutationEvent[] = []): Promise<unknown> {\n return this.controller.system.storage.create(INTERACTION_RECORD, event, mutationEvents)\n }\n async getEvent(query?: MatchExpressionData ) {\n return (await this.controller.system.storage.find(INTERACTION_RECORD, query, undefined, ['*'])).map(event => ({\n ...event,\n })) as unknown as InteractionEvent[]\n }\n getActivityCall(activityId: string): ActivityCall | undefined {\n return this.activityCalls.get(activityId)\n }\n\n getActivityCallByName(activityName: string): ActivityCall | undefined {\n return this.activityCallsByName.get(activityName)\n }\n\n getInteractionCall(interactionId: string): InteractionCall | undefined {\n return this.interactionCalls.get(interactionId)\n }\n\n getInteractionCallByName(interactionName: string): InteractionCall | undefined {\n return this.interactionCallsByName.get(interactionName)\n }\n} ","import {\n EntityInstance, RelationInstance, PropertyInstance,\n ActivityInstance, InteractionInstance,\n DictionaryInstance\n} from \"@shared\";\nimport { Controller } from \"../Controller\";\nimport { AttributeQueryData, MatchExp, MatchExpressionData, ModifierData } from \"@storage\";\nimport { DICTIONARY_RECORD } from \"../System\";\n\n// Types from ComputationHandle.ts\nexport type GlobalDataContext = {\n type: 'global',\n id: string\n}\n\nexport type EntityDataContext = {\n type: 'entity',\n id: EntityInstance\n}\n\nexport type RelationDataContext = {\n type: 'relation',\n id: RelationInstance\n}\n\nexport type PropertyDataContext = {\n type: 'property',\n host: EntityInstance | RelationInstance,\n id: PropertyInstance\n}\n\nexport type DataContext = GlobalDataContext|EntityDataContext|RelationDataContext|PropertyDataContext\n\nexport type ComputedEffect = any\n\nexport type ComputeEffectResult= ComputedEffect|ComputedEffect[]|undefined\n\ntype HandlesForType = {\n global?: { new(...args: any[]): Computation },\n entity?: { new(...args: any[]): Computation },\n relation?: { new(...args: any[]): Computation },\n property?: { new(...args: any[]): Computation },\n}\n\n\nexport type ComputationResultPatch = {\n type: 'insert' | 'update' | 'delete'\n data?: any\n affectedId?: any\n}\n\n\n\nexport class ComputationResult{\n static skip = () => new ComputationResultSkip()\n static resolved = (result: any, args?:any) => new ComputationResultResolved(result, args)\n static async = (args?:any) => new ComputationResultAsync(args)\n static fullRecompute = (reason?:any) => new ComputationResultFullRecompute(reason)\n}\n\nexport class ComputationResultSkip extends ComputationResult{\n\n}\n\nexport class ComputationResultFullRecompute extends ComputationResult{\n constructor(public reason?:any) {\n super()\n }\n}\n\nexport class ComputationResultAsync extends ComputationResult{\n constructor(public args?:any) {\n super()\n }\n}\n\nexport class ComputationResultResolved extends ComputationResult{\n constructor(public result: any, public args?:any) {\n super()\n }\n}\n\n\nexport class RecordBoundState<T> {\n key!: string\n controller!: Controller\n constructor(public defaultValue:any, public record?:string) { \n\n }\n async set(record:any, value: any): Promise<T> {\n await this.controller.system.storage.update(this.record!, MatchExp.atom({key: 'id', value: ['=', record.id]}), {[this.key]: value})\n return value\n }\n async get(record:any):Promise<T> {\n // TODO 如果 record 上不存在就重新查询\n if (record[this.key] === undefined) {\n const fullRecord = await this.controller.system.storage.findOne(this.record!, MatchExp.atom({key: 'id', value: ['=', record.id]}), undefined, [this.key])\n const value = fullRecord?.[this.key]\n return value !== undefined ? value as T : this.defaultValue as T\n }\n return record[this.key] as T\n }\n}\n\n\nexport class GlobalBoundState<T> {\n key!:string\n controller!: Controller\n constructor(public defaultValue?: any) {\n\n }\n async set(value: any):Promise<T> {\n await this.controller.system.storage.set(DICTIONARY_RECORD, this.key, value)\n return value\n }\n async get():Promise<T> {\n return await this.controller.system.storage.get(DICTIONARY_RECORD, this.key)\n }\n}\n\n\n\nexport type RecordsDataDep = {\n type: 'records',\n source: EntityInstance|RelationInstance|ActivityInstance|InteractionInstance,\n match?: MatchExpressionData,\n modifier?: ModifierData,\n attributeQuery?: AttributeQueryData\n}\n\nexport type GlobalDataDep = {\n type: 'global',\n source: DictionaryInstance\n}\n\n// 同一 record 的 property 依赖\nexport type PropertyDataDep = {\n type: 'property',\n attributeQuery?: AttributeQueryData\n}\n\n\n// 现在没用\nexport type DictionaryDataDep = {\n type: 'dict',\n source: DictionaryInstance\n keys: string[]\n}\n\nexport type DataDep = RecordsDataDep|PropertyDataDep|GlobalDataDep|DictionaryDataDep\n\n\n\nexport interface DataBasedComputation {\n dataContext: DataContext\n args: any\n state: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n // 全量计算\n compute: (...args: any[]) => Promise<ComputationResult|any>\n // 增量计算\n incrementalCompute?: (...args: any[]) => Promise<ComputationResult|any>\n // 增量计算,返回的是基于上一次结果的寄过增量\n incrementalPatchCompute?: (...args: any[]) => Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined>\n createState?: (...args: any[]) => {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n dataDeps: {[key: string]: any}\n getDefaultValue?: (...args: any[]) => any\n useLastValue?: boolean\n // 异步计算,就会声明这个函数\n asyncReturn?: (...args: any[]) => Promise<ComputationResultSkip|any>\n}\n\n\nexport type InteractionEventDep = {\n type: 'interaction',\n interaction: InteractionInstance\n}\n\nexport type DataEventDep = {\n type: 'data',\n eventType?: 'create'|'delete'|'update',\n dataDep: DataDep\n}\n\nexport type EventDep = InteractionEventDep|DataEventDep\n\nexport interface EventBasedComputation {\n dataContext: DataContext\n args: any\n state: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n incrementalCompute?: (...args: any[]) => Promise<ComputationResult|any>\n incrementalPatchCompute?: (...args: any[]) => Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined>\n createState?: (...args: any[]) => {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n eventDeps?: {[key: string]: EventDep}\n useLastValue?: boolean\n getDefaultValue?: (...args: any[]) => any\n computeDirtyRecords?: (...args: any[]) => Promise<any[]|undefined>\n asyncReturn?: (...args: any[]) => Promise<ComputationResultSkip|any>\n}\n\nexport type Computation = DataBasedComputation|EventBasedComputation\n\nexport type ComputationClass = new(...args: any[]) => Computation\n","import { StateMachineInstance } from \"@shared\";\n\nfunction shallowEqual(a: {[key:string]:any}, b: {[key:string]:any}) {\n if (a===b) return true\n \n for (const key in b) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n return true\n}\n\n\nexport class TransitionFinder {\n map: {[stateName: string]: any} = {}\n constructor(public data: StateMachineInstance) {\n for(const transfer of data.transfers) {\n if(!this.map[transfer.current.name]) {\n this.map[transfer.current.name] = []\n }\n this.map[transfer.current.name].push({\n trigger: transfer.trigger,\n next: transfer.next\n })\n }\n }\n\n findNextState(currentState: string, trigger: any) {\n const transitions = this.map[currentState]\n if (transitions) {\n for (const transition of transitions) {\n if (shallowEqual(transition.trigger, trigger)) {\n return transition.next\n }\n }\n }\n return null\n }\n\n findTransfers(trigger:any) {\n return this.data.transfers.filter(transfer => shallowEqual(transfer.trigger, trigger))\n }\n}","import { Relation, StateMachine, StateMachineInstance, StateNodeInstance } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { EntityIdRef, RecordMutationEvent } from '../System.js';\nimport { INTERACTION_RECORD } from \"../activity/ActivityManager.js\";\nimport { DataContext, EntityDataContext, PropertyDataContext } from \"./Computation.js\";\nimport { ComputationResult, ComputationResultPatch, EventBasedComputation, EventDep, GlobalBoundState, RecordBoundState } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { TransitionFinder } from \"./TransitionFinder.js\";\nimport { assert } from \"../util.js\";\n\ntype SourceTargetPair = [EntityIdRef, EntityIdRef][]\ntype ComputeRelationTargetResult = SourceTargetPair | {source: EntityIdRef[] | EntityIdRef, target: EntityIdRef[]|EntityIdRef} | undefined\ntype EntityTargetResult = EntityIdRef|EntityIdRef[]|undefined\ntype ComputeSourceResult = ComputeRelationTargetResult| EntityTargetResult\n\nexport class GlobalStateMachineHandle implements EventBasedComputation {\n static computationType = StateMachine\n static contextType = 'global' as const\n transitionFinder: TransitionFinder\n state!: {[key: string]: GlobalBoundState<any>}\n useLastValue: boolean = true\n eventDeps: {[key: string]: EventDep} = {}\n defaultState: StateNodeInstance\n constructor(public controller: Controller, public args: StateMachineInstance, public dataContext: DataContext) {\n this.transitionFinder = new TransitionFinder(this.args)\n this.defaultState = this.args.defaultState\n }\n createState() {\n return {\n currentState: new GlobalBoundState<string>(this.defaultState.name),\n }\n }\n // 这里的 defaultValue 不能是 async 的模式。因为是直接创建时填入的。\n getDefaultValue(event:any) {\n return this.defaultState.computeValue ? this.defaultState.computeValue.call(this.controller, undefined, event) : this.defaultState.name\n }\n mutationEventToTrigger(mutationEvent: RecordMutationEvent) {\n if (mutationEvent.recordName === INTERACTION_RECORD) {\n const interactionName = mutationEvent.record!.interactionName!\n const interaction = this.controller.interactions.find(i => i.name === interactionName)\n return interaction\n } else {\n return {\n type: 'data',\n eventType: mutationEvent.type,\n }\n }\n }\n async incrementalCompute(lastValue: string, mutationEvent: EtityMutationEvent, dirtyRecord: any) {\n assert(mutationEvent.recordName === INTERACTION_RECORD, 'Record StateMachine only supports interaction record')\n\n const currentStateName = await this.state.currentState.get()\n const trigger = this.mutationEventToTrigger(mutationEvent)\n const nextState = this.transitionFinder?.findNextState(currentStateName, trigger)\n if (!nextState) return ComputationResult.skip()\n\n await this.state.currentState.set(nextState.name)\n\n const interactionEvent = mutationEvent.record!\n return nextState.computeValue? (await nextState.computeValue.call(this.controller, lastValue, interactionEvent)) : nextState.name\n }\n}\n\n\n\n\nexport class PropertyStateMachineHandle implements EventBasedComputation {\n static computationType = StateMachine\n static contextType = 'property' as const\n transitionFinder: TransitionFinder\n state!: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n useLastValue: boolean = true\n eventDeps: {[key: string]: EventDep} = {}\n defaultState: StateNodeInstance\n dataContext: PropertyDataContext\n constructor(public controller: Controller, public args: StateMachineInstance, dataContext: DataContext) {\n this.transitionFinder = new TransitionFinder(this.args)\n this.defaultState = this.args.defaultState\n this.dataContext = dataContext as PropertyDataContext\n }\n createState() {\n return {\n currentState: new RecordBoundState<string>(this.defaultState.name),\n }\n }\n // 这里的 defaultValue 不能是 async 的模式。因为是直接创建时填入的。\n getDefaultValue(initialRecord:any) {\n const lastValue = initialRecord[this.dataContext.id.name]\n assert(\n !(lastValue !== undefined && !this.defaultState.computeValue), \n `${this.dataContext.host.name}.${this.dataContext.id.name} have been set when ${this.dataContext.host.name} created, \nif you want to save the use the initial value, you need to define computeValue in defaultState to save it.\nOr if you want to use state name as value, you should not set ${this.dataContext.host.name}.${this.dataContext.id.name} when ${this.dataContext.host.name} created.\n`\n )\n if (lastValue !== undefined || this.defaultState.computeValue) {\n return this.defaultState.computeValue!.call(this.controller, lastValue, undefined)\n } else {\n return this.defaultState.name\n }\n }\n mutationEventToTrigger(mutationEvent: RecordMutationEvent) {\n // FIXME 支持 data mutation\n if (mutationEvent.recordName === INTERACTION_RECORD) {\n const interactionName = mutationEvent.record!.interactionName!\n const interaction = this.controller.interactions.find(i => i.name === interactionName)\n return interaction\n }\n }\n async computeDirtyRecords(mutationEvent: RecordMutationEvent) {\n // 这里 trigger 要么是 DataEventDep,要么是 Interaqtion。\n // TODO 未来还会有 Action 之类的???\n const trigger = this.mutationEventToTrigger(mutationEvent)\n if (trigger) {\n const transfers = this.transitionFinder.findTransfers(trigger)\n // CAUTION 不能返回有 null 的节点,所以加上 filter。\n return (await Promise.all(transfers.map(transfer => {\n const event = mutationEvent.recordName === INTERACTION_RECORD ? mutationEvent.record : mutationEvent\n return transfer.computeTarget!.call(this.controller, event)\n }))).flat().filter(Boolean)\n }\n }\n \n async incrementalCompute(lastValue: string, mutationEvent: RecordMutationEvent, dirtyRecord: any) {\n assert(mutationEvent.recordName === INTERACTION_RECORD, 'Record StateMachine only supports interaction record')\n\n const currentStateName = await this.state.currentState.get(dirtyRecord)\n const trigger = this.mutationEventToTrigger(mutationEvent)\n const nextState = this.transitionFinder?.findNextState(currentStateName, trigger)\n if (!nextState) return ComputationResult.skip()\n\n await this.state.currentState.set(dirtyRecord, nextState.name)\n\n const interactionEvent = mutationEvent.record!\n return nextState.computeValue? (await nextState.computeValue.call(this.controller, lastValue, interactionEvent)) : nextState.name\n }\n}\n\n\n\nexport class RecordStateMachineHandle implements EventBasedComputation {\n static computationType = StateMachine\n static contextType = ['entity', 'relation'] as const\n transitionFinder: TransitionFinder\n state!: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}\n useLastValue: boolean = false\n eventDeps: {[key: string]: EventDep} = {}\n defaultState: StateNodeInstance\n dataContext: EntityDataContext\n isRelation: boolean\n constructor(public controller: Controller, public args: StateMachineInstance, dataContext: DataContext) {\n this.transitionFinder = new TransitionFinder(this.args)\n this.defaultState = this.args.defaultState\n this.dataContext = dataContext as EntityDataContext\n this.isRelation = this.dataContext.id instanceof Relation\n }\n createState() {\n return {\n currentState: new RecordBoundState<string>(this.defaultState.name),\n }\n }\n // 这里的 defaultValue 不能是 async 的模式。因为是直接创建时填入的。\n getDefaultValue(event:any) {\n return this.defaultState.computeValue ? this.defaultState.computeValue.call(this.controller, undefined, event) : this.defaultState.name\n }\n mutationEventToTrigger(mutationEvent: RecordMutationEvent) {\n // FIXME 支持 data mutation\n if (mutationEvent.recordName === INTERACTION_RECORD) {\n const interactionName = mutationEvent.record!.interactionName!\n const interaction = this.controller.interactions.find(i => i.name === interactionName)\n return interaction\n }\n }\n async computeDirtyRecords(mutationEvent: RecordMutationEvent) {\n // 这里 trigger 要么是 DataEventDep,要么是 Interaqtion。\n // TODO 未来还会有 Action 之类的???\n const trigger = this.mutationEventToTrigger(mutationEvent)\n if (trigger) {\n const transfers = this.transitionFinder.findTransfers(trigger)\n \n return (await Promise.all(transfers.map(transfer => {\n const event = mutationEvent.recordName === INTERACTION_RECORD ? mutationEvent.record : mutationEvent\n return transfer.computeTarget!.call(this.controller, event)\n }))).flat().filter(Boolean)\n }\n }\n \n async incrementalPatchCompute(lastValue: string, mutationEvent: RecordMutationEvent, dirtyRecord: any): Promise<ComputationResult|ComputationResultPatch|undefined> {\n assert(mutationEvent.recordName === INTERACTION_RECORD, 'Record StateMachine only supports interaction record')\n\n const currentStateName = dirtyRecord.id ? (await this.state.currentState.get(dirtyRecord)) : this.defaultState.name\n const trigger = this.mutationEventToTrigger(mutationEvent)\n const nextState = this.transitionFinder?.findNextState(currentStateName, trigger)\n if (!nextState) return ComputationResult.skip()\n\n const interactionEvent = mutationEvent.record!\n const nextValue = nextState.computeValue? (await nextState.computeValue.call(this.controller, lastValue, interactionEvent)) : nextState.name\n if (dirtyRecord.id) {\n if (nextValue === null) {\n return {\n type:'delete',\n affectedId: [dirtyRecord.id],\n }\n }else {\n // await this.state.currentState.set(dirtyRecord, nextState.name)\n return {\n type:'update',\n affectedId: [dirtyRecord.id],\n data: {\n ...nextState,\n [this.state.currentState.key]: nextState.name\n }\n }\n }\n } else {\n // 这个时候 dirtyRecord 是 computeTarget 继续算出来的要创建的新关系\n if (nextValue) {\n\n assert(!(this.isRelation && (dirtyRecord.source?.id===undefined || dirtyRecord.target?.id===undefined)), \n `\n${this.dataContext.id.name} StateMachine transfer from ${currentStateName} to ${nextState.name} will create new relation, \nit requires both source and target id, but your computeTarget function returned ${JSON.stringify(dirtyRecord)}`\n )\n \n return {\n type: 'insert',\n data: {\n ...dirtyRecord,\n ...nextValue,\n [this.state.currentState.key]: nextState.name\n }\n }\n }\n }\n }\n}\n\n\n \n// Export StateMachine computation handles\nexport const StateMachineHandles = [GlobalStateMachineHandle, PropertyStateMachineHandle, RecordStateMachineHandle];\n","import { DataContext, PropertyDataContext } from \"./Computation.js\";\nimport { WeightedSummation } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { WeightedSummationInstance, EntityInstance, RelationInstance } from \"@shared\";\nimport { ComputationResult, DataDep, RecordsDataDep, RecordBoundState } from \"./Computation.js\";\nimport { DataBasedComputation } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { AttributeQueryData, MatchExp, LINK_SYMBOL, RecordQueryData } from \"@storage\";\nimport { assert } from \"../util.js\";\n\nexport class GlobalWeightedSummationHandle implements DataBasedComputation {\n static computationType = WeightedSummation\n static contextType = 'global' as const\n matchRecordToWeight: (this: Controller, item: any) => { weight: number; value: number }\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n record: (EntityInstance|RelationInstance)\n\n constructor(public controller: Controller, public args: WeightedSummationInstance, public dataContext: DataContext) {\n this.matchRecordToWeight = this.args.callback.bind(this.controller)\n this.record = this.args.record!\n \n \n this.dataDeps = {\n main: {\n type: 'records',\n source: this.record,\n attributeQuery: this.args.attributeQuery\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n \n getDefaultValue() {\n return 0\n }\n createState() {\n return {\n itemResult: new RecordBoundState<number>(0, this.record.name!)\n }\n }\n\n async compute({main: records}: {main: any[]}): Promise<number> {\n let summation = 0;\n \n for (const record of records) {\n const weightAndValue = this.matchRecordToWeight.call(this.controller, record);\n summation += await this.state.itemResult.set(record, weightAndValue.weight * weightAndValue.value);\n }\n\n return summation;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent): Promise<number|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新,因为可能有自己和自己的关联关系的 dataDep。\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n let summation = lastValue\n if (mutationEvent.type === 'create') {\n const newItem = mutationEvent.record;\n const weightAndValue = this.matchRecordToWeight.call(this.controller, newItem);\n summation = lastValue + await this.state.itemResult.set(newItem, weightAndValue.weight * weightAndValue.value);\n } else if (mutationEvent.type === 'delete') {\n const oldResult = await this.state.itemResult.get(mutationEvent.record);\n summation = lastValue - oldResult;\n } else if (mutationEvent.type === 'update') {\n const oldResult = await this.state.itemResult.get(mutationEvent.oldRecord);\n\n const newRecord = await this.controller.system.storage.findOne(this.record.name!, MatchExp.atom({\n key: 'id',\n value: ['=', mutationEvent.record!.id]\n }), undefined, (this.dataDeps.main as RecordsDataDep).attributeQuery);\n const newWeightAndValue = this.matchRecordToWeight.call(this.controller, newRecord);\n const newResult = newWeightAndValue.weight * newWeightAndValue.value;\n \n summation = lastValue - oldResult + (await this.state.itemResult.set(newRecord, newResult));\n }\n\n return summation;\n }\n}\n\nexport class PropertyWeightedSummationHandle implements DataBasedComputation {\n static computationType = WeightedSummation\n static contextType = 'property' as const\n matchRecordToWeight: (this: Controller, item: any, dataDeps: {[key: string]: any}) => { weight: number; value: number }\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relatedRecordName: string\n isSource: boolean\n relation: RelationInstance\n property: string\n reverseProperty: string\n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n\n constructor(public controller: Controller, public args: WeightedSummationInstance, public dataContext: PropertyDataContext) {\n this.matchRecordToWeight = this.args.callback.bind(this.controller)\n\n // Find relation by property name\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n assert(this.relation, 'weighted summation computation must specify property')\n this.isSource = this.args.direction ? this.args.direction === 'source' : this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'weighted summation computation relation direction error')\n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property || this.relationAttr\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n \n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = this.args.attributeQuery?.filter(item => item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n \n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: [[this.relationAttr, {attributeQuery: this.args.attributeQuery}]]\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n createState() {\n return {\n itemResult: new RecordBoundState<number>(0, this.relation.name!)\n } \n }\n \n getDefaultValue() {\n return 0\n }\n\n async compute({_current, ...dataDeps}: {_current: any, [key: string]: any}): Promise<number> {\n const relations = _current[this.relationAttr] || [];\n let summation = 0;\n \n for (const relatedItem of relations) {\n const valueAndWeight = this.matchRecordToWeight.call(this.controller, relatedItem, dataDeps);\n const result = valueAndWeight.weight * valueAndWeight.value;\n await this.state.itemResult.set(relatedItem, result);\n summation += result;\n }\n \n return summation;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新。\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n\n let summation = lastValue;\n const relatedMutationEvent = mutationEvent.relatedMutationEvent!;\n\n if (relatedMutationEvent.type === 'create' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的新建\n const newRelationWithEntity = await this.controller.system.storage.findOne(this.relation.name!, MatchExp.atom({\n key: 'id',\n value: ['=', relatedMutationEvent.record!.id]\n }), undefined, this.relationAttributeQuery);\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const valueAndWeight = this.matchRecordToWeight.call(this.controller, relatedRecord, dataDeps);\n const result = valueAndWeight.weight * valueAndWeight.value;\n await this.state!.itemResult.set(newRelationWithEntity, result);\n summation = summation + result;\n } else if (relatedMutationEvent.type === 'delete' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的删除\n const oldResult = await this.state!.itemResult.get(relatedMutationEvent.record);\n summation = summation - oldResult;\n\n } else if (relatedMutationEvent.type === 'update') {\n // relatedAttribute 是从当前 dataContext 出发\n // 现在要把匹配的 key 改成从关联关系出发。\n const relationMatchKey = mutationEvent.relatedAttribute[1] === LINK_SYMBOL ? \n mutationEvent.relatedAttribute.slice(2).concat('id').join('.') : // 从2开始就是关联关系的字段了\n (mutationEvent.relatedAttribute.length === 1 ? \n `${this.isSource ? 'target' : 'source'}.id` : // 只有1个字段,就是关联实体的 id\n `${this.isSource ? 'target' : 'source'}.${mutationEvent.relatedAttribute.slice(1).concat('id').join('.')}` // 有多个字段,就是关联实体再关联上的字段\n )\n \n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: relationMatchKey, value: ['=', relatedMutationEvent.oldRecord!.id]}), \n undefined, \n this.relationAttributeQuery\n );\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const oldResult = await this.state!.itemResult.get(newRelationWithEntity);\n const newValueAndWeight = this.matchRecordToWeight.call(this.controller, relatedRecord, dataDeps);\n const newResult = newValueAndWeight.weight * newValueAndWeight.value;\n await this.state!.itemResult.set(newRelationWithEntity, newResult);\n summation = summation - oldResult + newResult;\n }\n\n return summation;\n }\n}\n\n// Export WeightedSummation computation handles\nexport const WeightedSummationHandles = [GlobalWeightedSummationHandle, PropertyWeightedSummationHandle];","import { PropertyDataContext } from \"./Computation.js\";\nimport { Every } from \"@shared\";\nimport { ComputationResult, DataBasedComputation, DataDep, GlobalBoundState, RecordBoundState, RecordsDataDep } from \"./Computation.js\";\nimport { EveryInstance, RelationInstance } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { DataContext } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { AttributeQueryData, AttributeQueryDataItem, AttributeQueryDataRecordItem, LINK_SYMBOL, MatchExp, RecordQueryData } from \"@storage\";\nimport { assert } from \"../util.js\";\n\n\nexport class GlobalEveryHandle implements DataBasedComputation {\n static computationType = Every\n static contextType = 'global' as const\n callback: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n defaultValue: boolean\n constructor(public controller: Controller, public args: EveryInstance, public dataContext: DataContext, ) {\n this.callback = this.args.callback.bind(this.controller)\n this.dataDeps = {\n main: {\n type: 'records',\n source: this.args.record!,\n attributeQuery: this.args.attributeQuery\n },\n ...(this.args.dataDeps || {})\n }\n this.defaultValue = !this.args.notEmpty\n }\n\n createState() {\n return {\n matchCount: new GlobalBoundState<number>(0),\n totalCount: new GlobalBoundState<number>(0),\n isItemMatch: new RecordBoundState<boolean>(false, this.args.record!.name!)\n }\n }\n \n getDefaultValue() {\n return this.defaultValue\n }\n\n async compute({main: records, ...dataDeps}: {main: any[], [key: string]: any}): Promise<boolean> {\n const totalCount = await this.state.totalCount.set(records.length)\n let matchCount = 0\n \n for (const item of records) {\n const isMatch = this.callback.call(this.controller, item, dataDeps)\n if (isMatch) {\n matchCount++\n }\n await this.state.isItemMatch.set(item, isMatch)\n }\n \n await this.state.matchCount.set(matchCount)\n\n return matchCount === totalCount\n }\n async incrementalCompute(lastValue: boolean, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<boolean|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新,因为可能有自己和自己的关联关系的 dataDep。\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n let totalCount = await this.state!.totalCount.get()\n let matchCount = await this.state!.matchCount.get()\n if (mutationEvent.type === 'create') {\n totalCount = await this.state!.totalCount.set(totalCount + 1)\n const newItemMatch = !!this.callback.call(this.controller, mutationEvent.record, dataDeps) \n if (newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount + 1)\n }\n await this.state!.isItemMatch.set(mutationEvent.record, newItemMatch)\n } else if (mutationEvent.type === 'delete') {\n totalCount = await this.state!.totalCount.set(totalCount - 1)\n // Get the old match status from state instead of recalculating\n const oldItemMatch = await this.state!.isItemMatch.get(mutationEvent.record)\n // Convert to boolean because database may store false as 0 or true as 1\n if (!!oldItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount - 1)\n }\n } else if (mutationEvent.type === 'update') {\n // Get the old match status from state instead of recalculating\n const oldItemMatch = await this.state!.isItemMatch.get(mutationEvent.oldRecord)\n const newItemMatch = !!this.callback.call(this.controller, mutationEvent.record, dataDeps)\n // Convert to boolean because database may store false as 0 or true as 1\n const oldItemMatchBool = !!oldItemMatch\n if (oldItemMatchBool === true && newItemMatch === false) {\n matchCount = await this.state!.matchCount.set(matchCount - 1)\n } else if (oldItemMatchBool === false && newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount + 1)\n }\n await this.state!.isItemMatch.set(mutationEvent.record, newItemMatch)\n }\n\n return matchCount === totalCount\n }\n}\n\n\n\n\nexport class PropertyEveryHandle implements DataBasedComputation {\n static computationType = Every\n static contextType = 'property' as const\n callback: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relation: RelationInstance\n relatedRecordName: string\n property: string\n reverseProperty: string\n isSource: boolean \n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n constructor(public controller: Controller, public args: EveryInstance, public dataContext: PropertyDataContext ) {\n this.callback = this.args.callback.bind(this.controller)\n\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n this.isSource = this.args.direction ? this.args.direction === 'source' :this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'every computation relation direction error')\n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property!\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = this.args.attributeQuery?.filter(item => item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n\n this.dataDeps = {\n _current: {\n type: 'property',\n // CAUTION 这里注册的依赖是从当前的 record 出发的。\n attributeQuery: [[this.property, {attributeQuery: this.args.attributeQuery}]]\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n createState() {\n return {\n matchCount: new RecordBoundState<number>(0),\n totalCount: new RecordBoundState<number>(0),\n isItemMatch: new RecordBoundState<boolean>(false, this.relation.name!)\n }\n }\n \n getDefaultValue() {\n return !this.args.notEmpty\n }\n\n async compute({_current, ...dataDeps}: {_current: any, [key: string]: any}): Promise<boolean> {\n const totalCount = await this.state.totalCount.set(_current,_current[this.relationAttr].length)\n let matchCount = 0\n for(const item of _current[this.relationAttr]) {\n if (this.callback.call(this.controller, item, dataDeps)) {\n matchCount++\n await this.state!.isItemMatch.set(item, true)\n }\n }\n\n return matchCount === totalCount\n }\n\n async incrementalCompute(lastValue: boolean, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<boolean|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新。\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n const relatedMutationEvent = mutationEvent.relatedMutationEvent!\n\n // TODO 如果未来支持用户可以自定义 dataDeps,那么这里也要支持如果发现是其他 dataDeps 变化,这里要直接返回重算的信号。\n let matchCount = await this.state!.matchCount.get(mutationEvent.record)\n let totalCount = await this.state!.totalCount.get(mutationEvent.record)\n\n // 关联实体只有更新才会触发到这里来,这是监听时就决定了的。\n // 关联关系的增删改都会到这里来。\n if (relatedMutationEvent.type === 'create'&&relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的新建\n const relationRecord = relatedMutationEvent.record!\n const newRelationWithEntity = await this.controller.system.storage.findOne(this.relation.name!, MatchExp.atom({\n key: 'id',\n value: ['=', relationRecord.id]\n }), undefined, this.relationAttributeQuery)\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = relationRecord\n\n const newItemMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps) \n if (newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(mutationEvent.record, matchCount + 1)\n await this.state!.isItemMatch.set(relationRecord, true)\n }\n\n totalCount = await this.state!.totalCount.set(mutationEvent.record, totalCount + 1)\n } else if (relatedMutationEvent.type === 'delete'&&relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的删除\n const relationRecord = relatedMutationEvent.record!\n const oldItemMatch = !!await this.state!.isItemMatch.get(relationRecord)\n if (oldItemMatch === true) {\n matchCount = await this.state!.matchCount.set(mutationEvent.record, matchCount - 1)\n }\n\n totalCount = await this.state!.totalCount.set(mutationEvent.record, totalCount - 1)\n } else if (relatedMutationEvent.type === 'update'&&(relatedMutationEvent.recordName === this.relation.name!||relatedMutationEvent.recordName === this.relatedRecordName)) {\n // 关联实体或者关联关系上的字段的更新\n const currentRecord = mutationEvent.oldRecord!\n\n // 关联关系或者关联实体的更新\n // relatedAttribute 是从当前 dataContext 出发\n // 现在要把匹配的 key 改成从关联关系出发。\n \n const relationMatchKey = mutationEvent.relatedAttribute[1] === LINK_SYMBOL ? \n mutationEvent.relatedAttribute.slice(2).concat('id').join('.') : // 从2开始就是关联关系的字段了\n (mutationEvent.relatedAttribute.length ===1 ? \n `${this.isSource ? 'target' : 'source'}.id` : // 只有1个字段,就是关联实体的 id\n `${this.isSource ? 'target' : 'source'}.${mutationEvent.relatedAttribute.slice(1).concat('id').join('.')}` // 有多个字段,就是关联实体再关联上的字段\n )\n\n const relationMatch = MatchExp.atom({\n key: relationMatchKey,\n value: ['=', relatedMutationEvent!.oldRecord!.id]\n }) \n\n const relationRecord = await this.controller.system.storage.findOne(this.relation.name!, relationMatch, undefined, this.relationAttributeQuery)\n const relatedRecord = relationRecord[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = relationRecord\n\n const oldItemMatch = !!await this.state!.isItemMatch.get(relationRecord)\n const newItemMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps)\n if (oldItemMatch === true && newItemMatch === false) {\n matchCount = await this.state!.matchCount.set(currentRecord, matchCount - 1)\n } else if (oldItemMatch === false && newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(currentRecord, matchCount + 1)\n }\n await this.state!.isItemMatch.set(relationRecord, newItemMatch)\n \n totalCount = await this.state!.totalCount.set(currentRecord, totalCount)\n } else {\n return ComputationResult.fullRecompute('mutation is not caused by relation.')\n }\n return matchCount === totalCount\n }\n}\n\n\n\n\n\n\n// Export Every computation handles\nexport const EveryHandles = [GlobalEveryHandle, PropertyEveryHandle];","import { DataContext, PropertyDataContext } from \"./Computation.js\";\nimport { Any } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { AnyInstance, RelationInstance } from \"@shared\";\nimport { ComputationResult, DataDep, GlobalBoundState, RecordBoundState, RecordsDataDep } from \"./Computation.js\";\nimport { DataBasedComputation } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../ComputationSourceMap.js\";\nimport { MatchExp, AttributeQueryData, RecordQueryData, LINK_SYMBOL } from \"@storage\";\nimport { assert } from \"../util.js\";\n\n\nexport class GlobalAnyHandle implements DataBasedComputation {\n static computationType = Any\n static contextType = 'global' as const\n callback: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n constructor(public controller: Controller, public args: AnyInstance, public dataContext: DataContext, ) {\n this.callback = this.args.callback.bind(this.controller)\n this.dataDeps = {\n main: {\n type: 'records',\n source:this.args.record!,\n attributeQuery: this.args.attributeQuery\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n createState() {\n return {\n matchCount: new GlobalBoundState<number>(0),\n isItemMatch: new RecordBoundState<boolean>(false, this.args.record!.name!)\n }\n }\n \n getDefaultValue() {\n return false\n }\n\n async compute({main: records, ...dataDeps}: {main: any[], [key: string]: any}): Promise<boolean> {\n let matchCount = 0\n \n for (const item of records) {\n const isMatch = this.callback.call(this.controller, item, dataDeps)\n if (isMatch) {\n matchCount++\n }\n await this.state.isItemMatch.set(item, isMatch)\n }\n \n await this.state.matchCount.set(matchCount)\n\n return matchCount>0\n }\n\n async incrementalCompute(lastValue: boolean, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<boolean|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新,因为可能有自己和自己的关联关系的 dataDep。\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n\n let matchCount = await this.state!.matchCount.get()\n if (mutationEvent.type === 'create') {\n const newItemMatch = !!this.callback.call(this.controller, mutationEvent.record, dataDeps) \n if (newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount + 1)\n }\n await this.state!.isItemMatch.set(mutationEvent.record, newItemMatch)\n } else if (mutationEvent.type === 'delete') {\n // Get the old match status from state instead of recalculating\n const oldItemMatch = await this.state!.isItemMatch.get(mutationEvent.record)\n // Convert to boolean because database may store false as 0 or true as 1\n if (!!oldItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount - 1)\n }\n } else if (mutationEvent.type === 'update') {\n // Get the old match status from state instead of recalculating\n const oldItemMatch = await this.state!.isItemMatch.get(mutationEvent.oldRecord)\n // 拉取全量的 new record 数据,因为可能关联关系有变化。\n const newRecord = await this.controller.system.storage.findOne(mutationEvent.recordName, MatchExp.atom({\n key: 'id',\n value: ['=', mutationEvent.record!.id]\n }), undefined, this.args.attributeQuery)\n\n const newItemMatch = !!this.callback.call(this.controller, newRecord, dataDeps)\n // Convert to boolean because database may store false as 0\n const oldItemMatchBool = !!oldItemMatch\n if (oldItemMatchBool === true && newItemMatch === false) {\n matchCount = await this.state!.matchCount.set(matchCount - 1)\n } else if (oldItemMatchBool === false && newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(matchCount + 1)\n }\n await this.state!.isItemMatch.set(newRecord, newItemMatch)\n }\n\n return matchCount > 0\n }\n}\n\n\nexport class PropertyAnyHandle implements DataBasedComputation {\n static computationType = Any\n static contextType = 'property' as const\n callback: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relatedRecordName: string\n isSource: boolean\n relation: RelationInstance\n property: string\n reverseProperty: string\n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n constructor(public controller: Controller, public args: AnyInstance, public dataContext: PropertyDataContext ) {\n this.callback = this.args.callback.bind(this.controller)\n\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n assert(this.relation, `cannot find relation for property ${this.args.property} in \"Any\" computation`)\n this.isSource = this.args.direction ? this.args.direction === 'source' : this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'any computation relation direction error')\n\n let baseRelation = this.relation.baseRelation || this.relation\n while(baseRelation.baseRelation) {\n baseRelation = baseRelation.baseRelation\n }\n const relType = baseRelation.type.split(':')\n assert(relType[this.isSource?1:0]==='n', `property-level Any computation argument must be an x:n relation. ${this.dataContext.host.name}.${this.args.property}\" is a ${this.isSource?relType.join(':'):relType.slice().reverse().join(':')} relation`)\n \n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property!\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = this.args.attributeQuery?.filter(item => item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: [[this.property, {attributeQuery: this.args.attributeQuery}]]\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n createState() {\n return {\n matchCount: new RecordBoundState<number>(0),\n isItemMatch: new RecordBoundState<boolean>(false, this.relation.name!)\n } \n }\n \n getDefaultValue() {\n return false\n }\n\n async compute({_current, ...dataDeps}: {_current: any, [key: string]: any}): Promise<boolean> {\n let matchCount = 0\n for(const item of _current[this.relationAttr]) {\n const isMatch = this.callback.call(this.controller, item, dataDeps)\n if (isMatch) {\n matchCount++\n await this.state!.isItemMatch.set(item, true)\n } else {\n await this.state!.isItemMatch.set(item, false)\n }\n }\n await this.state.matchCount.set(_current, matchCount)\n return matchCount>0\n }\n\n async incrementalCompute(lastValue: boolean, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<boolean|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新。\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n let matchCount = await this.state!.matchCount.get(mutationEvent.record)\n const relatedMutationEvent = mutationEvent.relatedMutationEvent!\n\n if (relatedMutationEvent.type === 'create'&&relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的新建\n const relationRecord = relatedMutationEvent.record!\n const newRelationWithEntity = await this.controller.system.storage.findOne(this.relation.name!, MatchExp.atom({\n key: 'id',\n value: ['=', relationRecord.id]\n }), undefined, this.relationAttributeQuery)\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = relationRecord\n\n const newItemMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps) \n if (newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(mutationEvent.record, matchCount + 1)\n await this.state!.isItemMatch.set(relationRecord, true)\n } else {\n await this.state!.isItemMatch.set(relationRecord, false)\n }\n } else if (relatedMutationEvent.type === 'delete'&&relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的删除\n const relationRecord = relatedMutationEvent.record!\n const oldItemMatch = !!await this.state!.isItemMatch.get(relationRecord)\n if (oldItemMatch === true) {\n matchCount = await this.state!.matchCount.set(mutationEvent.record, matchCount - 1)\n }\n } else if (relatedMutationEvent.type === 'update'&&(relatedMutationEvent.recordName === this.relation.name!||relatedMutationEvent.recordName === this.relatedRecordName)) {\n // 关联实体或者关联关系上的字段的更新\n const currentRecord = mutationEvent.oldRecord!\n // 关联关系或者关联实体的更新\n // relatedAttribute 是从当前 dataContext 出发\n // 现在要把匹配的 key 改成从关联关系出发。\n const relationMatchKey = mutationEvent.relatedAttribute[1] === '&' ? \n mutationEvent.relatedAttribute.slice(2).concat('id').join('.') : // 从2开始就是关联关系的字段了\n (mutationEvent.relatedAttribute.length === 1 ? \n `${this.isSource ? 'target' : 'source'}.id` : // 只有1个字段,就是关联实体的 id\n `${this.isSource ? 'target' : 'source'}.${mutationEvent.relatedAttribute.slice(1).concat('id').join('.')}` // 有多个字段,就是关联实体再关联上的字段\n )\n\n const relationMatch = MatchExp.atom({\n key: relationMatchKey,\n value: ['=', relatedMutationEvent!.oldRecord!.id]\n }) \n\n const relationRecord = await this.controller.system.storage.findOne(this.relation.name!, relationMatch, undefined, this.relationAttributeQuery)\n const relatedRecord = relationRecord[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = relationRecord\n\n const oldItemMatch = !!await this.state!.isItemMatch.get(relationRecord)\n const newItemMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps) \n if (oldItemMatch === true && newItemMatch === false) {\n matchCount = await this.state!.matchCount.set(currentRecord, matchCount - 1)\n } else if (oldItemMatch === false && newItemMatch === true) {\n matchCount = await this.state!.matchCount.set(currentRecord, matchCount + 1)\n }\n await this.state!.isItemMatch.set(relationRecord, newItemMatch)\n } else {\n return ComputationResult.fullRecompute('mutation is not caused by relation.')\n }\n\n return matchCount>0\n }\n}\n\n\n// Export Any computation handles\nexport const AnyHandles = [GlobalAnyHandle, PropertyAnyHandle];","import { DataContext, PropertyDataContext } from \"./Computation.js\";\nimport { Count } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { CountInstance, EntityInstance, RelationInstance } from \"@shared\";\nimport { ComputationResult, DataBasedComputation, DataDep, GlobalBoundState, RecordBoundState, RecordsDataDep } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { MatchExp, AttributeQueryData, RecordQueryData, LINK_SYMBOL } from \"@storage\";\nimport { assert } from \"../util.js\";\n\nexport class GlobalCountHandle implements DataBasedComputation {\n static computationType = Count\n static contextType = 'global' as const\n callback: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n record: (EntityInstance|RelationInstance)\n\n constructor(public controller: Controller, public args: CountInstance, public dataContext: DataContext) {\n this.record = this.args.record!\n this.callback = this.args.callback?.bind(this) || (() => true)\n \n this.dataDeps = {\n main: {\n type: 'records',\n source: this.record,\n attributeQuery: this.args.attributeQuery\n },\n ...(this.args.dataDeps || {})\n }\n }\n \n createState() {\n return {\n count: new GlobalBoundState<number>(0),\n isItemMatch: new RecordBoundState<boolean>(false, this.record.name!)\n }\n }\n \n getDefaultValue() {\n return 0\n }\n\n async compute({main: records, ...dataDeps}: {main: any[], [key: string]: any}): Promise<number> {\n let count: number = 0\n \n for (const item of records) {\n const isMatch = this.callback!.call(this.controller, item, dataDeps)\n if (isMatch) {\n count++\n }\n await (this.state as any).isItemMatch.set(item, isMatch)\n }\n \n await this.state.count.set(count)\n return count;\n }\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新,因为可能有自己和自己的关联关系的 dataDep。\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n let count = await this.state.count.get() || lastValue || 0;\n \n if (mutationEvent.type === 'create') {\n // 检查新创建的记录是否符合条件\n const itemMatch = !!this.callback.call(this.controller, mutationEvent.record, dataDeps)\n if (itemMatch) {\n count = count + 1;\n }\n await (this.state as any).isItemMatch.set(mutationEvent.record, itemMatch)\n } else if (mutationEvent.type === 'delete') {\n // Get the old match status from state instead of recalculating\n const itemMatch = await (this.state as any).isItemMatch.get(mutationEvent.record)\n // Convert to boolean because database may store false as 0 or true as 1\n if (!!itemMatch) {\n count = count - 1;\n }\n } else if (mutationEvent.type === 'update') {\n // Get the old match status from state instead of recalculating\n const oldItemMatch = await (this.state as any).isItemMatch.get(mutationEvent.oldRecord)\n const newItemMatch = !!this.callback.call(this.controller, mutationEvent.record, dataDeps)\n // Convert to boolean because database may store false as 0 or true as 1\n const oldItemMatchBool = !!oldItemMatch\n \n if (oldItemMatchBool && !newItemMatch) {\n count = count - 1;\n } else if (!oldItemMatchBool && newItemMatch) {\n count = count + 1;\n }\n await (this.state as any).isItemMatch.set(mutationEvent.record, newItemMatch)\n }\n \n // 防止计数为负数\n count = Math.max(0, count);\n await this.state.count.set(count);\n return count;\n }\n}\n\n\ntype StateWithCallback = {[k:string]: RecordBoundState<boolean>}\n\nexport class PropertyCountHandle implements DataBasedComputation {\n static computationType = Count\n static contextType = 'property' as const\n callback?: (this: Controller, item: any, dataDeps?: {[key: string]: any}) => boolean\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relatedRecordName: string\n isSource: boolean\n relation: RelationInstance\n property: string\n reverseProperty: string\n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n\n constructor(public controller: Controller, public args: CountInstance, public dataContext: PropertyDataContext) {\n this.callback = this.args.callback?.bind(this.controller)\n \n // Find relation by property name or fall back to record\n if (this.args.property) {\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n } else {\n this.relation = this.args.record as RelationInstance\n }\n this.isSource = this.args.direction ? this.args.direction === 'source' : this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'count computation relation direction error')\n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property || this.relationAttr\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n \n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = attributeQuery.filter(item => item && item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item && item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n \n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: this.callback ? \n [[this.relationAttr, {attributeQuery: attributeQuery.length > 0 ? attributeQuery : ['id']}]] : \n [[this.relationAttr, {attributeQuery: ['id']}]]\n },\n ...(this.args.dataDeps || {})\n }\n }\n\n createState(): {}| StateWithCallback {\n return this.callback ? {\n isItemMatchCount: new RecordBoundState<boolean>(false, this.relation.name!)\n } : {}\n }\n \n getDefaultValue() {\n return 0\n }\n\n async compute({_current, ...dataDeps}: {_current: any, [key: string]: any}): Promise<number> {\n const relations = _current[this.relationAttr] || [];\n let count: number = 0;\n \n if (this.callback) {\n // 如果有 callback,过滤符合条件的关联记录\n for(let item of relations) {\n const isItemMatch = this.callback!.call(this.controller, item, dataDeps)\n if (isItemMatch) {\n await (this.state as StateWithCallback).isItemMatchCount!.set(item, true)\n count++\n } else {\n await (this.state as StateWithCallback).isItemMatchCount!.set(item, false)\n }\n }\n } else {\n // 如果没有 callback,统计所有关联记录\n count = relations.length;\n }\n \n return count;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新。\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n const relatedMutationEvent = mutationEvent.relatedMutationEvent!;\n \n let count = lastValue || 0;\n\n if (relatedMutationEvent.type === 'create' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的新建\n if (this.callback) {\n const relationRecord = relatedMutationEvent.record!;\n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: 'id', value: ['=', relationRecord.id]}), \n undefined, \n this.relationAttributeQuery\n );\n \n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = relationRecord\n \n const itemMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps);\n if (itemMatch) {\n await (this.state as StateWithCallback).isItemMatchCount!.set(relationRecord, true)\n count = count + 1;\n } else {\n await (this.state as StateWithCallback).isItemMatchCount!.set(relationRecord, false)\n }\n } else {\n count = count + 1;\n }\n } else if (relatedMutationEvent.type === 'delete' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的删除。\n if (this.callback) {\n if((await (this.state as StateWithCallback).isItemMatchCount!.get(relatedMutationEvent.oldRecord))) {\n count = count - 1\n }\n } else {\n count = count - 1;\n }\n } else if (relatedMutationEvent.type === 'update') {\n // 这里可能是关联关系上的更新,也可能是关联实体的更新。不管哪一种,我们都重新查询一遍。\n if(this.callback) {\n // relatedAttribute 是从当前 dataContext 出发\n // 现在要把匹配的 key 改成从关联关系出发。\n const relationMatchKey = mutationEvent.relatedAttribute[1] === LINK_SYMBOL ? \n mutationEvent.relatedAttribute.slice(2).concat('id').join('.') : // 从2开始就是关联关系的字段了\n (mutationEvent.relatedAttribute.length === 1 ? \n `${this.isSource ? 'target' : 'source'}.id` : // 只有1个字段,就是关联实体的 id\n `${this.isSource ? 'target' : 'source'}.${mutationEvent.relatedAttribute.slice(1).concat('id').join('.')}` // 有多个字段,就是关联实体再关联上的字段\n )\n \n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: relationMatchKey, value: ['=', relatedMutationEvent.oldRecord!.id]}), \n undefined, \n this.relationAttributeQuery\n );\n \n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source']\n relatedRecord['&'] = newRelationWithEntity\n \n const isNewMatch = !!this.callback.call(this.controller, relatedRecord, dataDeps);\n const isOldMatch = await (this.state as StateWithCallback).isItemMatchCount!.get(newRelationWithEntity)\n if (isNewMatch !== isOldMatch) {\n count = isNewMatch ? (count + 1) : (count-1);\n await (this.state as StateWithCallback).isItemMatchCount!.set(newRelationWithEntity, isNewMatch)\n }\n }\n } else {\n return ComputationResult.fullRecompute(`unknown related mutation event for ${this.dataContext.host.name}.${this.dataContext.id.name}`)\n }\n\n return count;\n }\n}\n\n// Export Count computation handles\nexport const CountHandles = [GlobalCountHandle, PropertyCountHandle];\n","import { DataContext, EntityDataContext } from \"./Computation.js\";\nimport { Transform, TransformInstance, EntityInstance, RelationInstance, ActivityInstance, InteractionInstance } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { MatchExp } from \"@storage\";\nimport { ComputationResultPatch, DataDep, RecordBoundState, RecordsDataDep } from \"./Computation.js\";\nimport { DataBasedComputation } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../ComputationSourceMap.js\";\n\nexport class RecordsTransformHandle implements DataBasedComputation {\n static computationType = Transform\n static contextType = ['entity', 'relation'] as const\n transformCallback: (this: Controller, item: any) => any\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n \n constructor(public controller: Controller, public args: TransformInstance, public dataContext: DataContext) {\n this.transformCallback = this.args.callback.bind(this.controller)\n \n this.dataDeps = {\n main: {\n type: 'records',\n source: this.args.record as EntityInstance|RelationInstance|ActivityInstance|InteractionInstance,\n attributeQuery: this.args.attributeQuery || ['*']\n }\n }\n }\n \n createState() {\n return {\n sourceRecordId: new RecordBoundState<any>(''),\n transformIndex: new RecordBoundState<number>(0)\n }\n }\n \n getDefaultValue() {\n return []\n }\n\n async compute({main: records}: {main: any[]}): Promise<any[]> {\n const result: ComputationResultPatch[] = []\n for (const record of records) {\n const returnRecord = await this.transformCallback.call(this.controller, record)\n const transformedRecords = Array.isArray(returnRecord) ? returnRecord : [returnRecord]\n transformedRecords.forEach((transformedRecord, index)=> {\n result.push({\n ...transformedRecord,\n [this.state.sourceRecordId.key]: record.id,\n [this.state.transformIndex.key]: index\n })\n })\n \n }\n return result\n }\n\n async incrementalPatchCompute(lastValue: any[], mutationEvent: EtityMutationEvent): Promise<ComputationResultPatch | ComputationResultPatch[]|undefined> {\n const dataContext = this.dataContext as EntityDataContext\n const results: ComputationResultPatch[] = []\n if (mutationEvent.type === 'create') {\n const matchSourceRecord = MatchExp.atom({key: 'id', value: ['=', mutationEvent.record!.id]})\n const souceDataDep = this.dataDeps.main as RecordsDataDep\n const sourceRecord = await this.controller.system.storage.findOne(souceDataDep.source.name!, matchSourceRecord, undefined, souceDataDep.attributeQuery)\n const returnRecord = await this.transformCallback.call(this.controller, sourceRecord)\n const transformedRecords = Array.isArray(returnRecord) ? returnRecord : [returnRecord]\n transformedRecords.forEach((transformedRecord, index) => {\n // 允许返回 Null,表示不插入\n if(transformedRecord) {\n results.push({\n type:'insert',\n data: {\n ...transformedRecord,\n [this.state.sourceRecordId.key]: mutationEvent.record!.id,\n [this.state.transformIndex.key]: index\n }\n })\n }\n })\n } else {\n // update or delete\n const sourceRecordId = mutationEvent.oldRecord?.id ?? mutationEvent.record!.id\n const match = MatchExp.atom({key: this.state.sourceRecordId.key, value: ['=', sourceRecordId]})\n const mappedRecords = await this.controller.system.storage.find(dataContext.id.name!, match, undefined, ['*'])\n \n\n const mappedRecordsByIndex = mappedRecords.reduce((acc, record) => {\n acc[record[this.state.transformIndex.key]] = record\n return acc\n }, {} as Record<number, any>)\n \n let transformedRecords: any[] = []\n if (mutationEvent.type === 'update') {\n const matchSourceRecord = MatchExp.atom({key: 'id', value: ['=', sourceRecordId]})\n const sourceRecord = await this.controller.system.storage.findOne((this.dataDeps.main as RecordsDataDep).source.name!, matchSourceRecord, undefined, (this.dataDeps.main as RecordsDataDep).attributeQuery)\n const returnRecord = await this.transformCallback.call(this.controller, sourceRecord)\n transformedRecords = Array.isArray(returnRecord) ? returnRecord : [returnRecord]\n }\n transformedRecords.forEach((transformedRecord, index) => {\n if (transformedRecord) {\n if(mappedRecordsByIndex[index]) {\n results.push({\n type:'update',\n data: {\n ...transformedRecord,\n [this.state.sourceRecordId.key]: sourceRecordId,\n [this.state.transformIndex.key]: index\n },\n affectedId: mappedRecordsByIndex[index].id\n })\n delete mappedRecordsByIndex[index]\n } else {\n results.push({\n type:'insert',\n data: {\n ...transformedRecord,\n [this.state.sourceRecordId.key]: sourceRecordId,\n [this.state.transformIndex.key]: index\n }\n })\n }\n }\n }) \n Object.values(mappedRecordsByIndex).forEach((mappedRecord: any ) => {\n results.push({\n type:'delete',\n affectedId: mappedRecord.id\n })\n })\n }\n return results\n }\n}\n\n\n// Export Transform computation handles\nexport const TransformHandles = [RecordsTransformHandle];","interface Variable {\n id: string;\n value?: number;\n}\n\ntype ExpressionType = 'number' | 'variable' | 'operation';\n\ninterface ExpressionNode {\n type: ExpressionType;\n value?: number;\n variable?: Variable;\n operation?: string;\n left?: ExpressionNode;\n right?: ExpressionNode;\n}\n\ninterface LinearTerm {\n coefficient: number;\n power: number;\n constant: number;\n}\n\nexport class Expression {\n private node: ExpressionNode;\n\n constructor(node: ExpressionNode) {\n this.node = node;\n }\n\n static number(value: number): Expression {\n return new Expression({ type: 'number', value });\n }\n\n static variable(id: string): Expression {\n return new Expression({ type: 'variable', variable: { id } });\n }\n\n add(other: Expression | number): Expression {\n const rightNode = typeof other === 'number' \n ? { type: 'number' as ExpressionType, value: other }\n : other.node;\n \n return new Expression({\n type: 'operation',\n operation: '+',\n left: this.node,\n right: rightNode\n });\n }\n\n subtract(other: Expression | number): Expression {\n const rightNode = typeof other === 'number' \n ? { type: 'number' as ExpressionType, value: other }\n : other.node;\n \n return new Expression({\n type: 'operation',\n operation: '-',\n left: this.node,\n right: rightNode\n });\n }\n\n multiply(other: Expression | number): Expression {\n const rightNode = typeof other === 'number' \n ? { type: 'number' as ExpressionType, value: other }\n : other.node;\n \n return new Expression({\n type: 'operation',\n operation: '*',\n left: this.node,\n right: rightNode\n });\n }\n\n divide(other: Expression | number): Expression {\n const rightNode = typeof other === 'number' \n ? { type: 'number' as ExpressionType, value: other }\n : other.node;\n \n return new Expression({\n type: 'operation',\n operation: '/',\n left: this.node,\n right: rightNode\n });\n }\n\n power(other: Expression | number): Expression {\n const rightNode = typeof other === 'number' \n ? { type: 'number' as ExpressionType, value: other }\n : other.node;\n \n return new Expression({\n type: 'operation',\n operation: '^',\n left: this.node,\n right: rightNode\n });\n }\n\n sqrt(): Expression {\n return new Expression({\n type: 'operation',\n operation: 'sqrt',\n left: this.node\n });\n }\n\n evaluate(variables: Record<string, number> = {}): number {\n return this.evaluateNode(this.node, variables);\n }\n\n private evaluateNode(node: ExpressionNode, variables: Record<string, number>): number {\n switch (node.type) {\n case 'number':\n return node.value!;\n \n case 'variable':\n const varId = node.variable!.id;\n if (!(varId in variables)) {\n throw new Error(`Variable ${varId} not found`);\n }\n return variables[varId];\n \n case 'operation':\n const left = node.left ? this.evaluateNode(node.left, variables) : 0;\n const right = node.right ? this.evaluateNode(node.right, variables) : 0;\n \n switch (node.operation) {\n case '+': return left + right;\n case '-': return left - right;\n case '*': return left * right;\n case '/': \n if (right === 0) throw new Error('Division by zero');\n return left / right;\n case '^': return Math.pow(left, right);\n case 'sqrt': return Math.sqrt(left);\n default: throw new Error(`Unknown operation: ${node.operation}`);\n }\n \n default:\n throw new Error(`Unknown node type: ${node.type}`);\n }\n }\n\n gt(other: Expression | number): Inequality {\n return new Inequality(this, '>', other);\n }\n\n lt(other: Expression | number): Inequality {\n return new Inequality(this, '<', other);\n }\n\n eq(other: Expression | number): Equation {\n return new Equation(this, other);\n }\n\n getVariables(): string[] {\n const variables = new Set<string>();\n this.collectVariables(this.node, variables);\n return Array.from(variables);\n }\n\n private collectVariables(node: ExpressionNode, variables: Set<string>): void {\n if (node.type === 'variable') {\n variables.add(node.variable!.id);\n } else if (node.type === 'operation') {\n if (node.left) this.collectVariables(node.left, variables);\n if (node.right) this.collectVariables(node.right, variables);\n }\n }\n\n clone(): Expression {\n return new Expression(this.cloneNode(this.node));\n }\n\n private cloneNode(node: ExpressionNode): ExpressionNode {\n const cloned: ExpressionNode = { type: node.type };\n \n if (node.value !== undefined) cloned.value = node.value;\n if (node.variable) cloned.variable = { ...node.variable };\n if (node.operation) cloned.operation = node.operation;\n if (node.left) cloned.left = this.cloneNode(node.left);\n if (node.right) cloned.right = this.cloneNode(node.right);\n \n return cloned;\n }\n\n getLinearForm(variable: string): LinearTerm {\n return this.extractLinearForm(this.node, variable);\n }\n\n private extractLinearForm(node: ExpressionNode, variable: string): LinearTerm {\n switch (node.type) {\n case 'number':\n return { coefficient: 0, power: 0, constant: node.value! };\n \n case 'variable':\n if (node.variable!.id === variable) {\n return { coefficient: 1, power: 1, constant: 0 };\n } else {\n return { coefficient: 0, power: 0, constant: 0 };\n }\n \n case 'operation':\n const left = node.left ? this.extractLinearForm(node.left, variable) : { coefficient: 0, power: 0, constant: 0 };\n const right = node.right ? this.extractLinearForm(node.right, variable) : { coefficient: 0, power: 0, constant: 0 };\n \n switch (node.operation) {\n case '+':\n return {\n coefficient: left.coefficient + right.coefficient,\n power: Math.max(left.power, right.power),\n constant: left.constant + right.constant\n };\n \n case '-':\n return {\n coefficient: left.coefficient - right.coefficient,\n power: Math.max(left.power, right.power),\n constant: left.constant - right.constant\n };\n \n case '*':\n if (left.coefficient === 0) {\n return {\n coefficient: left.constant * right.coefficient,\n power: right.power,\n constant: left.constant * right.constant\n };\n } else if (right.coefficient === 0) {\n return {\n coefficient: right.constant * left.coefficient,\n power: left.power,\n constant: left.constant * right.constant\n };\n } else {\n throw new Error('Cannot solve equations with variable multiplication');\n }\n \n case '/':\n if (right.coefficient === 0 && right.constant !== 0) {\n return {\n coefficient: left.coefficient / right.constant,\n power: left.power,\n constant: left.constant / right.constant\n };\n } else {\n throw new Error('Cannot solve equations with variable division');\n }\n \n case '^':\n if (left.coefficient !== 0 && right.coefficient === 0) {\n const power = right.constant;\n if (power === Math.floor(power) && power > 0) {\n return {\n coefficient: left.coefficient === 1 ? 1 : Math.pow(left.coefficient, power),\n power: left.power * power,\n constant: left.constant === 0 ? 0 : Math.pow(left.constant, power)\n };\n } else {\n throw new Error('Only positive integer powers are supported');\n }\n } else {\n throw new Error('Cannot solve equations with variable in exponent');\n }\n \n case 'sqrt':\n if (left.coefficient !== 0) {\n if (left.power === 2) {\n return {\n coefficient: left.coefficient,\n power: 1,\n constant: Math.sqrt(left.constant)\n };\n } else {\n throw new Error('Cannot solve square root of non-quadratic variable');\n }\n } else {\n return {\n coefficient: 0,\n power: 0,\n constant: Math.sqrt(left.constant)\n };\n }\n \n default:\n throw new Error(`Unknown operation: ${node.operation}`);\n }\n \n default:\n throw new Error(`Unknown node type: ${node.type}`);\n }\n }\n}\n\nexport class Inequality {\n constructor(\n private left: Expression,\n private operator: '>' | '<',\n private right: Expression | number\n ) {}\n\n evaluate(variables: Record<string, number> = {}): boolean {\n const leftValue = this.left.evaluate(variables);\n const rightValue = typeof this.right === 'number' \n ? this.right \n : this.right.evaluate(variables);\n \n return this.operator === '>' ? leftValue > rightValue : leftValue < rightValue;\n }\n\n solve(): number | null {\n const rightExpr = typeof this.right === 'number' \n ? Expression.number(this.right) \n : this.right;\n \n const leftVars = this.left.getVariables();\n const rightVars = rightExpr.getVariables();\n const allVars = [...new Set([...leftVars, ...rightVars])];\n \n if (allVars.length !== 1) {\n throw new Error('Can only solve inequalities with exactly one variable');\n }\n \n const variable = allVars[0];\n return this.solveForVariable(variable);\n }\n\n private solveForVariable(variable: string): number | null {\n try {\n const combined = this.left.subtract(typeof this.right === 'number' ? this.right : this.right);\n const linearForm = combined.getLinearForm(variable);\n \n // 对于不等式 ax^n + b = 0,解为 x = (-b/a)^(1/n)\n if (linearForm.coefficient === 0) {\n return null; // 没有变量项,无解\n }\n \n const constantTerm = -linearForm.constant;\n const coefficient = linearForm.coefficient;\n const power = linearForm.power;\n \n if (power === 1) {\n // 线性不等式: ax + b = 0 => x = -b/a\n return constantTerm / coefficient;\n } else if (power === 2) {\n // 二次不等式: ax^2 + b = 0 => x = ±√(-b/a)\n const discriminant = constantTerm / coefficient;\n if (discriminant < 0) {\n return null; // 无实数解\n }\n return Math.sqrt(discriminant); // 返回正解\n } else {\n // 高次方程: ax^n + b = 0 => x = (-b/a)^(1/n)\n const base = constantTerm / coefficient;\n if (power % 2 === 0 && base < 0) {\n return null; // 偶次方根的负数无实数解\n }\n return Math.pow(Math.abs(base), 1 / power) * (base < 0 ? -1 : 1);\n }\n } catch {\n return null;\n }\n }\n}\n\nexport class Equation {\n constructor(\n private left: Expression,\n private right: Expression | number\n ) {}\n\n evaluate(variables: Record<string, number> = {}): boolean {\n const leftValue = this.left.evaluate(variables);\n const rightValue = typeof this.right === 'number' \n ? this.right \n : this.right.evaluate(variables);\n \n return Math.abs(leftValue - rightValue) < 1e-10;\n }\n\n solve(): number | null {\n const rightExpr = typeof this.right === 'number' \n ? Expression.number(this.right) \n : this.right;\n \n const leftVars = this.left.getVariables();\n const rightVars = rightExpr.getVariables();\n const allVars = [...new Set([...leftVars, ...rightVars])];\n \n if (allVars.length !== 1) {\n throw new Error('Can only solve equations with exactly one variable');\n }\n \n const variable = allVars[0];\n return this.solveForVariable(variable);\n }\n\n private solveForVariable(variable: string): number | null {\n try {\n const combined = this.left.subtract(typeof this.right === 'number' ? this.right : this.right);\n const linearForm = combined.getLinearForm(variable);\n \n // 对于方程 ax^n + b = 0,解为 x = (-b/a)^(1/n)\n if (linearForm.coefficient === 0) {\n // 没有变量项,检查常数项\n if (Math.abs(linearForm.constant) < 1e-10) {\n return 0; // 恒等式,任意值都是解,返回0\n } else {\n return null; // 矛盾,无解\n }\n }\n \n const constantTerm = -linearForm.constant;\n const coefficient = linearForm.coefficient;\n const power = linearForm.power;\n \n if (power === 1) {\n // 线性方程: ax + b = 0 => x = -b/a\n return constantTerm / coefficient;\n } else if (power === 2) {\n // 二次方程: ax^2 + b = 0 => x = ±√(-b/a)\n const discriminant = constantTerm / coefficient;\n if (discriminant < 0) {\n return null; // 无实数解\n }\n return Math.sqrt(discriminant); // 返回正解\n } else {\n // 高次方程: ax^n + b = 0 => x = (-b/a)^(1/n)\n const base = constantTerm / coefficient;\n if (power % 2 === 0 && base < 0) {\n return null; // 偶次方根的负数无实数解\n }\n return Math.pow(Math.abs(base), 1 / power) * (base < 0 ? -1 : 1);\n }\n } catch {\n return null;\n }\n }\n}","import { RealTime } from \"@shared\";\nimport { Controller } from \"../Controller\";\nimport { ComputationResultPatch, ComputationResult, DataBasedComputation, RecordBoundState, GlobalBoundState } from \"./Computation\";\nimport { RealTimeInstance, PropertyInstance } from \"@shared\";\nimport { DataContext } from \"./Computation.js\";\nimport { Equation, Expression, Inequality } from \"./MathResolver\";\n\nexport class GlobalRealTimeComputation implements DataBasedComputation {\n static computationType = RealTime\n static contextType = 'global' as const\n state!: ReturnType<typeof this.createState>\n incrementalCompute?: (...args: any[]) => Promise<ComputationResult|any>;\n incrementalPatchCompute?: (...args: any[]) => Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined>;\n // RealTimeValue 没有 dataDeps\n dataDeps: {[key: string]: any}\n useLastValue = false;\n callback: (now: Expression, dataDeps: {[key: string]: any}) => Promise<Expression|Inequality|Equation>\n nextRecomputeTime?: (now: number, dataDeps: {[key: string]: any}) => number\n\n constructor(public controller: Controller, public args: RealTimeInstance, public dataContext: DataContext) {\n this.dataDeps = this.args.dataDeps ?? {};\n this.callback = (now: Expression, dataDeps: {[key: string]: any}) => {\n return (this.args.callback as any).call(this.controller, now, dataDeps);\n };\n this.nextRecomputeTime = this.args.nextRecomputeTime ? \n (now: number, dataDeps: {[key: string]: any}) => {\n return (this.args.nextRecomputeTime as any).call(this.controller, now, dataDeps);\n } : undefined;\n }\n createState() {\n return {\n lastRecomputeTime: new GlobalBoundState<number>(null),\n nextRecomputeTime: new GlobalBoundState<number>(null)\n }\n }\n \n getDefaultValue() {\n return null; // Default value for global real-time computation\n }\n \n // TODO now 是不是应该用 dataDeps 动态注入???这样能手动测试。改成在哪里配置?\n async compute(dataDeps: {[key: string]: any}) : Promise<number|boolean>{\n const result = await this.args.callback(Expression.variable('now'), dataDeps) as Expression|Inequality|Equation\n const now = Date.now()\n let resultValue: number|boolean\n let nextRecomputeTime: number\n\n if (result instanceof Expression) {\n resultValue = result.evaluate({now});\n nextRecomputeTime = now + this.nextRecomputeTime!(now, dataDeps);\n } else if (result instanceof Inequality || result instanceof Equation) {\n resultValue = result.evaluate({now});\n nextRecomputeTime = result.solve()!;\n } else {\n throw new Error('Invalid result type');\n }\n\n await this.state.lastRecomputeTime.set(now);\n await this.state.nextRecomputeTime.set(nextRecomputeTime);\n\n return resultValue;\n }\n}\n\nexport class PropertyRealTimeComputation implements DataBasedComputation {\n static computationType = RealTime\n static contextType = 'property' as const\n state!: ReturnType<typeof this.createState>\n incrementalCompute?: (...args: any[]) => Promise<ComputationResult|any>;\n incrementalPatchCompute?: (...args: any[]) => Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined>;\n // RealTimeValue 没有 dataDeps\n dataDeps: {[key: string]: any}\n useLastValue = false;\n callback: (now: Expression, dataDeps: {[key: string]: any}) => Promise<Expression|Inequality|Equation>\n nextRecomputeTime?: (now: number, dataDeps: {[key: string]: any}) => number\n isResultNumber: boolean\n constructor(public controller: Controller, public args: RealTimeInstance, public dataContext: DataContext) {\n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: this.args.attributeQuery\n },\n ...(this.args.dataDeps || {})\n }\n this.isResultNumber = (this.dataContext.id as PropertyInstance).type === 'number'\n this.callback = (now: Expression, dataDeps: {[key: string]: any}) => {\n return (this.args.callback as any).call(this.controller, now, dataDeps);\n };\n this.nextRecomputeTime = this.args.nextRecomputeTime ? \n (now: number, dataDeps: {[key: string]: any}) => {\n return (this.args.nextRecomputeTime as any).call(this.controller, now, dataDeps);\n } : undefined;\n }\n createState() {\n return {\n lastRecomputeTime: new RecordBoundState<number>(null),\n nextRecomputeTime: new RecordBoundState<number>(null)\n }\n }\n \n getDefaultValue() {\n return 0; // Default value for property real-time computation\n }\n \n // TODO now 是不是应该用 dataDeps 动态注入???这样能手动测试。改成在哪里配置?\n async compute(dataDeps: {[key: string]: any}, record: any) : Promise<number|boolean>{\n const result = await this.args.callback(Expression.variable('now'), dataDeps) as Expression|Inequality|Equation\n const now = Date.now()\n let resultValue: number|boolean\n let nextRecomputeTime: number\n\n if (result instanceof Expression) {\n resultValue = result.evaluate({now});\n nextRecomputeTime = now + this.nextRecomputeTime!(now, dataDeps);\n } else if (result instanceof Inequality || result instanceof Equation) {\n resultValue = result.evaluate({now});\n nextRecomputeTime = result.solve()!;\n } else {\n throw new Error('Invalid result type');\n }\n\n await this.state.lastRecomputeTime.set(record, now);\n await this.state.nextRecomputeTime.set(record, nextRecomputeTime);\n\n return resultValue;\n }\n}\n\n// Export RealTime computation handles\nexport const RealTimeHandles = [GlobalRealTimeComputation, PropertyRealTimeComputation]; ","import { DataContext, PropertyDataContext, RecordBoundState } from \"./Computation.js\";\nimport { Summation } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { SummationInstance, EntityInstance, RelationInstance } from \"@shared\";\nimport { ComputationResult, DataBasedComputation, DataDep, RecordsDataDep } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { MatchExp, AttributeQueryData, LINK_SYMBOL } from \"@storage\";\nimport { assert } from \"../util.js\";\nimport { RecordQueryData } from \"@storage\";\n\nexport class GlobalSumHandle implements DataBasedComputation {\n static computationType = Summation\n static contextType = 'global' as const\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n record: (EntityInstance|RelationInstance)\n sumFieldPath: string[]\n constructor(public controller: Controller, public args: SummationInstance, public dataContext: DataContext) {\n this.record = this.args.record!\n \n // 获取 attributeQuery 的第一个字段作为求和字段\n if (!this.args.attributeQuery || this.args.attributeQuery.length === 0) {\n throw new Error('Sum computation requires attributeQuery with at least one field')\n }\n\n this.sumFieldPath = []\n let attrPointer:any = this.args.attributeQuery\n while(attrPointer) {\n this.sumFieldPath.push(Array.isArray(attrPointer[0]) ? attrPointer[0][0]: attrPointer[0])\n attrPointer = Array.isArray(attrPointer[0]) ? attrPointer[0][1].attributeQuery : null\n }\n\n this.dataDeps = {\n main: {\n type: 'records',\n source: this.record,\n attributeQuery:this.args.attributeQuery\n }\n }\n }\n \n createState() {\n return {\n itemValue: new RecordBoundState<number>(0, this.record.name!)\n } \n }\n \n getDefaultValue() {\n return 0\n }\n\n resolveSumField(record:any, sumFieldPath = this.sumFieldPath) {\n let base:any = record\n for(let attr of sumFieldPath) {\n base = base[attr]\n if (base === undefined||base === null) return 0\n }\n return (Number.isNaN(base)||!Number.isFinite(base) ) ? 0: base\n }\n async compute({main: records}: {main: any[]}): Promise<number> {\n let sum = 0;\n \n for (const record of records) {\n const value = this.resolveSumField(record) || 0;\n sum += value;\n await this.state.itemValue.set(record, value);\n }\n \n return sum;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新,因为可能有自己和自己的关联关系的 dataDep。\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n let sum = lastValue || 0;\n \n if (mutationEvent.type === 'create') {\n const newRecord = await this.controller.system.storage.findOne(this.record.name!, MatchExp.atom({key:'id', value:['=', mutationEvent.record!.id]}), undefined, this.args.attributeQuery)\n const value = this.resolveSumField(newRecord);\n sum += value;\n await this.state.itemValue.set(newRecord, value);\n } else if (mutationEvent.type === 'delete') {\n // Get the old value from state instead of returning fullRecompute\n const oldValue = await this.state.itemValue.get(mutationEvent.record);\n sum -= oldValue;\n } else if (mutationEvent.type === 'update') {\n const newRecord = await this.controller.system.storage.findOne(this.record.name!, MatchExp.atom({key:'id', value:['=', mutationEvent.record!.id]}), undefined, this.args.attributeQuery)\n const newValue = this.resolveSumField(newRecord);\n \n // Get the old value from state\n const oldValue = await this.state.itemValue.get(mutationEvent.oldRecord);\n sum += newValue - oldValue;\n await this.state.itemValue.set(newRecord, newValue);\n }\n \n return sum;\n }\n}\n\nexport class PropertySumHandle implements DataBasedComputation {\n static computationType = Summation\n static contextType = 'property' as const\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relatedRecordName: string\n isSource: boolean\n relation: RelationInstance\n property: string\n reverseProperty: string\n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n sumFieldPath: string[]\n\n constructor(public controller: Controller, public args: SummationInstance, public dataContext: PropertyDataContext) {\n // Find relation by property name or fall back to record\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n assert(this.relation, 'summation computation must specify either property or record')\n this.isSource = this.args.direction ? this.args.direction === 'source' : this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'summation computation relation direction error')\n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property!\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n \n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = this.args.attributeQuery?.filter(item => item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n \n // 解析 attributeQuery 获取求和字段\n \n this.sumFieldPath = []\n let attrPointer:any = attributeQuery\n while(attrPointer) {\n this.sumFieldPath.push(Array.isArray(attrPointer[0]) ? attrPointer[0][0]: attrPointer[0])\n attrPointer = Array.isArray(attrPointer[0]) ? attrPointer[0][1].attributeQuery : null\n }\n \n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: [[this.relationAttr, {attributeQuery: this.args.attributeQuery}]]\n }\n }\n }\n\n createState() {\n return {\n itemResult: new RecordBoundState<number>(0, this.relation.name!)\n } \n }\n \n getDefaultValue() {\n return 0\n }\n resolveSumField(record:any, sumFieldPath = this.sumFieldPath) {\n let base:any = record\n for(let attr of sumFieldPath) {\n base = base[attr]\n if (base === undefined||base === null) return 0\n }\n return (Number.isNaN(base)||!Number.isFinite(base) ) ? 0: base\n }\n\n async compute({_current}: {_current: any}): Promise<number> {\n const relations = _current[this.relationAttr] || [];\n let sum = 0;\n \n for (const relatedItem of relations) {\n const value = this.resolveSumField(relatedItem, this.sumFieldPath) || 0;\n sum += value;\n await this.state.itemResult.set(relatedItem, value);\n }\n \n return sum;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新。\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n const relatedMutationEvent = mutationEvent.relatedMutationEvent;\n if (!relatedMutationEvent) {\n return ComputationResult.fullRecompute('No related mutation event')\n }\n \n let sum = lastValue || 0;\n\n if (relatedMutationEvent.type === 'create' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的新建\n const relationRecord = relatedMutationEvent.record!;\n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!,\n MatchExp.atom({key: 'id', value: ['=', relationRecord.id]}), \n undefined, \n this.relationAttributeQuery\n );\n \n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const value = this.resolveSumField(relatedRecord) || 0;\n sum += value;\n await this.state.itemResult.set(newRelationWithEntity, value);\n } else if (relatedMutationEvent.type === 'delete' && relatedMutationEvent.recordName === this.relation.name!) {\n // 关联关系的删除\n const oldResult = await this.state!.itemResult.get(relatedMutationEvent.record);\n sum = sum - oldResult;\n } else if (relatedMutationEvent.type === 'update') {\n // relatedAttribute 是从当前 dataContext 出发\n // 现在要把匹配的 key 改成从关联关系出发。\n const relationMatchKey = mutationEvent.relatedAttribute[1] === LINK_SYMBOL ? \n mutationEvent.relatedAttribute.slice(2).concat('id').join('.') : // 从2开始就是关联关系的字段了\n (mutationEvent.relatedAttribute.length === 1 ? \n `${this.isSource ? 'target' : 'source'}.id` : // 只有1个字段,就是关联实体的 id\n `${this.isSource ? 'target' : 'source'}.${mutationEvent.relatedAttribute.slice(1).concat('id').join('.')}` // 有多个字段,就是关联实体再关联上的字段\n )\n \n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: relationMatchKey, value: ['=', relatedMutationEvent.oldRecord!.id]}), \n undefined, \n this.relationAttributeQuery\n );\n \n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const newValue = this.resolveSumField(relatedRecord) || 0;\n const oldValue = (await this.state.itemResult.get(newRelationWithEntity)) || 0;\n await this.state.itemResult.set(newRelationWithEntity, newValue);\n sum += newValue - oldValue;\n }\n\n return sum;\n }\n}\n\n// Export Summation computation handles\nexport const SummationHandles = [GlobalSumHandle, PropertySumHandle];","import { DataContext, PropertyDataContext } from \"./Computation.js\";\nimport { Average, AverageInstance, RelationInstance, EntityInstance } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { ComputationResult, DataBasedComputation, DataDep, RecordBoundState, GlobalBoundState, RecordsDataDep } from \"./Computation.js\";\nimport { EtityMutationEvent } from \"../Scheduler.js\";\nimport { MatchExp, AttributeQueryData, RecordQueryData, LINK_SYMBOL } from \"@storage\";\nimport { assert } from \"../util.js\";\n\nexport class GlobalAverageHandle implements DataBasedComputation {\n static computationType = Average\n static contextType = 'global' as const\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n record: (EntityInstance|RelationInstance)\n avgFieldPath: string[]\n \n constructor(public controller: Controller, public args: AverageInstance, public dataContext: DataContext) {\n this.record = this.args.record!\n \n // 获取 attributeQuery 的第一个字段作为平均值计算字段\n if (!this.args.attributeQuery || this.args.attributeQuery.length === 0) {\n throw new Error('Average computation requires attributeQuery with at least one field')\n }\n\n this.avgFieldPath = []\n let attrPointer:any = this.args.attributeQuery\n while(attrPointer) {\n this.avgFieldPath.push(Array.isArray(attrPointer[0]) ? attrPointer[0][0]: attrPointer[0])\n attrPointer = Array.isArray(attrPointer[0]) ? attrPointer[0][1].attributeQuery : null\n }\n\n this.dataDeps = {\n main: {\n type: 'records',\n source: this.record,\n attributeQuery: this.args.attributeQuery\n }\n }\n }\n \n createState() {\n return {\n sum: new GlobalBoundState<number>(0),\n count: new GlobalBoundState<number>(0),\n itemValue: new RecordBoundState<number>(0, this.record.name!)\n } \n }\n \n getDefaultValue() {\n return 0\n }\n\n resolveAvgField(record:any, avgFieldPath = this.avgFieldPath) {\n let base:any = record\n for(let attr of avgFieldPath) {\n base = base[attr]\n if (base === undefined || base === null) return null\n }\n return (Number.isNaN(base)||!Number.isFinite(base) ) ? null: base\n }\n \n async compute({main: records}: {main: any[]}): Promise<number> {\n let sum = 0;\n let count = 0;\n \n for (const record of records) {\n const value = this.resolveAvgField(record) || 0;\n sum += value;\n count++;\n await this.state.itemValue.set(record, value);\n }\n \n await this.state.sum.set(sum);\n await this.state.count.set(count);\n \n return count > 0 ? sum / count : 0;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 注意要同时检测名字和 relatedAttribute 才能确定是不是自己的更新\n if (mutationEvent.recordName !== (this.dataDeps.main as RecordsDataDep).source!.name || mutationEvent.relatedAttribute?.length) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n \n let count = await this.state.count.get() || 0;\n let sum = await this.state.sum.get() || 0;\n\n if (mutationEvent.type === 'create') {\n const newRecord = await this.controller.system.storage.findOne(\n this.record.name!, \n MatchExp.atom({key:'id', value:['=', mutationEvent.record!.id]}), \n undefined, \n this.args.attributeQuery\n )\n const value = this.resolveAvgField(newRecord) || 0;\n sum += value;\n count++;\n await this.state.itemValue.set(newRecord, value);\n } else if (mutationEvent.type === 'delete') {\n // Get the old value from state instead of returning fullRecompute\n const oldValue = (await this.state.itemValue.get(mutationEvent.record)) || 0;\n sum -= oldValue;\n count--;\n } else if (mutationEvent.type === 'update') {\n const newRecord = await this.controller.system.storage.findOne(\n this.record.name!, \n MatchExp.atom({key:'id', value:['=', mutationEvent.record!.id]}), \n undefined, \n this.args.attributeQuery\n )\n const newValue = this.resolveAvgField(newRecord) || 0;\n \n // Get the old value from state\n const oldValue = (await this.state.itemValue.get(mutationEvent.oldRecord)) || 0;\n \n // 更新 sum 和 count\n sum += newValue - oldValue;\n await this.state.itemValue.set(newRecord, newValue);\n }\n \n await this.state.sum.set(sum);\n await this.state.count.set(count);\n \n return count > 0 ? sum / count : 0;\n }\n}\n\n\nfunction setByPath(record: any, path: string[], value: any) {\n let base:any = record\n for(let attr of path.slice(0, -1)) {\n base = base[attr]\n }\n base[path.at(-1)!] = value\n}\n\n\nexport class PropertyAverageHandle implements DataBasedComputation {\n static computationType = Average\n static contextType = 'property' as const\n state!: ReturnType<typeof this.createState>\n useLastValue: boolean = true\n dataDeps: {[key: string]: DataDep} = {}\n relationAttr: string\n relatedRecordName: string\n isSource: boolean\n relation: RelationInstance\n property: string\n reverseProperty: string\n relationAttributeQuery: AttributeQueryData\n relatedAttributeQuery: AttributeQueryData\n avgFieldPath: string[]\n\n constructor(public controller: Controller, public args: AverageInstance, public dataContext: PropertyDataContext) {\n // Find relation by property name or fall back to record\n this.relation = this.controller.relations.find(r => (r.source === dataContext.host && r.sourceProperty === this.args.property) || (r.target === dataContext.host && r.targetProperty === this.args.property))!\n this.isSource = this.args.direction ? this.args.direction === 'source' : this.relation.source.name === dataContext.host.name\n assert(this.isSource ? this.relation.source === dataContext.host : this.relation.target === dataContext.host, 'average computation relation direction error')\n this.relationAttr = this.isSource ? this.relation.sourceProperty : this.relation.targetProperty\n this.relatedRecordName = this.isSource ? this.relation.target.name! : this.relation.source.name!\n this.property = this.args.property || this.relationAttr\n this.reverseProperty = this.isSource ? this.relation.targetProperty : this.relation.sourceProperty\n \n const attributeQuery = this.args.attributeQuery || []\n this.relatedAttributeQuery = attributeQuery.filter(item => item && item[0] !== LINK_SYMBOL) || []\n const relationQuery: AttributeQueryData|undefined = ((attributeQuery.find(item => item && item[0] === LINK_SYMBOL)||[])[1] as RecordQueryData)?.attributeQuery\n this.relationAttributeQuery = [\n [this.isSource ? 'target' : 'source', {attributeQuery: this.relatedAttributeQuery}],\n ...(relationQuery ? relationQuery : [])\n ]\n \n \n this.avgFieldPath = []\n let attrPointer:any = attributeQuery\n while(attrPointer) {\n this.avgFieldPath.push(Array.isArray(attrPointer[0]) ? attrPointer[0][0]: attrPointer[0])\n attrPointer = Array.isArray(attrPointer[0]) ? attrPointer[0][1].attributeQuery : null\n }\n \n this.dataDeps = {\n _current: {\n type: 'property',\n attributeQuery: [[this.relationAttr, {attributeQuery: this.args.attributeQuery}]]\n }\n }\n }\n\n createState() {\n return {\n count: new RecordBoundState<number>(0, this.dataContext.host.name),\n itemResult: new RecordBoundState<number>(0, this.relation.name!)\n } \n }\n \n getDefaultValue() {\n return 0\n }\n \n resolveAvgField(record:any, avgFieldPath = this.avgFieldPath) {\n let base:any = record\n for(let attr of avgFieldPath) {\n base = base[attr]\n if (base === undefined || base === null) return null\n }\n return base\n }\n\n async compute({_current}: {_current: any}): Promise<number> {\n const relations = _current[this.relationAttr] || [];\n let sum = 0;\n let count = 0;\n \n for (const relatedItem of relations) {\n const value = this.resolveAvgField(relatedItem, this.avgFieldPath) || 0;\n sum += value;\n count++;\n await this.state.itemResult.set(relatedItem, value);\n }\n \n await this.state.count.set(_current, count);\n \n return count > 0 ? sum / count : 0;\n }\n\n async incrementalCompute(lastValue: number, mutationEvent: EtityMutationEvent, record: any, dataDeps: {[key: string]: any}): Promise<number|ComputationResult> {\n // 只能支持通过 args.record 指定的关联关系或者关联实体的增量更新\n if (\n mutationEvent.recordName !== this.dataContext.host.name ||\n !mutationEvent.relatedAttribute ||\n mutationEvent.relatedAttribute.length === 0 || \n mutationEvent.relatedAttribute.length > 3 ||\n mutationEvent.relatedAttribute[0] !== this.relationAttr ||\n (mutationEvent.relatedAttribute[1] && mutationEvent.relatedAttribute[1] !== '&') ||\n (mutationEvent.relatedAttribute[2] && mutationEvent.relatedAttribute[2] !== (this.isSource ? 'target' : 'source'))\n ) {\n return ComputationResult.fullRecompute('mutationEvent.recordName not match')\n }\n\n const relatedMutationEvent = mutationEvent.relatedMutationEvent;\n if (!relatedMutationEvent) {\n return ComputationResult.fullRecompute('No related mutation event')\n }\n \n let count = await this.state.count.get(mutationEvent.record) || 0;\n let sum = (lastValue || 0) * count\n\n // 关联关系的新建\n if (relatedMutationEvent.type === 'create' && relatedMutationEvent.recordName === this.relation.name!) {\n \n const relationRecord = relatedMutationEvent.record!;\n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: 'id', value: ['=', relationRecord.id]}), \n undefined, \n this.relationAttributeQuery\n );\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const value = this.resolveAvgField(relatedRecord) || 0;\n sum += value;\n count++;\n await this.state.itemResult.set(newRelationWithEntity, value);\n } else if (relatedMutationEvent.type === 'delete' && relatedMutationEvent.recordName === this.relation.name!) {\n const oldResult = await this.state!.itemResult.get(relatedMutationEvent.record);\n sum = sum - oldResult; \n count--;\n } else if (relatedMutationEvent.type === 'update') {\n // 可能是关系更新也可能是关联实体更新\n const newRelationWithEntity = await this.controller.system.storage.findOne(\n this.relation.name!, \n MatchExp.atom({key: mutationEvent.relatedAttribute.slice(2).concat('id').join('.'), value: ['=', relatedMutationEvent.oldRecord!.id]}), \n undefined, \n this.relationAttributeQuery\n );\n\n const relatedRecord = newRelationWithEntity[this.isSource ? 'target' : 'source'];\n relatedRecord['&'] = newRelationWithEntity;\n const newValue = this.resolveAvgField(relatedRecord) || 0;\n\n const oldValue = (await this.state.itemResult.get(newRelationWithEntity)) || 0;\n await this.state.itemResult.set(newRelationWithEntity, newValue);\n \n // 更新 sum 和 count\n sum += newValue - oldValue;\n }\n\n await this.state.count.set(mutationEvent.record, count);\n \n return count > 0 ? sum / count : 0;\n }\n}\n\n// Export Average computation handles\nexport const AverageHandles = [GlobalAverageHandle, PropertyAverageHandle]; ","import { DataContext, PropertyDataContext } from \"./Computation.js\";\nimport { Custom, CustomInstance } from \"@shared\";\nimport { Controller } from \"../Controller.js\";\nimport { \n ComputationResult,\n ComputationResultPatch,\n DataBasedComputation,\n DataDep,\n RecordBoundState,\n GlobalBoundState\n} from \"./Computation.js\";\nimport { assert } from \"../util.js\";\n\n// Base class for shared implementation\nabstract class BaseCustomComputationHandle implements DataBasedComputation {\n static computationType = Custom\n \n state: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>} = {}\n useLastValue: boolean\n dataDeps: {[key: string]: DataDep} = {}\n \n computeCallback?: Function\n incrementalComputeCallback?: Function\n incrementalPatchComputeCallback?: Function\n createStateCallback?: Function\n getDefaultValueCallback?: Function\n asyncReturnCallback?: Function\n\n incrementalCompute?: (...args: any[]) => Promise<ComputationResult|any>\n incrementalPatchCompute?: (...args: any[]) => Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined>\n asyncReturn?: (...args: any[]) => Promise<ComputationResult|any>\n\n constructor(public controller: Controller, public args: CustomInstance, public dataContext: DataContext) {\n // 设置 useLastValue\n this.useLastValue = args.useLastValue !== undefined ? args.useLastValue : true;\n \n // 设置自定义的 dataDeps\n if (args.dataDeps) {\n this.dataDeps = args.dataDeps;\n }\n \n\n // CAUTION 下面一定要采用这种写法,因为 Scheduler 中是通过实例上有没有相应方法来决定如何更新数据的。\n\n // 保存回调函数引用\n if (args.compute) {\n this.computeCallback = args.compute;\n this.compute = async (...args: any[]): Promise<ComputationResult|any> => {\n if (this.computeCallback) {\n const [dataDeps, record] = args;\n const context = {\n controller: this.controller,\n state: this.state,\n getState: (key: string) => this.state[key]\n };\n return await this.computeCallback.call(context, dataDeps, record);\n }\n }\n }\n\n if (args.incrementalCompute) {\n this.incrementalComputeCallback = args.incrementalCompute;\n this.incrementalCompute = async (...args: any[]): Promise<ComputationResult|any> => {\n if (this.incrementalComputeCallback) {\n // 传递 lastValue, mutationEvent 等参数\n const [lastValue, mutationEvent, record, dataDeps] = args;\n const context = {\n controller: this.controller,\n state: this.state,\n getState: (key: string) => this.state[key]\n };\n return await this.incrementalComputeCallback.call(context, lastValue, mutationEvent, record, dataDeps);\n }\n // 如果没有定义增量计算,回退到全量计算\n return ComputationResult.fullRecompute('No incrementalCompute defined');\n }\n this.incrementalComputeCallback = args.incrementalCompute;\n }\n\n if (args.incrementalPatchCompute) {\n this.incrementalPatchComputeCallback = args.incrementalPatchCompute;\n this.incrementalPatchCompute = async (...args: any[]): Promise<ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined> => {\n if (this.incrementalPatchComputeCallback) {\n const [lastValue, mutationEvent, record, dataDeps] = args;\n const context = {\n controller: this.controller,\n state: this.state,\n getState: (key: string) => this.state[key]\n };\n return await this.incrementalPatchComputeCallback.call(context, lastValue, mutationEvent, record, dataDeps);\n }\n }\n }\n\n if (args.createState) {\n this.createStateCallback = args.createState;\n }\n if (args.getDefaultValue) {\n this.getDefaultValueCallback = args.getDefaultValue;\n }\n if (args.asyncReturn) {\n this.asyncReturnCallback = args.asyncReturn;\n this.asyncReturn = async (...args: any[]): Promise<ComputationResult|any> => {\n if (this.asyncReturnCallback) {\n const [asyncResult, dataDeps, record] = args;\n const context = {\n controller: this.controller,\n state: this.state,\n getState: (key: string) => this.state[key]\n };\n return await this.asyncReturnCallback.call(context, asyncResult, dataDeps, record);\n }\n }\n }\n \n // 如果提供了 createState,调用它来初始化 state\n if (this.createStateCallback) {\n this.state = this.createStateCallback.call(this.controller);\n // 绑定 state 到 controller\n Object.entries(this.state).forEach(([key, state]) => {\n state.key = key;\n state.controller = this.controller;\n });\n }\n }\n \n createState() {\n if (this.createStateCallback) {\n const states = this.createStateCallback.call(this.controller);\n // 绑定 state 到 controller\n Object.entries(states).forEach(([key, state]) => {\n (state as any).key = key;\n (state as any).controller = this.controller;\n });\n return states;\n }\n return {};\n }\n \n getDefaultValue() {\n if (this.getDefaultValueCallback) {\n return this.getDefaultValueCallback.call(this.controller);\n }\n return undefined;\n }\n \n async compute(...args: any[]): Promise<ComputationResult|any> {\n if (this.computeCallback) {\n // 传递 dataDeps 和 record(对于 property computation)\n const [dataDeps, record] = args;\n // 创建一个包含 state 的上下文对象\n const context = {\n controller: this.controller,\n state: this.state,\n getState: (key: string) => this.state[key]\n };\n return await this.computeCallback.call(context, dataDeps, record);\n }\n return ComputationResult.skip();\n }\n \n}\n\n// Create specific handle classes for each context type\nexport class GlobalCustomHandle extends BaseCustomComputationHandle {\n static contextType = 'global' as const\n}\n\nexport class EntityCustomHandle extends BaseCustomComputationHandle {\n static contextType = 'entity' as const\n}\n\nexport class RelationCustomHandle extends BaseCustomComputationHandle {\n static contextType = 'relation' as const\n}\n\nexport class PropertyCustomHandle extends BaseCustomComputationHandle {\n static contextType = 'property' as const\n\n constructor(controller: Controller, args: CustomInstance, dataContext: PropertyDataContext) {\n if (args.dataDeps) {\n const recordTypeDataDeps = Object.keys(args.dataDeps!).filter(key => args.dataDeps![key].type === 'records');\n assert(recordTypeDataDeps.length === 0, `property-level custom computation dataDeps should not contain \"records” type dataDeps, but got ${recordTypeDataDeps.join(', ')}\nIf you want to use related entity/relation as dataDeps, please use \"property\" type dataDeps with args: { type: \"property\", attributeQuery: [attributeQuery] }\nIf you want to use aggregated data from all records in the entity/relation, you should define a different dict value to store the aggregated data, and then use the dict value as dataDeps.\n`)\n }\n super(controller, args, dataContext);\n }\n}\n\n// Export all handles\nexport const CustomHandles = [\n GlobalCustomHandle,\n EntityCustomHandle,\n RelationCustomHandle,\n PropertyCustomHandle\n] ","import { AttributeQueryData, RecordQueryData } from \"../storage/index.js\";\nimport { DataDep, Computation, DataBasedComputation, RecordsDataDep } from \"./computations/Computation.js\";\nimport { PropertyDataContext } from \"./computations/Computation.js\";\nimport { Controller } from \"./Controller.js\";\nimport { InteractionEventEntity } from \"./activity/ActivityManager.js\";\nimport { DICTIONARY_RECORD, RecordMutationEvent, SYSTEM_RECORD } from \"./System.js\";\n\n// SourceMap 类型定义\nexport type EntityCreateEventsSourceMap = {\n dataDep: DataDep,\n type: 'create',\n // 当前事件所属的 entity 的 name,当前的 entity 不一定就是 dataDep 的 source 实体。可能是 dataDep source 的关联实体。\n recordName: string,\n // 当前实体是否是 relation 类型\n isRelation?: boolean,\n // dataDep 的 source 实体\n sourceRecordName: string,\n // 监听变化的属性相对于 dataDep 实体对象的路径。路径是从当前实体出发的。\n targetPath?: string[],\n // 当前要记录的事件是不是为了 record 初始化时就进行计算而用的。\n isInitial?: boolean\n computation: Computation,\n}\n\nexport type EntityDeleteEventsSourceMap = {\n dataDep: DataDep,\n type: 'delete',\n recordName: string,\n sourceRecordName: string,\n targetPath?: string[],\n isRelation?: boolean,\n computation: Computation\n}\n\nexport type EntityUpdateEventsSourceMap = {\n dataDep: DataDep,\n type: 'update',\n recordName: string,\n attributes: string[],\n sourceRecordName: string,\n targetPath?: string[],\n computation: Computation,\n isRelation?: boolean\n}\n\nexport type EntityEventSourceMap = EntityCreateEventsSourceMap | EntityDeleteEventsSourceMap | EntityUpdateEventsSourceMap\n\nexport type EtityMutationEvent = RecordMutationEvent & {\n dataDep: DataDep,\n attributes?: string[],\n relatedAttribute?: string[],\n relatedMutationEvent?: RecordMutationEvent,\n isRelation?: boolean\n}\n\n// SourceMapTree 类型\nexport type DataSourceMapTree = {\n [key: string]: {\n [key: string]: EntityEventSourceMap[]\n }\n}\n\n// SourceMap 管理类 - 持有数据并提供查询接口\nexport class ComputationSourceMapManager {\n private sourceMaps: EntityEventSourceMap[] = []\n private sourceMapTree: DataSourceMapTree = {}\n\n constructor(public controller: Controller) {\n \n }\n\n /**\n * 初始化或重新初始化 SourceMap 数据\n * @param sourceMaps EntityEventSourceMap 数组\n */\n initialize(computations: Set<Computation>): void {\n const ERMutationEventSources: EntityEventSourceMap[]= []\n\n for(const computation of computations) {\n // 1. 根据 data deps 计算出 mutation events\n if( this.isDataBasedComputation(computation)) {\n ERMutationEventSources.push(\n ...Object.entries(computation.dataDeps).map(([dataDepName, dataDep]) => this.convertDataDepToERMutationEventsSourceMap(dataDepName, dataDep, computation)).flat()\n )\n\n // 2. 监听自身 record 的 create 事件,可能一开始创建就要执行一遍 computation. 如果依赖了已有的 global dict。\n if (computation.dataContext.type === 'property' && Object.values(computation.dataDeps).some(dataDep => dataDep.type === 'global')) {\n const selfDataDep: RecordsDataDep = {\n type: 'records',\n source: computation.dataContext.host,\n }\n ERMutationEventSources.push(...this.convertDataDepToERMutationEventsSourceMap('_self', selfDataDep, computation, 'create'))\n }\n } else {\n // TODO 是不是可以和 DataBasedComputation 统一处理?因为监听的 Interaction 也是一种 entity。\n // 2. EventBasedComputation 等同于监听 \n // - Interaction 的 create 事件\n // - TODO Activity 的 create 事件?确定需要吗?\n const recordDataDep: RecordsDataDep = {\n type: 'records',\n source: InteractionEventEntity,\n attributeQuery: ['*']\n }\n ERMutationEventSources.push(...this.convertDataDepToERMutationEventsSourceMap('record', recordDataDep, computation, 'create'))\n }\n }\n\n\n this.sourceMaps = [...ERMutationEventSources]\n this.sourceMapTree = this.buildDataSourceMapTree(this.sourceMaps)\n }\n isDataBasedComputation(computation: Computation): computation is DataBasedComputation {\n return (computation as DataBasedComputation).compute !== undefined\n }\n /**\n * 添加新的 SourceMap\n * @param sourceMap 要添加的 EntityEventSourceMap\n */\n addSourceMap(sourceMap: EntityEventSourceMap): void {\n this.sourceMaps.push(sourceMap)\n this.addToTree(sourceMap)\n }\n\n /**\n * 批量添加 SourceMap\n * @param sourceMaps 要添加的 EntityEventSourceMap 数组\n */\n addSourceMaps(sourceMaps: EntityEventSourceMap[]): void {\n this.sourceMaps.push(...sourceMaps)\n sourceMaps.forEach(sourceMap => this.addToTree(sourceMap))\n }\n\n /**\n * 根据 mutation event 查找对应的 SourceMap\n * @param mutationEvent RecordMutationEvent\n * @returns 匹配的 EntityEventSourceMap 数组\n */\n findSourceMapsForMutation(mutationEvent: RecordMutationEvent): EntityEventSourceMap[] {\n return this.sourceMapTree[mutationEvent.recordName]?.[mutationEvent.type] || []\n }\n\n /**\n * 检查 update 类型的 SourceMap 是否需要触发计算\n * @param source EntityEventSourceMap\n * @param mutationEvent RecordMutationEvent\n * @returns 是否需要触发计算\n */\n shouldTriggerUpdateComputation(source: EntityEventSourceMap, mutationEvent: RecordMutationEvent): boolean {\n if (source.type !== 'update') {\n return true\n }\n \n // 特殊处理 Global 类型的数据依赖\n if (source.dataDep.type === 'global' && mutationEvent.recordName === SYSTEM_RECORD) {\n // 检查是否是 state 类型的记录,并且 key 匹配\n return mutationEvent.record?.concept === DICTIONARY_RECORD && \n mutationEvent.record?.key === source.dataDep.source.name\n } else {\n // 如果是更新,检查是否是依赖的属性有变化。\n const propAttrs = source.attributes!.filter(attr => attr !== 'id')\n return !propAttrs.every(attr => \n !mutationEvent.record!.hasOwnProperty(attr) || \n (mutationEvent.record![attr] === mutationEvent.oldRecord![attr])\n )\n }\n }\n\n convertDataDepToERMutationEventsSourceMap(dataDepName:string, dataDep: DataDep, computation: Computation, eventType?: 'create'|'delete'|'update', isInitial: boolean = false): EntityEventSourceMap[] {\n const ERMutationEventsSource: EntityEventSourceMap[]= []\n if (dataDep.type === 'records') {\n // 监听的是某个 records 集合。例如全局的 Count 就需要。\n // 没有指定 eventType 就说明全都要监听\n if (!eventType || eventType === 'create') {\n ERMutationEventsSource.push({\n dataDep: dataDep,\n type: 'create',\n recordName: dataDep.source.name!,\n sourceRecordName: dataDep.source.name!,\n computation,\n isInitial,\n })\n }\n if (!eventType || eventType === 'delete') {\n ERMutationEventsSource.push({ \n dataDep: dataDep,\n type: 'delete',\n recordName: dataDep.source.name!,\n sourceRecordName: dataDep.source.name!,\n computation\n })\n }\n \n if (!eventType || eventType === 'update') {\n // 监听 update\n if (dataDep.attributeQuery) {\n ERMutationEventsSource.push(...this.convertAttrsToERMutationEventsSourceMap(dataDep, dataDep.source.name!, dataDep.attributeQuery, [], computation, false))\n }\n }\n \n } else if (dataDep.type==='property') {\n // 依赖的是单个记录的某个 property 属性,或者关联实体、关联关系。例如自定义的计算中就常见。\n // 只能监听 update eventType。\n const dataContext = computation.dataContext as PropertyDataContext\n\n if (dataDep.attributeQuery) {\n // 注意这里的 recordName 应该是当前数据 entity 的 name,因为依赖的是 property 所在的自身 entity\n ERMutationEventsSource.push(...this.convertAttrsToERMutationEventsSourceMap(dataDep, dataContext.host.name!, dataDep.attributeQuery, [], computation, true))\n }\n } else if (dataDep.type ==='global') {\n // 依赖的是全局的一个 Dict 值。注意这里理论上只有 create 和 update,初始化的时候会得到创建的事件。全局的值是不会删除的。\n // Global 数据存储在 _System_ 表中,监听 state 类型的记录更新\n if (!eventType || eventType === 'update') {\n ERMutationEventsSource.push({\n dataDep: dataDep,\n type: 'update',\n recordName: SYSTEM_RECORD,\n sourceRecordName: SYSTEM_RECORD,\n attributes: ['value'],\n computation\n })\n }\n\n // create 也需要监听,因为可能依赖了已有的 global dict。\n if (!eventType || eventType === 'create'){\n ERMutationEventsSource.push({\n dataDep: dataDep,\n type: 'create',\n recordName: SYSTEM_RECORD,\n sourceRecordName: SYSTEM_RECORD,\n computation\n })\n }\n }\n\n return ERMutationEventsSource\n }\n \n convertAttrsToERMutationEventsSourceMap(dataDep: DataDep, baseRecordName: string, attributes: AttributeQueryData, context: string[], computation: Computation, includeCreate: boolean = false) {\n const ERMutationEventsSource: EntityEventSourceMap[] = []\n const primitiveAttr: string[] = []\n const relationQueryAttr: [string, RecordQueryData][] = []\n \n\n attributes.forEach(attr => {\n if (typeof attr === 'string' && attr !== '*') {\n primitiveAttr.push(attr)\n } else if (attr ==='*') {\n // TODO 要读定义\n } else if (Array.isArray(attr)) {\n relationQueryAttr.push(attr as [string, RecordQueryData])\n } else {\n throw new Error(`unknown attribute type: ${attr}`)\n }\n })\n // 自身的 attribute update\n if (primitiveAttr.length > 0) {\n let recordName = baseRecordName\n if (context.length>0) {\n if (context.at(-1) === '&') {\n recordName = this.controller.system.storage.getRelationName(baseRecordName, context.slice(0, -1).join('.'))\n } else {\n recordName = this.controller.system.storage.getEntityName(baseRecordName, context.join('.'))\n }\n }\n // 当依赖是 property 的时候,record 的创建也要监听,相当于初次就要执行 computation\n if (includeCreate) {\n ERMutationEventsSource.push({\n dataDep,\n type: 'create',\n recordName,\n sourceRecordName: baseRecordName,\n targetPath: context,\n computation\n })\n }\n ERMutationEventsSource.push({\n dataDep,\n type: 'update',\n recordName,\n sourceRecordName: baseRecordName,\n targetPath: context,\n attributes: primitiveAttr,\n computation\n })\n }\n\n // 关联 record 字段的更新\n relationQueryAttr.forEach(([attrName, subQuery]) => {\n ERMutationEventsSource.push(...this.convertRelationAttrToERMutationEventsSourceMap(dataDep, baseRecordName, subQuery.attributeQuery!, context.concat(attrName), computation))\n })\n return ERMutationEventsSource\n }\n\n convertRelationAttrToERMutationEventsSourceMap(dataDep: DataDep, baseRecordName: string, subAttrs: AttributeQueryData, context: string[], computation: Computation) {\n const ERMutationEventsSource: EntityEventSourceMap[] = []\n\n if (context.at(-1) !== '&') {\n // 1. 先监听\"关联实体关系\"的 create/delete\n const realtionRecordName = this.controller.system.storage.getRelationName(baseRecordName, context.join('.'))\n ERMutationEventsSource.push({\n dataDep,\n type: 'create',\n recordName: realtionRecordName,\n sourceRecordName: baseRecordName,\n isRelation: true,\n targetPath: context,\n computation\n }, {\n dataDep,\n type: 'delete',\n recordName: realtionRecordName,\n sourceRecordName: baseRecordName,\n isRelation: true,\n targetPath: context,\n computation\n })\n }\n // 2. 监听关联实体的属性 update\n if (subAttrs.length > 0) {\n ERMutationEventsSource.push(...this.convertAttrsToERMutationEventsSourceMap(dataDep, baseRecordName, subAttrs, context, computation))\n }\n \n return ERMutationEventsSource\n\n \n }\n\n /**\n * 获取所有 SourceMap\n * @returns 所有的 EntityEventSourceMap 数组\n */\n getAllSourceMaps(): EntityEventSourceMap[] {\n return [...this.sourceMaps]\n }\n\n /**\n * 根据 recordName 获取相关的 SourceMap\n * @param recordName 记录名称\n * @returns 相关的 EntityEventSourceMap 数组\n */\n getSourceMapsByRecordName(recordName: string): EntityEventSourceMap[] {\n return this.sourceMaps.filter(sourceMap => \n sourceMap.recordName === recordName || sourceMap.sourceRecordName === recordName\n )\n }\n\n\n /**\n * 清空所有 SourceMap 数据\n */\n clear(): void {\n this.sourceMaps = []\n this.sourceMapTree = {}\n }\n\n /**\n * 获取 SourceMapTree 的只读副本\n * @returns DataSourceMapTree 的副本\n */\n getSourceMapTree(): DataSourceMapTree {\n // 使用浅拷贝避免循环引用问题\n const result: DataSourceMapTree = {}\n for (const [recordName, typeMap] of Object.entries(this.sourceMapTree)) {\n result[recordName] = {}\n for (const [type, sourceMaps] of Object.entries(typeMap)) {\n result[recordName][type] = [...sourceMaps]\n }\n }\n return result\n }\n\n /**\n * 私有方法:构建 SourceMap 树结构\n * @param sourceMaps EntityEventSourceMap 数组\n * @returns 两层结构的树,第一层是 recordName,第二层是 type\n */\n private buildDataSourceMapTree(sourceMaps: EntityEventSourceMap[]): DataSourceMapTree {\n const sourceMapTree: DataSourceMapTree = {}\n sourceMaps.forEach(source => {\n this.addToTree(source, sourceMapTree)\n })\n return sourceMapTree\n }\n\n /**\n * 私有方法:将单个 SourceMap 添加到树结构中\n * @param source EntityEventSourceMap\n * @param tree 可选的目标树,默认使用实例的 sourceMapTree\n */\n private addToTree(source: EntityEventSourceMap, tree?: DataSourceMapTree): void {\n const targetTree = tree || this.sourceMapTree\n if (!targetTree[source.recordName]) {\n targetTree[source.recordName] = {}\n }\n if (!targetTree[source.recordName][source.type]) {\n targetTree[source.recordName][source.type] = []\n }\n targetTree[source.recordName][source.type].push(source)\n }\n} ","import { MatchExp } from \"@storage\";\nimport { Entity, Property, Relation, EntityInstance, RelationInstance, PropertyInstance, IInstance } from \"@shared\";\nimport { type EtityMutationEvent } from \"./ComputationSourceMap.js\";\nimport { Controller } from \"./Controller.js\";\nimport { DataContext, PropertyDataContext, EntityDataContext, RelationDataContext } from \"./computations/Computation.js\";\nimport { assert } from \"./util.js\";\nimport {\n SchedulerError,\n ComputationError, ComputationStateError,\n ComputationDataDepError\n} from \"./errors/index.js\";\nimport { Computation, ComputationClass, ComputationResult, ComputationResultAsync, ComputationResultFullRecompute, ComputationResultResolved, ComputationResultSkip, DataBasedComputation, EventBasedComputation, GlobalBoundState, RecordBoundState, RecordsDataDep } from \"./computations/Computation.js\";\nimport { DICTIONARY_RECORD, RecordMutationEvent, SYSTEM_RECORD } from \"./System.js\";\nimport {\n EntityEventSourceMap,\n DataSourceMapTree,\n ComputationSourceMapManager,\n EntityCreateEventsSourceMap\n} from \"./ComputationSourceMap.js\";\n\nexport { EtityMutationEvent };\n\nexport const ASYNC_TASK_RECORD = '_ASYNC_TASK_'\n\ntype ComputationContextType = 'global' | 'entity' | 'relation' | 'property'\n\nexport class Scheduler {\n computations = new Set<Computation>()\n private sourceMapManager: ComputationSourceMapManager\n private computationHandleMap: Map<any, { [key in ComputationContextType]?: { new(...args: any[]): Computation } }> = new Map()\n \n constructor(\n public controller: Controller, \n entities: EntityInstance[], \n relations: RelationInstance[], \n dict: PropertyInstance[],\n computationHandles: Array<{ new(...args: any[]): Computation }>\n ) {\n this.sourceMapManager = new ComputationSourceMapManager(this.controller)\n this.buildComputationHandleMap(computationHandles)\n const computationInputs: {dataContext: DataContext, args: IInstance}[] = []\n entities.forEach(entity => {\n if (entity.computation) {\n computationInputs.push({dataContext: {type: 'entity',id: entity},args: entity.computation})\n }\n\n // property 的\n entity.properties?.forEach(property => {\n if (property.computation) {\n computationInputs.push({dataContext: {type: 'property',host: entity,id: property},args: property.computation})\n }\n })\n })\n\n // relation 的\n relations.forEach(relation => {\n const relationWithComputation = relation as RelationInstance & { computation?: unknown; properties?: PropertyInstance[] };\n if(relationWithComputation.computation) {\n computationInputs.push({dataContext: {type: 'relation',id: relation},args: relationWithComputation.computation})\n }\n\n if (relationWithComputation.properties) {\n relationWithComputation.properties.forEach((property: PropertyInstance) => {\n if (property.computation) {\n computationInputs.push({dataContext: {type: 'property',host: relation,id: property},args: property.computation})\n }\n })\n }\n })\n\n dict.forEach(dictItem => {\n if (dictItem.computation) {\n computationInputs.push({dataContext: {type: 'global',id: dictItem.name},args: dictItem.computation})\n }\n })\n\n\n for(const computationInput of computationInputs) {\n const dataContext = computationInput.dataContext\n const args = computationInput.args as { constructor: { displayName?: string; name?: string } }\n const contextMap = this.computationHandleMap.get(args.constructor)\n assert(!!contextMap, `cannot find Computation handle map for ${args.constructor.displayName || args.constructor.name}`)\n const ComputationCtor = contextMap![dataContext.type] as ComputationClass\n assert(!!ComputationCtor, `cannot find Computation handle for ${args.constructor.displayName || args.constructor.name} with context type ${dataContext.type}`)\n const computation = new ComputationCtor(this.controller, args, dataContext)\n this.computations.add(computation)\n\n\n // 为每一个 async computation 建立自己所需要的 task 任务表。应该每一个 asyncComputation 都有一张独立的表。global state 总共一张。\n if(this.isAsyncComputation(computation)) {\n if (computation.dataContext.type === 'property') {\n const AsyncTaskEntity = Entity.create({\n name: this.getAsyncTaskRecordKey(computation),\n properties: [\n Property.create({\n name: 'status',\n type: 'string',\n }),\n Property.create({\n name: 'args',\n type: 'json',\n }),\n Property.create({\n name: 'result',\n type: 'json',\n })\n ]})\n const AsyncTaskRelation = Relation.create({\n name: `${AsyncTaskEntity.name}_${computation.dataContext.host.name}_${computation.dataContext.id.name}`,\n source: AsyncTaskEntity,\n target: computation.dataContext.host,\n sourceProperty: 'record',\n targetProperty: `_${computation.dataContext.id.name}_task`,\n type: '1:1'\n })\n entities.push(AsyncTaskEntity)\n relations.push(AsyncTaskRelation)\n } else if (computation.dataContext.type === 'global') {\n // Global 类型的异步任务表\n const AsyncTaskEntity = Entity.create({\n name: this.getAsyncTaskRecordKey(computation),\n properties: [\n Property.create({\n name: 'status',\n type: 'string',\n }),\n Property.create({\n name: 'args',\n type: 'json',\n }),\n Property.create({\n name: 'result',\n type: 'json',\n }),\n Property.create({\n name: 'globalKey',\n type: 'string',\n })\n ]\n })\n entities.push(AsyncTaskEntity)\n } else if (computation.dataContext.type === 'entity') {\n // Entity 类型的异步任务表\n const entityContext = computation.dataContext as EntityDataContext\n const AsyncTaskEntity = Entity.create({\n name: this.getAsyncTaskRecordKey(computation),\n properties: [\n Property.create({\n name: 'status',\n type: 'string',\n }),\n Property.create({\n name: 'args',\n type: 'json',\n }),\n Property.create({\n name: 'result',\n type: 'json',\n }),\n Property.create({\n name: 'entityName',\n type: 'string',\n })\n ]\n })\n entities.push(AsyncTaskEntity)\n } else if (computation.dataContext.type === 'relation') {\n // Relation 类型的异步任务表\n const relationContext = computation.dataContext as RelationDataContext\n const AsyncTaskEntity = Entity.create({\n name: this.getAsyncTaskRecordKey(computation),\n properties: [\n Property.create({\n name: 'status',\n type: 'string',\n }),\n Property.create({\n name: 'args',\n type: 'json',\n }),\n Property.create({\n name: 'result',\n type: 'json',\n }),\n Property.create({\n name: 'relationName',\n type: 'string',\n })\n ]\n })\n entities.push(AsyncTaskEntity)\n }\n }\n }\n }\n \n private buildComputationHandleMap(computationHandles: Array<{ new(...args: any[]): Computation }>) {\n for (const handle of computationHandles) {\n const handleClass = handle as any\n if (handleClass.computationType && handleClass.contextType) {\n if (!this.computationHandleMap.has(handleClass.computationType)) {\n this.computationHandleMap.set(handleClass.computationType, {})\n }\n const contextMap = this.computationHandleMap.get(handleClass.computationType)!\n \n if (Array.isArray(handleClass.contextType)) {\n for (const contextType of handleClass.contextType) {\n assert(!contextMap[contextType as ComputationContextType], `${contextType} for ${handleClass.computationType.name} is already registered.`)\n contextMap[contextType as ComputationContextType] = handle\n }\n } else {\n contextMap[handleClass.contextType as ComputationContextType] = handle\n }\n }\n }\n }\n \n getBoundStateName(dataContext: DataContext, stateName: string, stateItem: RecordBoundState<any>|GlobalBoundState<any>) {\n\n const stateDataContextKey = dataContext.type === 'property' ? \n `${dataContext.host.name}_${dataContext.id.name}` : \n (dataContext.type === 'entity' || dataContext.type === 'relation') ? dataContext.id.name : dataContext.id\n\n return `_${stateDataContextKey}_bound_${stateName}`\n }\n createStates() {\n const states: {dataContext: DataContext, state: {[key: string]: RecordBoundState<any>|GlobalBoundState<any>}}[] = []\n for(const computation of this.computations) {\n if (computation.createState) {\n const state = computation.createState()\n states.push({dataContext: computation.dataContext, state})\n computation.state = state\n\n\n for(let [stateName, stateItem] of Object.entries(state)) {\n stateItem.controller = this.controller\n stateItem.key = this.getBoundStateName(computation.dataContext, stateName, stateItem)\n if (stateItem instanceof RecordBoundState) {\n if (!stateItem.record) {\n if (computation.dataContext.type === 'property') {\n stateItem.record = (computation.dataContext as PropertyDataContext)!.host.name!\n } else if (computation.dataContext.type === 'entity') {\n stateItem.record = (computation.dataContext as EntityDataContext)!.id.name!\n } else if (computation.dataContext.type === 'relation') {\n stateItem.record = (computation.dataContext as RelationDataContext)!.id.name!\n } else {\n throw new Error(`global data context ${computation.dataContext.id} must specify record name for RecordBoundState`)\n }\n }\n }\n }\n } \n }\n return states\n }\n\n async setupDefaultValues() {\n for(const computation of this.computations) {\n // CAUTION 非 property 的 computation 的 defaultValue 直接 applyResult 即可。\n \n if(computation.getDefaultValue) {\n if (computation.dataContext.type==='global' || computation.dataContext.type==='entity' || computation.dataContext.type==='relation') {\n const defaultValue = await computation.getDefaultValue()\n await this.controller.applyResult(computation.dataContext, defaultValue)\n } else {\n // property 的默认值需要在 scheduler 监听 property 的 record 创建事件,来设置默认值。\n // 监听 record 的创建事件,来设置默认值。\n const propertyDataContext = computation.dataContext as PropertyDataContext\n\n // assertion: 有 computation 的 property 就不能有原本的 defaultValue 了,因为会被 computation 的 getDefaultValue 覆盖。\n assert(!propertyDataContext.id.defaultValue, `${propertyDataContext.host.name}.${propertyDataContext.id.name} property shuold not has a defaultValue, because it will be overridden by computation`)\n\n // TODO 未来合成一个 listener ?\n this.controller.system.storage.listen(async (mutationEvents) => {\n for(let mutationEvent of mutationEvents){\n if (mutationEvent.type === 'create' && mutationEvent.recordName === propertyDataContext.host.name) {\n const defaultValue = await computation.getDefaultValue?.(mutationEvent.record)\n if (defaultValue !== undefined) {\n await this.controller.applyResult(propertyDataContext, defaultValue, mutationEvent.record)\n }\n }\n }\n })\n }\n }\n }\n }\n async setupStateDefaultValues() {\n for(const computation of this.computations) {\n const computationHandle = computation as Computation\n // 1. 创建计算所需要的 state\n if (computationHandle.state) {\n for(const state of Object.values(computationHandle.state)) {\n if (state instanceof GlobalBoundState) {\n state.controller = this.controller\n await this.controller.system.storage.set(DICTIONARY_RECORD, state.key , state.defaultValue ?? null)\n } \n }\n }\n }\n }\n erMutationEventSources: EntityEventSourceMap[] = []\n dataSourceMapTree: DataSourceMapTree = {}\n async setupMutationListeners() {\n this.sourceMapManager.initialize(this.computations)\n this.dataSourceMapTree = this.sourceMapManager.getSourceMapTree()\n\n this.controller.system.storage.listen(async (mutationEvents) => {\n for(let mutationEvent of mutationEvents){\n const sources = this.sourceMapManager.findSourceMapsForMutation(mutationEvent)\n if (sources.length > 0) {\n for(const source of sources) {\n if(!this.sourceMapManager.shouldTriggerUpdateComputation(source, mutationEvent)) {\n continue\n }\n await this.runDirtyRecordsComputation(source, mutationEvent)\n }\n }\n }\n })\n\n // TODO 未来也许要监听 MutationEvent,让开发者能观测系统的变化。\n }\n async computeDirtyDataDepRecords(source: EntityEventSourceMap, mutationEvent: RecordMutationEvent): Promise<any[]> {\n // 1. 就是自身的变化\n if(!source.targetPath?.length) {\n return [mutationEvent.oldRecord ?? mutationEvent.record]\n }\n\n // 2. 关联关系、关联实体的变化\n let dirtyDataDepRecords: any[] = []\n if (!source.isRelation) { \n // 2.1. 关联实体的 update 事件,create/delete 不用管,因为那些会先有关系的 create/delete 事件。\n assert(source.type === 'update', 'only support update event for entity')\n dirtyDataDepRecords = await this.controller.system.storage.find(source.sourceRecordName, MatchExp.atom({\n key: source.targetPath!.concat('id').join('.'),\n value: ['=', mutationEvent.oldRecord!.id]\n }), undefined)\n } else {\n // 2.2. 关联关系的 create/delete 事件(不一定是直接的关联关系),计算出关联关系的增删改最终影响了哪些当前 dataDep\n assert(source.type === 'create' || source.type === 'delete', 'only support create/delete event for relation')\n \n const dataDep = source.dataDep as RecordsDataDep\n if (source.type === 'create') {\n dirtyDataDepRecords = await this.controller.system.storage.find(source.sourceRecordName, MatchExp.atom({\n key: source.targetPath!.concat(['&','id']).join('.'),\n value: ['=', mutationEvent.record!.id]\n }), undefined)\n } else {\n // 关系的删除\n // TODO 需要确定一下,是不是没考虑 targetPath 中间 semmetric relation 的情况\n const relation = this.controller.relations.find(relation => relation.name === source.recordName)!\n const isSemmetricRelation = relation.sourceProperty === relation.targetProperty && relation.source === relation.target\n\n if (isSemmetricRelation) {\n dirtyDataDepRecords = await this.controller.system.storage.find(source.sourceRecordName, MatchExp.atom({\n // 因为关系已经删掉了,所以必须用倒数第二个节点的信息来判断影响了谁。\n key: source.targetPath!.slice(0, -1).concat('id').join('.'),\n value: ['in', [mutationEvent.record!.source.id, mutationEvent.record!.target.id]]\n }), undefined)\n } else {\n const isSource = relation?.sourceProperty === source.targetPath!.at(-1)\n dirtyDataDepRecords = await this.controller.system.storage.find(source.sourceRecordName, MatchExp.atom({\n // 因为关系已经删掉了,所以必须用倒数第二个节点的信息来判断影响了谁。\n key: source.targetPath!.slice(0, -1).concat('id').join('.'),\n value: ['=', mutationEvent.record![isSource ? 'source' : 'target']!.id]\n }), undefined)\n }\n \n }\n }\n\n return dirtyDataDepRecords\n }\n computeOldRecord(newRecord: any, sourceMap: EntityEventSourceMap, mutationEvent: RecordMutationEvent) {\n // FIXME 理论上我们现在不需要 computeOldRecord 了。\n if(!sourceMap.targetPath?.length) {\n return mutationEvent.oldRecord\n }\n return {...newRecord}\n }\n async computeDataBasedDirtyRecordsAndEvents(source: EntityEventSourceMap, mutationEvent: RecordMutationEvent) {\n let dirtyRecordsAndEvents: [any, EtityMutationEvent][] = []\n\n // 特殊处理 Global 类型的数据依赖\n if (source.dataDep.type === 'global' && mutationEvent.recordName === SYSTEM_RECORD) {\n // 对于 Global 类型,需要找到所有依赖这个 global 值的记录\n // 如果是 property 级别的 dataContext,需要找到所有实体记录,就是记录都受影响了\n if (source.computation.dataContext.type === 'property') {\n const propertyContext = source.computation.dataContext as PropertyDataContext\n const allRecords = await this.controller.system.storage.find(propertyContext.host.name!, MatchExp.atom({key:'id', value:['not', null]}), {}, ['*'])\n dirtyRecordsAndEvents = allRecords.map(record => [record, {\n dataDep: source.dataDep,\n type: 'update',\n recordName: propertyContext.host.name!,\n record: record,\n oldRecord: record,\n relatedMutationEvent: mutationEvent\n }])\n } else if (source.computation.dataContext.type === 'global') {\n // 对于 global 级别的计算,不需要具体的记录\n dirtyRecordsAndEvents = [[null, {\n dataDep: source.dataDep,\n ...mutationEvent\n }]]\n }\n } else if(!source.targetPath?.length) {\n // 就是本身变化了。\n dirtyRecordsAndEvents = [[mutationEvent.record, {\n dataDep: source.dataDep,\n ...mutationEvent\n }]]\n } else {\n // 是关联关系或者关联实体变化了\n const dataDepRecords = await this.computeDirtyDataDepRecords(source, mutationEvent)\n dirtyRecordsAndEvents = dataDepRecords.map(record => [record, {\n dataDep: source.dataDep,\n type: 'update',\n recordName: source.sourceRecordName,\n record: record,\n oldRecord: this.computeOldRecord(record, source, mutationEvent),\n relatedAttribute: source.targetPath,\n relatedMutationEvent: mutationEvent\n }])\n }\n return dirtyRecordsAndEvents\n }\n async computeEventBasedDirtyRecordsAndEvents(source: EntityEventSourceMap, mutationEvent: RecordMutationEvent) {\n const eventBasedComputation = source.computation as EventBasedComputation\n if (eventBasedComputation.computeDirtyRecords) {\n let dirtyRecords = (await eventBasedComputation.computeDirtyRecords!(mutationEvent)) || []\n dirtyRecords = Array.isArray(dirtyRecords) ? dirtyRecords : [dirtyRecords]\n return dirtyRecords.filter(Boolean).map(record => [record, {\n dataDep: source.dataDep,\n ...mutationEvent\n }]) as [any, EtityMutationEvent][]\n } else {\n return [[null, {\n dataDep: source.dataDep,\n ...mutationEvent\n }]] as [any, EtityMutationEvent][]\n }\n }\n isDataBasedComputation(computation: Computation) {\n return (computation as DataBasedComputation).compute !== undefined\n }\n async runDirtyRecordsComputation(source: EntityEventSourceMap, mutationEvent: RecordMutationEvent) {\n try {\n if ((source as EntityCreateEventsSourceMap).isInitial) {\n await this.runComputation(source.computation, mutationEvent, mutationEvent.record, true)\n } else {\n let dirtyRecordsAndEvents: [any, EtityMutationEvent][] = []\n \n try {\n if (this.isDataBasedComputation(source.computation)) {\n dirtyRecordsAndEvents = await this.computeDataBasedDirtyRecordsAndEvents(source, mutationEvent)\n } else {\n dirtyRecordsAndEvents = await this.computeEventBasedDirtyRecordsAndEvents(source, mutationEvent)\n }\n } catch (e) {\n const error = new ComputationError('Failed to compute dirty records and events', {\n handleName: source.computation.constructor.name,\n computationName: source.computation.args.constructor.displayName,\n dataContext: source.computation.dataContext,\n computationPhase: 'dirty-records-computation',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n \n for(const [record, erRecordMutationEvent] of dirtyRecordsAndEvents) {\n try {\n await this.runComputation(source.computation, erRecordMutationEvent, record)\n } catch (e) {\n // Log the error but continue with other records to avoid blocking the entire batch\n const error = new ComputationError('Failed to run computation for dirty record', {\n handleName: source.computation.constructor.name,\n computationName: source.computation.args.constructor.displayName,\n dataContext: source.computation.dataContext,\n computationPhase: 'batch-computation',\n context: { recordId: record?.id },\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n // For now, re-throw to maintain existing behavior, but in production you might want to log and continue\n throw error\n }\n }\n }\n } catch (e) {\n if (e instanceof ComputationError) {\n throw e\n }\n const error = new SchedulerError('Unexpected error in dirty records computation', {\n schedulingPhase: 'dirty-records-processing',\n failedComputations: [source.computation.args.constructor.displayName],\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n getAsyncTaskRecordKey(computation: Computation) {\n if (computation.dataContext.type === 'property') {\n const propertyContext = computation.dataContext as PropertyDataContext\n return `${ASYNC_TASK_RECORD}_${propertyContext.host.name}_${propertyContext.id.name}`\n } else if (computation.dataContext.type === 'global') {\n return `${ASYNC_TASK_RECORD}_${computation.dataContext.id}`\n } else {\n // entity 或其他类型\n return `${ASYNC_TASK_RECORD}_${computation.dataContext.type}_${(computation.dataContext as any).id?.name || computation.dataContext.id}`\n }\n }\n async createAsyncTask(computation: Computation, args: any, record?: any, result?: any) {\n // 根据不同 dataContext 来创建不同的 task\n if (computation.dataContext.type === 'property') {\n return this.controller.system.storage.create(this.getAsyncTaskRecordKey(computation), {\n status: result === undefined ? 'pending' : 'success',\n args,\n record,\n result\n })\n } else if (computation.dataContext.type === 'global') {\n return this.controller.system.storage.create(this.getAsyncTaskRecordKey(computation), {\n status: result === undefined ? 'pending' : 'success',\n args,\n globalKey: computation.dataContext.id,\n result\n })\n } else if (computation.dataContext.type === 'entity') {\n const entityContext = computation.dataContext as EntityDataContext\n return this.controller.system.storage.create(this.getAsyncTaskRecordKey(computation), {\n status: result === undefined ? 'pending' : 'success',\n args,\n entityName: entityContext.id.name,\n result\n })\n } else if (computation.dataContext.type === 'relation') {\n const relationContext = computation.dataContext as RelationDataContext\n return this.controller.system.storage.create(this.getAsyncTaskRecordKey(computation), {\n status: result === undefined ? 'pending' : 'success',\n args,\n relationName: relationContext.id.name,\n result\n })\n } else {\n throw new Error(`Async computation for ${(computation.dataContext as any).type} is not implemented yet`)\n }\n }\n\n async handleAsyncReturn(computation: DataBasedComputation, taskRecordIdRef: {id: string}) {\n const attributeQuery = computation.dataContext.type === 'property' ? ['*', ['record', {attributeQuery: ['id']}]] : ['*']\n const taskRecord = await this.controller.system.storage.findOne(this.getAsyncTaskRecordKey(computation), MatchExp.atom({key: 'id', value: ['=', taskRecordIdRef.id]}), {}, attributeQuery)\n \n // 检查 task 是否仍然是 dataContext 当前最新的,如果不是,说明 task 已经过期,返回值不用管了。\n if (taskRecord.status === 'success') {\n const resultOrPatch = await computation.asyncReturn!(taskRecord.result, taskRecord.args)\n \n if (computation.dataContext.type === 'global') {\n // Global 类型不需要 record 参数\n if (computation.incrementalPatchCompute) {\n await this.controller.applyResultPatch(computation.dataContext, resultOrPatch)\n } else {\n await this.controller.applyResult(computation.dataContext, resultOrPatch)\n }\n } else if (computation.dataContext.type === 'property') {\n // Property 和其他类型需要 record 参数\n if (computation.incrementalPatchCompute) {\n await this.controller.applyResultPatch(computation.dataContext, resultOrPatch, taskRecord.record)\n } else {\n await this.controller.applyResult(computation.dataContext, resultOrPatch, taskRecord.record)\n }\n } else if (computation.dataContext.type === 'entity' || computation.dataContext.type === 'relation') {\n // Entity 和 Relation 类型不需要 record 参数\n if (computation.incrementalPatchCompute) {\n await this.controller.applyResultPatch(computation.dataContext, resultOrPatch)\n } else {\n await this.controller.applyResult(computation.dataContext, resultOrPatch)\n }\n }\n } else {\n // TODO error 处理\n }\n }\n\n isAsyncComputation(computation: Computation) {\n return (computation as DataBasedComputation).asyncReturn !== undefined\n }\n\n\n async runComputation(computation: Computation, erRecordMutationEvent: RecordMutationEvent, record?: any, forceFullCompute: boolean = false) {\n try {\n let computationResult: ComputationResult|any\n\n // 1. 依赖解析阶段的错误处理\n let dataDeps: any = {}\n try {\n dataDeps = (computation as DataBasedComputation).dataDeps ? await this.resolveDataDeps(computation as DataBasedComputation, record) : {}\n } catch (e) {\n const error = new ComputationDataDepError('Failed to resolve computation data dependencies', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n\n // 2. 计算执行阶段的错误处理\n try {\n if (forceFullCompute || (!computation.incrementalCompute && !computation.incrementalPatchCompute)) {\n // 全量计算。forceFullCompute 用在了初始化时,或者要修正数据时。\n const databasedComputation = computation as DataBasedComputation\n computationResult = await databasedComputation.compute(dataDeps, record)\n } else {\n if (computation.incrementalCompute) {\n // 1.增量计算,返回全量结果\n let lastValue = undefined\n if (computation.useLastValue) {\n try {\n lastValue = await this.controller.retrieveLastValue(computation.dataContext, record)\n } catch (e) {\n const error = new ComputationStateError('Failed to retrieve last value for incremental computation', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n \n computationResult = await computation.incrementalCompute(lastValue, erRecordMutationEvent, record, dataDeps)\n \n } else if(computation.incrementalPatchCompute){\n // 2.增量计算,返回增量结果\n let lastValue = undefined\n if (computation.useLastValue) {\n try {\n lastValue = await this.controller.retrieveLastValue(computation.dataContext, record)\n } catch (e) {\n const error = new ComputationStateError('Failed to retrieve last value for incremental patch computation', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n \n computationResult = await computation.incrementalPatchCompute(lastValue, erRecordMutationEvent, record, dataDeps)\n } else {\n const error = new ComputationError(`Unknown computation type: ${computation.constructor.name}`, {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'type-validation'\n })\n throw error\n }\n\n if (computationResult instanceof ComputationResultFullRecompute) {\n // 如果计算结果为 false ,说明不能增量计算,要全量计算。\n const databasedComputation = computation as DataBasedComputation\n if (!databasedComputation.compute) {\n const error = new ComputationError('compute must be defined for computation when incrementalCompute returns ComputationResultFullRecompute', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'fallback-compute'\n })\n throw error\n }\n computationResult = await databasedComputation.compute(dataDeps, record)\n } \n }\n } catch (e) {\n if (e instanceof ComputationError) {\n throw e // Re-throw our custom errors\n }\n const error = new ComputationError('Computation execution failed', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'execution',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n\n if (computationResult instanceof ComputationResultSkip) {\n return\n }\n if (computationResult instanceof ComputationResultAsync) {\n try {\n return await this.createAsyncTask(computation, computationResult.args, record)\n } catch (e) {\n const error = new ComputationError('Failed to create async task', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'async-task-creation',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n } \n\n // 3. 结果处理阶段的错误处理\n try {\n const result = computationResult instanceof ComputationResultResolved ? await computation.asyncReturn!(computationResult.result, computationResult.args) : computationResult\n \n if (computation.incrementalPatchCompute) {\n await this.controller.applyResultPatch(computation.dataContext, result, record)\n } else {\n await this.controller.applyResult(computation.dataContext, result, record)\n }\n } catch (e) {\n const error = new ComputationError('Failed to apply computation result', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'result-application',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n } catch (e) {\n if (e instanceof ComputationError) {\n throw e // Re-throw our custom errors\n }\n // Top-level unexpected error handling\n const error = new ComputationError('Unexpected error during computation execution', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n computationPhase: 'top-level',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n async resolveDataDeps(computation: DataBasedComputation, record?: any) {\n if (computation.dataDeps) {\n try {\n const values: any[] = await Promise.all(Object.entries(computation.dataDeps).map(async ([dataDepName, dataDep]) => {\n try {\n if (dataDep.type === 'records') {\n return await this.controller.system.storage.find(dataDep.source.name!, undefined, {}, dataDep.attributeQuery)\n } else if (dataDep.type === 'property') {\n if (!record?.id) {\n const error = new ComputationDataDepError('Record ID is required for property data dependency', {\n depName: dataDepName,\n depType: dataDep.type,\n missingData: true,\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext\n })\n throw error\n }\n return this.controller.system.storage.findOne((computation.dataContext as PropertyDataContext).host.name!, MatchExp.atom({key: 'id', value: ['=', record.id]}), {}, dataDep.attributeQuery)\n } else if (dataDep.type === 'global') {\n return await this.controller.system.storage.get(DICTIONARY_RECORD, dataDep.source.name!)\n } else {\n const error = new ComputationDataDepError(`Unknown data dependency type: ${(dataDep as any).type}`, {\n depName: dataDepName,\n depType: (dataDep as any).type,\n invalidData: true,\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext\n })\n throw error\n }\n } catch (e) {\n if (e instanceof ComputationDataDepError) {\n throw e\n }\n const error = new ComputationDataDepError(`Failed to resolve data dependency '${dataDepName}'`, {\n depName: dataDepName,\n depType: dataDep.type,\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }))\n return Object.fromEntries(Object.entries(computation.dataDeps).map(([dataDepName], index) => [dataDepName, values[index]]))\n } catch (e) {\n if (e instanceof ComputationDataDepError) {\n throw e\n }\n const error = new ComputationDataDepError('Failed to resolve computation data dependencies', {\n handleName: computation.constructor.name,\n computationName: computation.args.constructor.displayName,\n dataContext: computation.dataContext,\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n } else {\n return {}\n }\n }\n async setupGlobalDict() {\n const globalDict = this.controller.dict.filter(dict => dict.defaultValue !== undefined)\n for (const dict of globalDict) {\n await this.controller.system.storage.set(DICTIONARY_RECORD, dict.name, dict.defaultValue!())\n }\n }\n \n async setup() {\n try {\n // entity/relation/dict 是 computation 时的 defaultValue.\n try {\n await this.setupDefaultValues()\n } catch (e) {\n const error = new SchedulerError('Failed to setup computation default values', {\n schedulingPhase: 'default-values-setup',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n\n // entity/relation/dict 中的 computation 内部的 state 的 default value.\n try {\n await this.setupStateDefaultValues()\n } catch (e) {\n const error = new SchedulerError('Failed to setup computation state default values', {\n schedulingPhase: 'state-default-values-setup',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n\n // 设置 computation 对 mutation 事件 的监听\n try {\n await this.setupMutationListeners()\n } catch (e) {\n const error = new SchedulerError('Failed to setup mutation listeners for computations', {\n schedulingPhase: 'mutation-listeners-setup',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n\n // 可能需要的 computation 初始化行为。\n // 为什么放在这里,因为 global dict 的赋值行为可能触发初始化的其他 computation.\n try {\n await this.setupGlobalDict()\n } catch (e) {\n const error = new SchedulerError('Failed to setup global dictionary', {\n schedulingPhase: 'global-dict-setup',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n } catch (e) {\n if (e instanceof SchedulerError) {\n throw e\n }\n const error = new SchedulerError('Unexpected error during scheduler setup', {\n schedulingPhase: 'top-level-setup',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n}\n\n","import { DICTIONARY_RECORD, RecordMutationEvent, System, SystemCallback, SystemLogger } from \"./System.js\";\nimport {\n BoolExp, IInstance, EntityInstance, RelationInstance, ActivityInstance, InteractionInstance, DictionaryInstance\n} from \"@shared\";\nimport './computations/index.js';\nimport { InteractionCallResponse, InteractionEventArgs } from \"./activity/InteractionCall.js\";\nimport { DataContext, EntityDataContext, PropertyDataContext, RelationDataContext } from \"./computations/Computation.js\";\nimport { Computation } from \"./computations/Computation.js\";\nimport { ComputationResult, ComputationResultSkip, ComputationResultPatch } from \"./computations/Computation.js\";\nimport { Scheduler } from \"./Scheduler.js\";\nimport { MatchExp } from \"@storage\";\nimport { ActivityManager } from \"./activity/ActivityManager.js\";\nimport { CountHandles } from \"./computations/Count.js\";\nimport { TransformHandles } from \"./computations/Transform.js\";\nimport { AnyHandles } from \"./computations/Any.js\";\nimport { EveryHandles } from \"./computations/Every.js\";\nimport { WeightedSummationHandles } from \"./computations/WeightedSummation.js\";\nimport { SummationHandles } from \"./computations/Summation.js\";\nimport { AverageHandles } from \"./computations/Average.js\";\nimport { RealTimeHandles } from \"./computations/RealTime.js\";\nimport { StateMachineHandles } from \"./computations/StateMachine.js\";\nimport { CustomHandles } from \"./computations/Custom.js\";\nimport {\n InteractionExecutionError\n} from \"./errors/index.js\";\n\nexport const USER_ENTITY = 'User'\n\n// Define RecordMutationSideEffect since it's not exported from shared\nexport interface IRecordMutationSideEffect {\n name: string;\n record: { name: string };\n content: (event: RecordMutationEvent) => Promise<any>;\n}\n\n// Create a class to use as a type and value\nexport class RecordMutationSideEffect implements IRecordMutationSideEffect {\n name: string;\n record: { name: string };\n content: (event: RecordMutationEvent) => Promise<any>;\n\n constructor(data: IRecordMutationSideEffect) {\n this.name = data.name;\n this.record = data.record;\n this.content = data.content;\n }\n\n static create(data: IRecordMutationSideEffect): RecordMutationSideEffect {\n return new RecordMutationSideEffect(data);\n }\n}\n\nexport type InteractionContext = {\n logContext?: any\n [k: string]: any\n}\n\nexport type ComputationType = 'global' | 'entity' | 'relation' | 'property'\n\nexport interface ControllerOptions {\n system: System\n entities?: EntityInstance[]\n relations?: RelationInstance[]\n activities?: ActivityInstance[]\n interactions?: InteractionInstance[]\n dict?: DictionaryInstance[]\n recordMutationSideEffects?: RecordMutationSideEffect[]\n computations?: (new (...args: any[]) => Computation)[]\n ignorePermission?: boolean\n forceThtrowInteractionError?: boolean\n}\n\nexport class Controller {\n // 因为很多 function 都会bind controller 作为 this,所以我们也把 controller 的 globals 作为注入全局工具的入口。\n public recordNameToSideEffects = new Map<string, Set<IInstance | RecordMutationSideEffect>>()\n public globals = {\n BoolExp,\n MatchExp\n }\n public scheduler: Scheduler\n public activityManager: ActivityManager\n public system: System\n public entities: EntityInstance[]\n public relations: RelationInstance[]\n public activities: ActivityInstance[]\n public interactions: InteractionInstance[]\n public dict: DictionaryInstance[] = []\n public recordMutationSideEffects: RecordMutationSideEffect[] = []\n public ignorePermission: boolean\n public forceThtrowInteractionError: boolean\n constructor(options: ControllerOptions) {\n const {\n system,\n entities = [],\n relations = [],\n activities = [],\n interactions = [],\n dict = [],\n recordMutationSideEffects = [],\n computations = [],\n ignorePermission = false,\n forceThtrowInteractionError = false // 会 catch 住 error,并在 result 中返回。\n } = options\n \n // 首先初始化 system\n this.system = system\n this.ignorePermission = ignorePermission\n this.forceThtrowInteractionError = forceThtrowInteractionError\n // 因为我们会对 entities 数组进行补充。如果外部复用了传入的数组对象,就会发生混乱,例如在测试用例中复用。\n this.entities = [...entities]\n this.relations = [...relations]\n this.activities = [...activities]\n this.interactions = [...interactions]\n this.dict = [...dict]\n this.recordMutationSideEffects = [...recordMutationSideEffects]\n\n // Initialize ActivityManager\n this.activityManager = new ActivityManager(this, activities, interactions)\n\n // Import default computation handles\n const allComputationHandles = [\n ...CountHandles,\n ...TransformHandles,\n ...AnyHandles,\n ...EveryHandles,\n ...WeightedSummationHandles,\n ...SummationHandles,\n ...AverageHandles,\n ...RealTimeHandles,\n ...StateMachineHandles,\n ...CustomHandles,\n ...computations\n ]\n \n this.scheduler = new Scheduler(this, this.entities, this.relations, this.dict, allComputationHandles)\n\n recordMutationSideEffects.forEach(sideEffect => {\n let sideEffects = this.recordNameToSideEffects.get(sideEffect.record.name)\n if (!sideEffects) {\n this.recordNameToSideEffects.set(sideEffect.record.name, sideEffects = new Set())\n }\n sideEffects.add(sideEffect)\n })\n\n }\n \n async setup(install?: boolean) {\n const states = this.scheduler.createStates()\n await this.system.setup(this.entities, this.relations, states, install)\n await this.scheduler.setup()\n\n // TODO 如果是恢复模式,还要从 event stack 中开始恢复数据。\n }\n async applyResult(dataContext: DataContext, result: any, record?: any) {\n if (result instanceof ComputationResultSkip) return\n\n if (dataContext.type === 'global') {\n return this.system.storage.set(DICTIONARY_RECORD, dataContext.id! as string, result)\n } else if (dataContext.type === 'entity') {\n if (result === undefined || result === null) return\n // Entity 级别的计算结果完全替换实体表中的所有记录\n const entityContext = dataContext as EntityDataContext\n // 先删除所有记录\n await this.system.storage.delete(entityContext.id.name!, BoolExp.atom({key: 'id', value: ['not', null]}))\n // 然后插入新记录,result 必须是数组\n const items = Array.isArray(result) ? result : [result]\n for (const item of items) {\n await this.system.storage.create(entityContext.id.name!, item)\n }\n } else if (dataContext.type === 'relation') {\n if (result === undefined || result === null) return\n // Relation 级别的计算结果完全替换关系表中的所有记录\n const relationContext = dataContext as RelationDataContext\n // 先删除所有记录\n await this.system.storage.delete(relationContext.id.name!, BoolExp.atom({key: 'id', value: ['not', null]}))\n // 然后插入新记录,result 必须是数组\n const items = Array.isArray(result) ? result : [result]\n for (const item of items) {\n await this.system.storage.create(relationContext.id.name!, item)\n }\n } else {\n const propertyDataContext = dataContext as PropertyDataContext\n await this.system.storage.update(propertyDataContext.host.name!, BoolExp.atom({key: 'id', value: ['=', record.id]}), {[propertyDataContext.id.name]: result})\n } \n }\n async retrieveLastValue(dataContext: DataContext, record?: any) {\n if (dataContext.type === 'global') {\n return this.system.storage.get(DICTIONARY_RECORD, dataContext.id! as string)\n } else if (dataContext.type === 'entity'||dataContext.type === 'relation') {\n return this.system.storage.find(dataContext.id.name!, undefined, undefined, ['*'])\n } else {\n const propertyDataContext = dataContext as PropertyDataContext\n if (record[propertyDataContext.id.name]) return record[propertyDataContext.id.name]\n\n const item = await this.system.storage.findOne(propertyDataContext.host.name!, BoolExp.atom({key: 'id', value: ['=', record!.id]}), undefined, ['*'])\n return item[propertyDataContext.id.name]\n }\n }\n async applyResultPatch(dataContext: DataContext, patch: ComputationResult|ComputationResultPatch|ComputationResultPatch[]|undefined, record?: any) {\n if (patch instanceof ComputationResultSkip||patch === undefined) return\n\n const patches = Array.isArray(patch) ? patch : [patch]\n for(const patch of patches) {\n if (dataContext.type === 'global') {\n return this.system.storage.set(DICTIONARY_RECORD, dataContext.id! as string, patch)\n } else if (dataContext.type === 'entity'||dataContext.type === 'relation') {\n const erDataContext = dataContext as EntityDataContext|RelationDataContext\n if (patch.type === 'insert') { \n await this.system.storage.create(erDataContext.id.name!, patch.data)\n } else if (patch.type === 'update') {\n const match = MatchExp.atom({key: 'id', value: ['=', patch.affectedId]})\n await this.system.storage.update(erDataContext.id.name!, match, patch.data)\n } else if (patch.type === 'delete') {\n const match = MatchExp.atom({key: 'id', value: ['=', patch.affectedId]})\n await this.system.storage.delete(erDataContext.id.name!, match)\n }\n } else {\n const propertyDataContext = dataContext as PropertyDataContext\n if (patch.type === 'insert') {\n await this.system.storage.update(propertyDataContext.host.name!, BoolExp.atom({key: 'id', value: ['=', record.id]}), {[propertyDataContext.id.name]: patch.data})\n } else if (patch.type === 'update') {\n await this.system.storage.update(propertyDataContext.host.name!, BoolExp.atom({key: 'id', value: ['=', record.id]}), {[propertyDataContext.id.name]: patch.data})\n } else if (patch.type === 'delete') {\n await this.system.storage.update(propertyDataContext.host.name!, BoolExp.atom({key: 'id', value: ['=', record.id]}), {[propertyDataContext.id.name]: null})\n }\n }\n }\n }\n callbacks: Map<any, Set<SystemCallback>> = new Map()\n\n async callInteraction(interactionName:string, interactionEventArgs: InteractionEventArgs) {\n try {\n // 内部 error 已经 catch 住了,如果 option 中没有声明 returnInteractionError,则直接 throw 出去。\n const result = await this.activityManager.callInteraction(interactionName, interactionEventArgs)\n if (result.error && this.forceThtrowInteractionError) {\n throw result.error\n } else {\n return result\n }\n } catch (e) {\n const error = new InteractionExecutionError('Failed to call interaction', {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'callInteraction',\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n async callActivityInteraction(activityName:string, interactionName:string, activityId: string|undefined, interactionEventArgs: InteractionEventArgs) {\n try {\n const result = await this.activityManager.callActivityInteraction(activityName, interactionName, activityId, interactionEventArgs)\n if (result.error && this.forceThtrowInteractionError) {\n throw result.error\n } else {\n return result\n }\n } catch (e) {\n const error = new InteractionExecutionError('Failed to call activity interaction', {\n interactionName,\n userId: interactionEventArgs.user?.id,\n payload: interactionEventArgs.payload,\n executionPhase: 'callActivityInteraction',\n context: { activityName, activityId },\n causedBy: e instanceof Error ? e : new Error(String(e))\n })\n throw error\n }\n }\n async runRecordChangeSideEffects(result: InteractionCallResponse, logger: SystemLogger) {\n const mutationEvents = result.effects as RecordMutationEvent[]\n for(let event of mutationEvents || []) {\n const sideEffects = this.recordNameToSideEffects.get(event.recordName)\n if (sideEffects) {\n for(let sideEffect of sideEffects) {\n try {\n if (sideEffect instanceof RecordMutationSideEffect) {\n result.sideEffects![sideEffect.name] = {\n result: await sideEffect.content(event),\n }\n } else {\n // Handle IInstance case - check if it has the required properties\n const instanceSideEffect = sideEffect as IInstance & { name?: string; content?: (event: RecordMutationEvent) => Promise<unknown> };\n if (instanceSideEffect.name && typeof instanceSideEffect.content === 'function') {\n result.sideEffects![instanceSideEffect.name] = {\n result: await instanceSideEffect.content(event),\n }\n }\n }\n } catch (e){\n let effectName = 'unknown';\n if (sideEffect instanceof RecordMutationSideEffect) {\n effectName = sideEffect.name;\n } else {\n const instanceSideEffect = sideEffect as IInstance & { name?: string };\n effectName = instanceSideEffect.name || 'unknown';\n }\n logger.error({label: \"recordMutationSideEffect\", message: effectName})\n result.sideEffects![effectName] = {\n error: e\n }\n }\n }\n }\n }\n }\n // Add addEventListener method to Controller class\n addEventListener(eventName: string, callback: (...args: any[]) => any) {\n // Implementation of addEventListener\n if (!this.callbacks.has(eventName)) {\n this.callbacks.set(eventName, new Set());\n }\n this.callbacks.get(eventName)!.add(callback);\n }\n}\n\n","import SQLite from \"better-sqlite3\";\nimport {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR} from \"./System.js\";\nimport {asyncInteractionContext} from \"./asyncInteractionContext.js\";\nimport {InteractionContext} from \"./Controller\";\nimport { dbConsoleLogger } from \"./MonoSystem.js\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS _IDS_ (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n const lastId = (await this.db.query<{last: number}>( `SELECT last FROM _IDS_ WHERE name = '${recordName}'`, [], `finding last id of ${recordName}` ))[0]?.last\n const newId = (lastId || 0) +1\n const name =`set last id for ${recordName}: ${newId}`\n if (lastId === undefined) {\n await this.db.scheme(`INSERT INTO _IDS_ (name, last) VALUES ('${recordName}', ${newId})`, name)\n } else {\n await this.db.update(`UPDATE _IDS_ SET last = ? WHERE name = ?`, [newId, recordName], undefined, name)\n }\n return newId as unknown as string\n }\n}\n\nexport type SQLiteDBOptions = Parameters<typeof SQLite>[1] & { logger :DatabaseLogger }\n\nexport class SQLiteDB implements Database{\n db!: InstanceType<typeof SQLite>\n idSystem!: IDSystem\n logger: DatabaseLogger\n constructor(public file:string = ':memory:', public options?: SQLiteDBOptions) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open() {\n this.db = new SQLite(this.file, this.options)\n await this.idSystem.setup()\n }\n async query<T extends any>(sql:string, where: any[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).all(...params) as T[]\n }\n async update(sql:string,values: any[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING ${idField} AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return this.db.prepare(finalSQL).run(...params) as unknown as any[]\n }\n async insert (sql:string, values:any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n return this.db.prepare(`${sql} RETURNING ${ROW_ID_ATTR}`).run(...params) as unknown as EntityIdRef\n }\n async delete (sql:string, where: any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).run(...params) as unknown as any[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return this.db.prepare(sql).run()\n }\n async close() {\n this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n return {\n fieldValue: `NOT NULL AND EXISTS (\n SELECT 1\n FROM json_each(${fieldName})\n WHERE json_each.value = ${p()}\n)`,\n fieldParams: [value[1]]\n }\n }\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INTEGER PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object'||type==='json') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"INT\"\n }else{\n return type\n }\n }\n}","import {\n ComputationState,\n Database,\n DatabaseLogger,\n RecordMutationCallback,\n RecordMutationEvent,\n Storage,\n System,\n SYSTEM_RECORD,\n SystemEntity,\n SystemLogger,\n SystemLogType\n} from \"./System.js\";\nimport { createClass, Property, EntityInstance, RelationInstance, Entity, Relation, RefContainer } from \"@shared\";\nimport {\n DBSetup,\n EntityQueryHandle,\n EntityToTableMap,\n MatchExp,\n MatchExpressionData,\n RawEntityData\n} from '@storage';\nimport { SQLiteDB } from \"./SQLite.js\";\nimport { RecordBoundState } from \"./computations/Computation.js\";\n\nfunction JSONStringify(value:any) {\n return encodeURI(JSON.stringify(value))\n}\n\nfunction JSONParse(value: string) {\n return value === undefined ? undefined : JSON.parse(decodeURI(value))\n}\n\n\nclass MonoStorage implements Storage{\n public map!: DBSetup[\"map\"]\n public queryHandle?: EntityQueryHandle\n constructor(public db: Database) {\n }\n public callbacks: Set<RecordMutationCallback> = new Set()\n beginTransaction(name='') {\n return this.db.scheme('BEGIN', name)\n }\n commitTransaction(name='') {\n return this.db.scheme('COMMIT', name)\n }\n rollbackTransaction(name='') {\n return this.db.scheme('ROLLBACK', name)\n }\n // CAUTION kv 结构数据的实现也用 er。这是系统约定,因为也需要 Record 事件!\n async get(concept: string, key: string, initialValue?: any) {\n const match = MatchExp.atom({key: 'key', value: ['=', key]}).and({ key: 'concept', value: ['=', concept] })\n const value = (await this.queryHandle!.findOne(SYSTEM_RECORD, match, undefined, ['value']))?.value\n if (value === undefined) return initialValue\n\n return JSONParse(value)\n }\n async set(concept: string, key: string, value:any, events?: RecordMutationEvent[]) {\n const match = MatchExp.atom({key: 'key', value: ['=', key]}).and({ key: 'concept', value: ['=', concept] })\n const origin = await this.queryHandle!.findOne(SYSTEM_RECORD, match, undefined, ['value'])\n if (origin) {\n return this.callWithEvents(this.queryHandle!.update.bind(this.queryHandle), [SYSTEM_RECORD, match, { concept, key: key.toString(), value: JSONStringify(value)}], events)\n } else {\n return this.callWithEvents(this.queryHandle!.create.bind(this.queryHandle), [SYSTEM_RECORD, { concept, key: key.toString(), value: encodeURI(JSON.stringify(value))}], events)\n }\n }\n async setup(entities: EntityInstance[], relations: RelationInstance[], createTables = false) {\n await this.db.open(createTables)\n const dbSetup = new DBSetup(\n entities as any, \n relations as any, \n this.db\n )\n if (createTables) await dbSetup.createTables()\n this.queryHandle = new EntityQueryHandle( new EntityToTableMap(dbSetup.map), this.db)\n\n this.map = dbSetup.map\n }\n findOne(...arg:Parameters<EntityQueryHandle[\"findOne\"]>) {\n return this.queryHandle!.findOne(...arg)\n }\n find(...arg:Parameters<EntityQueryHandle[\"find\"]>) {\n return this.queryHandle!.find(...arg)\n }\n create(entityName: string, rawData: RawEntityData, events?: RecordMutationEvent[]) {\n return this.callWithEvents(this.queryHandle!.create.bind(this.queryHandle), [entityName, rawData], events)\n }\n update(entity: string, matchExpressionData: MatchExpressionData, rawData: RawEntityData, events?: RecordMutationEvent[]) {\n return this.callWithEvents(this.queryHandle!.update.bind(this.queryHandle), [entity, matchExpressionData, rawData], events)\n }\n delete(entityName: string, matchExpressionData: MatchExpressionData, events?: RecordMutationEvent[]) {\n return this.callWithEvents(this.queryHandle!.delete.bind(this.queryHandle), [entityName, matchExpressionData], events)\n }\n async callWithEvents<T extends any[]>(method: (...arg: [...T, RecordMutationEvent[]]) => any, args: T, events: RecordMutationEvent[] = []) {\n const result = await method(...args, events)\n // FIXME 还没有实现异步机制\n // nextJob(() => {\n // this.dispatch(events)\n // })\n // CAUTION 特别注意这里会空充 events\n const newEvents = await this.dispatch(events)\n events.push(...newEvents)\n return result\n }\n findRelationByName(...arg:Parameters<EntityQueryHandle[\"findRelationByName\"]>) {\n return this.queryHandle!.findRelationByName(...arg)\n }\n findOneRelationByName(...arg: Parameters<EntityQueryHandle[\"findOneRelationByName\"]>) {\n return this.queryHandle!.findOneRelationByName(...arg)\n }\n updateRelationByName(relationName: string, matchExpressionData: MatchExpressionData, rawData: RawEntityData, events?: RecordMutationEvent[] ) {\n return this.callWithEvents(this.queryHandle!.updateRelationByName.bind(this.queryHandle), [relationName, matchExpressionData, rawData], events)\n }\n removeRelationByName(relationName: string, matchExpressionData: MatchExpressionData, events?: RecordMutationEvent[]) {\n return this.callWithEvents(this.queryHandle!.removeRelationByName.bind(this.queryHandle), [relationName, matchExpressionData], events)\n }\n addRelationByNameById(relationName: string, sourceEntityId: string, targetEntityId: string, rawData: RawEntityData = {}, events?: RecordMutationEvent[]) {\n return this.callWithEvents(this.queryHandle!.addRelationByNameById.bind(this.queryHandle), [relationName, sourceEntityId, targetEntityId, rawData], events)\n }\n getRelationName(...arg:Parameters<EntityQueryHandle[\"getRelationName\"]>) {\n return this.queryHandle!.getRelationName(...arg)\n }\n getEntityName(...arg:Parameters<EntityQueryHandle[\"getEntityName\"]>) {\n return this.queryHandle!.getEntityName(...arg)\n }\n listen(callback: RecordMutationCallback) {\n this.callbacks.add(callback)\n }\n async dispatch(events: RecordMutationEvent[]) {\n const newEvents: RecordMutationEvent[] = []\n for(let callback of this.callbacks) {\n const callbackResult = (await callback(events)) as {events?: RecordMutationEvent[]}\n if (callbackResult?.events) {\n newEvents.push(...callbackResult.events)\n }\n }\n return newEvents\n }\n destroy() {\n return this.db.close()\n }\n}\n\n\n\n\n// Define log levels for database logger\nexport enum DBLogLevel {\n ERROR = 0,\n INFO = 1,\n}\n\nexport class DBConsoleLogger implements DatabaseLogger{\n constructor(private level: DBLogLevel = DBLogLevel.ERROR) {}\n \n info({type, name, sql, params}: Parameters<DatabaseLogger[\"info\"]>[0]) {\n if (this.level >= DBLogLevel.INFO) {\n console.log({type, name, sql, params})\n }\n }\n error({type, name, sql, params, error}: Parameters<DatabaseLogger[\"error\"]>[0]) {\n if (this.level >= DBLogLevel.ERROR) {\n console.error({type, name, sql, params, error})\n }\n }\n child() {\n return new DBConsoleLogger(this.level)\n }\n}\n\n// Define log levels for system logger\nexport enum SystemLogLevel {\n MUTE = -1,\n ERROR = 0,\n INFO = 1,\n DEBUG = 2,\n}\n\nexport class SystemConsoleLogger implements SystemLogger{\n constructor(private level: SystemLogLevel = SystemLogLevel.ERROR) {}\n \n error({label, message, ...rest}: SystemLogType) {\n if (this.level >= SystemLogLevel.ERROR) {\n console.error(`[ERROR] ${label}: ${message}`, rest)\n }\n }\n info({label, message, ...rest}: SystemLogType) {\n if (this.level >= SystemLogLevel.INFO) {\n console.info(`[INFO] ${label}: ${message}`, rest)\n }\n }\n debug({label, message, ...rest}: SystemLogType) {\n if (this.level >= SystemLogLevel.DEBUG) {\n console.debug(`[DEBUG] ${label}: ${message}`, rest)\n }\n }\n child(fixed: object) {\n return new SystemConsoleLogger(this.level)\n }\n}\nexport const dbConsoleLogger = new DBConsoleLogger()\nexport const systemConsoleLogger = new SystemConsoleLogger()\n\nexport class MonoSystem implements System {\n conceptClass: Map<string, ReturnType<typeof createClass>> = new Map()\n storage: Storage\n constructor(db: Database = new SQLiteDB(undefined,{logger: dbConsoleLogger}), public logger: SystemLogger = systemConsoleLogger) {\n this.storage = new MonoStorage(db)\n }\n \n setup(originalEntities: EntityInstance[], originalRelations: RelationInstance[], states: ComputationState[], install = false){\n // Use RefContainer to handle cloning and reference updates\n const container = new RefContainer(originalEntities, originalRelations);\n \n // Get cloned entities and relations with all references automatically updated\n const { entities, relations } = container.getAll();\n \n // Process states to inject properties into entities/relations\n states.forEach(({dataContext, state}) => {\n Object.entries(state).forEach(([stateName, stateItem]) => {\n if (stateItem instanceof RecordBoundState) { \n if (!stateItem.record) {\n return;\n }\n let rootEntity: EntityInstance|RelationInstance | undefined = container.getEntityByName(stateItem.record);\n if (!rootEntity) {\n rootEntity = container.getRelationByName(stateItem.record);\n }\n if (!rootEntity) {\n throw new Error(`Entity or Relation not found: ${stateItem.record}`);\n }\n\n // 考虑 filtered entity 和 filtered relation 的级联问题,这里要找到根\n while ((rootEntity as EntityInstance).baseEntity || (rootEntity as RelationInstance).baseRelation) {\n rootEntity = (rootEntity as EntityInstance).baseEntity || (rootEntity as RelationInstance).baseRelation!\n }\n\n if (stateItem.defaultValue instanceof Property) {\n // CAUTION 特别注意这里改了 name\n stateItem.defaultValue.name = stateItem.key\n rootEntity.properties.push(stateItem.defaultValue)\n } else {\n const defaultValuetype = typeof stateItem.defaultValue\n rootEntity.properties.push(Property.create({\n name: stateItem.key,\n type: defaultValuetype,\n // 应该系统定义\n collection: Array.isArray(stateItem.defaultValue),\n defaultValue: () => stateItem.defaultValue\n }))\n }\n }\n })\n })\n\n \n // Pass the prepared entities to storage.setup\n return this.storage.setup(\n [...entities, SystemEntity], \n relations,\n install\n )\n }\n destroy() {\n this.storage.destroy()\n }\n}\n","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR} from \"./System.js\";\nimport pg, { type ClientConfig} from 'pg'\nimport {asyncInteractionContext} from \"./asyncInteractionContext.js\";\nimport {InteractionContext} from \"./Controller\";\nimport { dbConsoleLogger } from \"./MonoSystem.js\";\n\nconst { Client} = pg\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n const lastId = (await this.db.query<{last: number}>( `SELECT last FROM \"_IDS_\" WHERE name = '${recordName}'`, [], `finding last id of ${recordName}` ))[0]?.last\n const newId = (lastId || 0) +1\n const name =`set last id for ${recordName}: ${newId}`\n if (lastId === undefined) {\n await this.db.scheme(`INSERT INTO \"_IDS_\" (name, last) VALUES ('${recordName}', ${newId})`, name)\n } else {\n await this.db.update(`UPDATE \"_IDS_\" SET last = $1 WHERE name = $2`, [newId, recordName], undefined, name)\n }\n return newId as unknown as string\n }\n}\n\nexport type PostgreSQLDBConfig = Omit<ClientConfig, 'database'> & { logger? :DatabaseLogger }\n\nexport class PostgreSQLDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof Client>\n constructor(public database:string, public options: PostgreSQLDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new Client({\n ...options,\n })\n }\n async open(forceDrop = false) {\n await this.db.connect()\n // 要不要有存在 就删掉的?\n // SELECT 'DROP DATABASE your_database_name' WHERE EXISTS (SELECT FROM pg_database WHERE dataname = 'your_database_name');\n const databaseExist = await this.db.query(`SELECT FROM pg_database WHERE datname = '${this.database}'`)\n if (databaseExist.rows.length === 0) {\n await this.db.query(`CREATE DATABASE ${this.database}`)\n } else {\n if (forceDrop) {\n await this.db.query(`DROP DATABASE ${this.database}`)\n await this.db.query(`CREATE DATABASE ${this.database}`)\n }\n this.db = new Client({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n }\n\n await this.idSystem.setup()\n\n }\n async query<T extends any>(sql:string, where: any[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n }\n async update<T extends any>(sql:string,values: any[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n }\n async insert(sql:string, values:any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n return (await this.db.query(finalSQL, params)).rows[0] as EntityIdRef\n }\n async delete<T extends any> (sql:string, where: any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.db.query(sql)\n }\n close() {\n return this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT GENERATED ALWAYS AS IDENTITY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOLEAN'\n } else if(type === 'number'){\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR} from \"./System.js\";\nimport { PGlite} from '@electric-sql/pglite'\nimport {asyncInteractionContext} from \"./asyncInteractionContext.js\";\nimport { uuidv7 } from \"uuidv7\";\nimport {InteractionContext} from \"./Controller.js\";\nimport { dbConsoleLogger } from \"./MonoSystem.js\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n return uuidv7()\n }\n}\n\nexport type PGLiteDBConfig = { logger? :DatabaseLogger }\n\nexport class PGLiteDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof PGlite>\n constructor(public database?:string, public options: PGLiteDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new PGlite(this.database)\n }\n async open(forceDrop = false) {\n // PGLite doesn't support CREATE/DROP DATABASE commands\n // When forceDrop is true, we'll drop all existing tables instead\n \n if (forceDrop) {\n // Get all table names except system tables\n const tables = await this.db.query<{tablename: string}>(`\n SELECT tablename FROM pg_tables \n WHERE schemaname = 'public' \n AND tablename NOT LIKE 'pg_%'\n AND tablename NOT LIKE 'sql_%'\n `)\n \n // Drop each table\n for (const table of tables.rows) {\n await this.db.query(`DROP TABLE IF EXISTS \"${table.tablename}\" CASCADE`)\n }\n }\n\n await this.idSystem.setup()\n }\n async query<T extends any>(sql:string, params: any[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n try {\n return (await this.db.query(sql, params)).rows as T[]\n } catch (error: any) {\n logger.error({\n type:'query',\n name,\n sql,\n params,\n error: error.message\n })\n throw error\n }\n }\n async update<T extends any>(sql:string,values: any[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n \n }\n async insert(sql:string, values:any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n try {\n return (await this.db.query(finalSQL, params)).rows[0] as EntityIdRef\n } catch (error: any) {\n logger.error({\n type:'insert',\n name,\n sql: finalSQL,\n params,\n error: error.message\n })\n throw error\n }\n }\n async delete<T extends any> (sql:string, params: any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n \n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n try {\n return await this.db.query(sql)\n } catch (error: any) {\n logger.error({\n type:'scheme',\n name,\n sql,\n error: error.message\n })\n throw error\n }\n }\n close() {\n return this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType.toLowerCase() === 'json') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'SERIAL PRIMARY KEY'\n } else if (type === 'id') {\n return 'UUID'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOL'\n } else if(type === 'number'){\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef} from \"./System.js\";\nimport mysql, {type Connection, type ConnectionOptions, RowDataPacket} from 'mysql2/promise'\nimport {asyncInteractionContext} from \"./asyncInteractionContext.js\";\nimport {InteractionContext} from \"./Controller\";\nimport { dbConsoleLogger } from \"./MonoSystem.js\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS _IDS_ (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n const lastId = (await this.db.query<{last: number}>( `SELECT last FROM \"_IDS_\" WHERE name = '${recordName}'`, [], `finding last id of ${recordName}` ))[0]?.last\n const newId = (lastId || 0) +1\n const name =`set last id for ${recordName}: ${newId}`\n if (lastId === undefined) {\n await this.db.scheme(`INSERT INTO \"_IDS_\" (name, last) VALUES ('${recordName}', ${newId})`, name)\n } else {\n await this.db.update(`UPDATE \"_IDS_\" SET last = ? WHERE name = ?`, [newId, recordName], undefined, name)\n }\n return newId as unknown as string\n }\n}\n\nexport type MysqlDBConfig = Omit<ConnectionOptions, 'database'> & { logger? :DatabaseLogger }\n\nexport class MysqlDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db!: Connection\n constructor(public database:string, public options: MysqlDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open(forceDrop = false) {\n const options = {...this.options}\n delete options.logger\n this.db = await mysql.createConnection({\n ...this.options,\n })\n await this.db.connect()\n const [rows] = await this.db.query(`SHOW DATABASES LIKE '${this.database}'`)\n if ((rows as RowDataPacket[]).length === 0) {\n await this.db.query(`CREATE DATABASE ${this.database}`)\n } else {\n if (forceDrop) {\n await this.db.query(`DROP DATABASE ${this.database}`)\n await this.db.query(`CREATE DATABASE ${this.database}`)\n }\n this.db = await mysql.createConnection({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n }\n await this.db.query(`SET sql_mode='ANSI_QUOTES'`)\n\n await this.idSystem.setup()\n\n }\n async query<T extends any>(sql:string, where: any[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async update<T extends any>(sql:string,values: any[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async insert(sql:string, values:any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n await this.db.query(sql, params)\n const [rows] = (await this.db.query(`SELECT LAST_INSERT_ID();`))\n const insertedId = (rows as RowDataPacket[])[0]['LAST_INSERT_ID()']\n return {id: insertedId} as EntityIdRef\n }\n async delete<T extends any> (sql:string, where: any[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.db.query(sql)\n }\n close() {\n return this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND JSON_CONTAINS(${fieldNameWithQuotes}, '${JSON.stringify(value[1])}', '$')`,\n fieldParams: []\n }\n }\n }\n }\n\n getPlaceholder() {\n return () => {\n return '?'\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT AUTO_INCREMENT PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}"],"names":["isObject","obj","isPlainObject","proto","indexBy","array","key","result","item","stringifyAttribute","deepClone","deepCloneKlass","v","value","k","instance","clearAllInstances","klasses","klass","removeAllInstance","KlassByName","registerKlass","name","klassLike","stringifyAllInstances","Klass","createInstancesFromString","objStr","objects","createInstances","uuidToInstance","type","options","uuid","rawProps","createClass","meta","BaseKlass","instances","i","typeName","data","generateUUID","uuidv7","validNameFormatExp","Entity","args","properties","p","inputEntities","deep","json","PropertyTypes","Dictionary","Property","Relation","firstRelation","relation","thisInstance","Interaction","Activity","g","t","e","ActivityGroup","a","Transfer","forEachInteraction","activity","handle","parentGroup","group","sub","getInteractions","findRootActivity","interaction","BoolAtomData","BoolExpressionData","BoolExp","raw","atomValues","atomValueWithoutUndefined","first","rest","acc","cur","atomValueOrExp","fn","context","newLeft","newRight","newAtomData","matchFn","leftMatched","atomHandle","stack","inverse","currentStack","resultOrErrorMessage","leftResult","OperatorNames","defaultParse","astNodeToBoolExpressionNode","astNode","optionsByName","parseAtomNameToObject","parse","exp","ast","parseStr","Attributive","Attributives","toAttributives","expData","boolExpToAttributives","Condition","DataAttributive","QueryItem","Query","Action","GetAction","Gateway","Event","StateNode","StateTransfer","StateMachine","WeightedSummation","Count","record","Summation","Average","Every","Any","Transform","RealTime","PayloadItem","Payload","SideEffect","convertBoolExpToData","Conditions","DataAttributives","klassesToRegister","Custom","field","RefContainer","originalEntities","originalRelations","entity","cloned","original","replacement","inputEntity","inputRelation","newEntity","oldEntity","originalKey","oldCloned","clonedNew","newRelation","oldRelation","oldObj","newObj","newItem","oldItem","createUserRoleAttributive","isRef","SYSTEM_RECORD","DICTIONARY_RECORD","ID_ATTR","ROW_ID_ATTR","SystemEntity","assert","condition","message","filterMap","map","mapObject","everyAsync","items","check","someAsync","arr","everyWithErrorAsync","setByPath","root","inputPath","path","pointer","nextAttr","lastAttr","AttributeInfo","parentEntityName","attributeName","symmetricDirection","linkInfoRecord","linkInfo","reverseAttribute","MatchExp","entityName","contextRootEntity","fromRelation","recordInfo","isFiltered","RecordQueryTree","combinedData","conditions","base","expression","paths","boolExp","pathParts","matchData","matchExpRawData","matchAttributePath","resolvedPath","matchExpressionInPath","part","currentPath","currentPathInfo","currentResolvedPath","currentMatchExpression","linkMatchExp","reversePath","rebasePath","rebasedLinkMatch","recordQueryTree","namePath","attributeInfo","manyToManySymmetricPaths","valueStr","tableAlias","rawFieldName","isReferenceValue","fieldName","fieldType","db","fieldValue","fieldParams","x","symmetricPaths","sourcePath","targetPath","fieldNamePath","fieldValue2","fieldParams2","sourceNamePath","targetNamePath","targetEntityName","transformData","left","right","operator","atom","keyParts","newKey","transformedData","Modifier","recordName","RecordQuery","matchExpression","attributeQuery","modifier","parentRecord","onlyRelationData","allowNull","label","goto","exit","alias","baseRecordName","inputMatch","resolvedMatchExpression","AttributeQuery","parent","parentLinkQueryTree","LINK_SYMBOL","info","subTree","newTree","r","otherTree","fields","keys","records","ALL_ATTR_SYMBOL","shouldQueryParentLinkData","valueAttributesSet","rawItem","subQueryData","relatedAttributeName","relatedSubQueryData","subMatchExp","rebasedMatchExp","mergedMatchExp","relatedEntity","attributeQueryData","otherAttributeQueryData","allAttributeQueryData","propertyAttributes","recordAttributesByName","includeSameTableReliance","includeMergedRecordAttribute","includeManagedRecordAttributes","includeNotRelianceCombined","inputRecordInfo","relianceAttributeQueryData","attributeQueryItem","relianceRelationAttributeQueryData","fieldPath","nameContext","queryFields","recordQuery","nextFieldPath","nextNameContext","nextLinkFieldPath","nextLinkNameContext","symmetricLinkPaths","nextSymmetricLinkNameContext","reverseInfo","entityQuery","flatten","NewRecordData","originalRecordName","rawData","originalRecordInfo","valueAttributesInfo","entityAttributesInfo","entityIdAttributes","attr","valueAttr","newRelatedEntityData","partialNewRawData","merged","oldRecord","newRecord","updatedComputedFields","allValueAttributes","defaultVal","newValue","recordData","combinedNewRecord","FilteredEntityManager","queryAgent","filteredEntityName","baseEntityName","dependencies","dependency","dep","existing","d","fullPath","depEntityName","depPath","attribute","changedEntityName","changedRecordId","changedAttributes","depInfo","matchKey","matchCondition","query","recordId","resultSet","visited","collectFiltered","directFiltered","filtered","combinedExpression","events","originalRecord","isCreation","changedFields","filteredEntities","flags","filteredEntity","filteredEntitiesAttribute","affectedSourceRecords","sourceRecord","flag1","flag2","keys1","keys2","currentRecord","currentFlags","matchesFilter","previouslyBelonged","FieldAliasMap","forceCreate","pathStr","newAlias","ROOT_LABEL","RecursiveContext","RecordQueryRef","relatedRecordQuery","RecordQueryAgent","database","rootEntityName","prefix","parentP","fieldQueryTree","matchQueryTree","finalQueryTree","joinTables","fieldMatchExp","whereClause","params","selectClause","fieldAliasMap","fromClause","joinClause","modifierClause","limit","offset","orderBy","clauses","order","rawReturns","JSONFields","rawReturn","attributePath","queryName","recordQueryRef","gotoQuery","matchExpWithParent","newQuery","querySQL","nextRecursiveContext","subEntityQuery","reverseAttributeName","matchWithParentId","subGotoQueryWithParentMatch","nextContext","subLinkRecordQuery","subEntityQueryOfSubLink","linkRecordReverseAttributeName","linkRecordId","queryOfThisRecord","xToOneSubQuery","xToManySubSubQuery","xToOneSubSubQuery","newMatch","newAttributeQuery","newSubQuery","itemWithParentLinkData","parentLinkRecordQuery","subEntityQueryOfLink","linkId","queryTree","parentInfos","parentNamePath","parentAlias","parentIdField","parentTable","parentTableAndAlias","subQueryTree","entityAttributeName","currentNamePath","currentTable","currentTableAlias","relationTable","relationTableAlias","idField","reverseAttributeInfo","isCurrentRelationSource","linkNamePath","linkIdField","linkParentInfo","tableAliasAndField","aliasName","joinSource","joinIdField","joinTarget","sql","values","leftSql","leftValues","rightSql","rightValues","currentAlias","parentAttributeNamePath","existEntityQuery","innerQuerySQL","innerParams","newRecordData","newRecordDataWithDeps","mergedLinkTargetRecord","newDepIdRef","newLinkRecordData","newLinkRecordDataWithDep","combinedRecord","newEntityData","newEntityDataWithDep","newRecordIdRef","relianceResult","fullRecord","isUpdate","newRawDataWithNewIds","linkRecord","newEntityDataWithIds","flashOutRecordRasData","reason","match","combinedRecordIdRef","attributeIdMatchAtom","recordsWithCombined","recordWithCombined","linkName","matchExpressionData","moveSource","moveAttribute","toMoveRecordInfo","toMoveRecordData","newEntityDataWithIdsWithFlashOutRecords","sameRowNewFieldAndValue","f","currentIdRef","newIdRefs","newRecordDataWithMyId","idMatch","newData","updatedRecord","linkRawData","newLinkData","newLinkRecord","idRef","columnAndValue","entityInfo","matchedEntity","sameRowEntityNullOrRefOrNewData","updatedEntityLinkAttr","otherTableEntitiesData","removedLinkName","relatedEntityData","finalRelatedEntityRef","updateRecordQuery","matchedEntities","relianceUpdatedResult","matchExp","inSameRowDataOp","deleteQuery","relianceEvents","sameRowRecordEvents","relationEvents","recordEvents","recordWithSameRowDataQuery","recordWithSameRowData","relianceInfo","recordsById","matchInIds","event","entityId","relatedEntityId","attributes","isEntitySource","sourceId","targetId","existRecord","unlinkAttr","unlinkId","attributePathStr","startRecordId","endRecordId","limitLength","attributePathAndLast","endAttribute","recursiveLabel","foundPath","EntityQueryHandle","limitedModifier","modifierData","relationName","sourceEntityId","targetEntityId","attributeEntityId","relationData","ancestorId","arg","RecordInfo","valueFields","linkFields","managedRecordAttributeFields","relianceFields","attributeData","LinkInfo","isFromSource","baseLinkName","EntityToTableMap","rawAttributeName","rawAttribute","isSource","attributivePath","currentEntity","parentEntity","lastAttribute","rawCurrentAttribute","lastSymmetricDirection","currentAttribute","relationPath","lastEntityData","lastTable","lastTableAlias","isLinkRecord","currentAttributeName","linkTable","linkAlias","currentEntityAttribute","currentEntityData","dontShrink","table","attrInfo","found","head","splitPoint","linkData","attributeInfos","_","linkSymbolOccur","attributeNames","valueAttributes","entityAttributes","previousEntity","previousAttr","nextPart","relationInfo","relationPointsTo","sourceTargetPointsTo","buildEntityTree","entities","tree","leafSet","buildRelationTree","relations","inputRelationNames","baseRelationName","processMergedItems","refContainer","entityTree","relationTree","processMergedItemsOfType","itemTree","itemType","mergedItems","inputItems","getInputItems","mergedItem","processSingleMergedItem","isEntity","inputTypeFieldName","getItemName","itemToTransform","transformedItem","virtualBaseItem","transformMergedItem","inputItem","processInputItem","filteredItem","baseItem","createFilteredItemFromInput","baseItemName","existingItem","buildLeafToInputMap","leafToInputMap","itemName","inputItemNames","leafItem","leafInputItemNames","childSet","createInputTypeProperty","inputFieldName","inputNames","input","mergeProperties","mergedProperties","itemPropertyMap","mergedPropertyMap","sourceItem","isRelation","propertyMap","prop","isInputItemMergedItem","childItemNames","childItemName","childItem","childItemPropertyMap","propName","mergedProp","property","inputTypeProperty","transformedEntity","virtualBaseEntity","transformedRelation","virtualBaseRelation","inputRelationName","baseEntity","rootBase","baseRelation","getRootBaseRelation","current","DBSetup","mergeLinks","joinTargetRecord","link","moveTable","joinTargetTable","joinTargetSameTableRecords","sameTableRecordsToMove","conflicts","sameTableRecordToMove","sameTableRecord","mergeTarget","toMerge","linkConflict","virtualLinkName","originTableName","newTableName","entityWithProps","entityData","relType","allFiltered","filteredBy","resolvedBaseRecordName","tableName","matchExpressions","nextEntity","nextMatchExpression","relationEntityName","relationWithProps","sourceRelType","targetRelType","sourceName","targetName","virtualSourceRelationName","virtualTargetRelationName","relationRecord","isFilteredRelation","sourceLink","oneToOneRelianceLinks","xToOneNotRelianceLinks","mergedLinks","rootRecord","targetRecord","recordToMove","linkToRecordLinkName","mergeWithSource","mergedLinkData","sourceLinkName","originTableNames","valueAttributeData","sourceAttribute","targetAttribute","valueAttribute","column","originalName","parts","shortName","FrameworkError","chain","output","importantContext","err","rootCause","line","error","ErrorClass","ErrorSeverity","ErrorCategory","InteractionExecutionError","ActivityError","ComputationError","ComputationStateError","ComputationDataDepError","SchedulerError","ConditionError","payload","fullMessage","InteractionCall","controller","activitySeqCall","inputAttributive","interactionEvent","attributiveTarget","attributive","testFn","attributiveData","AttributiveClass","target","activityId","checkUserRef","res","userAttributiveCombined","checkHandle","concept","attributives","conceptRes","handleAttributives","attrMatchRes","derivedConcept","errors","checkRes","constructorCheck","handleAttributive","payloadDefs","payloadKeys","payloadKey","payloadDef","payloadItem","fullPayloadItem","itemMatch","handleAttribute","eventArgs","response","sideEffectsPromise","sideEffect","results","effects","fixedModifier","fixedAttributeQuery","interactionEventArgs","ActivitySeqState","graph","headNode","InteractionState","seqState","child","node","nextState","state","seqNode","GroupStateNode","groupState","childPrevUUID","childNextUUID","childSeq","ActivityState","ActivityCall","eventUser","rawGatewayToNode","seq","interactionCall","gateway","candidateStart","candidateEnd","transfer","sourceNode","targetNode","initialStateData","inputActivityId","stateCompleteResult","refs","AnyActivityStateNode","EveryActivityStateNode","RaceActivityStateNode","ProgrammaticActivityStateNode","asyncInteractionContext","AsyncLocalStorage","INTERACTION_RECORD","ACTIVITY_RECORD","InteractionEventEntity","ActivityStateEntity","ActivityInteractionRelation","ActivityManager","activities","interactions","activityCall","interactionName","logger","unknownError","activityName","mutationEvents","sideEffects","RecordMutationSideEffect","instanceSideEffect","effectName","interactionId","ComputationResult","ComputationResultSkip","ComputationResultResolved","ComputationResultAsync","ComputationResultFullRecompute","RecordBoundState","defaultValue","GlobalBoundState","shallowEqual","b","TransitionFinder","currentState","trigger","transitions","transition","GlobalStateMachineHandle","dataContext","mutationEvent","lastValue","dirtyRecord","currentStateName","PropertyStateMachineHandle","initialRecord","transfers","RecordStateMachineHandle","nextValue","StateMachineHandles","GlobalWeightedSummationHandle","summation","weightAndValue","oldResult","newWeightAndValue","newResult","PropertyWeightedSummationHandle","relationQuery","_current","dataDeps","relatedItem","valueAndWeight","relatedMutationEvent","newRelationWithEntity","relatedRecord","relationMatchKey","newValueAndWeight","WeightedSummationHandles","GlobalEveryHandle","totalCount","matchCount","isMatch","newItemMatch","oldItemMatch","oldItemMatchBool","PropertyEveryHandle","relationMatch","EveryHandles","GlobalAnyHandle","PropertyAnyHandle","AnyHandles","GlobalCountHandle","count","PropertyCountHandle","isNewMatch","isOldMatch","CountHandles","RecordsTransformHandle","returnRecord","transformedRecord","index","matchSourceRecord","souceDataDep","sourceRecordId","mappedRecordsByIndex","transformedRecords","mappedRecord","TransformHandles","Expression","id","other","rightNode","variables","varId","Inequality","Equation","variable","power","leftValue","rightValue","rightExpr","leftVars","rightVars","allVars","linearForm","constantTerm","coefficient","discriminant","GlobalRealTimeComputation","now","resultValue","nextRecomputeTime","PropertyRealTimeComputation","RealTimeHandles","GlobalSumHandle","attrPointer","sumFieldPath","sum","oldValue","PropertySumHandle","SummationHandles","GlobalAverageHandle","avgFieldPath","PropertyAverageHandle","AverageHandles","BaseCustomComputationHandle","asyncResult","states","GlobalCustomHandle","EntityCustomHandle","RelationCustomHandle","PropertyCustomHandle","recordTypeDataDeps","CustomHandles","ComputationSourceMapManager","computations","ERMutationEventSources","computation","dataDepName","dataDep","selfDataDep","recordDataDep","sourceMap","sourceMaps","source","eventType","isInitial","ERMutationEventsSource","includeCreate","primitiveAttr","relationQueryAttr","attrName","subQuery","subAttrs","realtionRecordName","typeMap","sourceMapTree","targetTree","ASYNC_TASK_RECORD","Scheduler","dict","computationHandles","computationInputs","relationWithComputation","dictItem","computationInput","contextMap","ComputationCtor","AsyncTaskEntity","AsyncTaskRelation","handleClass","contextType","stateName","stateItem","propertyDataContext","computationHandle","sources","dirtyDataDepRecords","dirtyRecordsAndEvents","propertyContext","eventBasedComputation","dirtyRecords","erRecordMutationEvent","entityContext","relationContext","taskRecordIdRef","taskRecord","resultOrPatch","forceFullCompute","computationResult","databasedComputation","globalDict","USER_ENTITY","Controller","system","recordMutationSideEffects","ignorePermission","forceThtrowInteractionError","allComputationHandles","install","patch","patches","erDataContext","eventName","callback","IDSystem$3","lastId","newId","SQLiteDB","file","IDSystem","dbConsoleLogger","SQLite","where","finalSQL","getReferenceFieldValue","collection","JSONStringify","JSONParse","MonoStorage","initialValue","createTables","dbSetup","method","newEvents","callbackResult","DBLogLevel","DBConsoleLogger","level","SystemLogLevel","SystemConsoleLogger","fixed","systemConsoleLogger","MonoSystem","container","rootEntity","defaultValuetype","Client","pg","IDSystem$2","PostgreSQLDB","forceDrop","fieldNameWithQuotes","IDSystem$1","PGLiteDB","PGlite","tables","MysqlDB","mysql","rows"],"mappings":"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"}