orange-orm 3.10.2

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 (459) hide show
  1. package/.dockerignore +1 -0
  2. package/.eslintignore +2 -0
  3. package/.eslintrc.js +45 -0
  4. package/.gitattributes +3 -0
  5. package/CNAME +1 -0
  6. package/CONTRIBUTING.md +43 -0
  7. package/LICENSE +7 -0
  8. package/README.md +1969 -0
  9. package/SECURITY.md +12 -0
  10. package/bin/build.js +127 -0
  11. package/bin/compile.js +26 -0
  12. package/bin/rdb.js +4 -0
  13. package/docs/CODE_OF_CONDUCT.md +18 -0
  14. package/docs/changelog.md +461 -0
  15. package/docs/docs.md +2373 -0
  16. package/docs/orange.svg +32 -0
  17. package/docs/relations.png +0 -0
  18. package/package.json +139 -0
  19. package/src/applyPatch.js +105 -0
  20. package/src/client/axiosInterceptor.js +46 -0
  21. package/src/client/clientMap.js +72 -0
  22. package/src/client/createPatch.js +122 -0
  23. package/src/client/createProviders.js +121 -0
  24. package/src/client/index.js +997 -0
  25. package/src/client/index.mjs +6295 -0
  26. package/src/client/map.js +110 -0
  27. package/src/client/merge.js +9 -0
  28. package/src/client/netAdapter.js +133 -0
  29. package/src/client/rollup.config.js +12 -0
  30. package/src/client/self.js +4 -0
  31. package/src/client/stringify.js +22 -0
  32. package/src/client/toKeyPositionMap.js +30 -0
  33. package/src/clsTest.js +79 -0
  34. package/src/createDomain/negotiateForwardProperty.js +23 -0
  35. package/src/createDomain.js +31 -0
  36. package/src/dateToISOString.js +25 -0
  37. package/src/emitEvent.js +46 -0
  38. package/src/emptyFilter.js +35 -0
  39. package/src/flags.js +6 -0
  40. package/src/fromCompareObject.js +24 -0
  41. package/src/generic-pool.js +641 -0
  42. package/src/getManyDto/newQuery.js +18 -0
  43. package/src/getManyDto/query/newColumnSql.js +8 -0
  44. package/src/getManyDto/query/newSingleQuery.js +19 -0
  45. package/src/getManyDto/query/singleQuery/newJoinedColumnSql.js +25 -0
  46. package/src/getManyDto/query/singleQuery/newShallowColumnSql.js +25 -0
  47. package/src/getManyDto.js +255 -0
  48. package/src/getTSDefinition.js +510 -0
  49. package/src/hostExpress/executePath.js +433 -0
  50. package/src/hostExpress/getMeta.js +49 -0
  51. package/src/hostExpress.js +125 -0
  52. package/src/hostLocal.js +110 -0
  53. package/src/index.d.ts +324 -0
  54. package/src/index.js +116 -0
  55. package/src/jsconfig.json +8 -0
  56. package/src/lock/toIntKey.js +35 -0
  57. package/src/lock.js +26 -0
  58. package/src/map.d.ts +1729 -0
  59. package/src/mssql/encodeBuffer.js +7 -0
  60. package/src/mssql/newDatabase.js +129 -0
  61. package/src/mssql/newPool.js +19 -0
  62. package/src/mssql/newTransaction.js +69 -0
  63. package/src/mssql/pool/defaults.js +45 -0
  64. package/src/mssql/pool/end.js +13 -0
  65. package/src/mssql/pool/newGenericPool.js +62 -0
  66. package/src/mssql/wrapQuery.js +34 -0
  67. package/src/mySql/deleteFromSql.js +8 -0
  68. package/src/mySql/encodeBoolean.js +7 -0
  69. package/src/mySql/insert.js +21 -0
  70. package/src/mySql/insertSql.js +62 -0
  71. package/src/mySql/lastInsertedSql.js +11 -0
  72. package/src/mySql/limitAndOffset.js +18 -0
  73. package/src/mySql/newDatabase.js +127 -0
  74. package/src/mySql/newPool.js +19 -0
  75. package/src/mySql/newTransaction.js +54 -0
  76. package/src/mySql/pool/defaults.js +16 -0
  77. package/src/mySql/pool/end.js +13 -0
  78. package/src/mySql/pool/negotiatePoolOptions.js +12 -0
  79. package/src/mySql/pool/newGenericPool.js +67 -0
  80. package/src/mySql/selectForUpdateSql.js +3 -0
  81. package/src/mySql/wrapQuery.js +16 -0
  82. package/src/mySql/wrapQueryStream.js +9 -0
  83. package/src/newArray.js +3 -0
  84. package/src/newCollection.js +55 -0
  85. package/src/newId.js +1 -0
  86. package/src/newImmutable.js +22 -0
  87. package/src/newObject.js +5 -0
  88. package/src/oracle/deleteFromSql.js +8 -0
  89. package/src/oracle/encodeBoolean.js +7 -0
  90. package/src/oracle/encodeBuffer.js +7 -0
  91. package/src/oracle/encodeDate.js +7 -0
  92. package/src/oracle/formatDateIn.js +5 -0
  93. package/src/oracle/formatDateOut.js +5 -0
  94. package/src/oracle/insert.js +23 -0
  95. package/src/oracle/insertSql.js +73 -0
  96. package/src/oracle/lastInsertedSql.js +14 -0
  97. package/src/oracle/limitAndOffset.js +18 -0
  98. package/src/oracle/mergeSql.js +79 -0
  99. package/src/oracle/newDatabase.js +128 -0
  100. package/src/oracle/newInsertCommandCore.js +27 -0
  101. package/src/oracle/newPool.js +19 -0
  102. package/src/oracle/newTransaction.js +63 -0
  103. package/src/oracle/outputInsertedSql.js +5 -0
  104. package/src/oracle/pool/defaults.js +45 -0
  105. package/src/oracle/pool/end.js +13 -0
  106. package/src/oracle/pool/newGenericPool.js +64 -0
  107. package/src/oracle/replaceParamChar.js +14 -0
  108. package/src/oracle/selectForUpdateSql.js +3 -0
  109. package/src/oracle/wrapQuery.js +38 -0
  110. package/src/patchRow.js +13 -0
  111. package/src/patchTable.js +317 -0
  112. package/src/pg/deleteFromSql.js +8 -0
  113. package/src/pg/encodeBoolean.js +5 -0
  114. package/src/pg/encodeDate.js +7 -0
  115. package/src/pg/encodeJSON.js +15 -0
  116. package/src/pg/formatDateOut.js +5 -0
  117. package/src/pg/insert.js +14 -0
  118. package/src/pg/insertSql.js +70 -0
  119. package/src/pg/lastInsertedSql.js +11 -0
  120. package/src/pg/limitAndOffset.js +18 -0
  121. package/src/pg/newDatabase.js +153 -0
  122. package/src/pg/newPool.js +19 -0
  123. package/src/pg/newStreamableQuery.js +7 -0
  124. package/src/pg/newTransaction.js +58 -0
  125. package/src/pg/pool/defaults.js +45 -0
  126. package/src/pg/pool/end.js +13 -0
  127. package/src/pg/pool/newPgPool.js +82 -0
  128. package/src/pg/replaceParamChar.js +14 -0
  129. package/src/pg/schema.js +11 -0
  130. package/src/pg/selectForUpdateSql.js +3 -0
  131. package/src/pg/wrapQuery.js +33 -0
  132. package/src/pg/wrapQueryStream.js +20 -0
  133. package/src/pools.js +17 -0
  134. package/src/query/negotiateParameters.js +10 -0
  135. package/src/query/negotiateSql.js +14 -0
  136. package/src/query/wrapQuery.js +17 -0
  137. package/src/query.js +13 -0
  138. package/src/sap/deleteFromSql.js +8 -0
  139. package/src/sap/encodeBoolean.js +7 -0
  140. package/src/sap/encodeBuffer.js +7 -0
  141. package/src/sap/formatDateOut.js +5 -0
  142. package/src/sap/insert.js +21 -0
  143. package/src/sap/insertSql.js +64 -0
  144. package/src/sap/lastInsertedSql.js +12 -0
  145. package/src/sap/limitAndOffset.js +16 -0
  146. package/src/sap/mergeSql.js +73 -0
  147. package/src/sap/newDatabase.js +129 -0
  148. package/src/sap/newPool.js +19 -0
  149. package/src/sap/newTransaction.js +69 -0
  150. package/src/sap/pool/end.js +13 -0
  151. package/src/sap/selectForUpdateSql.js +3 -0
  152. package/src/sqlite/deleteFromSql.js +8 -0
  153. package/src/sqlite/encodeBoolean.js +7 -0
  154. package/src/sqlite/encodeBuffer.js +7 -0
  155. package/src/sqlite/insert.js +21 -0
  156. package/src/sqlite/insertSql.js +64 -0
  157. package/src/sqlite/lastInsertedSql.js +12 -0
  158. package/src/sqlite/limitAndOffset.js +18 -0
  159. package/src/sqlite/newDatabase.js +128 -0
  160. package/src/sqlite/newPool.js +19 -0
  161. package/src/sqlite/newTransaction.js +58 -0
  162. package/src/sqlite/pool/defaults.js +45 -0
  163. package/src/sqlite/pool/end.js +13 -0
  164. package/src/sqlite/pool/newGenericPool.js +59 -0
  165. package/src/sqlite/selectForUpdateSql.js +3 -0
  166. package/src/sqlite/wrapQuery.js +24 -0
  167. package/src/table/aggregate.js +9 -0
  168. package/src/table/begin.js +10 -0
  169. package/src/table/cascadeDelete.js +11 -0
  170. package/src/table/cloneStrategy.js +18 -0
  171. package/src/table/column/binary/newDecode.js +15 -0
  172. package/src/table/column/binary/newEncode.js +23 -0
  173. package/src/table/column/binary/purify.js +12 -0
  174. package/src/table/column/binary.js +12 -0
  175. package/src/table/column/boolean/newDecode.js +12 -0
  176. package/src/table/column/boolean/newEncode.js +36 -0
  177. package/src/table/column/boolean/purify.js +7 -0
  178. package/src/table/column/boolean.js +14 -0
  179. package/src/table/column/date/formatOut.js +11 -0
  180. package/src/table/column/date/newDecode.js +17 -0
  181. package/src/table/column/date/newEncode.js +47 -0
  182. package/src/table/column/date/purify.js +17 -0
  183. package/src/table/column/date/toISOString.js +25 -0
  184. package/src/table/column/date/tryParseISO.js +14 -0
  185. package/src/table/column/date.js +14 -0
  186. package/src/table/column/dateWithTimeZone/newEncode.js +41 -0
  187. package/src/table/column/dateWithTimeZone.js +14 -0
  188. package/src/table/column/encodeFilterArg.js +8 -0
  189. package/src/table/column/equal.js +15 -0
  190. package/src/table/column/extractAlias.js +7 -0
  191. package/src/table/column/greaterThan.js +12 -0
  192. package/src/table/column/greaterThanOrEqual.js +12 -0
  193. package/src/table/column/guid/newDecode.js +10 -0
  194. package/src/table/column/guid/newEncode.js +30 -0
  195. package/src/table/column/guid/purify.js +10 -0
  196. package/src/table/column/guid.js +12 -0
  197. package/src/table/column/in.js +24 -0
  198. package/src/table/column/json/formatOut.js +11 -0
  199. package/src/table/column/json/newDecode.js +21 -0
  200. package/src/table/column/json/newEncode.js +41 -0
  201. package/src/table/column/json/purify.js +7 -0
  202. package/src/table/column/json.js +22 -0
  203. package/src/table/column/lessThan.js +12 -0
  204. package/src/table/column/lessThanOrEqual.js +12 -0
  205. package/src/table/column/negotiateNextAndFilter.js +7 -0
  206. package/src/table/column/negotiateNextOrFilter.js +7 -0
  207. package/src/table/column/negotiateRawSqlFilter.js +74 -0
  208. package/src/table/column/newBoolean.js +54 -0
  209. package/src/table/column/newColumn.js +89 -0
  210. package/src/table/column/newDecodeCore.js +10 -0
  211. package/src/table/column/notEqual.js +15 -0
  212. package/src/table/column/numeric/negotiateDefault.js +5 -0
  213. package/src/table/column/numeric/newDecode.js +16 -0
  214. package/src/table/column/numeric/newEncode.js +25 -0
  215. package/src/table/column/numeric/purify.js +12 -0
  216. package/src/table/column/numeric.js +15 -0
  217. package/src/table/column/string/contains.js +3 -0
  218. package/src/table/column/string/containsCore.js +16 -0
  219. package/src/table/column/string/endsWith.js +3 -0
  220. package/src/table/column/string/endsWithCore.js +16 -0
  221. package/src/table/column/string/iContains.js +3 -0
  222. package/src/table/column/string/iEndsWith.js +3 -0
  223. package/src/table/column/string/iEqual.js +15 -0
  224. package/src/table/column/string/iStartsWith.js +3 -0
  225. package/src/table/column/string/newEncode.js +31 -0
  226. package/src/table/column/string/purify.js +7 -0
  227. package/src/table/column/string/startsWith.js +3 -0
  228. package/src/table/column/string/startsWithCore.js +16 -0
  229. package/src/table/column/string.js +55 -0
  230. package/src/table/column.js +154 -0
  231. package/src/table/commands/beginCommand.js +13 -0
  232. package/src/table/commands/commitCommand.js +9 -0
  233. package/src/table/commands/compressChanges.js +25 -0
  234. package/src/table/commands/delete/createAlias.js +6 -0
  235. package/src/table/commands/delete/newSingleCommand.js +17 -0
  236. package/src/table/commands/delete/singleCommand/joinSql.js +26 -0
  237. package/src/table/commands/delete/singleCommand/newSingleCommandCore.js +19 -0
  238. package/src/table/commands/delete/singleCommand/selectSql.js +11 -0
  239. package/src/table/commands/delete/singleCommand/subFilter.js +19 -0
  240. package/src/table/commands/delete/singleCommand/whereSql.js +25 -0
  241. package/src/table/commands/getChangeSet.js +6 -0
  242. package/src/table/commands/insert/getSqlTemplate.js +68 -0
  243. package/src/table/commands/lastCommandMatches.js +11 -0
  244. package/src/table/commands/negotiateEndEdit.js +7 -0
  245. package/src/table/commands/newDeleteCommand.js +23 -0
  246. package/src/table/commands/newGetLastInsertedCommand.js +49 -0
  247. package/src/table/commands/newGetLastInsertedCommandCore.js +42 -0
  248. package/src/table/commands/newInsertAndForgetCommand.js +55 -0
  249. package/src/table/commands/newInsertCommand.js +56 -0
  250. package/src/table/commands/newInsertCommandCore.js +27 -0
  251. package/src/table/commands/newRow.js +51 -0
  252. package/src/table/commands/newUpdateCommand.js +62 -0
  253. package/src/table/commands/newUpdateCommandCore.js +45 -0
  254. package/src/table/commands/pushCommand.js +10 -0
  255. package/src/table/commands/rollbackCommand.js +13 -0
  256. package/src/table/commit.js +30 -0
  257. package/src/table/count.js +29 -0
  258. package/src/table/createJSONReadStream.js +7 -0
  259. package/src/table/createJSONReadStreamDefault.js +33 -0
  260. package/src/table/createJSONReadStreamNative.js +31 -0
  261. package/src/table/createReadStream.js +24 -0
  262. package/src/table/createReadStreamCoreNative.js +40 -0
  263. package/src/table/createReadStreamDefault.js +102 -0
  264. package/src/table/createReadStreamNative.js +17 -0
  265. package/src/table/delete.js +20 -0
  266. package/src/table/deleteSessionContext.js +17 -0
  267. package/src/table/encodeDbSpecific.js +10 -0
  268. package/src/table/executeQueries/executeChanges.js +35 -0
  269. package/src/table/executeQueries/executeQueriesCore.js +12 -0
  270. package/src/table/executeQueries/executeQuery.js +8 -0
  271. package/src/table/executeQueries/resolveExecuteQuery.js +57 -0
  272. package/src/table/executeQueries.js +15 -0
  273. package/src/table/extractDeleteStrategy.js +9 -0
  274. package/src/table/fuzzyPromise.js +18 -0
  275. package/src/table/getById.js +33 -0
  276. package/src/table/getFirstFromDb.js +10 -0
  277. package/src/table/getFromDbById.js +17 -0
  278. package/src/table/getIdArgs.js +14 -0
  279. package/src/table/getMany.js +26 -0
  280. package/src/table/getManyDto/newQuery.js +32 -0
  281. package/src/table/getManyDto/pg/newQuery.js +8 -0
  282. package/src/table/getManyDto.js +10 -0
  283. package/src/table/getManyDtoFast/getSubRows.js +172 -0
  284. package/src/table/getManyDtoFast/newQuery.js +8 -0
  285. package/src/table/getManyDtoFast/newQueryCore.js +18 -0
  286. package/src/table/getManyDtoFast/query/newSingleQuery.js +20 -0
  287. package/src/table/getManyDtoFast/query/newSubQueries/joinLegToQuery.js +18 -0
  288. package/src/table/getManyDtoFast/query/newSubQueries/manyLegToQuery.js +20 -0
  289. package/src/table/getManyDtoFast/query/newSubQueries/oneLegToQuery.js +21 -0
  290. package/src/table/getManyDtoFast/query/newSubQueries.js +47 -0
  291. package/src/table/getManyDtoFast/query/singleQuery/newShallowColumnSql.js +21 -0
  292. package/src/table/getSessionContext.js +10 -0
  293. package/src/table/getSessionSingleton.js +5 -0
  294. package/src/table/groupBy/newQuery.js +25 -0
  295. package/src/table/groupBy.js +65 -0
  296. package/src/table/hasMany.js +33 -0
  297. package/src/table/hasOne.js +33 -0
  298. package/src/table/insert.js +91 -0
  299. package/src/table/insertDefault.js +88 -0
  300. package/src/table/join.js +42 -0
  301. package/src/table/joinRelation/getRelatives.js +64 -0
  302. package/src/table/log.js +39 -0
  303. package/src/table/negotiateAddStrategy.js +20 -0
  304. package/src/table/negotiateExpandInverse.js +13 -0
  305. package/src/table/newCache.js +96 -0
  306. package/src/table/newCascadeDeleteStrategy.js +30 -0
  307. package/src/table/newGetRelated.js +21 -0
  308. package/src/table/newJoinRelation.js +117 -0
  309. package/src/table/newManyRelation.js +61 -0
  310. package/src/table/newOneRelation.js +61 -0
  311. package/src/table/newPrimaryKeyFilter.js +13 -0
  312. package/src/table/newQuery.js +18 -0
  313. package/src/table/newRelatedTable.js +100 -0
  314. package/src/table/newRowCache.js +106 -0
  315. package/src/table/newThrow.js +11 -0
  316. package/src/table/nullPromise.js +1 -0
  317. package/src/table/objectToCallback.js +7 -0
  318. package/src/table/oneRelation/getRelatives.js +45 -0
  319. package/src/table/popChanges.js +19 -0
  320. package/src/table/promise.js +14 -0
  321. package/src/table/purifyStrategy.js +49 -0
  322. package/src/table/query/extractFilter.js +9 -0
  323. package/src/table/query/extractLimit.js +11 -0
  324. package/src/table/query/extractLimitQuery.js +23 -0
  325. package/src/table/query/extractOffset.js +11 -0
  326. package/src/table/query/extractOrderBy.js +57 -0
  327. package/src/table/query/extractSql.js +10 -0
  328. package/src/table/query/newParameterized.js +38 -0
  329. package/src/table/query/newSingleQuery.js +23 -0
  330. package/src/table/query/parameterized/extractParameters.js +8 -0
  331. package/src/table/query/singleQuery/columnSql/joinLegToColumnSql.js +16 -0
  332. package/src/table/query/singleQuery/columnSql/newJoinedColumnSql.js +27 -0
  333. package/src/table/query/singleQuery/columnSql/newShallowColumnSql.js +37 -0
  334. package/src/table/query/singleQuery/joinSql/joinLegToJoinSql.js +13 -0
  335. package/src/table/query/singleQuery/joinSql/joinLegToShallowJoinSql.js +9 -0
  336. package/src/table/query/singleQuery/joinSql/newDiscriminatorSql.js +11 -0
  337. package/src/table/query/singleQuery/joinSql/newShallowJoinSql.js +9 -0
  338. package/src/table/query/singleQuery/joinSql/newShallowJoinSqlCore.js +25 -0
  339. package/src/table/query/singleQuery/joinSql/oneLegToJoinSql.js +13 -0
  340. package/src/table/query/singleQuery/joinSql/oneLegToShallowJoinSql.js +10 -0
  341. package/src/table/query/singleQuery/negotiateExclusive.js +11 -0
  342. package/src/table/query/singleQuery/negotiateLimit.js +10 -0
  343. package/src/table/query/singleQuery/newColumnSql.js +8 -0
  344. package/src/table/query/singleQuery/newDiscriminatorSql.js +33 -0
  345. package/src/table/query/singleQuery/newJoinSql.js +41 -0
  346. package/src/table/query/singleQuery/newQueryContext.js +20 -0
  347. package/src/table/query/singleQuery/newWhereSql.js +19 -0
  348. package/src/table/readStream/extractLimit.js +7 -0
  349. package/src/table/readStream/extractOrderBy.js +55 -0
  350. package/src/table/readStream/mySql/newQuery.js +16 -0
  351. package/src/table/readStream/mySql/query/newSingleQuery.js +21 -0
  352. package/src/table/readStream/mySql/query/newSubQueries/joinLegToQuery.js +19 -0
  353. package/src/table/readStream/mySql/query/newSubQueries/manyLegToQuery.js +22 -0
  354. package/src/table/readStream/mySql/query/newSubQueries/newQueryCore.js +9 -0
  355. package/src/table/readStream/mySql/query/newSubQueries/newSingleQueryCore.js +18 -0
  356. package/src/table/readStream/mySql/query/newSubQueries/oneLegToQuery.js +22 -0
  357. package/src/table/readStream/mySql/query/newSubQueries.js +47 -0
  358. package/src/table/readStream/mySql/query/singleQuery/newShallowColumnSql.js +17 -0
  359. package/src/table/readStream/newQuery.js +32 -0
  360. package/src/table/readStream/newQueryStream.js +8 -0
  361. package/src/table/readStream/pg/newQuery.js +8 -0
  362. package/src/table/readStream/pg/newQueryCore.js +17 -0
  363. package/src/table/readStream/pg/query/newSingleQuery.js +19 -0
  364. package/src/table/readStream/pg/query/newSubQueries/joinLegToQuery.js +19 -0
  365. package/src/table/readStream/pg/query/newSubQueries/manyLegToQuery.js +22 -0
  366. package/src/table/readStream/pg/query/newSubQueries/oneLegToQuery.js +19 -0
  367. package/src/table/readStream/pg/query/newSubQueries.js +47 -0
  368. package/src/table/readStream/pg/query/singleQuery/newShallowColumnSql.js +19 -0
  369. package/src/table/readStreamDefault/createBatchFilter.js +39 -0
  370. package/src/table/relatedTable/aggregate/aggregateJoinSql.js +37 -0
  371. package/src/table/relatedTable/aggregate/joinSql.js +38 -0
  372. package/src/table/relatedTable/aggregate.js +48 -0
  373. package/src/table/relatedTable/all.js +24 -0
  374. package/src/table/relatedTable/any.js +70 -0
  375. package/src/table/relatedTable/childColumn.js +61 -0
  376. package/src/table/relatedTable/columnAggregate.js +16 -0
  377. package/src/table/relatedTable/columnAggregateGroup.js +59 -0
  378. package/src/table/relatedTable/joinSql.js +40 -0
  379. package/src/table/relatedTable/joinSqlArray.js +32 -0
  380. package/src/table/relatedTable/none.js +22 -0
  381. package/src/table/relatedTable/relatedColumn.js +49 -0
  382. package/src/table/relatedTable/relationFilter.js +16 -0
  383. package/src/table/relatedTable/selectSql.js +11 -0
  384. package/src/table/relatedTable/subFilter.js +16 -0
  385. package/src/table/relatedTable/where.js +50 -0
  386. package/src/table/relatedTable/whereSql.js +41 -0
  387. package/src/table/relation/manyCache/extractParentKey.js +17 -0
  388. package/src/table/relation/manyCache/synchronizeAdded.js +13 -0
  389. package/src/table/relation/manyCache/synchronizeChanged.js +31 -0
  390. package/src/table/relation/manyCache/synchronizeRemoved.js +13 -0
  391. package/src/table/relation/newExpanderCache.js +7 -0
  392. package/src/table/relation/newForeignKeyFilter.js +20 -0
  393. package/src/table/relation/newJoinLeg.js +23 -0
  394. package/src/table/relation/newManyCache.js +57 -0
  395. package/src/table/relation/newManyCacheCore.js +53 -0
  396. package/src/table/relation/newManyLeg.js +15 -0
  397. package/src/table/relation/newOneCache.js +28 -0
  398. package/src/table/relation/newOneLeg.js +25 -0
  399. package/src/table/releaseDbClient.js +15 -0
  400. package/src/table/resultToPromise.js +8 -0
  401. package/src/table/resultToRows/dbRowToRow.js +51 -0
  402. package/src/table/resultToRows/dbRowsToRows.js +13 -0
  403. package/src/table/resultToRows/decodeDbRow.js +25 -0
  404. package/src/table/resultToRows/delete/removeFromCache.js +33 -0
  405. package/src/table/resultToRows/delete.js +31 -0
  406. package/src/table/resultToRows/negotiateQueryContext.js +6 -0
  407. package/src/table/resultToRows/newDecodeDbRow.js +262 -0
  408. package/src/table/resultToRows/toDto/createDto.js +20 -0
  409. package/src/table/resultToRows/toDto/extractStrategy.js +41 -0
  410. package/src/table/resultToRows/toDto.js +92 -0
  411. package/src/table/resultToRows.js +37 -0
  412. package/src/table/rollback.js +31 -0
  413. package/src/table/rowArray/negotiateNextTick.js +11 -0
  414. package/src/table/rowArray/orderBy.js +51 -0
  415. package/src/table/rowArray.js +62 -0
  416. package/src/table/setSessionSingleton.js +5 -0
  417. package/src/table/strategyToSpan.js +49 -0
  418. package/src/table/tryGetById.js +13 -0
  419. package/src/table/tryGetFirstFromDb.js +23 -0
  420. package/src/table/tryGetFromCacheById.js +12 -0
  421. package/src/table/tryGetFromDbById/extractStrategy.js +9 -0
  422. package/src/table/tryGetFromDbById.js +19 -0
  423. package/src/table/tryGetSessionContext.js +16 -0
  424. package/src/table/tryReleaseDbClient.js +14 -0
  425. package/src/table/updateField.js +12 -0
  426. package/src/table/where.js +12 -0
  427. package/src/table.js +174 -0
  428. package/src/tedious/deleteFromSql.js +8 -0
  429. package/src/tedious/encodeBoolean.js +7 -0
  430. package/src/tedious/encodeBuffer.js +7 -0
  431. package/src/tedious/formatDateOut.js +5 -0
  432. package/src/tedious/formatJSONOut.js +5 -0
  433. package/src/tedious/getManyDto/newQuery.js +8 -0
  434. package/src/tedious/getManyDto/newQueryCore.js +18 -0
  435. package/src/tedious/getManyDto/query/newSingleQuery.js +29 -0
  436. package/src/tedious/getManyDto/query/newSubQueries/joinLegToQuery.js +16 -0
  437. package/src/tedious/getManyDto/query/newSubQueries/manyLegToQuery.js +16 -0
  438. package/src/tedious/getManyDto/query/newSubQueries/oneLegToQuery.js +19 -0
  439. package/src/tedious/getManyDto/query/newSubQueries.js +48 -0
  440. package/src/tedious/getManyDto/query/singleQuery/newShallowColumnSql.js +34 -0
  441. package/src/tedious/getManyDto.js +27 -0
  442. package/src/tedious/insert.js +13 -0
  443. package/src/tedious/insertSql.js +70 -0
  444. package/src/tedious/limitAndOffset.js +16 -0
  445. package/src/tedious/mergeSql.js +76 -0
  446. package/src/tedious/newDatabase.js +129 -0
  447. package/src/tedious/newPool.js +19 -0
  448. package/src/tedious/newTransaction.js +72 -0
  449. package/src/tedious/outputInsertedSql.js +11 -0
  450. package/src/tedious/pool/defaults.js +45 -0
  451. package/src/tedious/pool/end.js +13 -0
  452. package/src/tedious/pool/newGenericPool.js +71 -0
  453. package/src/tedious/pool/parseConnectionString.js +40 -0
  454. package/src/tedious/selectForUpdateSql.js +3 -0
  455. package/src/tedious/wrapQuery.js +112 -0
  456. package/src/toCompareObject.js +41 -0
  457. package/src/useHook.js +9 -0
  458. package/src/validateDeleteAllowed.js +49 -0
  459. package/src/validateDeleteConflict.js +92 -0
