orange-orm 4.5.0-beta.0 → 4.5.0-beta.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 (310) hide show
  1. package/README.md +6 -1
  2. package/docs/changelog.md +4 -0
  3. package/package.json +10 -6
  4. package/src/applyPatch.js +5 -2
  5. package/src/client/index.js +3 -2
  6. package/src/client/index.mjs +13552 -6381
  7. package/src/client/rollup.config.js +24 -4
  8. package/src/client/stringify.js +2 -9
  9. package/src/createDomain.js +7 -28
  10. package/src/d1/newDatabase.js +23 -37
  11. package/src/d1/newPool.js +6 -6
  12. package/src/d1/newTransaction.js +1 -0
  13. package/src/d1/pool/newGenericPool.js +2 -14
  14. package/src/emitEvent.js +6 -4
  15. package/src/emptyFilter.js +12 -12
  16. package/src/format.js +9 -0
  17. package/src/generic-pool.js +274 -313
  18. package/src/getManyDto/newQuery.js +5 -5
  19. package/src/getManyDto/query/newSingleQuery.js +5 -5
  20. package/src/getManyDto.js +73 -41
  21. package/src/hostExpress/cycle.ts +211 -0
  22. package/src/hostExpress/executePath.js +361 -357
  23. package/src/hostExpress.js +2 -7
  24. package/src/hostLocal.js +9 -9
  25. package/src/index.js +13 -17
  26. package/src/indexBrowser.js +39 -0
  27. package/src/mssql/newDatabase.js +19 -31
  28. package/src/mssql/newPool.js +2 -2
  29. package/src/mssql/newTransaction.js +4 -3
  30. package/src/mssql/pool/newGenericPool.js +1 -13
  31. package/src/mySql/deleteFromSql.js +5 -5
  32. package/src/mySql/insert.js +5 -5
  33. package/src/mySql/insertSql.js +2 -3
  34. package/src/mySql/lastInsertedSql.js +3 -4
  35. package/src/mySql/newDatabase.js +20 -34
  36. package/src/mySql/newPool.js +10 -10
  37. package/src/mySql/newTransaction.js +2 -2
  38. package/src/mySql/pool/newGenericPool.js +2 -15
  39. package/src/mySql/quote.js +1 -0
  40. package/src/newId.js +2 -1
  41. package/src/newImmutable.js +1 -2
  42. package/src/oracle/deleteFromSql.js +5 -5
  43. package/src/oracle/formatDateOut.js +1 -1
  44. package/src/oracle/insert.js +6 -6
  45. package/src/oracle/insertSql.js +6 -14
  46. package/src/oracle/lastInsertedSql.js +3 -3
  47. package/src/oracle/mergeSql.js +3 -6
  48. package/src/oracle/newDatabase.js +18 -33
  49. package/src/oracle/newInsertCommandCore.js +5 -5
  50. package/src/oracle/newPool.js +10 -10
  51. package/src/oracle/newTransaction.js +2 -1
  52. package/src/oracle/pool/newGenericPool.js +2 -14
  53. package/src/oracle/quote.js +1 -0
  54. package/src/oracle/wrapQuery.js +0 -3
  55. package/src/package.json +5 -0
  56. package/src/patchRow.js +2 -2
  57. package/src/patchTable.js +6 -5
  58. package/src/pg/deleteFromSql.js +5 -5
  59. package/src/pg/formatDateOut.js +1 -2
  60. package/src/pg/insert.js +3 -3
  61. package/src/pg/insertSql.js +2 -7
  62. package/src/pg/lastInsertedSql.js +1 -2
  63. package/src/pg/newDatabase.js +20 -37
  64. package/src/pg/newPool.js +10 -10
  65. package/src/pg/newTransaction.js +2 -1
  66. package/src/pg/pool/newPgPool.js +23 -16
  67. package/src/pg/pool/parseSearchPathParam.js +10 -0
  68. package/src/pg/quote.js +2 -0
  69. package/src/pg/schema.js +2 -2
  70. package/src/{mySql/pool/defaults.js → poolDefaults.js} +0 -2
  71. package/src/promisify.js +24 -0
  72. package/src/query.js +2 -2
  73. package/src/sap/deleteFromSql.js +3 -3
  74. package/src/sap/formatDateOut.js +1 -1
  75. package/src/sap/insert.js +5 -5
  76. package/src/sap/insertSql.js +4 -5
  77. package/src/sap/lastInsertedSql.js +3 -3
  78. package/src/sap/mergeSql.js +1 -2
  79. package/src/sap/newDatabase.js +23 -34
  80. package/src/sap/newPool.js +2 -2
  81. package/src/sap/newTransaction.js +2 -1
  82. package/src/sap/quote.js +1 -0
  83. package/src/sqlite/deleteFromSql.js +5 -5
  84. package/src/sqlite/insert.js +5 -5
  85. package/src/sqlite/insertSql.js +2 -2
  86. package/src/sqlite/lastInsertedSql.js +2 -2
  87. package/src/sqlite/newDatabase.js +16 -32
  88. package/src/sqlite/newPool.js +10 -10
  89. package/src/sqlite/newTransaction.js +2 -1
  90. package/src/sqlite/pool/newGenericPool.js +1 -13
  91. package/src/sqlite/quote.js +1 -0
  92. package/src/table/aggregate.js +1 -1
  93. package/src/table/begin.js +5 -5
  94. package/src/table/cascadeDelete.js +2 -2
  95. package/src/table/column/binary/newDecode.js +2 -2
  96. package/src/table/column/binary/newEncode.js +3 -4
  97. package/src/table/column/boolean/newDecode.js +1 -1
  98. package/src/table/column/boolean/newEncode.js +6 -6
  99. package/src/table/column/date/formatOut.js +3 -5
  100. package/src/table/column/date/newDecode.js +2 -2
  101. package/src/table/column/date/newEncode.js +8 -8
  102. package/src/table/column/date/tryParseISO.js +6 -8
  103. package/src/table/column/date.js +1 -1
  104. package/src/table/column/dateWithTimeZone/newEncode.js +3 -4
  105. package/src/table/column/dateWithTimeZone.js +1 -1
  106. package/src/table/column/encodeFilterArg.js +3 -3
  107. package/src/table/column/equal.js +3 -3
  108. package/src/table/column/extractAlias.js +0 -2
  109. package/src/table/column/greaterThan.js +3 -3
  110. package/src/table/column/greaterThanOrEqual.js +3 -3
  111. package/src/table/column/guid/newDecode.js +1 -1
  112. package/src/table/column/guid/newEncode.js +3 -3
  113. package/src/table/column/in.js +3 -3
  114. package/src/table/column/json/formatOut.js +3 -3
  115. package/src/table/column/json/newDecode.js +3 -3
  116. package/src/table/column/json/newEncode.js +6 -6
  117. package/src/table/column/json.js +2 -1
  118. package/src/table/column/lessThan.js +3 -3
  119. package/src/table/column/lessThanOrEqual.js +4 -4
  120. package/src/table/column/negotiateRawSqlFilter.js +1 -72
  121. package/src/table/column/newBoolean.js +2 -53
  122. package/src/table/column/newColumn.js +21 -21
  123. package/src/table/column/newDecodeCore.js +1 -1
  124. package/src/table/column/notEqual.js +3 -3
  125. package/src/table/column/numeric/newDecode.js +2 -2
  126. package/src/table/column/numeric/newEncode.js +3 -3
  127. package/src/table/column/string/contains.js +2 -1
  128. package/src/table/column/string/containsCore.js +5 -5
  129. package/src/table/column/string/endsWith.js +1 -1
  130. package/src/table/column/string/endsWithCore.js +4 -4
  131. package/src/table/column/string/iContains.js +2 -1
  132. package/src/table/column/string/iEndsWith.js +1 -1
  133. package/src/table/column/string/iEqual.js +3 -3
  134. package/src/table/column/string/iStartsWith.js +1 -1
  135. package/src/table/column/string/newEncode.js +3 -3
  136. package/src/table/column/string/startsWith.js +1 -1
  137. package/src/table/column/string/startsWithCore.js +4 -4
  138. package/src/table/column/string.js +14 -14
  139. package/src/table/column/utils.js +113 -0
  140. package/src/table/column.js +6 -2
  141. package/src/table/commands/beginCommand.js +2 -2
  142. package/src/table/commands/compressChanges.js +2 -2
  143. package/src/table/commands/delete/newSingleCommand.js +5 -5
  144. package/src/table/commands/delete/singleCommand/joinSql.js +12 -12
  145. package/src/table/commands/delete/singleCommand/newSingleCommandCore.js +2 -2
  146. package/src/table/commands/delete/singleCommand/selectSql.js +6 -6
  147. package/src/table/commands/delete/singleCommand/subFilter.js +11 -11
  148. package/src/table/commands/delete/singleCommand/whereSql.js +2 -2
  149. package/src/table/commands/getChangeSet.js +2 -2
  150. package/src/table/commands/insert/getSqlTemplate.js +16 -16
  151. package/src/table/commands/lastCommandMatches.js +2 -2
  152. package/src/table/commands/newDeleteCommand.js +5 -10
  153. package/src/table/commands/newGetLastInsertedCommand.js +4 -4
  154. package/src/table/commands/newGetLastInsertedCommandCore.js +5 -5
  155. package/src/table/commands/newInsertCommand.js +5 -3
  156. package/src/table/commands/newInsertCommandCore.js +12 -12
  157. package/src/table/commands/newRow.js +4 -4
  158. package/src/table/commands/newUpdateCommand.js +4 -4
  159. package/src/table/commands/newUpdateCommandCore.js +4 -4
  160. package/src/table/commands/pushCommand.js +2 -2
  161. package/src/table/commit.js +13 -11
  162. package/src/table/count.js +8 -8
  163. package/src/table/delete.js +4 -4
  164. package/src/table/deleteSessionContext.js +2 -14
  165. package/src/table/executeQueries/executeChanges.js +3 -3
  166. package/src/table/executeQueries/executeQueriesCore.js +2 -2
  167. package/src/table/executeQueries/executeQuery.js +2 -2
  168. package/src/table/executeQueries/resolveExecuteQuery.js +3 -10
  169. package/src/table/executeQueries.js +4 -4
  170. package/src/table/getFromDbById.js +1 -1
  171. package/src/table/getMany.js +7 -7
  172. package/src/table/getManyDto.js +3 -4
  173. package/src/table/getSessionContext.js +4 -4
  174. package/src/table/getSessionSingleton.js +3 -2
  175. package/src/table/groupBy/newQuery.js +4 -4
  176. package/src/table/groupBy.js +9 -9
  177. package/src/table/insert.js +10 -13
  178. package/src/table/joinRelation/getRelatives.js +6 -6
  179. package/src/table/newCascadeDeleteStrategy.js +1 -7
  180. package/src/table/newGetRelated.js +3 -3
  181. package/src/table/newManyRelation.js +9 -9
  182. package/src/table/newOneRelation.js +9 -9
  183. package/src/table/newPrimaryKeyFilter.js +6 -6
  184. package/src/table/newQuery.js +5 -5
  185. package/src/table/newRelatedTable.js +6 -12
  186. package/src/table/newRowCache.js +17 -17
  187. package/src/table/newThrow.js +2 -2
  188. package/src/table/oneRelation/getRelatives.js +5 -5
  189. package/src/table/popChanges.js +3 -3
  190. package/src/table/promise.js +2 -8
  191. package/src/table/query/extractLimit.js +2 -2
  192. package/src/table/query/extractOffset.js +2 -2
  193. package/src/table/query/extractOrderBy.js +2 -2
  194. package/src/table/query/newParameterized.js +8 -11
  195. package/src/table/query/newSingleQuery.js +7 -7
  196. package/src/table/query/singleQuery/columnSql/joinLegToColumnSql.js +2 -15
  197. package/src/table/query/singleQuery/columnSql/newJoinedColumnSql.js +2 -25
  198. package/src/table/query/singleQuery/columnSql/newShallowColumnSql.js +4 -4
  199. package/src/table/query/singleQuery/columnSql/sharedJoinUtils.js +37 -0
  200. package/src/table/query/singleQuery/joinSql/joinLegToJoinSql.js +2 -7
  201. package/src/table/query/singleQuery/joinSql/joinLegToShallowJoinSql.js +2 -2
  202. package/src/table/query/singleQuery/joinSql/newDiscriminatorSql.js +2 -2
  203. package/src/table/query/singleQuery/joinSql/newShallowJoinSql.js +5 -5
  204. package/src/table/query/singleQuery/joinSql/newShallowJoinSqlCore.js +6 -5
  205. package/src/table/query/singleQuery/joinSql/oneLegToJoinSql.js +2 -8
  206. package/src/table/query/singleQuery/joinSql/oneLegToShallowJoinSql.js +2 -2
  207. package/src/table/query/singleQuery/negotiateExclusive.js +2 -2
  208. package/src/table/query/singleQuery/newColumnSql.js +3 -3
  209. package/src/table/query/singleQuery/newDiscriminatorSql.js +2 -2
  210. package/src/table/query/singleQuery/newJoinSql.js +7 -7
  211. package/src/table/query/singleQuery/newWhereSql.js +3 -3
  212. package/src/table/quote.js +4 -4
  213. package/src/table/relatedTable/aggregate.js +2 -8
  214. package/src/table/relatedTable/all.js +6 -12
  215. package/src/table/relatedTable/any.js +4 -11
  216. package/src/table/relatedTable/childColumn.js +12 -12
  217. package/src/table/relatedTable/columnAggregate.js +3 -3
  218. package/src/table/relatedTable/columnAggregateGroup.js +11 -11
  219. package/src/table/relatedTable/joinSql.js +5 -5
  220. package/src/table/relatedTable/joinSqlArray.js +3 -3
  221. package/src/table/relatedTable/none.js +4 -10
  222. package/src/table/relatedTable/relatedColumn.js +13 -13
  223. package/src/table/relatedTable/selectSql.js +2 -2
  224. package/src/table/relatedTable/subFilter.js +4 -4
  225. package/src/table/relatedTable/where.js +3 -9
  226. package/src/table/relatedTable/whereSql.js +2 -2
  227. package/src/table/relation/manyCache/synchronizeAdded.js +2 -2
  228. package/src/table/relation/manyCache/synchronizeChanged.js +3 -3
  229. package/src/table/relation/manyCache/synchronizeRemoved.js +2 -2
  230. package/src/table/relation/newForeignKeyFilter.js +2 -2
  231. package/src/table/relation/newManyCache.js +25 -17
  232. package/src/table/relation/newOneCache.js +6 -6
  233. package/src/table/releaseDbClient.js +4 -4
  234. package/src/table/resultToPromise.js +1 -3
  235. package/src/table/resultToRows/dbRowToRow.js +6 -13
  236. package/src/table/resultToRows/dbRowsToRows.js +2 -2
  237. package/src/table/resultToRows/decodeDbRow.js +2 -2
  238. package/src/table/resultToRows/delete/removeFromCache.js +4 -11
  239. package/src/table/resultToRows/delete.js +6 -6
  240. package/src/table/resultToRows/newDecodeDbRow.js +19 -25
  241. package/src/table/resultToRows/toDto/extractStrategy.js +1 -7
  242. package/src/table/resultToRows/toDto.js +3 -3
  243. package/src/table/resultToRows.js +3 -3
  244. package/src/table/rollback.js +21 -11
  245. package/src/table/rowArray/negotiateNextTick.js +1 -2
  246. package/src/table/setSessionSingleton.js +6 -3
  247. package/src/table/tryGetFirstFromDb.js +4 -4
  248. package/src/table/tryGetFromCacheById.js +3 -3
  249. package/src/table/tryGetFromDbById/extractStrategy.js +2 -2
  250. package/src/table/tryGetFromDbById.js +8 -6
  251. package/src/table/tryGetSessionContext.js +3 -13
  252. package/src/table/tryReleaseDbClient.js +2 -2
  253. package/src/table/updateField.js +4 -4
  254. package/src/table/where.js +2 -2
  255. package/src/table.js +56 -53
  256. package/src/tedious/deleteFromSql.js +5 -5
  257. package/src/tedious/formatDateOut.js +1 -1
  258. package/src/tedious/getManyDto/newQueryCore.js +5 -5
  259. package/src/tedious/getManyDto/query/newSingleQuery.js +5 -5
  260. package/src/tedious/getManyDto/query/newSubQueries/joinLegToQuery.js +4 -5
  261. package/src/tedious/getManyDto/query/newSubQueries/manyLegToQuery.js +4 -5
  262. package/src/tedious/getManyDto/query/newSubQueries/oneLegToQuery.js +13 -14
  263. package/src/tedious/getManyDto/query/newSubQueries.js +9 -26
  264. package/src/tedious/getManyDto/query/singleQuery/newShallowColumnSql.js +5 -6
  265. package/src/tedious/getManyDto.js +6 -6
  266. package/src/tedious/insert.js +3 -3
  267. package/src/tedious/insertSql.js +3 -3
  268. package/src/tedious/newDatabase.js +17 -30
  269. package/src/tedious/newPool.js +10 -10
  270. package/src/tedious/newTransaction.js +3 -4
  271. package/src/tedious/pool/newGenericPool.js +1 -13
  272. package/src/tedious/quote.js +1 -0
  273. package/src/validateDeleteConflict.js +4 -2
  274. package/src/createDomain/negotiateForwardProperty.js +0 -23
  275. package/src/d1/pool/defaults.js +0 -45
  276. package/src/mssql/pool/defaults.js +0 -45
  277. package/src/oracle/pool/defaults.js +0 -45
  278. package/src/pg/pool/defaults.js +0 -45
  279. package/src/sqlite/pool/defaults.js +0 -45
  280. package/src/table/createJSONReadStream.js +0 -7
  281. package/src/table/createJSONReadStreamDefault.js +0 -33
  282. package/src/table/createJSONReadStreamNative.js +0 -31
  283. package/src/table/createReadStream.js +0 -24
  284. package/src/table/createReadStreamCoreNative.js +0 -40
  285. package/src/table/createReadStreamDefault.js +0 -102
  286. package/src/table/createReadStreamNative.js +0 -17
  287. package/src/table/readStream/extractLimit.js +0 -7
  288. package/src/table/readStream/extractOrderBy.js +0 -59
  289. package/src/table/readStream/mySql/newQuery.js +0 -16
  290. package/src/table/readStream/mySql/query/newSingleQuery.js +0 -21
  291. package/src/table/readStream/mySql/query/newSubQueries/joinLegToQuery.js +0 -20
  292. package/src/table/readStream/mySql/query/newSubQueries/manyLegToQuery.js +0 -22
  293. package/src/table/readStream/mySql/query/newSubQueries/newQueryCore.js +0 -9
  294. package/src/table/readStream/mySql/query/newSubQueries/newSingleQueryCore.js +0 -18
  295. package/src/table/readStream/mySql/query/newSubQueries/oneLegToQuery.js +0 -22
  296. package/src/table/readStream/mySql/query/newSubQueries.js +0 -47
  297. package/src/table/readStream/mySql/query/singleQuery/newShallowColumnSql.js +0 -18
  298. package/src/table/readStream/newQuery.js +0 -32
  299. package/src/table/readStream/newQueryStream.js +0 -8
  300. package/src/table/readStream/pg/newQuery.js +0 -8
  301. package/src/table/readStream/pg/newQueryCore.js +0 -17
  302. package/src/table/readStream/pg/query/newSingleQuery.js +0 -19
  303. package/src/table/readStream/pg/query/newSubQueries/joinLegToQuery.js +0 -19
  304. package/src/table/readStream/pg/query/newSubQueries/manyLegToQuery.js +0 -22
  305. package/src/table/readStream/pg/query/newSubQueries/oneLegToQuery.js +0 -19
  306. package/src/table/readStream/pg/query/newSubQueries.js +0 -47
  307. package/src/table/readStream/pg/query/singleQuery/newShallowColumnSql.js +0 -20
  308. package/src/table/readStreamDefault/createBatchFilter.js +0 -39
  309. package/src/tedious/pool/defaults.js +0 -45
  310. package/src/useHook.js +0 -9
@@ -5,27 +5,37 @@ const popChanges = require('./popChanges');
5
5
  const newThrow = require('./newThrow');
6
6
  const resultToPromise = require('./resultToPromise');
7
7
  const conflictId = '12345678-1234-1234-1234-123456789012';
8
+ const getSessionSingleton = require('./getSessionSingleton');
8
9
 
9
- function rollback(e) {
10
- var executeRollback = executeQuery.bind(null, rollbackCommand);
10
+ function _rollback(context, e) {
11
11
  var chain = resultToPromise()
12
- .then(popChanges)
12
+ .then(() => popChanges(context))
13
13
  .then(executeRollback)
14
- .then(releaseDbClient);
14
+ .then(() => releaseDbClient(context));
15
+
16
+
17
+ function executeRollback() {
18
+ const transactionLess = getSessionSingleton(context, 'transactionLess');
19
+ if (transactionLess)
20
+ return Promise.resolve();
21
+ return executeQuery(context, rollbackCommand);
22
+ }
15
23
 
16
24
  if (e) {
17
- if (e.message.indexOf('ORA-01476: divisor is equal to zero') > -1)
18
- return newThrow(new Error('Conflict when updating a column'), chain);
25
+ if (e.message?.indexOf('ORA-01476: divisor is equal to zero') > -1)
26
+ return newThrow(context, new Error('Conflict when updating a column'), chain);
19
27
  let errors = e.message && e.message.split(conflictId) || [];
20
28
  if (errors.length > 1) {
21
- return newThrow(new Error(errors[1]), chain);
29
+ return newThrow(context, new Error(errors[1]), chain);
22
30
  }
23
31
  else
24
- return newThrow(e, chain);
32
+ return newThrow(context, e, chain);
25
33
  }
26
34
  return chain;
27
35
  }
28
36
 
29
- module.exports = function(e) {
30
- return Promise.resolve().then(() => rollback(e));
31
- };
37
+ function rollback(context, e) {
38
+ return Promise.resolve().then(() => _rollback(context, e));
39
+ }
40
+
41
+ module.exports = rollback;
@@ -1,10 +1,9 @@
1
- var promise = require('promise/domains');
2
1
 
3
2
  function negotiateNextTick(i) {
4
3
  if (i === 0)
5
4
  return;
6
5
  if (i % 1000 === 0)
7
- return promise.resolve();
6
+ return Promise.resolve();
8
7
  return;
9
8
  }
10
9
 
@@ -1,5 +1,8 @@
1
1
  var getSessionContext = require('./getSessionContext');
2
2
 
3
- module.exports = function(name, value) {
4
- getSessionContext()[name] = value;
5
- };
3
+ function setSessionSingleton(context, name, value) {
4
+ const rdb = getSessionContext(context);
5
+ rdb[name] = value;
6
+ }
7
+
8
+ module.exports = setSessionSingleton;
@@ -1,8 +1,8 @@
1
1
  var getMany = require('./getMany');
2
2
 
3
- function tryGet(table, filter, strategy) {
3
+ function tryGet(context, table, filter, strategy) {
4
4
  strategy = setLimit(strategy);
5
- return getMany(table, filter, strategy).then(filterRows);
5
+ return getMany(context, table, filter, strategy).then(filterRows);
6
6
  }
7
7
 
8
8
  function filterRows(rows) {
@@ -11,9 +11,9 @@ function filterRows(rows) {
11
11
  return null;
12
12
  }
13
13
 
14
- tryGet.exclusive = function(table, filter, strategy) {
14
+ tryGet.exclusive = function(context, table, filter, strategy) {
15
15
  strategy = setLimit(strategy);
16
- return getMany.exclusive(table, filter, strategy).then(filterRows);
16
+ return getMany.exclusive(context, table, filter, strategy).then(filterRows);
17
17
  };
18
18
 
19
19
  function setLimit(strategy) {
@@ -1,12 +1,12 @@
1
- function tryGet(table) {
1
+ function tryGet(context, table) {
2
2
  var fakeRow = {};
3
3
  var args = arguments;
4
4
  table._primaryColumns.forEach(addPkValue);
5
5
 
6
6
  function addPkValue(pkColumn, index){
7
- fakeRow[pkColumn.alias] = args[index + 1];
7
+ fakeRow[pkColumn.alias] = args[index + 2];
8
8
  }
9
9
 
10
- return table._cache.tryGet(fakeRow);
10
+ return table._cache.tryGet(context, fakeRow);
11
11
  }
12
12
  module.exports = tryGet;
@@ -1,6 +1,6 @@
1
1
 
2
- function extract(table) {
3
- var lengthWithStrategy = table._primaryColumns.length + 2;
2
+ function extract(_context, table) {
3
+ var lengthWithStrategy = table._primaryColumns.length + 3;
4
4
  if (arguments.length === lengthWithStrategy)
5
5
  return arguments[lengthWithStrategy-1];
6
6
  return;
@@ -2,18 +2,20 @@ var newPrimaryKeyFilter = require('./newPrimaryKeyFilter');
2
2
  var tryGetFirstFromDb = require('./tryGetFirstFromDb');
3
3
  var extractStrategy = require('./tryGetFromDbById/extractStrategy');
4
4
 
5
- function tryGet() {
5
+ function tryGet(context) {
6
6
  var filter = newPrimaryKeyFilter.apply(null, arguments);
7
- var table = arguments[0];
7
+ var table = arguments[1];
8
8
  var strategy = extractStrategy.apply(null, arguments);
9
- return tryGetFirstFromDb(table, filter, strategy);
9
+ return tryGetFirstFromDb(context, table, filter, strategy);
10
10
  }
11
11
 
12
- tryGet.exclusive = function tryGet() {
12
+ tryGet.exclusive = function tryGet(context) {
13
13
  var filter = newPrimaryKeyFilter.apply(null, arguments);
14
- var table = arguments[0];
14
+ var table = arguments[1];
15
15
  var strategy = extractStrategy.apply(null, arguments);
16
- return tryGetFirstFromDb.exclusive(table, filter, strategy);
16
+ return tryGetFirstFromDb.exclusive(context, table, filter, strategy);
17
+
18
+
17
19
  };
18
20
 
19
21
  module.exports = tryGet;
@@ -1,16 +1,6 @@
1
- let useHook = require('../useHook');
2
- let cls;
3
-
4
-
5
- function tryGetSessionContext() {
6
- if (useHook()) {
7
- if (!cls)
8
- cls = require('node-cls');
9
- let context = cls.getContext('rdb');
10
- return context && context.rdb;
11
- }
12
- else
13
- return process.domain && process.domain.rdb;
1
+ function tryGetSessionContext(context) {
2
+ if (context)
3
+ return context.rdb;
14
4
  }
15
5
 
16
6
  module.exports = tryGetSessionContext;
@@ -1,8 +1,8 @@
1
1
  var release = require('./releaseDbClient');
2
2
 
3
- function tryReleaseDbClient() {
3
+ function tryReleaseDbClient(context) {
4
4
  try {
5
- release();
5
+ release(context);
6
6
  }
7
7
  // eslint-disable-next-line no-empty
8
8
  catch (e) {
@@ -2,11 +2,11 @@ var newUpdateCommand = require('./commands/newUpdateCommand');
2
2
  var pushCommand = require('./commands/pushCommand');
3
3
  var lastCommandMatches = require('./commands/lastCommandMatches');
4
4
 
5
- function updateField(table, column, row, oldValue) {
6
- if (lastCommandMatches(row))
5
+ function updateField(context, table, column, row) {
6
+ if (lastCommandMatches(context, row))
7
7
  return;
8
- var command = newUpdateCommand(table, column, row, oldValue);
9
- pushCommand(command);
8
+ var command = newUpdateCommand(context, table, column, row);
9
+ pushCommand(context, command);
10
10
  }
11
11
 
12
12
  module.exports = updateField;
@@ -2,9 +2,9 @@ const negotiateRawSqlFilter = require('./column/negotiateRawSqlFilter');
2
2
 
3
3
  function newWhere(table) {
4
4
 
5
- function where(fn) {
5
+ function where(context, fn) {
6
6
  let arg = typeof fn === 'function' ? fn(table) : fn;
7
- return negotiateRawSqlFilter(arg);
7
+ return negotiateRawSqlFilter(context, arg);
8
8
  }
9
9
  return where;
10
10
  }
package/src/table.js CHANGED
@@ -14,13 +14,10 @@ const newContext = require('./newObject');
14
14
  const insert = require('./table/insert');
15
15
  const _delete = require('./table/delete');
16
16
  const cascadeDelete = require('./table/cascadeDelete');
17
- const createReadStream = require('./table/createReadStream');
18
- const createJSONReadStream = require('./table/createJSONReadStream');
19
- const getIdArgs = require('./table/getIdArgs');
20
17
  const patchTable = require('./patchTable');
21
18
  const newEmitEvent = require('./emitEvent');
22
19
  const hostLocal = require('./hostLocal');
23
- const getTSDefinition = require('./getTSDefinition');
20
+ // const getTSDefinition = require('./getTSDefinition'); //todo: unused ?
24
21
  const where = require('./table/where');
25
22
  const aggregate = require('./table/aggregate');
26
23
  const groupBy = require('./table/groupBy');
@@ -62,63 +59,63 @@ function _new(tableName) {
62
59
  return hasOne(joinRelation);
63
60
  };
64
61
 
65
- table.count = function(filter) {
66
- return Promise.resolve().then(() => count(table, filter));
62
+ table.count = function(context, ...rest) {
63
+ const args = [context, table, ...rest];
64
+ return Promise.resolve().then(() => count.apply(null, args));
67
65
  };
68
66
 
69
- table.getMany = function(filter, strategy) {
70
- return Promise.resolve().then(() => getMany(table, filter, strategy));
67
+ table.getMany = function(context, ...rest) {
68
+ const args = [context, table, ...rest];
69
+ return Promise.resolve().then(() => getMany.apply(null, args));
71
70
  };
72
- table.getManyDto = function(filter, strategy) {
73
- return Promise.resolve().then(() => getManyDto(table, filter, strategy));
71
+ table.getManyDto = function(context, ...rest) {
72
+ const args = [context, table, ...rest];
73
+ return Promise.resolve().then(() => getManyDto.apply(null, args));
74
74
  };
75
75
 
76
- table.aggregate = function(filter, strategy) {
77
- return groupBy(table, filter, strategy);
76
+ table.aggregate = function(context, ...rest) {
77
+ const args = [context, table, ...rest];
78
+ return groupBy.apply(null, args);
78
79
  };
79
80
 
80
- table.getMany.exclusive = function(filter, strategy) {
81
- return Promise.resolve().then(() => getMany.exclusive(table, filter, strategy));
81
+ table.getMany.exclusive = function(context, ...rest) {
82
+ const args = [context, table, ...rest];
83
+ return Promise.resolve().then(() => getMany.exclusive.apply(null, args));
82
84
  };
83
85
 
84
- table.tryGetFirst = function(filter, strategy) {
85
- return Promise.resolve().then(() => tryGetFirst(table, filter, strategy));
86
+ table.tryGetFirst = function(context, ...rest) {
87
+ const args = [context, table, ...rest];
88
+ return Promise.resolve().then(() => tryGetFirst.apply(null, args));
86
89
  };
87
- table.tryGetFirst.exclusive = function(filter, strategy) {
88
- return Promise.resolve().then(() => tryGetFirst.exclusive(table, filter, strategy));
90
+ table.tryGetFirst.exclusive = function(context, ...rest) {
91
+ const args = [context, table, ...rest];
92
+ return Promise.resolve().then(() => tryGetFirst.exclusive.apply(null, args));
89
93
  };
94
+
90
95
  table.getOne = table.tryGetFirst;
91
96
  table.getOne.exclusive = table.tryGetFirst.exclusive;
92
97
 
93
- function callAsync(func, args) {
94
- return Promise.resolve().then(() => call(func, args));
95
- }
96
-
97
- function call(func, args) {
98
- var mergedArgs = [table];
99
- for (var i = 0; i < args.length; i++) {
100
- mergedArgs.push(args[i]);
101
- }
102
- return func.apply(null, mergedArgs);
103
- }
104
-
105
- table.getById = function() {
106
- return callAsync(getById, getIdArgs(table, arguments));
98
+ table.getById = function(context, ...rest) {
99
+ const args = [context, table, ...rest];
100
+ return Promise.resolve().then(() => getById.apply(null, args));
107
101
  };
108
102
 
109
- table.getById.exclusive = function() {
110
-
111
- return callAsync(getById.exclusive, getIdArgs(table, arguments));
103
+ table.getById.exclusive = function(context, ...rest) {
104
+ const args = [context, table, ...rest];
105
+ return Promise.resolve().then(() => getById.exclusive.apply(null, args));
112
106
  };
113
107
 
114
- table.tryGetById = function() {
115
- return callAsync(tryGetById, getIdArgs(table, arguments));
108
+ table.tryGetById = function(context, ...rest) {
109
+ const args = [context, table, ...rest];
110
+ return Promise.resolve().then(() => tryGetById.apply(null, args));
116
111
  };
117
112
 
118
- table.tryGetById.exclusive = function() {
119
- return callAsync(tryGetById.exclusive, getIdArgs(table, arguments));
113
+ table.tryGetById.exclusive = function(context, ...rest) {
114
+ const args = [context, table, ...rest];
115
+ return Promise.resolve().then(() => tryGetById.exclusive.apply(null, args));
120
116
  };
121
117
 
118
+
122
119
  table.columnDiscriminators = function() {
123
120
  for (var i = 0; i < arguments.length; i++) {
124
121
  table._columnDiscriminators.push(arguments[i]);
@@ -133,37 +130,43 @@ function _new(tableName) {
133
130
  return table;
134
131
  };
135
132
 
136
- table.insert = function() {
133
+ table.insert = function(context, ...rest) {
137
134
  const concurrency = undefined;
138
- let args = [{table, concurrency}].concat([].slice.call(arguments));
135
+ let args = [context, {table, concurrency}, ...rest];
139
136
  return insert.apply(null, args);
140
137
  };
141
138
 
142
- table.insertWithConcurrency = function(options, ...rows) {
143
- let args = [{table, options}].concat([].slice.call(rows));
139
+ table.insertWithConcurrency = function(context, options, ...rows) {
140
+ let args = [context, {table, options}].concat([].slice.call(rows));
144
141
  return insert.apply(null, args);
145
142
  };
146
143
 
147
144
  table.delete = _delete.bind(null, table);
148
- table.cascadeDelete = cascadeDelete.bind(null, table);
149
- table.deleteCascade = cascadeDelete.bind(null, table);
150
- table.createReadStream = createReadStream.bind(null, table);
151
- table.createJSONReadStream = createJSONReadStream.bind(null, table);
145
+ table.cascadeDelete = function(context, ...rest) {
146
+ const args = [context, table, ...rest];
147
+ return cascadeDelete.apply(null, args);
148
+ };
149
+
150
+ table.deleteCascade = table.cascadeDelete;
152
151
  table.exclusive = function() {
153
152
  table._exclusive = true;
154
153
  return table;
155
154
  };
156
- table.patch = patchTable.bind(null, table);
157
- table.subscribeChanged = table._emitChanged.add;
158
- table.unsubscribeChanged = table._emitChanged.remove;
155
+ table.patch = function(context, ...rest) {
156
+ const args = [context, table, ...rest];
157
+ return patchTable.apply(null, args);
158
+ };
159
+
160
+ // table.subscribeChanged = table._emitChanged.add; //legacy
161
+ // table.unsubscribeChanged = table._emitChanged.remove; //legacy
159
162
 
160
163
  table.hostLocal = function(options) {
161
164
  return hostLocal({table, ...options});
162
165
  };
163
166
 
164
- table.ts = function(name) {
165
- return getTSDefinition(table, {name});
166
- };
167
+ // table.ts = function(name) { //unused ?
168
+ // return getTSDefinition(table, {name});
169
+ // };
167
170
 
168
171
  table.where = where(table);
169
172
  table._aggregate = aggregate(table);
@@ -1,10 +1,10 @@
1
- var format = 'delete %s from %s as %s%s';
2
- var util = require('util');
3
- const quote = require('../table/quote');
1
+ const format = 'delete %s from %s as %s%s';
2
+ const formatString = require('../format');
3
+ const quote = require('./quote');
4
4
 
5
5
  function deleteFromSql(table, alias, whereSql) {
6
- var name = quote(table._dbName);
6
+ const name = quote(table._dbName);
7
7
  alias = quote(alias);
8
- return util.format(format, alias, name, alias, whereSql);
8
+ return formatString(format, alias, name, alias, whereSql);
9
9
  }
10
10
  module.exports = deleteFromSql;
@@ -1,4 +1,4 @@
1
- const quote = require('../table/quote');
1
+ const quote = require('./quote');
2
2
 
3
3
  function formatDateOut(column, alias) {
4
4
  return `CONVERT(VARCHAR, ${alias}.${quote(column._dbName)}, 121)`;
@@ -5,14 +5,14 @@ var extractOrderBy = require('../../table/query/extractOrderBy');
5
5
  var extractLimit = require('../../table/query/extractLimit');
6
6
  var limitAndOffset = require('../limitAndOffset');
7
7
 
8
- function newQuery(table,filter,span,alias) {
8
+ function newQuery(context, table, filter, span, alias) {
9
9
  filter = extractFilter(filter);
10
- var orderBy = extractOrderBy(table,alias,span.orderBy);
11
- var limit = extractLimit(span);
10
+ var orderBy = extractOrderBy(context, table, alias, span.orderBy);
11
+ var limit = extractLimit(context, span);
12
12
  var offset = limitAndOffset(span);
13
13
 
14
- var subQueries = newSubQueries(table,span,alias);
15
- return newSingleQuery(table,filter,span,alias,subQueries,orderBy,limit,offset);
14
+ var subQueries = newSubQueries(newQuery, context, table, span, alias);
15
+ return newSingleQuery(context, table, filter, span, alias, subQueries, orderBy, limit, offset);
16
16
  }
17
17
 
18
18
  module.exports = newQuery;
@@ -2,17 +2,17 @@ var newColumnSql = require('./singleQuery/newShallowColumnSql');
2
2
  var newWhereSql = require('../../../table/query/singleQuery/newWhereSql');
3
3
  var newParameterized = require('../../../table/query/newParameterized');
4
4
 
5
- function _new(table, filter, span, alias, subQueries, orderBy, limit, offset) {
6
- var columnSql = newColumnSql(table, alias, span);
7
- var whereSql = newWhereSql(table, filter, alias);
5
+ function _new(context, table, filter, span, alias, subQueries, orderBy, limit, offset) {
6
+ var columnSql = newColumnSql(context, table, alias, span);
7
+ var whereSql = newWhereSql(context, table, filter, alias);
8
8
  if (limit)
9
9
  limit = limit + ' ';
10
10
 
11
11
  let join = '';
12
12
  const set = new Set();
13
- for(let key in span.aggregates) {
13
+ for (let key in span.aggregates) {
14
14
  const agg = span.aggregates[key];
15
- for(let sql of agg.joins) {
15
+ for (let sql of agg.joins) {
16
16
  if (!set.has(sql)) {
17
17
  join = join + sql;
18
18
  set.add(sql);
@@ -1,15 +1,14 @@
1
- var newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
2
- var newQuery = require('../../newQueryCore');
1
+ const newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
3
2
 
4
- function joinLegToQuery(parentAlias,leg,_legNo) {
3
+ function joinLegToQuery(newQuery, context, parentAlias, leg, _legNo) {
5
4
  var childAlias = parentAlias + leg.name;
6
5
  var span = leg.span;
7
6
  var parentTable = leg.table;
8
7
  var childColumns = span.table._primaryColumns;
9
8
  var parentColumns = leg.columns;
10
9
 
11
- var filter = newShallowJoinSql(parentTable,childColumns,parentColumns,childAlias,parentAlias,leg.span.where);
12
- var query = newQuery(span.table,filter,span,childAlias);
10
+ var filter = newShallowJoinSql(context, parentTable, childColumns, parentColumns, childAlias, parentAlias, leg.span.where);
11
+ var query = newQuery(context, span.table, filter, span, childAlias);
13
12
  return query.prepend('JSON_QUERY((').append(` FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) "${leg.name}"`);
14
13
  }
15
14
 
@@ -1,15 +1,14 @@
1
- var newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
2
- var newQuery = require('../../newQueryCore');
1
+ const newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
3
2
 
4
- function manyLegToQuery(rightAlias, leg, _legNo) {
3
+ function manyLegToQuery(newQuery, context, rightAlias, leg, _legNo) {
5
4
  var leftAlias = rightAlias + leg.name;
6
5
  var span = leg.span;
7
6
  var rightTable = leg.table;
8
7
  var rightColumns = rightTable._primaryColumns;
9
8
  var leftColumns = leg.columns;
10
9
 
11
- var filter = newShallowJoinSql(rightTable, leftColumns, rightColumns, leftAlias, rightAlias, leg.span.where);
12
- var query = newQuery(span.table, filter, span, leftAlias);
10
+ var filter = newShallowJoinSql(context, rightTable, leftColumns, rightColumns, leftAlias, rightAlias, leg.span.where);
11
+ var query = newQuery(context, span.table, filter, span, leftAlias);
13
12
  return query.prepend('JSON_QUERY( coalesce((').append(` FOR JSON PATH, INCLUDE_NULL_VALUES),'[]')) "${leg.name}"`);
14
13
  }
15
14
 
@@ -1,19 +1,18 @@
1
- var newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
2
- var newQuery = require('../../newQueryCore');
3
- var newParameterized = require('../../../../table/query/newParameterized');
4
- var util = require('util');
1
+ const newShallowJoinSql = require('../../../../table/query/singleQuery/joinSql/newShallowJoinSqlCore');
2
+ const newParameterized = require('../../../../table/query/newParameterized');
3
+ const formatString = require('../../../../format');
5
4
 
6
- function oneLegToQuery(rightAlias,leg,_legNo) {
7
- var leftAlias = rightAlias + leg.name;
8
- var span = leg.span;
9
- var rightTable = leg.table;
10
- var rightColumns = rightTable._primaryColumns;
11
- var leftColumns = leg.columns;
5
+ function oneLegToQuery(newQuery, context, rightAlias, leg, _legNo) {
6
+ let leftAlias = rightAlias + leg.name;
7
+ let span = leg.span;
8
+ let rightTable = leg.table;
9
+ let rightColumns = rightTable._primaryColumns;
10
+ let leftColumns = leg.columns;
12
11
 
13
- var filter = newShallowJoinSql(rightTable,leftColumns,rightColumns,leftAlias,rightAlias,leg.span.where);
14
- var query = newQuery(span.table,filter,span,leftAlias);
15
- var sql = 'SELECT TOP 1' + query.sql().substring(6);
16
- return newParameterized(util.format('JSON_QUERY((%s FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) "%s"',sql, leg.name ), query.parameters);
12
+ let filter = newShallowJoinSql(context, rightTable, leftColumns, rightColumns, leftAlias, rightAlias, leg.span.where);
13
+ let query = newQuery(context, span.table, filter, span, leftAlias);
14
+ let sql = 'SELECT TOP 1' + query.sql().substring(6);
15
+ return newParameterized(formatString('JSON_QUERY((%s FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) "%s"', sql, leg.name), query.parameters);
17
16
  }
18
17
 
19
18
  module.exports = oneLegToQuery;
@@ -1,26 +1,26 @@
1
- var joinLegToQuery = _joinLegToQuery;
2
- var oneLegToQuery = _oneLegToQuery;
3
- var manyLegToQuery = _manyLegToQuery;
4
- var newParameterized = require('../../../table/query/newParameterized');
1
+ const newParameterized = require('../../../table/query/newParameterized');
2
+ const joinLegToQuery = require('./newSubQueries/joinLegToQuery');
3
+ const oneLegToQuery = require('./newSubQueries/oneLegToQuery');
4
+ const manyLegToQuery = require('./newSubQueries/manyLegToQuery');
5
5
 
6
- function newSubQueries(_table,span,alias) {
6
+ function newSubQueries(newQuery, context, _table, span, alias) {
7
7
  var result = newParameterized('', []);
8
8
  var c = {};
9
9
  var _legNo;
10
10
 
11
11
  c.visitJoin = function(leg) {
12
- result = result.append(',').append(joinLegToQuery( alias,leg,_legNo));
12
+ result = result.append(',').append(joinLegToQuery(newQuery, context, alias, leg, _legNo));
13
13
  };
14
14
  c.visitOne = function(leg) {
15
- result = result.append(',').append(oneLegToQuery( alias,leg,_legNo));
15
+ result = result.append(',').append(oneLegToQuery(newQuery, context, alias, leg, _legNo));
16
16
  };
17
17
  c.visitMany = function(leg) {
18
- result = result.append(',').append(manyLegToQuery( alias,leg,_legNo));
18
+ result = result.append(',').append(manyLegToQuery(newQuery, context, alias, leg, _legNo));
19
19
  };
20
20
 
21
21
  span.legs.forEach(onEachLeg);
22
22
 
23
- function onEachLeg(leg,legNo) {
23
+ function onEachLeg(leg, legNo) {
24
24
  _legNo = legNo;
25
25
  leg.accept(c);
26
26
  }
@@ -28,21 +28,4 @@ function newSubQueries(_table,span,alias) {
28
28
  return result;
29
29
  }
30
30
 
31
- function _joinLegToQuery() {
32
- joinLegToQuery = require('./newSubQueries/joinLegToQuery');
33
- return joinLegToQuery.apply(null,arguments);
34
- }
35
-
36
- function _oneLegToQuery() {
37
- oneLegToQuery = require('./newSubQueries/oneLegToQuery');
38
- return oneLegToQuery.apply(null,arguments);
39
- }
40
-
41
- function _manyLegToQuery() {
42
- manyLegToQuery = require('./newSubQueries/manyLegToQuery');
43
- return manyLegToQuery.apply(null,arguments);
44
- }
45
-
46
-
47
-
48
31
  module.exports = newSubQueries;
@@ -1,7 +1,6 @@
1
- const getSessionSingleton = require('../../../../table/getSessionSingleton');
1
+ const quote = require('../../../quote');
2
2
 
3
- function _new(table,alias, span) {
4
- const quote = getSessionSingleton('quote');
3
+ function _new(context, table, alias, span) {
5
4
  alias = quote(alias);
6
5
  let columnsMap = span.columns;
7
6
  var columns = table._columns;
@@ -11,7 +10,7 @@ function _new(table,alias, span) {
11
10
  for (var i = 0; i < columns.length; i++) {
12
11
  var column = columns[i];
13
12
  if (!columnsMap || (columnsMap.get(column))) {
14
- sql = sql + separator + formatColumn(column) + ' as ' + quote(column.alias);
13
+ sql = sql + separator + formatColumn(column) + ' as ' + quote(column.alias);
15
14
  separator = ',';
16
15
  }
17
16
  }
@@ -24,11 +23,11 @@ function _new(table,alias, span) {
24
23
 
25
24
  function formatColumn(column) {
26
25
 
27
- const formatted = column.formatOut && column.tsType !== 'DateColumn' ? column.formatOut(alias) : alias + '.' + quote(column._dbName);
26
+ const formatted = column.formatOut && column.tsType !== 'DateColumn' ? column.formatOut(context, alias) : alias + '.' + quote(column._dbName);
28
27
  if (column.dbNull === null)
29
28
  return formatted;
30
29
  else {
31
- const encoded = column.encode.unsafe(column.dbNull);
30
+ const encoded = column.encode.unsafe(context, column.dbNull);
32
31
  return `CASE WHEN ${formatted}=${encoded} THEN null ELSE ${formatted} END`;
33
32
  }
34
33
 
@@ -3,17 +3,17 @@ const negotiateRawSqlFilter = require('../table/column/negotiateRawSqlFilter');
3
3
  const strategyToSpan = require('../table/strategyToSpan');
4
4
  const executeQueries = require('../table/executeQueries');
5
5
 
6
- async function getManyDto(table, filter, strategy) {
7
- filter = negotiateRawSqlFilter(filter, table);
6
+ async function getManyDto(context, table, filter, strategy) {
7
+ filter = negotiateRawSqlFilter(context, filter, table);
8
8
  if (strategy && strategy.where) {
9
9
  let arg = typeof strategy.where === 'function' ? strategy.where(table) : strategy.where;
10
- filter = filter.and(arg);
10
+ filter = filter.and(context, arg);
11
11
  }
12
- let span = strategyToSpan(table,strategy);
12
+ let span = strategyToSpan(table, strategy);
13
13
  let alias = table._dbName;
14
14
 
15
- const query = newQuery(table, filter, span, alias);
16
- const res = await executeQueries([query]);
15
+ const query = newQuery(context, table, filter, span, alias);
16
+ const res = await executeQueries(context, [query]);
17
17
  const rows = await res[0];
18
18
  if (rows.length === 0)
19
19
  return [];