package/docs/docs.md ADDED
@@ -0,0 +1,2373 @@
1
+ All examples below are found at [npmjs.org/package/rdb-demo](https://npmjs.org/package/rdb-demo).
2
+ This is the _Classic Documentation_. Are you looking for the [_Modern Typescript Documentation_](https://github.com/alfateam/orange-orm/blob/master/README.md) ?
3
+ ---------------
4
+ __Connecting__
5
+ [connect to postgres](#_connecttopostgres)
6
+ [connect to mySql](#_connecttomysql)
7
+ [connect to Ms Sql](#_connecttomssql)
8
+ [connect to Sybase SAP](#_connecttosap)
9
+ [connect to sqlite](#_connecttosqlite)
10
+ [pool size](#_poolsize)
11
+ [native bindings](#_native)
12
+ [schema](#_schema)
13
+ [schema alternative 2](#_schema2)
14
+ [end pool](#_endpool)
15
+ [end all pools](#_endallpools)
16
+ [logging](#_logging)
17
+
18
+ __Basic querying__
19
+ [getById](#_getbyid)
20
+ [tryGetById](#_trygetbyid)
21
+ [tryGetFirst](#_trygetfirst)
22
+ [join](#_join)
23
+ [hasMany](#_hasmany)
24
+ [hasOne](#_hasone)
25
+ [composite keys](#_compositekeys)
26
+ [getById eagerly](#_getbyideager)
27
+ [tryGetFirst eagerly](#_trygetfirsteager)
28
+ [toDto](#_todto)
29
+ [toDto with strategy](#_todtowithstrategy)
30
+ [toDto with orderBy](#_todtowithorderby)
31
+ [toDto with orderBy descending](#_todtowithorderbydesc)
32
+ [toDto ignoring columns](#_serializable)
33
+ [toJSON](#_tojson)
34
+ [toJSON with strategy](#_tojsonwithstrategy)
35
+ [getMany](#_getmany)
36
+ [getManyDto](#_getmanydto)
37
+ [getMany lazily](#_getmanylazy)
38
+ [getMany eagerly](#_getmanyeager)
39
+ [getManyDto eagerly](#_getmanydtoeager)
40
+ [limit and offset](#_limit)
41
+ [getMany with orderBy jsonb](#_getmanywithorderbyjsonb)
42
+ [getMany with orderBy jsonb descending](#_getmanywithorderbyjsonbdesc)
43
+ [(many)ToDto](#_manytodto)
44
+ [(many)ToDto with strategy](#_manytodtowithstrategy)
45
+ [(many)ToJSON](#_manytojson)
46
+ [(many)ToJSON with strategy](#_manytojsonwithstrategy)
47
+ [Raw SQL query](#_rawsqlquery)
48
+ [Raw SQL Query With Parameters](#_rawsqlquerywithparameters)
49
+
50
+ __Streaming__
51
+ [streaming rows](#_streameager)
52
+ [streaming json](#_streamjsoneager)
53
+
54
+ __Persistence__
55
+ [update](#_update)
56
+ [insert](#_insert)
57
+ [insertAndForget](#_insertAndForget)
58
+ [delete](#_delete)
59
+ [cascade delete](#_cascadedelete)
60
+ [bulk delete](#_bulkdelete)
61
+ [bulk cascade delete](#_bulkcascadedelete)
62
+ [default values](#_defaultvalues)
63
+ [conventions](#_conventions)
64
+ [update a join-relation](#_updatejoin)
65
+ [update a hasOne-relation](#_updatehasone)
66
+ [update a hasMany-relation](#_updatehasmany)
67
+ [row lock](#_rowlock)
68
+ [transaction lock](#_transactionlock)
69
+ [session lock](#_sessionlock)
70
+
71
+ __Validation__
72
+ [plain validator](#_validate)
73
+ [JSON Schema](#_jsonschema)
74
+
75
+ __Filters__
76
+ [equal](#_equal)
77
+ [notEqual](#_notequal)
78
+ [not](#_not)
79
+ [lessThan](#_lessthan)
80
+ [lessThanOrEqual](#_lessthanorequal)
81
+ [greaterThan](#_greaterthan)
82
+ [greaterThanOrEqual](#_greaterthanorequal)
83
+ [between](#_between)
84
+ [in](#_in)
85
+ [startsWith](#_startswith)
86
+ [endsWith](#_endswith)
87
+ [contains](#_contains)
88
+ [iEqual](#_iequal)
89
+ [iStartsWith](#_istartswith)
90
+ [iEndsWith](#_iendswith)
91
+ [iContains](#_icontains)
92
+ [exists](#_exists)
93
+ [or](#_or)
94
+ [and](#_and)
95
+ [or alternative syntax](#_oralternative)
96
+ [and alternative syntax](#_andalternative)
97
+ [any filter](#_any)
98
+ [all filter](#_all)
99
+ [none filter](#_none)
100
+ [composite filter](#_compositefilter)
101
+ [raw sql filter](#_rawsqlfilter)
102
+
103
+ _Contents_
104
+ ---------------
105
+
106
+ <a name="_connecttopostgres"></a>
107
+ [connect to postgres](https://github.com/alfateam/rdb-demo/blob/master/connect.js)
108
+ Prerequisites:
109
+ - npm install [pg](https://www.npmjs.com/package/pg)
110
+ ```js
111
+ let orange = require('orange-orm');
112
+
113
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
114
+ //alternatively: let db = orange.pg('postgres://postgres:postgres@localhost/test');
115
+
116
+ return db.transaction(async () => {
117
+ //transaction will commit after this function
118
+ });
119
+ ```
120
+ <a name="_connecttomysql"></a>
121
+ [connect to mySql](https://github.com/alfateam/rdb-demo/blob/master/mySql/connect.js)
122
+ Prerequisites:
123
+ - npm install [mysql2](https://www.npmjs.com/package/mysql2)
124
+ ```js
125
+ let orange = require('orange-orm');
126
+
127
+ let db = orange('mysql://root@localhost/rdbDemo?multipleStatements=true');
128
+ //alternatively: let db = orange.mySql('mysql://root@localhost/rdbDemo?multipleStatements=true');
129
+
130
+ return db.transaction(async () => {
131
+ //transaction will commit after this function
132
+ });
133
+ ```
134
+ <a name="_connecttomssql"></a>
135
+ [connect to Ms Sql](https://github.com/alfateam/rdb-demo/blob/master/msSql/connect.js)
136
+ Prerequisites:
137
+ - npm install [tedious](https://www.npmjs.com/package/tedious)
138
+ ```js
139
+ let orange = require('orange-orm');
140
+
141
+ let db = orange.mssql('server=.;Database=rdbDemo;Trusted_Connection=Yes;Driver={ODBC Driver 17 for SQL Server}');
142
+
143
+ return db.transaction(async () => {
144
+ //transaction will commit after this function
145
+ });
146
+ ```
147
+ <a name="_connecttosap"></a>
148
+ [connect to Sybase SAP](https://github.com/alfateam/rdb-demo/blob/master/sap/connect.js)
149
+ Prerequisites:
150
+ - The adaptive server driver
151
+ - npm install [mssqlnodev8](https://www.npmjs.com/package/msnodesqlv8) (yes, even though we are not using ms sql here)
152
+ ```js
153
+ let orange = require('orange-orm');
154
+
155
+ let db = orange.sap('DRIVER=Adaptive Server Enterprise;server=.;Port=5000;Database=rdbDemo;UID=test;PWD=test');
156
+
157
+ return db.transaction(async () => {
158
+ //transaction will commit after this function
159
+ });
160
+ ```
161
+ <a name="_connecttosqlite"></a>
162
+ [connect to sqlite](https://github.com/alfateam/rdb-demo/blob/master/sqlite/connect.js)
163
+ Prerequisites:
164
+ - npm install [sqlite3](https://www.npmjs.com/package/sqlite3)
165
+ ```js
166
+ let orange = require('orange-orm');
167
+
168
+ let db = orange.sqlite(__dirname + '/db/rdbDemo');
169
+
170
+ return db.transaction(async () => {
171
+ //transaction will commit after this function
172
+ });
173
+ ```
174
+ <a name="_poolsize"></a>
175
+ [pool size](https://github.com/alfateam/rdb-demo/blob/master/poolOptions.js)
176
+ ```js
177
+ let orange = require('orange-orm');
178
+ let poolOptions = {size: 20};
179
+
180
+ let db = orange('postgres://orange:orange@localhost/rdbdemo', poolOptions);
181
+
182
+ return db.transaction(async () => {
183
+ //transaction will commit after this function
184
+ });
185
+ ```
186
+ <a name="_native"></a>
187
+ __native bindings__
188
+ (postgres only)
189
+ Prerequisites:
190
+ - npm install [pg-native](https://npmjs.org/package/pg-native)
191
+ ```js
192
+ let orange = require('orange-orm');
193
+ let poolOptions = {native: true};
194
+
195
+ let db = orange('postgres://orange:orange@localhost/rdbdemo', poolOptions);
196
+
197
+ return db.transaction(async () => {
198
+ //transaction will commit after this function
199
+ });
200
+ ```
201
+ <a name="_schema"></a>
202
+ [schema](https://github.com/alfateam/rdb-demo/blob/master/schema.js)
203
+ (postgres only)
204
+ ```js
205
+ let orange = require('orange-orm');
206
+
207
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
208
+ //alternatively: let db = orange.pg('postgres://postgres:postgres@localhost/test');
209
+
210
+ await db.transaction({schema: ['mySchema', 'otherSchema']}, async () => {
211
+ //or use string for single schema );
212
+ //transaction will commit after this function
213
+ });
214
+ ```
215
+ <a name="_schema2"></a>
216
+ [schema alternative 2](https://github.com/alfateam/rdb-demo/blob/master/schema2.js)
217
+ (postgres only)
218
+ ```js
219
+ let orange = require('orange-orm');
220
+
221
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
222
+ //alternatively: let db = orange.pg('postgres://postgres:postgres@localhost/test');
223
+
224
+ return db.transaction(async () => {
225
+ await db.schema({schema: ['mySchema', 'otherSchema']});
226
+ //or use string for single schema );
227
+ });
228
+ ```
229
+ <a name="_endpool"></a>
230
+ [end pool](https://github.com/alfateam/rdb-demo/blob/master/endPool.js)
231
+ ```js
232
+ let orange = require('orange-orm');
233
+
234
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
235
+
236
+ await db.transaction(async () => {
237
+ //transaction will commit after this function
238
+ });
239
+ await db.end();
240
+ console.log('Pool ended.');
241
+
242
+ ```
243
+ <a name="_endallpools"></a>
244
+ [end all pools](https://github.com/alfateam/rdb-demo/blob/master/endAllPools.js)
245
+ ```js
246
+ let orange = require('orange-orm');
247
+
248
+ let dbPg = orange('postgres://orange:orange@localhost/rdbdemo');
249
+ let dbMySql = orange('mysql://root@localhost/rdbDemo?multipleStatements=true');
250
+
251
+ await dbPg.transaction(async () => {
252
+ //do pg stuff here
253
+ });
254
+ await dbMySql.transaction(async () => {
255
+ //do mySql stuff here
256
+ });
257
+ await orange.end();
258
+ console.log('Pools ended.');
259
+ ```
260
+ <a name="_logging"></a>
261
+ [logging](https://github.com/alfateam/rdb-demo/blob/master/logging.js)
262
+ ```js
263
+ let orange = require('orange-orm');
264
+
265
+ let Customer = orange.table('_customer');
266
+
267
+ Customer.primaryColumn('cId').guid().as('id');
268
+ Customer.column('cName').string().as('name');
269
+
270
+ orange.log(console.log); //will log sql and parameters
271
+
272
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
273
+
274
+ await db.transaction(async () => {
275
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
276
+ customer.name = 'Ringo';
277
+ });
278
+ ```
279
+ <a name="_getbyid"></a>
280
+ [getById](https://github.com/alfateam/rdb-demo/blob/master/getById.js)
281
+ ```js
282
+ let orange = require('orange-orm');
283
+ let Customer = orange.table('_customer');
284
+
285
+ Customer.primaryColumn('cId').guid().as('id');
286
+ Customer.column('cName').string().as('name');
287
+ Customer.column('cBalance').numeric().as('balance');
288
+ Customer.column('cRegdate').date().as('registeredDate');
289
+ Customer.column('cIsActive').boolean().as('isActive');
290
+ Customer.column('cPicture').binary().as('picture');
291
+ Customer.column('cDocument').json().as('document');
292
+
293
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
294
+
295
+ await db.transaction(async () => {
296
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
297
+ console.log(await customer.toDto());
298
+ });
299
+ ```
300
+ <a name="_trygetbyid"></a>
301
+ [tryGetById](https://github.com/alfateam/rdb-demo/blob/master/tryGetById.js)
302
+ ```js
303
+ let orange = require('orange-orm');
304
+
305
+ let Customer = orange.table('_customer');
306
+
307
+ Customer.primaryColumn('cId').guid().as('id');
308
+ Customer.column('cName').string().as('name');
309
+ Customer.column('cBalance').numeric().as('balance');
310
+ Customer.column('cRegdate').date().as('registeredDate');
311
+ Customer.column('cIsActive').boolean().as('isActive');
312
+ Customer.column('cPicture').binary().as('picture');
313
+
314
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
315
+
316
+ await db.transaction(async () => {
317
+ let customer = await Customer.tryGetById('a0000000-0000-0000-0000-000000000000');
318
+ console.log(await customer.toDto());
319
+ });
320
+ ```
321
+ <a name="_trygetfirst"></a>
322
+ [tryGetFirst](https://github.com/alfateam/rdb-demo/blob/master/tryGetFirst.js)
323
+ ```js
324
+ let orange = require('orange-orm');
325
+
326
+ let Customer = orange.table('_customer');
327
+
328
+ Customer.primaryColumn('cId').guid().as('id');
329
+ Customer.column('cName').string().as('name');
330
+
331
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
332
+
333
+ await db.transaction(async () => {
334
+ let filter = Customer.name.equal('John');
335
+ let customer = await Customer.tryGetFirst(filter);
336
+ console.log(await customer.toDto());
337
+ });
338
+ ```
339
+ <a name="_join"></a>
340
+ [join](https://github.com/alfateam/rdb-demo/blob/master/join.js)
341
+ ```js
342
+ let orange = require('orange-orm');
343
+
344
+ let Customer = orange.table('_customer');
345
+ let Order = orange.table('_order');
346
+
347
+ Customer.primaryColumn('cId').guid().as('id');
348
+ Customer.column('cName').string().as('name');
349
+
350
+ Order.primaryColumn('oId').guid().as('id');
351
+ Order.column('oOrderNo').string().as('orderNo');
352
+ Order.column('oCustomerId').guid().as('customerId');
353
+ Order.join(Customer).by('oCustomerId').as('customer');
354
+
355
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
356
+
357
+ await db.transaction(async () => {
358
+ let order = await Order.getById('a0000000-a000-0000-0000-000000000000');
359
+ console.log(await order.toJSON({customer: null}));
360
+ });
361
+
362
+ ```
363
+ <a name="_hasmany"></a>
364
+ [hasMany](https://github.com/alfateam/rdb-demo/blob/master/hasMany.js)
365
+ ```js
366
+ let orange = require('orange-orm');
367
+ let resetDemo = require('./db/resetDemo');
368
+ let inspect = require('util').inspect;
369
+
370
+ let Order = orange.table('_order');
371
+ let OrderLine = orange.table('_orderLine');
372
+
373
+ Order.primaryColumn('oId').guid().as('id');
374
+ Order.column('oOrderNo').string().as('orderNo');
375
+
376
+ OrderLine.primaryColumn('lId').guid().as('id');
377
+ OrderLine.column('lOrderId').guid().as('orderId');
378
+ OrderLine.column('lProduct').string().as('product');
379
+
380
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
381
+ Order.hasMany(line_order_relation).as('lines');
382
+
383
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
384
+
385
+ await db.transaction(async () => {
386
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
387
+ let dtos = await order.toDto();
388
+ console.log(inspect(dtos, false, 10));
389
+ });
390
+ ```
391
+ <a name="_hasone"></a>
392
+ [hasOne](https://github.com/alfateam/rdb-demo/blob/master/hasOne.js)
393
+ ```js
394
+ let orange = require('orange-orm');
395
+ let {inspect} = require('util');
396
+
397
+ let Order = orange.table('_order');
398
+ let DeliveryAddress = orange.table('_deliveryAddress');
399
+
400
+ Order.primaryColumn('oId').guid().as('id');
401
+ Order.column('oOrderNo').string().as('orderNo');
402
+
403
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
404
+ DeliveryAddress.column('dOrderId').string().as('orderId');
405
+ DeliveryAddress.column('dName').string().as('name');
406
+ DeliveryAddress.column('dStreet').string().as('street');
407
+
408
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
409
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
410
+
411
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
412
+
413
+ await db.transaction(async () => {
414
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
415
+ let dtos = await order.toDto();
416
+ console.log(inspect(dtos, false, 10));
417
+ });
418
+ ```
419
+ <a name="_compositekeys"></a>
420
+ [composite keys](https://github.com/alfateam/rdb-demo/blob/master/compositeKeys.js)
421
+ ```js
422
+ let orange = require('orange-orm');
423
+
424
+ let Order = orange.table('_compositeOrder');
425
+ let OrderLine = orange.table('_compositeOrderLine');
426
+
427
+ Order.primaryColumn('oCompanyId').numeric().as('companyId');
428
+ Order.primaryColumn('oOrderNo').numeric().as('orderNo');
429
+
430
+ OrderLine.primaryColumn('lCompanyId').numeric().as('companyId');
431
+ OrderLine.primaryColumn('lOrderNo').numeric().as('orderNo');
432
+ OrderLine.primaryColumn('lLineNo').numeric().as('lineNo');
433
+ OrderLine.column('lProduct').string().as('product');
434
+
435
+ let line_order_relation = OrderLine.join(Order).by('lCompanyId', 'lOrderNo').as('order');
436
+ Order.hasMany(line_order_relation).as('lines');
437
+
438
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
439
+
440
+ await db.transaction(async () => {
441
+ let companyId = 1;
442
+ let orderId = 1001;
443
+ let order = await Order.getById(companyId, orderId);
444
+ console.log(await order.toDto());
445
+ });
446
+ ```
447
+ <a name="_getbyideager"></a>
448
+ [getById eagerly](https://github.com/alfateam/rdb-demo/blob/master/getByIdEager.js)
449
+ ```js
450
+ let orange = require('orange-orm');
451
+ let inspect = require('util').inspect;
452
+
453
+ let Customer = orange.table('_customer');
454
+ let Order = orange.table('_order');
455
+
456
+ Customer.primaryColumn('cId').guid().as('id');
457
+ Customer.column('cName').string().as('name');
458
+
459
+ Order.primaryColumn('oId').guid().as('id');
460
+ Order.column('oOrderNo').string().as('orderNo');
461
+ Order.column('oCustomerId').guid().as('customerId');
462
+ Order.join(Customer).by('oCustomerId').as('customer');
463
+
464
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
465
+
466
+ await db.transaction(async () => {
467
+ let fetchingStrategy = { customer: null }; //alternatively: {customer : {}}
468
+ let order = await Order.getById('a0000000-a000-0000-0000-000000000000', fetchingStrategy);
469
+ console.log(await order.toDto());
470
+ let customer = await order.customer;
471
+ console.log(await customer.toDto());
472
+ });
473
+ ```
474
+ <a name="_trygetfirsteager"></a>
475
+ [tryGetFirst eagerly](https://github.com/alfateam/rdb-demo/blob/master/tryGetFirstEager.js)
476
+ ```js
477
+ let orange = require('orange-orm');
478
+
479
+ let Customer = orange.table('_customer');
480
+ let Order = orange.table('_order');
481
+
482
+ Customer.primaryColumn('cId').guid().as('id');
483
+ Customer.column('cName').string().as('name');
484
+
485
+ Order.primaryColumn('oId').guid().as('id');
486
+ Order.column('oOrderNo').string().as('orderNo');
487
+ Order.column('oCustomerId').guid().as('customerId');
488
+
489
+ Order.join(Customer).by('oCustomerId').as('customer');
490
+
491
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
492
+
493
+ await db.transaction(async () => {
494
+ let filter = Order.customer.name.equal('John');
495
+ let strategy = { customer: null };
496
+ let order = await Order.tryGetFirst(filter, strategy);
497
+ if (order)
498
+ console.log(await order.toDto());
499
+ });
500
+ ```
501
+ <a name="_todto"></a>
502
+ [toDto](https://github.com/alfateam/rdb-demo/blob/master/toDto.js)
503
+ ```js
504
+ let orange = require('orange-orm');
505
+
506
+ let Order = orange.table('_order');
507
+ let Customer = orange.table('_customer');
508
+ let OrderLine = orange.table('_orderLine');
509
+ let DeliveryAddress = orange.table('_deliveryAddress');
510
+
511
+ Order.primaryColumn('oId').guid().as('id');
512
+ Order.column('oOrderNo').string().as('orderNo');
513
+ Order.column('oCustomerId').string().as('customerId');
514
+
515
+ Customer.primaryColumn('cId').guid().as('id');
516
+ Customer.column('cName').string().as('name');
517
+
518
+ OrderLine.primaryColumn('lId').guid().as('id');
519
+ OrderLine.column('lOrderId').string().as('orderId');
520
+ OrderLine.column('lProduct').string().as('product');
521
+
522
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
523
+ DeliveryAddress.column('dOrderId').string().as('orderId');
524
+ DeliveryAddress.column('dName').string().as('name');
525
+ DeliveryAddress.column('dStreet').string().as('street');
526
+
527
+ Order.join(Customer).by('oCustomerId').as('customer');
528
+
529
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
530
+ Order.hasMany(line_order_relation).as('lines');
531
+
532
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
533
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
534
+
535
+
536
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
537
+
538
+ await db.transaction(async () => {
539
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
540
+ let dto = await order.toDto( /*strategy*/ );
541
+ //default strategy, expand all hasOne and hasMany relations
542
+ console.log(dto);
543
+ });
544
+ ```
545
+ <a name="_todtowithstrategy"></a>
546
+ [toDto with strategy](https://github.com/alfateam/rdb-demo/blob/master/toDtoWithStrategy.js)
547
+ ```js
548
+ let orange = require('orange-orm');
549
+
550
+ let Order = orange.table('_order');
551
+ let Customer = orange.table('_customer');
552
+ let OrderLine = orange.table('_orderLine');
553
+ let DeliveryAddress = orange.table('_deliveryAddress');
554
+
555
+ Order.primaryColumn('oId').guid().as('id');
556
+ Order.column('oOrderNo').string().as('orderNo');
557
+ Order.column('oCustomerId').string().as('customerId');
558
+
559
+ Customer.primaryColumn('cId').guid().as('id');
560
+ Customer.column('cName').string().as('name');
561
+
562
+ OrderLine.primaryColumn('lId').guid().as('id');
563
+ OrderLine.column('lOrderId').string().as('orderId');
564
+ OrderLine.column('lProduct').string().as('product');
565
+
566
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
567
+ DeliveryAddress.column('dOrderId').string().as('orderId');
568
+ DeliveryAddress.column('dName').string().as('name');
569
+ DeliveryAddress.column('dStreet').string().as('street');
570
+
571
+ Order.join(Customer).by('oCustomerId').as('customer');
572
+
573
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
574
+ Order.hasMany(line_order_relation).as('lines');
575
+
576
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
577
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
578
+
579
+
580
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
581
+
582
+ await db.transaction(async () => {
583
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
584
+ let strategy = {customer : null, lines : null, deliveryAddress : null};
585
+ let dto = await order.toDto(strategy);
586
+ console.log(dto);
587
+ });
588
+ ```
589
+ <a name="_todtowithorderby"></a>
590
+ [toDto with orderBy](https://github.com/alfateam/rdb-demo/blob/master/toDtoWithOrderBy.js)
591
+ ```js
592
+ let orange = require('orange-orm');
593
+
594
+ let Order = orange.table('_order');
595
+ let Customer = orange.table('_customer');
596
+ let OrderLine = orange.table('_orderLine');
597
+ let DeliveryAddress = orange.table('_deliveryAddress');
598
+
599
+ Order.primaryColumn('oId').guid().as('id');
600
+ Order.column('oOrderNo').string().as('orderNo');
601
+ Order.column('oCustomerId').string().as('customerId');
602
+
603
+ Customer.primaryColumn('cId').guid().as('id');
604
+ Customer.column('cName').string().as('name');
605
+
606
+ OrderLine.primaryColumn('lId').guid().as('id');
607
+ OrderLine.column('lOrderId').string().as('orderId');
608
+ OrderLine.column('lProduct').string().as('product');
609
+
610
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
611
+ DeliveryAddress.column('dOrderId').string().as('orderId');
612
+ DeliveryAddress.column('dName').string().as('name');
613
+ DeliveryAddress.column('dStreet').string().as('street');
614
+
615
+ Order.join(Customer).by('oCustomerId').as('customer');
616
+
617
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
618
+ Order.hasMany(line_order_relation).as('lines');
619
+
620
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
621
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
622
+
623
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
624
+
625
+ await db.transaction(async () => {
626
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
627
+ let strategy = {
628
+ lines: {
629
+ orderBy: ['product']
630
+ //alternative: orderBy: ['product asc']
631
+ }
632
+ };
633
+ let dto = await order.toDto(strategy);
634
+ console.log(dto);
635
+ });
636
+ ```
637
+ <a name="_todtowithorderbydesc"></a>
638
+ [toDto with orderBy descending](https://github.com/alfateam/rdb-demo/blob/master/toDtoWithOrderByDesc.js)
639
+ ```js
640
+ let orange = require('orange-orm');
641
+
642
+ let Order = orange.table('_order');
643
+ let Customer = orange.table('_customer');
644
+ let OrderLine = orange.table('_orderLine');
645
+ let DeliveryAddress = orange.table('_deliveryAddress');
646
+
647
+ Order.primaryColumn('oId').guid().as('id');
648
+ Order.column('oOrderNo').string().as('orderNo');
649
+ Order.column('oCustomerId').string().as('customerId');
650
+
651
+ Customer.primaryColumn('cId').guid().as('id');
652
+ Customer.column('cName').string().as('name');
653
+
654
+ OrderLine.primaryColumn('lId').guid().as('id');
655
+ OrderLine.column('lOrderId').string().as('orderId');
656
+ OrderLine.column('lProduct').string().as('product');
657
+
658
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
659
+ DeliveryAddress.column('dOrderId').string().as('orderId');
660
+ DeliveryAddress.column('dName').string().as('name');
661
+ DeliveryAddress.column('dStreet').string().as('street');
662
+
663
+ Order.join(Customer).by('oCustomerId').as('customer');
664
+
665
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
666
+ Order.hasMany(line_order_relation).as('lines');
667
+
668
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
669
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
670
+
671
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
672
+
673
+ await db.transaction(async () => {
674
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
675
+ let strategy = {
676
+ lines: {
677
+ orderBy: ['product desc']
678
+ }
679
+ };
680
+ let dto = await order.toDto(strategy);
681
+ console.log(dto);
682
+ });
683
+ ```
684
+ <a name="_serializable"></a>
685
+ [toDto ignoring columns](https://github.com/alfateam/rdb-demo/blob/master/serializable.js)
686
+ ```js
687
+ let orange = require('orange-orm');
688
+
689
+ let User = orange.table('_user');
690
+ User.primaryColumn('uId').guid().as('id');
691
+ User.column('uUserId').string().as('userId');
692
+ User.column('uPassword').string().as('password').serializable(false);
693
+ User.column('uEmail').string().as('email');
694
+
695
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
696
+
697
+ await db.transaction(async () => {
698
+ let user = await User.getById('87654400-0000-0000-0000-000000000000');
699
+ console.log(await user.toDto());
700
+ //will print all properties except password
701
+ //because it is not serializable
702
+ });
703
+ ```
704
+ <a name="_tojson"></a>
705
+ [toJSON](https://github.com/alfateam/rdb-demo/blob/master/toJSON.js)
706
+ ```js
707
+ let orange = require('orange-orm');
708
+
709
+ let Order = orange.table('_order');
710
+ let Customer = orange.table('_customer');
711
+ let OrderLine = orange.table('_orderLine');
712
+ let DeliveryAddress = orange.table('_deliveryAddress');
713
+
714
+ Order.primaryColumn('oId').guid().as('id');
715
+ Order.column('oOrderNo').string().as('orderNo');
716
+ Order.column('oCustomerId').string().as('customerId');
717
+
718
+ Customer.primaryColumn('cId').guid().as('id');
719
+ Customer.column('cName').string().as('name');
720
+
721
+ OrderLine.primaryColumn('lId').guid().as('id');
722
+ OrderLine.column('lOrderId').string().as('orderId');
723
+ OrderLine.column('lProduct').string().as('product');
724
+
725
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
726
+ DeliveryAddress.column('dOrderId').string().as('orderId');
727
+ DeliveryAddress.column('dName').string().as('name');
728
+ DeliveryAddress.column('dStreet').string().as('street');
729
+
730
+ Order.join(Customer).by('oCustomerId').as('customer');
731
+
732
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
733
+ Order.hasMany(line_order_relation).as('lines');
734
+
735
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
736
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
737
+
738
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
739
+
740
+ await db.transaction(async () => {
741
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
742
+ let json = await order.toJSON( /*strategy*/ );
743
+ //default strategy, expand all hasOne and hasMany relations
744
+ console.log(json);
745
+ });
746
+ ```
747
+ <a name="_tojsonwithstrategy"></a>
748
+ [toJSON with strategy](https://github.com/alfateam/rdb-demo/blob/master/toJSONWithStrategy.js)
749
+ ```js
750
+ let orange = require('orange-orm');
751
+
752
+ let Order = orange.table('_order');
753
+ let Customer = orange.table('_customer');
754
+ let OrderLine = orange.table('_orderLine');
755
+ let DeliveryAddress = orange.table('_deliveryAddress');
756
+
757
+ Order.primaryColumn('oId').guid().as('id');
758
+ Order.column('oOrderNo').string().as('orderNo');
759
+ Order.column('oCustomerId').string().as('customerId');
760
+
761
+ Customer.primaryColumn('cId').guid().as('id');
762
+ Customer.column('cName').string().as('name');
763
+
764
+ OrderLine.primaryColumn('lId').guid().as('id');
765
+ OrderLine.column('lOrderId').string().as('orderId');
766
+ OrderLine.column('lProduct').string().as('product');
767
+
768
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
769
+ DeliveryAddress.column('dOrderId').string().as('orderId');
770
+ DeliveryAddress.column('dName').string().as('name');
771
+ DeliveryAddress.column('dStreet').string().as('street');
772
+
773
+ Order.join(Customer).by('oCustomerId').as('customer');
774
+
775
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
776
+ Order.hasMany(line_order_relation).as('lines');
777
+
778
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
779
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
780
+
781
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
782
+
783
+ await db.transaction(async () => {
784
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
785
+ let strategy = {customer : null, lines : null, deliveryAddress : null};
786
+ console.log(await order.toJSON(strategy));
787
+ });
788
+ ```
789
+ <a name="_getmany"></a>
790
+ [getMany](https://github.com/alfateam/rdb-demo/blob/master/getMany.js)
791
+ ```js
792
+ let orange = require('orange-orm');
793
+
794
+ let Customer = orange.table('_customer');
795
+
796
+ Customer.primaryColumn('cId').guid().as('id');
797
+ Customer.column('cName').string().as('name');
798
+
799
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
800
+
801
+ await db.transaction(async () => {
802
+ let customers = await Customer.getMany();
803
+ let dtos = await customers.toDto();
804
+ console.log(dtos);
805
+ });
806
+ ```
807
+ <a name="_getmanydto"></a>
808
+ [getManyDto](https://github.com/alfateam/rdb-demo/blob/master/getManyDto.js)
809
+ ```js
810
+ let orange = require('orange-orm');
811
+
812
+ let Customer = orange.table('_customer');
813
+
814
+ Customer.primaryColumn('cId').guid().as('id');
815
+ Customer.column('cName').string().as('name');
816
+
817
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
818
+
819
+ await db.transaction(async () => {
820
+ console.log(await Customer.getManyDto());
821
+ });
822
+ ```
823
+ <a name="_getmanylazy"></a>
824
+ [getMany lazily](https://github.com/alfateam/rdb-demo/blob/master/getManyLazy.js)
825
+ ```js
826
+ let orange = require('orange-orm');
827
+ let inspect = require('util').inspect;
828
+
829
+ let Order = orange.table('_order');
830
+ let OrderLine = orange.table('_orderLine');
831
+
832
+ Order.primaryColumn('oId').guid().as('id');
833
+ Order.column('oOrderNo').string().as('orderNo');
834
+
835
+ OrderLine.primaryColumn('lId').guid().as('id');
836
+ OrderLine.column('lOrderId').guid().as('orderId');
837
+ OrderLine.column('lProduct').string().as('product');
838
+
839
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
840
+ Order.hasMany(line_order_relation).as('lines');
841
+
842
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
843
+
844
+ await db.transaction(async () => {
845
+ let orders = await Order.getMany();
846
+ let dtos = await orders.toDto();
847
+ console.log(inspect(dtos, false, 10));
848
+ });
849
+ ```
850
+ <a name="_getmanyeager"></a>
851
+ [getMany eager](https://github.com/alfateam/rdb-demo/blob/master/getManyEager.js)
852
+ ```js
853
+ let inspect = require('util').inspect;
854
+ let orange = require('orange-orm');
855
+
856
+ let Order = orange.table('_order');
857
+ let OrderLine = orange.table('_orderLine');
858
+
859
+ Order.primaryColumn('oId').guid().as('id');
860
+ Order.column('oOrderNo').string().as('orderNo');
861
+
862
+ OrderLine.primaryColumn('lId').guid().as('id');
863
+ OrderLine.column('lOrderId').guid().as('orderId');
864
+ OrderLine.column('lProduct').string().as('product');
865
+
866
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
867
+ Order.hasMany(line_order_relation).as('lines');
868
+
869
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
870
+
871
+ await db.transaction(async () => {
872
+ let emptyFilter;
873
+ let strategy = {
874
+ lines: null
875
+ };
876
+ let orders = await Order.getMany(emptyFilter, strategy);
877
+ let dtos = await orders.toDto();
878
+ console.log(inspect(dtos, false, 10));
879
+ });
880
+ ```
881
+ <a name="_getmanydtoeager"></a>
882
+ [getManyDto eager](https://github.com/alfateam/rdb-demo/blob/master/getManyDtoEager.js)
883
+ ```js
884
+ let orange = require('orange-orm');
885
+ let inspect = require('util').inspect;
886
+
887
+ let Order = orange.table('_order');
888
+ let OrderLine = orange.table('_orderLine');
889
+
890
+ Order.primaryColumn('oId').guid().as('id');
891
+ Order.column('oOrderNo').string().as('orderNo');
892
+
893
+ OrderLine.primaryColumn('lId').guid().as('id');
894
+ OrderLine.column('lOrderId').guid().as('orderId');
895
+ OrderLine.column('lProduct').string().as('product');
896
+
897
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
898
+ Order.hasMany(line_order_relation).as('lines');
899
+
900
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
901
+
902
+ await db.transaction(async () => {
903
+ let emptyFilter;
904
+ let strategy = {lines : null};
905
+ let orders = await Order.getManyDto(emptyFilter, strategy);
906
+ console.log(inspect(orders, false, 10));
907
+ });
908
+ ```
909
+ <a name="_limit"></a>
910
+ [limit and offset](https://github.com/alfateam/rdb-demo/blob/master/limit.js)
911
+ ```js
912
+ let orange = require('orange-orm');
913
+ let Customer = orange.table('_customer');
914
+
915
+ Customer.primaryColumn('cId').guid().as('id');
916
+ Customer.column('cName').string().as('name');
917
+
918
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
919
+
920
+ await db.transaction(async () => {
921
+ let customers = await Customer.getMany(null, {limit: 2, offset: 1});
922
+ let dtos = await customers.toDto();
923
+ console.log(dtos);
924
+ });
925
+ ```
926
+ <a name="_getmanywithorderbyjsonb"></a>
927
+ [getMany with orderBy jsonb](https://github.com/alfateam/rdb-demo/blob/master/getManyWithOrderByJsonb.js)
928
+ ```js
929
+ let orange = require('orange-orm');
930
+
931
+ let Order = orange.table('_jOrder');
932
+
933
+ Order.primaryColumn('oId').guid().as('id');
934
+ Order.column('oData').json().as('data');
935
+
936
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
937
+
938
+ await db.transaction(async () => {
939
+ let strategy = {
940
+ orderBy: ['data->\'orderNo\'']
941
+ //alternative: orderBy: ['data->>\'orderId\' asc']
942
+ };
943
+ let orders = await Order.getMany(null, strategy);
944
+ let dtos = await orders.toDto();
945
+ console.log(dtos);
946
+ });
947
+ ```
948
+ <a name="_getmanywithorderbyjsonbdesc"></a>
949
+ [getMany with orderBy jsonb descending](https://github.com/alfateam/rdb-demo/blob/master/getManyWithOrderByJsonb.js)
950
+ ```js
951
+ let orange = require('orange-orm');
952
+
953
+ let Order = orange.table('_jOrder');
954
+
955
+ Order.primaryColumn('oId').guid().as('id');
956
+ Order.column('oData').json().as('data');
957
+
958
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
959
+
960
+ await db.transaction(async () => {
961
+ let strategy = {
962
+ orderBy: ['data->\'orderNo\' desc']
963
+ };
964
+ let orders = await Order.getMany(null, strategy);
965
+ let dtos = await orders.toDto();
966
+ console.log(dtos);
967
+ });
968
+ ```
969
+ <a name="_manytodto"></a>
970
+ [(many)ToDto](https://github.com/alfateam/rdb-demo/blob/master/manyToDto.js)
971
+ ```js
972
+ let orange = require('orange-orm');
973
+ let inspect = require('util').inspect;
974
+
975
+ let Order = orange.table('_order');
976
+ let Customer = orange.table('_customer');
977
+ let OrderLine = orange.table('_orderLine');
978
+ let DeliveryAddress = orange.table('_deliveryAddress');
979
+
980
+ Order.primaryColumn('oId').guid().as('id');
981
+ Order.column('oOrderNo').string().as('orderNo');
982
+ Order.column('oCustomerId').string().as('customerId');
983
+
984
+ Customer.primaryColumn('cId').guid().as('id');
985
+ Customer.column('cName').string().as('name');
986
+
987
+ OrderLine.primaryColumn('lId').guid().as('id');
988
+ OrderLine.column('lOrderId').guid().as('orderId');
989
+ OrderLine.column('lProduct').string().as('product');
990
+
991
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
992
+ DeliveryAddress.column('dOrderId').string().as('orderId');
993
+ DeliveryAddress.column('dName').string().as('name');
994
+ DeliveryAddress.column('dStreet').string().as('street');
995
+
996
+ Order.join(Customer).by('oCustomerId').as('customer');
997
+
998
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
999
+ Order.hasMany(line_order_relation).as('lines');
1000
+
1001
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
1002
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
1003
+
1004
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1005
+
1006
+ await db.transaction(async () => {
1007
+ let orders = await Order.getMany();
1008
+ let dtos = await orders.toDto( /*strategy*/ );
1009
+ //default strategy, expand all hasOne and hasMany relations
1010
+ console.log(inspect(dtos, false, 10));
1011
+ });
1012
+ ```
1013
+ <a name="_manytodtowithstrategy"></a>
1014
+ [(many)ToDto with strategy](https://github.com/alfateam/rdb-demo/blob/master/manyToDtoWithStrategy.js)
1015
+ ```js
1016
+ let inspect = require('util').inspect;
1017
+ let orange = require('orange-orm');
1018
+
1019
+ let Order = orange.table('_order');
1020
+ let Customer = orange.table('_customer');
1021
+ let OrderLine = orange.table('_orderLine');
1022
+ let DeliveryAddress = orange.table('_deliveryAddress');
1023
+
1024
+ Order.primaryColumn('oId').guid().as('id');
1025
+ Order.column('oOrderNo').string().as('orderNo');
1026
+ Order.column('oCustomerId').string().as('customerId');
1027
+
1028
+ Customer.primaryColumn('cId').guid().as('id');
1029
+ Customer.column('cName').string().as('name');
1030
+
1031
+ OrderLine.primaryColumn('lId').guid().as('id');
1032
+ OrderLine.column('lOrderId').guid().as('orderId');
1033
+ OrderLine.column('lProduct').string().as('product');
1034
+
1035
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
1036
+ DeliveryAddress.column('dOrderId').string().as('orderId');
1037
+ DeliveryAddress.column('dName').string().as('name');
1038
+ DeliveryAddress.column('dStreet').string().as('street');
1039
+
1040
+ Order.join(Customer).by('oCustomerId').as('customer');
1041
+
1042
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1043
+ Order.hasMany(line_order_relation).as('lines');
1044
+
1045
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
1046
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
1047
+
1048
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1049
+
1050
+ await db.transaction(async () => {
1051
+ let orders = await Order.getMany();
1052
+ let strategy = { customer: null, lines: null, deliveryAddress: null };
1053
+ let dtos = await orders.toDto(strategy);
1054
+ console.log(inspect(dtos, false, 10));
1055
+ });
1056
+ ```
1057
+ <a name="_manytojson"></a>
1058
+ [(many)ToJSON](https://github.com/alfateam/rdb-demo/blob/master/manyToJSON.js)
1059
+ ```js
1060
+ let orange = require('orange-orm');
1061
+
1062
+ let Order = orange.table('_order');
1063
+ let Customer = orange.table('_customer');
1064
+ let OrderLine = orange.table('_orderLine');
1065
+ let DeliveryAddress = orange.table('_deliveryAddress');
1066
+
1067
+ Order.primaryColumn('oId').guid().as('id');
1068
+ Order.column('oOrderNo').string().as('orderNo');
1069
+ Order.column('oCustomerId').string().as('customerId');
1070
+
1071
+ Customer.primaryColumn('cId').guid().as('id');
1072
+ Customer.column('cName').string().as('name');
1073
+
1074
+ OrderLine.primaryColumn('lId').guid().as('id');
1075
+ OrderLine.column('lOrderId').guid().as('orderId');
1076
+ OrderLine.column('lProduct').string().as('product');
1077
+
1078
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
1079
+ DeliveryAddress.column('dOrderId').string().as('orderId');
1080
+ DeliveryAddress.column('dName').string().as('name');
1081
+ DeliveryAddress.column('dStreet').string().as('street');
1082
+
1083
+ Order.join(Customer).by('oCustomerId').as('customer');
1084
+
1085
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1086
+ Order.hasMany(line_order_relation).as('lines');
1087
+
1088
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
1089
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
1090
+
1091
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1092
+
1093
+ await db.transaction(async () => {
1094
+ let orders = await Order.getMany();
1095
+ console.log(await orders.toJSON( /*strategy*/ ));
1096
+ //default strategy, expand all hasOne and hasMany relations
1097
+ });
1098
+ ```
1099
+ <a name="_manytojsonwithstrategy"></a>
1100
+ [(many)ToJSON with strategy](https://github.com/alfateam/rdb-demo/blob/master/manyToJSONWithStrategy.js)
1101
+ ```js
1102
+ let orange = require('orange-orm');
1103
+
1104
+ let Order = orange.table('_order');
1105
+ let Customer = orange.table('_customer');
1106
+ let OrderLine = orange.table('_orderLine');
1107
+ let DeliveryAddress = orange.table('_deliveryAddress');
1108
+
1109
+ Order.primaryColumn('oId').guid().as('id');
1110
+ Order.column('oOrderNo').string().as('orderNo');
1111
+ Order.column('oCustomerId').string().as('customerId');
1112
+
1113
+ Customer.primaryColumn('cId').guid().as('id');
1114
+ Customer.column('cName').string().as('name');
1115
+
1116
+ OrderLine.primaryColumn('lId').guid().as('id');
1117
+ OrderLine.column('lOrderId').guid().as('orderId');
1118
+ OrderLine.column('lProduct').string().as('product');
1119
+
1120
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
1121
+ DeliveryAddress.column('dOrderId').string().as('orderId');
1122
+ DeliveryAddress.column('dName').string().as('name');
1123
+ DeliveryAddress.column('dStreet').string().as('street');
1124
+
1125
+ Order.join(Customer).by('oCustomerId').as('customer');
1126
+
1127
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1128
+ Order.hasMany(line_order_relation).as('lines');
1129
+
1130
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
1131
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
1132
+
1133
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1134
+
1135
+ await db.transaction(async () => {
1136
+ let orders = await Order.getMany();
1137
+ let strategy = {customer : null, lines : null, deliveryAddress : null};
1138
+ console.log(await orders.toJSON(strategy));
1139
+ });
1140
+ ```
1141
+ <a name="_rawsqlquery"></a>
1142
+ [Raw SQL Query](https://github.com/alfateam/rdb-demo/blob/master/rawSqlQuery.js)
1143
+ ```js
1144
+ let orange = require('orange-orm');
1145
+
1146
+ let db = orange('postgres://postgres:postgres@localhost/test');
1147
+
1148
+ await db.transaction(async () => {
1149
+ let result = await orange.query('SELECT DISTINCT oCustomerId AS "customerId" FROM _order');
1150
+ console.log(result);
1151
+ });
1152
+ ```
1153
+ <a name="_rawsqlquerywithparameters"></a>
1154
+ [Raw SQL Query With Parameters](https://github.com/alfateam/rdb-demo/blob/master/rawSqlQueryWithParameters.js)
1155
+ ```js
1156
+ let orange = require('orange-orm');
1157
+
1158
+ let db = orange('postgres://postgres:postgres@localhost/test');
1159
+
1160
+ await db.transaction(async () => {
1161
+ let result = await orange.query({
1162
+ sql: 'SELECT oOrderNo AS "orderNo" FROM _order WHERE oOrderNo LIKE ?',
1163
+ parameters: ['%04']
1164
+ });
1165
+ console.log(result);
1166
+ });
1167
+ ```
1168
+ <a name="_validate"></a>
1169
+ [Plain validator](https://github.com/alfateam/rdb-demo/blob/master/validate.js)
1170
+ ```js
1171
+ let orange = require('orange-orm');
1172
+
1173
+ let Customer = orange.table('_customer');
1174
+
1175
+ Customer.primaryColumn('cId').guid().as('id');
1176
+ Customer.column('cName').string().as('name').validate(validateName);
1177
+
1178
+ function validateName(value, row) {
1179
+ if (value && value.length > 10)
1180
+ throw new Error("Length cannot exceed 10 characters");
1181
+ }
1182
+
1183
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1184
+ try {
1185
+ await resetDemo();
1186
+ await db.transaction(async () => {
1187
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1188
+ customer.name = 'Ringo Starr' //11 Chars. Will throw
1189
+ });
1190
+ } catch (e) {
1191
+ console.log(e.message);
1192
+ //Length cannot exceed 10 characters
1193
+ }
1194
+ ```
1195
+ <a name="_jsonschema"></a>
1196
+ [JSON Schema](https://github.com/alfateam/rdb-demo/blob/master/jsonSchema.js)
1197
+ Using [ajv](https://www.npmjs.com/package/ajv)
1198
+ ```js
1199
+ let orange = require('orange-orm');
1200
+
1201
+ let documentSchema = {
1202
+ "properties": {
1203
+ "foo": { "type": "number" },
1204
+ "bar": { "type": "number" }
1205
+ }
1206
+ };
1207
+
1208
+ let nameSchema = {
1209
+ type: "string",
1210
+ "maxLength": 20
1211
+ };
1212
+
1213
+ let Customer = orange.table('_customer');
1214
+
1215
+ Customer.primaryColumn('cId').guid().as('id');
1216
+ Customer.column('cName').string().as('name').JSONSchema(nameSchema);
1217
+ Customer.column('cBalance').numeric().as('balance');
1218
+ Customer.column('cDocument').json().as('document').JSONSchema(documentSchema, {allErrors: true});
1219
+
1220
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1221
+ try {
1222
+ await resetDemo();
1223
+ await db.transaction(async () => {
1224
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1225
+ customer.name = 'Ringo Starr' //OK
1226
+ customer.document = {foo: 'not a number', bar: 'invalid'}; //violates schema
1227
+ });
1228
+ } catch (e) {
1229
+ console.log(e.stack);
1230
+ console.log(e.errors);
1231
+ // [ { keyword: 'type',
1232
+ // dataPath: '.foo',
1233
+ // schemaPath: '#/properties/foo/type',
1234
+ // params: { type: 'number' },
1235
+ // message: 'should be number' },
1236
+ // { keyword: 'type',
1237
+ // dataPath: '.bar',
1238
+ // schemaPath: '#/properties/bar/type',
1239
+ // params: { type: 'number' },
1240
+ // message: 'should be number' } ]
1241
+ }
1242
+ ```
1243
+ <a name="_streameager"></a>
1244
+ [streaming rows](https://github.com/alfateam/rdb-demo/blob/master/streamEager.js)
1245
+ ```js
1246
+ let orange = require('orange-orm');
1247
+
1248
+ let Order = orange.table('_order');
1249
+ let OrderLine = orange.table('_orderLine');
1250
+
1251
+ Order.primaryColumn('oId').guid().as('id');
1252
+ Order.column('oOrderNo').string().as('orderNo');
1253
+
1254
+ OrderLine.primaryColumn('lId').guid().as('id');
1255
+ OrderLine.column('lOrderId').guid().as('orderId');
1256
+ OrderLine.column('lProduct').string().as('product');
1257
+
1258
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1259
+ Order.hasMany(line_order_relation).as('lines');
1260
+
1261
+ let db = orange('postgres://postgres:postgres@localhost/test');
1262
+
1263
+ let emptyFilter;
1264
+ let strategy = {
1265
+ lines: {
1266
+ orderBy: ['product']
1267
+ },
1268
+ orderBy: ['orderNo'],
1269
+ limit: 5,
1270
+ };
1271
+
1272
+ await Order.createReadStream(db, emptyFilter, strategy).on('data', printOrder);
1273
+
1274
+ function printOrder(order) {
1275
+ let format = 'Order Id: %s, Order No: %s';
1276
+ console.log(format, order.id, order.orderNo);
1277
+ order.lines.forEach(printLine);
1278
+ }
1279
+
1280
+ function printLine(line) {
1281
+ let format = 'Line Id: %s, Order Id: %s, Product: %s';
1282
+ console.log(format, line.id, line.orderId, line.product);
1283
+ }
1284
+ ```
1285
+ <a name="_streamjsoneager"></a>
1286
+ [streaming json](https://github.com/alfateam/rdb-demo/blob/master/streamJSONEager.js)
1287
+ ```js
1288
+ let orange = require('orange-orm');
1289
+
1290
+ let Order = orange.table('_order');
1291
+ let OrderLine = orange.table('_orderLine');
1292
+
1293
+ Order.primaryColumn('oId').guid().as('id');
1294
+ Order.column('oOrderNo').string().as('orderNo');
1295
+
1296
+ OrderLine.primaryColumn('lId').guid().as('id');
1297
+ OrderLine.column('lOrderId').guid().as('orderId');
1298
+ OrderLine.column('lProduct').string().as('product');
1299
+
1300
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1301
+ Order.hasMany(line_order_relation).as('lines');
1302
+
1303
+ let db = orange('postgres://postgres:postgres@localhost/test');
1304
+
1305
+ let emptyFilter;
1306
+ let strategy = {
1307
+ lines: {
1308
+ orderBy: ['product']
1309
+ },
1310
+ orderBy: ['orderNo'],
1311
+ limit: 5,
1312
+ };
1313
+
1314
+ await Order.createJSONReadStream(db, emptyFilter, strategy).pipe(process.stdout);
1315
+ ```
1316
+ <a name="_update"></a>
1317
+ [update](https://github.com/alfateam/rdb-demo/blob/master/update.js)
1318
+ ```js
1319
+ let orange = require('orange-orm');
1320
+
1321
+ let Customer = orange.table('_customer');
1322
+
1323
+ Customer.primaryColumn('cId').guid().as('id');
1324
+ Customer.column('cName').string().as('name');
1325
+
1326
+ let db = orange('postgres://postgres:postgres@localhost/test');
1327
+
1328
+ await db.transaction(async () => {
1329
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1330
+ customer.name = 'Ringo';
1331
+ customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1332
+ console.log(customer.name)
1333
+ });
1334
+ ```
1335
+ <a name="_insert"></a>
1336
+ [insert](https://github.com/alfateam/rdb-demo/blob/master/insert.js)
1337
+ ```js
1338
+ let orange = require('orange-orm');
1339
+
1340
+ let Customer = orange.table('_customer');
1341
+
1342
+ Customer.primaryColumn('cId').guid().as('id');
1343
+ Customer.column('cName').string().as('name');
1344
+
1345
+ let db = orange('postgres://postgres:postgres@localhost/test');
1346
+
1347
+ await db.transaction(async () => {
1348
+ let id = 'abcdef00-0000-0000-0000-000000000000'
1349
+ let customer = Customer.insert(id)
1350
+ customer.name = 'Paul';
1351
+ customer = await Customer.getById(id);
1352
+ console.log(customer.name)
1353
+ });
1354
+ ```
1355
+ <a name="_insertAndForget"></a>
1356
+ [insertAndForget](https://github.com/alfateam/rdb-demo/blob/master/insertAndForget.js)
1357
+ If you don't have SELECT access, you want this instead of regular insert.
1358
+ ```js
1359
+ let orange = require('orange-orm');
1360
+
1361
+ let Customer = orange.table('_customer');
1362
+
1363
+ Customer.primaryColumn('cId').guid().as('id');
1364
+ Customer.column('cName').string().as('name');
1365
+
1366
+ let db = orange('postgres://postgres:postgres@localhost/test');
1367
+
1368
+ await db.transaction(async () => {
1369
+ let id = 'abcdef00-0000-0000-0000-000000000000'
1370
+ await Customer.insertAndForget({id, name: 'Paul'}); //returns empty promise
1371
+ });
1372
+ ```
1373
+ <a name="_delete"></a>
1374
+ [delete](https://github.com/alfateam/rdb-demo/blob/master/delete.js)
1375
+ ```js
1376
+ let orange = require('orange-orm');
1377
+
1378
+ let Customer = orange.table('_customer');
1379
+
1380
+ Customer.primaryColumn('cId').guid().as('id');
1381
+ Customer.column('cName').string().as('name');
1382
+ Customer.column('cBalance').numeric().as('balance');
1383
+ Customer.column('cRegdate').date().as('registeredDate');
1384
+ Customer.column('cIsActive').boolean().as('isActive');
1385
+ Customer.column('cPicture').binary().as('picture');
1386
+
1387
+ let db = orange('postgres://postgres:postgres@localhost/test');
1388
+
1389
+ await db.transaction(async () => {
1390
+ let customer = await Customer.getById('87654321-0000-0000-0000-000000000000');
1391
+ await customer.delete();
1392
+ });
1393
+ ```
1394
+ <a name="_cascadedelete"></a>
1395
+ [cascadeDelete](https://github.com/alfateam/rdb-demo/blob/master/cascadeDelete.js)
1396
+ ```js
1397
+ let orange = require('orange-orm');
1398
+
1399
+ let Customer = orange.table('_customer');
1400
+ let Order = orange.table('_order');
1401
+ let OrderLine = orange.table('_orderLine');
1402
+
1403
+ Customer.primaryColumn('cId').guid().as('id');
1404
+ Customer.column('cName').string().as('name');
1405
+
1406
+ Order.primaryColumn('oId').guid().as('id');
1407
+ Order.column('oOrderNo').string().as('orderNo');
1408
+ Order.column('oCustomerId').guid().as('customerId');
1409
+
1410
+ OrderLine.primaryColumn('lId').guid().as('id');
1411
+ OrderLine.column('lOrderId').guid().as('orderId');
1412
+
1413
+ let orderToCustomer = Order.join(Customer).by('oCustomerId').as('customer');
1414
+ Customer.hasMany(orderToCustomer).as('orders');
1415
+
1416
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1417
+ Order.hasMany(line_order_relation).as('lines');
1418
+
1419
+ let db = orange('postgres://postgres:postgres@localhost/test');
1420
+
1421
+ await db.transaction(async () => {
1422
+ let customer = await Customer.getById('87654399-0000-0000-0000-000000000000');
1423
+ await customer.cascadeDelete();
1424
+ });
1425
+ ```
1426
+ <a name="_bulkdelete"></a>
1427
+ [bulk delete](https://github.com/alfateam/rdb-demo/blob/master/bulkDelete.js)
1428
+ ```js
1429
+ let orange = require('orange-orm');
1430
+
1431
+ let Customer = orange.table('_customer');
1432
+
1433
+ Customer.primaryColumn('cId').guid().as('id');
1434
+ Customer.column('cName').string().as('name');
1435
+ Customer.column('cBalance').numeric().as('balance');
1436
+ Customer.column('cRegdate').date().as('registeredDate');
1437
+ Customer.column('cIsActive').boolean().as('isActive');
1438
+ Customer.column('cPicture').binary().as('picture');
1439
+
1440
+ let db = orange('postgres://postgres:postgres@localhost/test');
1441
+
1442
+ await db.transaction(async () => {
1443
+ let filter = Customer.id.eq('87654321-0000-0000-0000-000000000000');
1444
+ await Customer.delete(filter);
1445
+ });
1446
+ ```
1447
+ <a name="_cascadedelete"></a>
1448
+ [bulk cascadeDelete](https://github.com/alfateam/rdb-demo/blob/master/bulkCascadeDelete.js)
1449
+ ```js
1450
+ let orange = require('orange-orm');
1451
+
1452
+ let Customer = orange.table('_customer');
1453
+ let Order = orange.table('_order');
1454
+ let OrderLine = orange.table('_orderLine');
1455
+
1456
+ Customer.primaryColumn('cId').guid().as('id');
1457
+ Customer.column('cName').string().as('name');
1458
+
1459
+ Order.primaryColumn('oId').guid().as('id');
1460
+ Order.column('oOrderNo').string().as('orderNo');
1461
+ Order.column('oCustomerId').guid().as('customerId');
1462
+
1463
+ OrderLine.primaryColumn('lId').guid().as('id');
1464
+ OrderLine.column('lOrderId').guid().as('orderId');
1465
+
1466
+ let orderToCustomer = Order.join(Customer).by('oCustomerId').as('customer');
1467
+ Customer.hasMany(orderToCustomer).as('orders');
1468
+
1469
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1470
+ Order.hasMany(line_order_relation).as('lines');
1471
+
1472
+ let db = orange('postgres://postgres:postgres@localhost/test');
1473
+
1474
+ await db.transaction(async () => {
1475
+ let filter = Customer.id.eq('87654399-0000-0000-0000-000000000000');
1476
+ await Customer.cascadeDelete(filter);
1477
+ });
1478
+ ```
1479
+ <a name="_defaultvalues"></a>
1480
+ [default values](https://github.com/alfateam/rdb-demo/blob/master/defaultValues.js)
1481
+ ```js
1482
+ let orange = require('orange-orm');
1483
+
1484
+ let buf = Buffer.alloc(10);
1485
+ buf.write('\u00bd + \u00bc = \u00be', 0);
1486
+
1487
+ let Customer = orange.table('_customer');
1488
+
1489
+ /*unless overridden, numeric is default 0,
1490
+ string is default null,
1491
+ guid is default null,
1492
+ date is default null,
1493
+ binary is default null,
1494
+ boolean is default false,
1495
+ json is default null
1496
+ */
1497
+
1498
+ Customer.primaryColumn('cId').guid().as('id').default(null);
1499
+ Customer.column('cName').string().as('name').default('default name');
1500
+ Customer.column('cBalance').numeric().as('balance').default(2000);
1501
+ Customer.column('cRegdate').date().as('registeredDate').default(() => new Date());
1502
+ Customer.column('cIsActive').boolean().as('isActive').default(true);
1503
+ Customer.column('cPicture').binary().as('picture').default(buf);
1504
+ Customer.column('cDocument').json().as('document').default({foo: true});
1505
+
1506
+ let db = orange('postgres://postgres:postgres@localhost/test');
1507
+
1508
+ await db.transaction(async () => {
1509
+ let customer = Customer.insert('abcdef02-0000-0000-0000-000000000000')
1510
+ console.log(await customer.toDto());
1511
+ });
1512
+ ```
1513
+ <a name="_conventions"></a>
1514
+ [conventions](https://github.com/alfateam/rdb-demo/blob/master/conventions.js)
1515
+ ```js
1516
+ let orange = require('orange-orm');
1517
+
1518
+ let Customer = orange.table('_customer');
1519
+
1520
+ Customer.primaryColumn('cId').guid(); //property name will also be cId
1521
+ Customer.column('cName').string(); //property name will also be cName
1522
+
1523
+ let db = orange('postgres://postgres:postgres@localhost/test');
1524
+
1525
+ await db.transaction(async () => {
1526
+ let customer = Customer.insert('abcdef01-0000-0000-0000-000000000000')
1527
+ customer.cName = 'Paul';
1528
+ console.log(await customer.toDto());
1529
+ });
1530
+ ```
1531
+ <a name="_updatejoin"></a>
1532
+ [update a join-relation](https://github.com/alfateam/rdb-demo/blob/master/updateJoin.js)
1533
+ ```js
1534
+ let orange = require('orange-orm');
1535
+
1536
+ let Customer = orange.table('_customer');
1537
+ let Order = orange.table('_order');
1538
+
1539
+ Customer.primaryColumn('cId').guid().as('id');
1540
+ Customer.column('cName').string().as('name');
1541
+
1542
+ Order.primaryColumn('oId').guid().as('id');
1543
+ Order.column('oOrderNo').string().as('orderNo');
1544
+ Order.column('oCustomerId').guid().as('customerId');
1545
+
1546
+ Order.join(Customer).by('oCustomerId').as('customer');
1547
+
1548
+ let db = orange('postgres://postgres:postgres@localhost/test');
1549
+
1550
+ await db.transaction(async () => {
1551
+ let order = await Order.getById('b0000000-b000-0000-0000-000000000000');
1552
+ let yokoId = '12345678-0000-0000-0000-000000000000';
1553
+ order.customerId = yokoId;
1554
+ let customer = await order.customer;
1555
+ console.log(customer.name);
1556
+ });
1557
+ ```
1558
+ <a name="_updatehasone"></a>
1559
+ [update a hasOne-relation](https://github.com/alfateam/rdb-demo/blob/master/updateHasOne.js)
1560
+ ```js
1561
+ let orange = require('orange-orm');
1562
+
1563
+ let Order = orange.table('_order');
1564
+ let DeliveryAddress = orange.table('_deliveryAddress');
1565
+
1566
+ Order.primaryColumn('oId').guid().as('id');
1567
+ Order.column('oOrderNo').string().as('orderNo');
1568
+
1569
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
1570
+ DeliveryAddress.column('dOrderId').string().as('orderId');
1571
+ DeliveryAddress.column('dName').string().as('name');
1572
+ DeliveryAddress.column('dStreet').string().as('street');
1573
+
1574
+ let deliveryAddress_order_relation = DeliveryAddress.hasone(Order).by('dOrderId').as('order');
1575
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
1576
+
1577
+ let db = orange('postgres://postgres:postgres@localhost/test');
1578
+
1579
+ await db.transaction(async () => {
1580
+ let address = DeliveryAddress.insert('eeeeeeee-0000-0000-0000-000000000000');
1581
+ address.orderId = 'a0000000-a000-0000-0000-000000000000';
1582
+ address.name = 'Sgt. Pepper';
1583
+ address.street = 'L18 Penny Lane';
1584
+ let order = await address.order;
1585
+ console.log((await order.deliveryAddress).street);
1586
+ });
1587
+ ```
1588
+ <a name="_updatehasmany"></a>
1589
+ [update a hasMany-relation](https://github.com/alfateam/rdb-demo/blob/master/updateHasMany.js)
1590
+ ```js
1591
+ let orange = require('orange-orm');
1592
+
1593
+ let Order = orange.table('_order');
1594
+ let OrderLine = orange.table('_orderLine');
1595
+
1596
+ Order.primaryColumn('oId').guid().as('id');
1597
+ Order.column('oOrderNo').string().as('orderNo');
1598
+
1599
+ OrderLine.primaryColumn('lId').guid().as('id');
1600
+ OrderLine.column('lOrderId').guid().as('orderId');
1601
+ OrderLine.column('lProduct').string().as('product');
1602
+
1603
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
1604
+ Order.hasMany(line_order_relation).as('lines');
1605
+
1606
+ let db = orange('postgres://postgres:postgres@localhost/test');
1607
+ let orderIdWithNoLines = 'c0000000-c000-0000-0000-000000000000';
1608
+
1609
+ await db.transaction(async () => {
1610
+ let orderIdWithNoLines = 'c0000000-c000-0000-0000-000000000000';
1611
+
1612
+ let line = OrderLine.insert('eeeeeeee-0001-0000-0000-000000000000');
1613
+ line.orderId = orderIdWithNoLines;
1614
+ line.product = 'Roller blades';
1615
+
1616
+ let line2 = OrderLine.insert('eeeeeeee-0002-0000-0000-000000000000');
1617
+ line2.orderId = orderIdWithNoLines;
1618
+ line2.product = 'Helmet';
1619
+
1620
+ let order = await line.order;
1621
+ let lines = await order.lines;
1622
+ console.log('Number of lines: ' + lines.length);
1623
+ });
1624
+ ```
1625
+ <a name="_rowlock"></a>
1626
+ [row lock](https://github.com/alfateam/rdb-demo/blob/master/exclusive.js)
1627
+ (not in sqlite)
1628
+ ```js
1629
+ let orange = require('orange-orm');
1630
+
1631
+ let Customer = orange.table('_customer');
1632
+ Customer.primaryColumn('cId').guid().as('id');
1633
+ Customer.column('cBalance').numeric().as('balance');
1634
+
1635
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1636
+
1637
+ await showBalance();
1638
+ await updateConcurrently();
1639
+ await showBalance();
1640
+
1641
+ function showBalance() {
1642
+ return db.transaction(async () => {
1643
+ let customer = await Customer.getById.exclusive('a0000000-0000-0000-0000-000000000000');
1644
+ console.log('Balance: ' + customer.balance);
1645
+ });
1646
+ }
1647
+
1648
+ function updateConcurrently() {
1649
+ let concurrent1 = db.transaction(async () => {
1650
+ let customer = await Customer.getById.exclusive('a0000000-0000-0000-0000-000000000000');
1651
+ customer.balance += 100;
1652
+ });
1653
+
1654
+ let concurrent2 = db.transaction(async () => {
1655
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1656
+ customer.balance += 100;
1657
+ });
1658
+
1659
+ return Promise.all([concurrent1, concurrent2]);
1660
+ }
1661
+ ```
1662
+ <a name="_transactionlock"></a>
1663
+ [transaction lock](https://github.com/alfateam/rdb-demo/blob/master/lock.js)
1664
+ (postgres only)
1665
+ ```js
1666
+ let orange = require('orange-orm');
1667
+
1668
+ let Customer = orange.table('_customer');
1669
+ Customer.primaryColumn('cId').guid().as('id');
1670
+ Customer.column('cBalance').numeric().as('balance');
1671
+
1672
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1673
+
1674
+ await showBalance();
1675
+ await updateConcurrently();
1676
+ await showBalance();
1677
+
1678
+ function showBalance() {
1679
+ return db.transaction(async () => {
1680
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1681
+ console.log('Balance: ' + customer.balance);
1682
+ });
1683
+ }
1684
+
1685
+ function updateConcurrently() {
1686
+ let concurrent1 = db.transaction(async () => {
1687
+ await db.lock("12345");
1688
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1689
+ customer.balance += 100;
1690
+ });
1691
+
1692
+ let concurrent2 = db.transaction(async () => {
1693
+ await db.lock("12345");
1694
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1695
+ customer.balance += 100;
1696
+ });
1697
+
1698
+ return Promise.all([concurrent1, concurrent2]);
1699
+ }
1700
+ ```
1701
+ <a name="_sessionlock"></a>
1702
+ [session lock](https://github.com/alfateam/rdb-demo/blob/master/sessionLock.js)
1703
+ (postgres only)
1704
+ The function will only be run when a lock has been acquired. The function is awaited for any return value, then lock is released. The function will then forward the return value from the supplied function.
1705
+ ```js
1706
+ let orange = require('orange-orm');
1707
+
1708
+ let Customer = orange.table('_customer');
1709
+ Customer.primaryColumn('cId').guid().as('id');
1710
+ Customer.column('cBalance').numeric().as('balance');
1711
+
1712
+ let db = orange('postgres://orange:orange@localhost/rdbdemo');
1713
+
1714
+ await showBalance();
1715
+ await updateConcurrently();
1716
+ await showBalance();
1717
+
1718
+ function showBalance() {
1719
+ return db.transaction(async () => {
1720
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1721
+ console.log('Balance: ' + customer.balance);
1722
+ });
1723
+ }
1724
+
1725
+ function updateConcurrently() {
1726
+ let concurrent1 = db.transaction(async () => {
1727
+ await db.lock("12345", runInLock);
1728
+ //lock released
1729
+ //do other stuff..
1730
+ });
1731
+
1732
+ let concurrent2 = db.transaction(async () => {
1733
+ await db.lock("12345", runInLock);
1734
+ //lock released
1735
+ //do other stuff..
1736
+ });
1737
+
1738
+ async function runInLock() {
1739
+ let customer = await Customer.getById('a0000000-0000-0000-0000-000000000000');
1740
+ customer.balance += 100;
1741
+ }
1742
+
1743
+ return Promise.all([concurrent1, concurrent2]);
1744
+ }
1745
+ ```
1746
+ <a name="_equal"></a>
1747
+ [equal](https://github.com/alfateam/rdb-demo/blob/master/filtering/equal.js)
1748
+ ```js
1749
+ let orange = require('orange-orm');
1750
+
1751
+ let Customer = orange.table('_customer');
1752
+
1753
+ Customer.primaryColumn('cId').guid().as('id');
1754
+ Customer.column('cName').string().as('name');
1755
+
1756
+ let db = orange('postgres://postgres:postgres@localhost/test');
1757
+
1758
+ await db.transaction(async () => {
1759
+ let filter = Customer.name.equal('John');
1760
+ //same as Customer.name.eq('John');
1761
+ let customers = await Customer.getMany(filter);
1762
+ console.log(await customers.toDto());
1763
+ });
1764
+ ```
1765
+ <a name="_notequal"></a>
1766
+ [notEqual](https://github.com/alfateam/rdb-demo/blob/master/filtering/notEqual.js)
1767
+ ```js
1768
+ let orange = require('orange-orm');
1769
+
1770
+ let Customer = orange.table('_customer');
1771
+
1772
+ Customer.primaryColumn('cId').guid().as('id');
1773
+ Customer.column('cName').string().as('name');
1774
+
1775
+ let db = orange('postgres://postgres:postgres@localhost/test');
1776
+
1777
+ await db.transaction(async () => {
1778
+ let filter = Customer.name.notEqual('John');
1779
+ //same as Customer.name.ne('John');
1780
+ let customers = await Customer.getMany(filter);
1781
+ console.log(await customers.toDto());
1782
+ });
1783
+ ```
1784
+ <a name="_not"></a>
1785
+ [not](https://github.com/alfateam/rdb-demo/blob/master/filtering/not.js)
1786
+ ```js
1787
+ let orange = require('orange-orm');
1788
+
1789
+ let Customer = orange.table('_customer');
1790
+
1791
+ Customer.primaryColumn('cId').guid().as('id');
1792
+ Customer.column('cName').string().as('name');
1793
+
1794
+ let db = orange('postgres://postgres:postgres@localhost/test');
1795
+
1796
+ await db.transaction(async () => {
1797
+ let filter = Customer.name.equal('John').not();
1798
+ let customers = await Customer.getMany(filter);
1799
+ console.log(await customers.toDto());
1800
+ });
1801
+ ```
1802
+ <a name="_lessthan"></a>
1803
+ [lessThan](https://github.com/alfateam/rdb-demo/blob/master/filtering/lessThan.js)
1804
+ ```js
1805
+ let orange = require('orange-orm');
1806
+
1807
+ let Customer = orange.table('_customer');
1808
+
1809
+ Customer.primaryColumn('cId').guid().as('id');
1810
+ Customer.column('cBalance').numeric().as('balance');
1811
+ Customer.column('cName').string().as('name');
1812
+
1813
+ let db = orange('postgres://postgres:postgres@localhost/test');
1814
+
1815
+ await db.transaction(async () => {
1816
+ let filter = Customer.balance.lessThan(5000);
1817
+ //same as Customer.balance.lt(5000);
1818
+ let customers = await Customer.getMany(filter);
1819
+ console.log(await customers.toDto());
1820
+ });
1821
+ ```
1822
+ <a name="_lessthanorequal"></a>
1823
+ [lessThanOrEqual](https://github.com/alfateam/rdb-demo/blob/master/filtering/lessThanOrEqual.js)
1824
+ ```js
1825
+ let orange = require('orange-orm');
1826
+
1827
+ let Customer = orange.table('_customer');
1828
+
1829
+ Customer.primaryColumn('cId').guid().as('id');
1830
+ Customer.column('cBalance').numeric().as('balance');
1831
+ Customer.column('cName').string().as('name');
1832
+
1833
+ let db = orange('postgres://postgres:postgres@localhost/test');
1834
+
1835
+ await db.transaction(async () => {
1836
+ let filter = Customer.balance.lessThanOrEqual(8123);
1837
+ //same as Customer.balance.le(8123);
1838
+ let customers = await Customer.getMany(filter);
1839
+ console.log(await customers.toDto());
1840
+ });
1841
+ ```
1842
+ <a name="_greaterthan"></a>
1843
+ [greaterThan](https://github.com/alfateam/rdb-demo/blob/master/filtering/greaterThan.js)
1844
+ ```js
1845
+ let orange = require('orange-orm');
1846
+
1847
+ let Customer = orange.table('_customer');
1848
+
1849
+ Customer.primaryColumn('cId').guid().as('id');
1850
+ Customer.column('cBalance').numeric().as('balance');
1851
+ Customer.column('cName').string().as('name');
1852
+
1853
+ let db = orange('postgres://postgres:postgres@localhost/test');
1854
+
1855
+ await db.transaction(async () => {
1856
+ let filter = Customer.balance.greaterThan(5000);
1857
+ //same as Customer.balance.gt(5000);
1858
+ let customers = await Customer.getMany(filter);
1859
+ console.log(await customers.toDto());
1860
+ });
1861
+ ```
1862
+ <a name="_greaterthanorequal"></a>
1863
+ [greaterThanOrEqual](https://github.com/alfateam/rdb-demo/blob/master/filtering/greaterThanOrEqual.js)
1864
+ ```js
1865
+ let orange = require('orange-orm');
1866
+
1867
+ let Customer = orange.table('_customer');
1868
+
1869
+ Customer.primaryColumn('cId').guid().as('id');
1870
+ Customer.column('cBalance').numeric().as('balance');
1871
+ Customer.column('cName').string().as('name');
1872
+
1873
+ let db = orange('postgres://postgres:postgres@localhost/test');
1874
+
1875
+ await db.transaction(async () => {
1876
+ let filter = Customer.balance.greaterThanOrEqual(8123);
1877
+ //same as Customer.balance.ge(8123);
1878
+ let customers = await Customer.getMany(filter);
1879
+ console.log(await customers.toDto());
1880
+ });
1881
+ ```
1882
+ <a name="_between"></a>
1883
+ [between](https://github.com/alfateam/rdb-demo/blob/master/filtering/between.js)
1884
+ ```js
1885
+ let orange = require('orange-orm');
1886
+
1887
+ let Customer = orange.table('_customer');
1888
+
1889
+ Customer.primaryColumn('cId').guid().as('id');
1890
+ Customer.column('cBalance').numeric().as('balance');
1891
+ Customer.column('cName').string().as('name');
1892
+
1893
+ let db = orange('postgres://postgres:postgres@localhost/test');
1894
+
1895
+ await db.transaction(async () => {
1896
+ let filter = Customer.balance.between(3000, 8123);
1897
+ let customers = await Customer.getMany(filter);
1898
+ console.log(await customers.toDto());
1899
+ });
1900
+ ```
1901
+ <a name="_in"></a>
1902
+ [in](https://github.com/alfateam/rdb-demo/blob/master/filtering/in.js)
1903
+ ```js
1904
+ let orange = require('orange-orm');
1905
+
1906
+ let Customer = orange.table('_customer');
1907
+
1908
+ Customer.primaryColumn('cId').guid().as('id');
1909
+ Customer.column('cName').string().as('name');
1910
+
1911
+ let db = orange('postgres://postgres:postgres@localhost/test');
1912
+
1913
+ await db.transaction(async () => {
1914
+ let filter = Customer.name.in(['John', 'Yoko']);
1915
+ let customers = await Customer.getMany(filter);
1916
+ console.log(await customers.toDto());
1917
+ });
1918
+ ```
1919
+ <a name="_startswith"></a>
1920
+ [startsWith](https://github.com/alfateam/rdb-demo/blob/master/filtering/startsWith.js)
1921
+ ```js
1922
+ let orange = require('orange-orm');
1923
+
1924
+ let Customer = orange.table('_customer');
1925
+
1926
+ Customer.primaryColumn('cId').guid().as('id');
1927
+ Customer.column('cName').string().as('name');
1928
+
1929
+ let db = orange('postgres://postgres:postgres@localhost/test');
1930
+
1931
+ await db.transaction(async () => {
1932
+ let filter = Customer.name.startsWith('Jo');
1933
+ let customers = await Customer.getMany(filter);
1934
+ console.log(await customers.toDto());
1935
+ });
1936
+ ```
1937
+ <a name="_endswith"></a>
1938
+ [endsWith](https://github.com/alfateam/rdb-demo/blob/master/filtering/endsWith.js)
1939
+ ```js
1940
+ let orange = require('orange-orm');
1941
+
1942
+ let Customer = orange.table('_customer');
1943
+
1944
+ Customer.primaryColumn('cId').guid().as('id');
1945
+ Customer.column('cName').string().as('name');
1946
+
1947
+ let db = orange('postgres://postgres:postgres@localhost/test');
1948
+
1949
+ await db.transaction(async () => {
1950
+ let filter = Customer.name.endsWith('nny');
1951
+ let customers = await Customer.getMany(filter);
1952
+ console.log(await customers.toDto());
1953
+ });
1954
+ ```
1955
+ <a name="_contains"></a>
1956
+ [contains](https://github.com/alfateam/rdb-demo/blob/master/filtering/contains.js)
1957
+ ```js
1958
+ let orange = require('orange-orm');
1959
+
1960
+ let Customer = orange.table('_customer');
1961
+
1962
+ Customer.primaryColumn('cId').guid().as('id');
1963
+ Customer.column('cName').string().as('name');
1964
+
1965
+ let db = orange('postgres://postgres:postgres@localhost/test');
1966
+
1967
+ await db.transaction(async () => {
1968
+ let filter = Customer.name.contains('ohn');
1969
+ let customers = await Customer.getMany(filter);
1970
+ console.log(await customers.toDto());
1971
+ });
1972
+ ```
1973
+ <a name="_iequal"></a>
1974
+ [iEqual](https://github.com/alfateam/rdb-demo/blob/master/filtering/iEqual.js)
1975
+ (postgres only)
1976
+ ```js
1977
+ let orange = require('orange-orm');
1978
+
1979
+ let Customer = orange.table('_customer');
1980
+
1981
+ Customer.primaryColumn('cId').guid().as('id');
1982
+ Customer.column('cName').string().as('name');
1983
+
1984
+ let db = orange('postgres://postgres:postgres@localhost/test');
1985
+
1986
+ await db.transaction(async () => {
1987
+ let filter = Customer.name.iEqual('jOhN');
1988
+ //same as Customer.name.iEq('jOhN');
1989
+ let customers = await Customer.getMany(filter);
1990
+ console.log(await customers.toDto());
1991
+ });
1992
+ ```
1993
+ <a name="_istartswith"></a>
1994
+ [iStartsWith](https://github.com/alfateam/rdb-demo/blob/master/filtering/iStartsWith.js)
1995
+ (postgres only)
1996
+ ```js
1997
+ let orange = require('orange-orm');
1998
+
1999
+ let Customer = orange.table('_customer');
2000
+
2001
+ Customer.primaryColumn('cId').guid().as('id');
2002
+ Customer.column('cName').string().as('name');
2003
+
2004
+ let db = orange('postgres://postgres:postgres@localhost/test');
2005
+
2006
+ await db.transaction(async () => {
2007
+ let filter = Customer.name.iStartsWith('jo');
2008
+ let customers = await Customer.getMany(filter);
2009
+ console.log(await customers.toDto());
2010
+ });
2011
+ ```
2012
+ <a name="_iendswith"></a>
2013
+ [iEndsWith](https://github.com/alfateam/rdb-demo/blob/master/filtering/iEndsWith.js)
2014
+ (postgres only)
2015
+ ```js
2016
+ let orange = require('orange-orm');
2017
+
2018
+ let Customer = orange.table('_customer');
2019
+
2020
+ Customer.primaryColumn('cId').guid().as('id');
2021
+ Customer.column('cName').string().as('name');
2022
+
2023
+ let db = orange('postgres://postgres:postgres@localhost/test');
2024
+
2025
+ await db.transaction(async () => {
2026
+ let filter = Customer.name.iEndsWith('nNy');
2027
+ let customers = await Customer.getMany(filter);
2028
+ console.log(await customers.toDto());
2029
+ });
2030
+ ```
2031
+ <a name="_icontains"></a>
2032
+ [iContains](https://github.com/alfateam/rdb-demo/blob/master/filtering/iContains.js)
2033
+ (postgres only)
2034
+ ```js
2035
+ let orange = require('orange-orm');
2036
+
2037
+ let Customer = orange.table('_customer');
2038
+
2039
+ Customer.primaryColumn('cId').guid().as('id');
2040
+ Customer.column('cName').string().as('name');
2041
+
2042
+ let db = orange('postgres://postgres:postgres@localhost/test');
2043
+
2044
+ await db.transaction(async () => {
2045
+ let filter = Customer.name.iContains('oHn');
2046
+ let customers = await Customer.getMany(filter);
2047
+ console.log(await customers.toDto());
2048
+ });
2049
+ ```
2050
+ <a name="_exists"></a>
2051
+ [exists](https://github.com/alfateam/rdb-demo/blob/master/filtering/exists.js)
2052
+ ```js
2053
+ let orange = require('orange-orm');
2054
+
2055
+ let Order = orange.table('_order');
2056
+ let DeliveryAddress = orange.table('_deliveryAddress');
2057
+
2058
+ Order.primaryColumn('oId').guid().as('id');
2059
+ Order.column('oOrderNo').string().as('orderNo');
2060
+
2061
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
2062
+ DeliveryAddress.column('dOrderId').string().as('orderId');
2063
+ DeliveryAddress.column('dName').string().as('name');
2064
+ DeliveryAddress.column('dStreet').string().as('street');
2065
+
2066
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
2067
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
2068
+
2069
+ let db = orange('postgres://postgres:postgres@localhost/test');
2070
+
2071
+ await db.transaction(async () => {
2072
+ let filter = Order.deliveryAddress.exists();
2073
+ let orders = await Order.getMany(filter);
2074
+ console.log(await orders.toDto());
2075
+ });
2076
+ ```
2077
+ <a name="_or"></a>
2078
+ [or](https://github.com/alfateam/rdb-demo/blob/master/filtering/or.js)
2079
+ ```js
2080
+ let orange = require('orange-orm');
2081
+
2082
+ let Customer = orange.table('_customer');
2083
+
2084
+ Customer.primaryColumn('cId').guid().as('id');
2085
+ Customer.column('cName').string().as('name');
2086
+
2087
+ let db = orange('postgres://postgres:postgres@localhost/test');
2088
+
2089
+ await db.transaction(async () => {
2090
+ let john = Customer.name.equal('John');
2091
+ let yoko = Customer.name.equal('Yoko');
2092
+ let filter = john.or(yoko);
2093
+ let customers = await Customer.getMany(filter);
2094
+ console.log(await customers.toDto());
2095
+ });
2096
+ ```
2097
+ <a name="_and"></a>
2098
+ [and](https://github.com/alfateam/rdb-demo/blob/master/filtering/and.js)
2099
+ ```js
2100
+ let orange = require('orange-orm');
2101
+
2102
+ let Customer = orange.table('_customer');
2103
+
2104
+ Customer.primaryColumn('cId').guid().as('id');
2105
+ Customer.column('cIsActive').boolean().as('isActive');
2106
+ Customer.column('cBalance').numeric().as('balance');
2107
+ Customer.column('cName').string().as('name');
2108
+
2109
+ let db = orange('postgres://postgres:postgres@localhost/test');
2110
+
2111
+ await db.transaction(async () => {
2112
+ let isActive = Customer.isActive.equal(true);
2113
+ let highBalance = Customer.balance.greaterThan(8000);
2114
+ let filter = isActive.and(highBalance);
2115
+ let customers = await Customer.getMany(filter);
2116
+ console.log(await customers.toDto());
2117
+ });
2118
+ ```
2119
+ <a name="_oralternative"></a>
2120
+ [or alternative syntax](https://github.com/alfateam/rdb-demo/blob/master/filtering/orAlternative.js)
2121
+ ```js
2122
+ let orange = require('orange-orm');
2123
+
2124
+ let Customer = orange.table('_customer');
2125
+
2126
+ Customer.primaryColumn('cId').guid().as('id');
2127
+ Customer.column('cName').string().as('name');
2128
+
2129
+ let db = orange('postgres://postgres:postgres@localhost/test');
2130
+
2131
+ await db.transaction(async () => {
2132
+ let john = Customer.name.equal('John');
2133
+ let yoko = Customer.name.equal('Yoko');
2134
+ let filter = orange.filter.or(john).or(yoko);
2135
+ //alternatively orange.filter.and(john).or(yoko);
2136
+ let customers = await Customer.getMany(filter);
2137
+ console.log(await customers.toDto());
2138
+ });
2139
+ ```
2140
+ <a name="_andalternative"></a>
2141
+ [and alternative syntax](https://github.com/alfateam/rdb-demo/blob/master/filtering/andAlternative.js)
2142
+ ```js
2143
+ let orange = require('orange-orm');
2144
+
2145
+ let Customer = orange.table('_customer');
2146
+
2147
+ Customer.primaryColumn('cId').guid().as('id');
2148
+ Customer.column('cIsActive').boolean().as('isActive');
2149
+ Customer.column('cBalance').numeric().as('balance');
2150
+ Customer.column('cName').string().as('name');
2151
+
2152
+ let db = orange('postgres://postgres:postgres@localhost/test');
2153
+
2154
+ await db.transaction(async () => {
2155
+ let isActive = Customer.isActive.equal(true);
2156
+ let highBalance = Customer.balance.greaterThan(8000);
2157
+ let filter = orange.filter.and(isActive).and(highBalance);
2158
+ //alternatively orange.filter.or(isActive).and(highBalance);
2159
+ let customers = await Customer.getMany(filter);
2160
+ console.log(await customers.toDto());
2161
+ });
2162
+ ```
2163
+ <a name="_any"></a>
2164
+ [any filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/any.js)
2165
+ ```js
2166
+ let orange = require('orange-orm');
2167
+
2168
+ let Order = orange.table('_order');
2169
+ let Customer = orange.table('_customer');
2170
+ let OrderLine = orange.table('_orderLine');
2171
+
2172
+ Order.primaryColumn('id').guid();
2173
+ Order.column('customerId').guid();
2174
+ Order.column('orderNo').string();
2175
+
2176
+ Customer.primaryColumn('id').guid();
2177
+ Customer.column('isActive').boolean();
2178
+ Customer.column('balance').numeric();
2179
+ Customer.column('name').string();
2180
+
2181
+ OrderLine.primaryColumn('id').guid();
2182
+ OrderLine.column('orderId').guid();
2183
+ OrderLine.column('product').string();
2184
+
2185
+ Order.join(Customer).by('customerId').as('customer');
2186
+
2187
+ let line_order_relation = OrderLine.join(Order).by('orderId').as('order');
2188
+ Order.hasMany(line_order_relation).as('lines');
2189
+
2190
+ let db = orange.sqlite(__dirname + '/../db/rdbDemo');
2191
+
2192
+ await db.transaction(async () => {
2193
+ let filter = Order.lines.any( line => {
2194
+ let aFilter = line.product.contains('a');
2195
+ let cFilter = line.product.startsWith('c');
2196
+ return aFilter.and(cFilter);
2197
+ });
2198
+ let orders = await Order.getMany(filter);
2199
+ console.log(inspect(await orders.toDto(), false, 10));
2200
+ });
2201
+ ```
2202
+ <a name="_all"></a>
2203
+ [all filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/all.js)
2204
+ ```js
2205
+ let orange = require('orange-orm');
2206
+
2207
+ let Order = orange.table('_order');
2208
+ let Customer = orange.table('_customer');
2209
+ let OrderLine = orange.table('_orderLine');
2210
+
2211
+ Order.primaryColumn('id').guid();
2212
+ Order.column('customerId').guid();
2213
+ Order.column('orderNo').string();
2214
+
2215
+ Customer.primaryColumn('id').guid();
2216
+ Customer.column('isActive').boolean();
2217
+ Customer.column('balance').numeric();
2218
+ Customer.column('name').string();
2219
+
2220
+ OrderLine.primaryColumn('id').guid();
2221
+ OrderLine.column('orderId').guid();
2222
+ OrderLine.column('product').string();
2223
+
2224
+ Order.join(Customer).by('customerId').as('customer');
2225
+
2226
+ let line_order_relation = OrderLine.join(Order).by('orderId').as('order');
2227
+ Order.hasMany(line_order_relation).as('lines');
2228
+
2229
+ let db = orange.sqlite(__dirname + '/../db/rdbDemo');
2230
+
2231
+ await db.transaction(async () => {
2232
+ let filter = Order.lines.all( line => {
2233
+ return line.product.contains('sub');
2234
+ });
2235
+ let orders = await Order.getMany(filter);
2236
+ console.log(inspect(await orders.toDto(), false, 10));
2237
+ });
2238
+ ```
2239
+ <a name="_none"></a>
2240
+ [none filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/none.js)
2241
+ ```js
2242
+ let orange = require('orange-orm');
2243
+
2244
+ let Order = orange.table('_order');
2245
+ let Customer = orange.table('_customer');
2246
+ let OrderLine = orange.table('_orderLine');
2247
+
2248
+ Order.primaryColumn('id').guid();
2249
+ Order.column('customerId').guid();
2250
+ Order.column('orderNo').string();
2251
+
2252
+ Customer.primaryColumn('id').guid();
2253
+ Customer.column('isActive').boolean();
2254
+ Customer.column('balance').numeric();
2255
+ Customer.column('name').string();
2256
+
2257
+ OrderLine.primaryColumn('id').guid();
2258
+ OrderLine.column('orderId').guid();
2259
+ OrderLine.column('product').string();
2260
+
2261
+ Order.join(Customer).by('customerId').as('customer');
2262
+
2263
+ let line_order_relation = OrderLine.join(Order).by('orderId').as('order');
2264
+ Order.hasMany(line_order_relation).as('lines');
2265
+
2266
+ let db = orange.sqlite(__dirname + '/../db/rdbDemo');
2267
+
2268
+ await db.transaction(async () => {
2269
+ let filter = Order.lines.none( line => {
2270
+ return line.product.contains('sub');
2271
+ });
2272
+ //alternatively: Order.lines.product.contains('sub').not();
2273
+ let orders = await Order.getMany(filter);
2274
+ console.log(inspect(await orders.toDto(), false, 10));
2275
+ });
2276
+ ```
2277
+ <a name="_subfilter"></a>
2278
+ [sub filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/subFilter.js)
2279
+ ```js
2280
+ let orange = require('orange-orm');
2281
+
2282
+ let Order = orange.table('_order');
2283
+ let DeliveryAddress = orange.table('_deliveryAddress');
2284
+
2285
+ Order.primaryColumn('oId').guid().as('id');
2286
+ Order.column('oOrderNo').string().as('orderNo');
2287
+
2288
+ DeliveryAddress.primaryColumn('dId').guid().as('id');
2289
+ DeliveryAddress.column('dOrderId').string().as('orderId');
2290
+ DeliveryAddress.column('dName').string().as('name');
2291
+ DeliveryAddress.column('dStreet').string().as('street');
2292
+
2293
+ let deliveryAddress_order_relation = DeliveryAddress.join(Order).by('dOrderId').as('order');
2294
+ Order.hasOne(deliveryAddress_order_relation).as('deliveryAddress');
2295
+
2296
+ let db = orange('postgres://postgres:postgres@localhost/test');
2297
+
2298
+ await db.transaction(async () => {
2299
+ let filter = Order.deliveryAddress.street.startsWith('Node');
2300
+ let orders = await Order.getMany(filter);
2301
+ console.log(await orders.toDto());
2302
+ });
2303
+ ```
2304
+ <a name="_compositefilter"></a>
2305
+ [composite filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/compositeFilter.js)
2306
+ ```js
2307
+ let orange = require('orange-orm');
2308
+
2309
+ let Order = orange.table('_order');
2310
+ let Customer = orange.table('_customer');
2311
+ let OrderLine = orange.table('_orderLine');
2312
+
2313
+ Order.primaryColumn('oId').guid().as('id');
2314
+ Order.column('oCustomerId').guid().as('customerId');
2315
+ Order.column('oOrderNo').string().as('orderNo');
2316
+
2317
+ Customer.primaryColumn('cId').guid().as('id');
2318
+ Customer.column('cIsActive').boolean().as('isActive');
2319
+ Customer.column('cBalance').numeric().as('balance');
2320
+ Customer.column('cName').string().as('name');
2321
+
2322
+ OrderLine.primaryColumn('lId').guid().as('id');
2323
+ OrderLine.column('lOrderId').guid().as('orderId');
2324
+ OrderLine.column('lProduct').string().as('product');
2325
+
2326
+ Order.join(Customer).by('oCustomerId').as('customer');
2327
+
2328
+ let line_order_relation = OrderLine.join(Order).by('lOrderId').as('order');
2329
+ Order.hasMany(line_order_relation).as('lines');
2330
+
2331
+ let db = orange('postgres://postgres:postgres@localhost/test');
2332
+
2333
+ await db.transaction(async () => {
2334
+ let isActive = Order.customer.isActive.eq(true);
2335
+ let didOrderCar = Order.lines.product.contains('car');
2336
+ let filter = isActive.and(didOrderCar);
2337
+ //alternatively orange.filter.and(isActive).and(didOrderCar);
2338
+ let orders = await Order.getMany(filter);
2339
+ console.log(inspect(await orders.toDto(), false, 10));
2340
+ });
2341
+ ```
2342
+ <a name="_rawsqlfilter"></a>
2343
+ [raw sql filter](https://github.com/alfateam/rdb-demo/blob/master/filtering/rawSqlFilter.js)
2344
+ ```js
2345
+ let inspect = require('util').inspect;
2346
+ let orange = require('orange-orm');
2347
+
2348
+ let Order = orange.table('_order');
2349
+ Order.primaryColumn('oId').guid().as('id');
2350
+ Order.column('oOrderNo').string().as('orderNo');
2351
+ Order.column('oCustomerId').guid().as('customerId');
2352
+
2353
+ let Customer = orange.table('_customer');
2354
+ Customer.primaryColumn('cid').guid().as('id');
2355
+ Customer.column('cName').string().as('name');
2356
+ Customer.column('cBalance').string().as('balance');
2357
+ Customer.column('cIsActive').boolean().as('isActive');
2358
+
2359
+ let orderCustomerJoin = Order.join(Customer).by('oCustomerId').as('customer');
2360
+ Customer.hasMany(orderCustomerJoin).as('orders');
2361
+
2362
+ let db = orange('postgres://postgres:postgres@localhost/test');
2363
+
2364
+ await db.transaction(async () => {
2365
+ let filter = {
2366
+ sql: 'exists (select 1 from _customer where _customer.cId = oCustomerId and _customer.cBalance > 3000 and _customer.cName LIKE ?)',
2367
+ parameters: ['%o%']
2368
+ };
2369
+ let orders = await Order.getMany(filter);
2370
+ let strategy = { customer: null }
2371
+ console.log(await orders.toDto(strategy));
2372
+ });
2373
+ ```