json-fs-query 3.1.4 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +257 -15
  2. package/browser/jsonFsQuery.js +3884 -5057
  3. package/browser/jsonFsQuery.min.js +1 -1
  4. package/dist/data/introspect/alter.d.ts +12 -0
  5. package/dist/data/introspect/alter.js +304 -0
  6. package/dist/data/introspect/alter.min.js +1 -0
  7. package/dist/data/introspect/create.d.ts +10 -0
  8. package/dist/data/introspect/create.js +9 -23
  9. package/dist/data/introspect/create.min.js +1 -1
  10. package/dist/data/introspect/drop.js +7 -15
  11. package/dist/data/introspect/drop.min.js +1 -1
  12. package/dist/data/introspect/formatDatabase.d.ts +17 -0
  13. package/dist/data/introspect/formatDatabase.js +56 -0
  14. package/dist/data/introspect/formatDatabase.min.js +1 -0
  15. package/dist/data/introspect/index.d.ts +9 -0
  16. package/dist/data/introspect/index.js +18 -5
  17. package/dist/data/introspect/index.min.js +1 -1
  18. package/dist/data/introspect/packDatabase.d.ts +27 -0
  19. package/dist/data/introspect/packDatabase.js +113 -0
  20. package/dist/data/introspect/packDatabase.min.js +1 -0
  21. package/dist/data/introspect/policies/foreignKeyExists.d.ts +2 -0
  22. package/dist/data/introspect/policies/foreignKeyExists.js +9 -3
  23. package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
  24. package/dist/data/introspect/policies/hasDependents.d.ts +3 -3
  25. package/dist/data/introspect/policies/hasDependents.js +11 -3
  26. package/dist/data/introspect/policies/hasDependents.min.js +1 -1
  27. package/dist/data/introspect/policies/keyUnique.d.ts +3 -0
  28. package/dist/data/introspect/policies/keyUnique.js +10 -0
  29. package/dist/data/introspect/policies/keyUnique.min.js +1 -1
  30. package/dist/data/queries/databaseStatements.d.ts +31 -0
  31. package/dist/data/queries/databaseStatements.js +97 -0
  32. package/dist/data/queries/databaseStatements.min.js +1 -0
  33. package/dist/data/queries/deleteEntity.js +35 -19
  34. package/dist/data/queries/deleteEntity.min.js +1 -1
  35. package/dist/data/queries/insertEntity.d.ts +8 -0
  36. package/dist/data/queries/insertEntity.js +340 -43
  37. package/dist/data/queries/insertEntity.min.js +1 -1
  38. package/dist/data/queries/joinEntity.d.ts +15 -0
  39. package/dist/data/queries/joinEntity.js +91 -15
  40. package/dist/data/queries/joinEntity.min.js +1 -1
  41. package/dist/data/queries/query.d.ts +2 -1
  42. package/dist/data/queries/query.js +5 -2
  43. package/dist/data/queries/query.min.js +1 -1
  44. package/dist/data/queries/selectFields.d.ts +5 -4
  45. package/dist/data/queries/selectFields.js +25 -11
  46. package/dist/data/queries/selectFields.min.js +1 -1
  47. package/dist/data/queries/updateEntity.js +54 -15
  48. package/dist/data/queries/updateEntity.min.js +1 -1
  49. package/dist/data/storage/databases.d.ts +32 -0
  50. package/dist/data/storage/databases.js +93 -0
  51. package/dist/data/storage/databases.min.js +1 -0
  52. package/dist/data/storage/fileExists.d.ts +7 -0
  53. package/dist/data/storage/fileExists.js +25 -0
  54. package/dist/data/storage/fileExists.min.js +1 -0
  55. package/dist/data/storage/index.d.ts +19 -0
  56. package/dist/data/storage/index.js +124 -0
  57. package/dist/data/storage/index.min.js +1 -0
  58. package/dist/data/storage/listFiles.d.ts +8 -0
  59. package/dist/data/storage/listFiles.js +52 -0
  60. package/dist/data/storage/listFiles.min.js +1 -0
  61. package/dist/data/storage/makeDirectory.d.ts +7 -0
  62. package/dist/data/storage/makeDirectory.js +24 -0
  63. package/dist/data/storage/makeDirectory.min.js +1 -0
  64. package/dist/data/storage/nodeFiles.d.ts +6 -0
  65. package/dist/data/storage/nodeFiles.js +12 -0
  66. package/dist/data/storage/nodeFiles.min.js +1 -0
  67. package/dist/data/storage/readCache.d.ts +37 -0
  68. package/dist/data/storage/readCache.js +117 -0
  69. package/dist/data/storage/readCache.min.js +1 -0
  70. package/dist/data/storage/readJson.d.ts +16 -0
  71. package/dist/data/storage/readJson.js +38 -0
  72. package/dist/data/storage/readJson.min.js +1 -0
  73. package/dist/data/storage/removeDirectory.d.ts +8 -0
  74. package/dist/data/storage/removeDirectory.js +30 -0
  75. package/dist/data/storage/removeDirectory.min.js +1 -0
  76. package/dist/data/storage/removeFile.d.ts +8 -0
  77. package/dist/data/storage/removeFile.js +31 -0
  78. package/dist/data/storage/removeFile.min.js +1 -0
  79. package/dist/data/storage/storagePath.d.ts +11 -0
  80. package/dist/data/storage/storagePath.js +25 -0
  81. package/dist/data/storage/storagePath.min.js +1 -0
  82. package/dist/data/storage/writeJson.d.ts +17 -0
  83. package/dist/data/storage/writeJson.js +37 -0
  84. package/dist/data/storage/writeJson.min.js +1 -0
  85. package/dist/data/storage/writeSet.d.ts +64 -0
  86. package/dist/data/storage/writeSet.js +306 -0
  87. package/dist/data/storage/writeSet.min.js +1 -0
  88. package/dist/data/utilities/compareAs.d.ts +1 -0
  89. package/dist/data/utilities/compareAs.js +2 -2
  90. package/dist/data/utilities/compareAs.min.js +1 -1
  91. package/dist/data/utilities/config.d.ts +37 -0
  92. package/dist/data/utilities/config.js +77 -5
  93. package/dist/data/utilities/config.min.js +1 -1
  94. package/dist/data/utilities/databaseLock.d.ts +7 -0
  95. package/dist/data/utilities/databaseLock.js +19 -4
  96. package/dist/data/utilities/databaseLock.min.js +1 -1
  97. package/dist/data/utilities/deregisterRecord.js +4 -10
  98. package/dist/data/utilities/deregisterRecord.min.js +1 -1
  99. package/dist/data/utilities/getConditionIndexedList.js +3 -4
  100. package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
  101. package/dist/data/utilities/indexBuffer.d.ts +35 -0
  102. package/dist/data/utilities/indexBuffer.js +139 -0
  103. package/dist/data/utilities/indexBuffer.min.js +1 -0
  104. package/dist/data/utilities/indexHas.d.ts +13 -0
  105. package/dist/data/utilities/indexHas.js +48 -0
  106. package/dist/data/utilities/indexHas.min.js +1 -0
  107. package/dist/data/utilities/joinBases.d.ts +29 -0
  108. package/dist/data/utilities/joinBases.js +128 -0
  109. package/dist/data/utilities/joinBases.min.js +1 -0
  110. package/dist/data/utilities/joinKey.d.ts +17 -0
  111. package/dist/data/utilities/joinKey.js +31 -0
  112. package/dist/data/utilities/joinKey.min.js +1 -0
  113. package/dist/data/utilities/keyIndexFiles.d.ts +16 -0
  114. package/dist/data/utilities/keyIndexFiles.js +60 -0
  115. package/dist/data/utilities/keyIndexFiles.min.js +1 -0
  116. package/dist/data/utilities/knownFields.d.ts +26 -0
  117. package/dist/data/utilities/knownFields.js +128 -0
  118. package/dist/data/utilities/knownFields.min.js +1 -0
  119. package/dist/data/utilities/packedTable.d.ts +34 -0
  120. package/dist/data/utilities/packedTable.js +60 -0
  121. package/dist/data/utilities/packedTable.min.js +1 -0
  122. package/dist/data/utilities/parsers/findInsertValues.d.ts +3 -3
  123. package/dist/data/utilities/parsers/findInsertValues.js +28 -12
  124. package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
  125. package/dist/data/utilities/parsers/maskStrings.js +11 -2
  126. package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
  127. package/dist/data/utilities/parsers/parseAlter.d.ts +33 -0
  128. package/dist/data/utilities/parsers/parseAlter.js +84 -0
  129. package/dist/data/utilities/parsers/parseAlter.min.js +1 -0
  130. package/dist/data/utilities/parsers/parseCreate.d.ts +14 -0
  131. package/dist/data/utilities/parsers/parseCreate.js +13 -5
  132. package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
  133. package/dist/data/utilities/parsers/parseDatabaseStatement.d.ts +17 -0
  134. package/dist/data/utilities/parsers/parseDatabaseStatement.js +82 -0
  135. package/dist/data/utilities/parsers/parseDatabaseStatement.min.js +1 -0
  136. package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
  137. package/dist/data/utilities/parsers/parseQuery.js +24 -0
  138. package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
  139. package/dist/data/utilities/parsers/startsQuery.js +1 -1
  140. package/dist/data/utilities/parsers/startsQuery.min.js +1 -1
  141. package/dist/data/utilities/recordExists.js +2 -7
  142. package/dist/data/utilities/recordExists.min.js +1 -1
  143. package/dist/data/utilities/registerRecord.js +4 -10
  144. package/dist/data/utilities/registerRecord.min.js +1 -1
  145. package/dist/data/utilities/removeFromIndex.js +4 -10
  146. package/dist/data/utilities/removeFromIndex.min.js +1 -1
  147. package/dist/data/utilities/retrieveFile.d.ts +5 -0
  148. package/dist/data/utilities/retrieveFile.js +7 -16
  149. package/dist/data/utilities/retrieveFile.min.js +1 -1
  150. package/dist/data/utilities/retrieveFiles.d.ts +15 -0
  151. package/dist/data/utilities/retrieveFiles.js +48 -0
  152. package/dist/data/utilities/retrieveFiles.min.js +1 -0
  153. package/dist/data/utilities/retrieveRecord.d.ts +6 -0
  154. package/dist/data/utilities/retrieveRecord.js +24 -1
  155. package/dist/data/utilities/retrieveRecord.min.js +1 -1
  156. package/dist/data/utilities/retrieveRecords.d.ts +22 -0
  157. package/dist/data/utilities/retrieveRecords.js +60 -10
  158. package/dist/data/utilities/retrieveRecords.min.js +1 -1
  159. package/dist/data/utilities/rowLookup.d.ts +38 -0
  160. package/dist/data/utilities/rowLookup.js +99 -0
  161. package/dist/data/utilities/rowLookup.min.js +1 -0
  162. package/dist/data/utilities/runQuery.js +28 -4
  163. package/dist/data/utilities/runQuery.min.js +1 -1
  164. package/dist/data/utilities/semiJoin.d.ts +27 -0
  165. package/dist/data/utilities/semiJoin.js +97 -0
  166. package/dist/data/utilities/semiJoin.min.js +1 -0
  167. package/dist/data/utilities/updateIndex.js +5 -14
  168. package/dist/data/utilities/updateIndex.min.js +1 -1
  169. package/dist/index.d.ts +1 -1
  170. package/dist/index.js +24 -0
  171. package/dist/index.min.js +1 -1
  172. package/package.json +10 -4
  173. package/dist/data/utilities/getJoinIndexedList.d.ts +0 -3
  174. package/dist/data/utilities/getJoinIndexedList.js +0 -76
  175. package/dist/data/utilities/getJoinIndexedList.min.js +0 -1
  176. package/dist/data/utilities/getMatchingIndexes.d.ts +0 -2
  177. package/dist/data/utilities/getMatchingIndexes.js +0 -28
  178. package/dist/data/utilities/getMatchingIndexes.min.js +0 -1
  179. package/dist/data/utilities/matchIndexedJoins.d.ts +0 -2
  180. package/dist/data/utilities/matchIndexedJoins.js +0 -63
  181. package/dist/data/utilities/matchIndexedJoins.min.js +0 -1
  182. package/dist/data/utilities/restrictIndexedList.d.ts +0 -2
  183. package/dist/data/utilities/restrictIndexedList.js +0 -45
  184. package/dist/data/utilities/restrictIndexedList.min.js +0 -1
  185. package/dist/data/utilities/useJoinClause.d.ts +0 -6
  186. package/dist/data/utilities/useJoinClause.js +0 -57
  187. package/dist/data/utilities/useJoinClause.min.js +0 -1
@@ -4,31 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.deregisterRecord = void 0;
7
- require("core-js/modules/es.json.stringify.js");
8
7
  require("core-js/modules/esnext.iterator.constructor.js");
9
8
  require("core-js/modules/esnext.iterator.filter.js");
10
- var _config = require("./config");
11
- const {
12
- readFile,
13
- writeFile
14
- } = require('fs/promises');
9
+ var _storage = require("../storage");
15
10
  /**
16
11
  * Remove a record's filename from the __RECORDS registry. A missing registry file is left
17
12
  * untouched rather than created, since there's nothing to remove from it.
18
13
  * @param recordName
19
14
  */
20
15
  const deregisterRecord = async recordName => {
21
- const databasePath = (0, _config.getSetting)('databasePath', 'database/');
22
- const registryPath = `${databasePath}__RECORDS.json`;
16
+ const registryPath = '__RECORDS.json';
23
17
  let registry;
24
18
  try {
25
- registry = JSON.parse(await readFile(registryPath, 'utf8'));
19
+ registry = await (0, _storage.readJson)(registryPath);
26
20
  } catch (err) {
27
21
  return null;
28
22
  }
29
23
  const fileName = `${recordName}.json`;
30
24
  registry.entries = registry.entries.filter(entry => entry !== fileName);
31
- await writeFile(registryPath, JSON.stringify(registry, null, 2));
25
+ await (0, _storage.writeJson)(registryPath, registry);
32
26
  return registry;
33
27
  };
34
28
  exports.deregisterRecord = deregisterRecord;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deregisterRecord=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js");var _config=require("./config");const{readFile:readFile,writeFile:writeFile}=require("fs/promises"),deregisterRecord=async e=>{const r=`${(0,_config.getSetting)("databasePath","database/")}__RECORDS.json`;let t;try{t=JSON.parse(await readFile(r,"utf8"))}catch(e){return null}const s=`${e}.json`;return t.entries=t.entries.filter((e=>e!==s)),await writeFile(r,JSON.stringify(t,null,2)),t};exports.deregisterRecord=deregisterRecord;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deregisterRecord=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js");var _storage=require("../storage");const deregisterRecord=async e=>{const r="__RECORDS.json";let t;try{t=await(0,_storage.readJson)(r)}catch(e){return null}const s=`${e}.json`;return t.entries=t.entries.filter((e=>e!==s)),await(0,_storage.writeJson)(r,t),t};exports.deregisterRecord=deregisterRecord;
@@ -28,6 +28,7 @@ var _isEntityProperty = require("./parsers/isEntityProperty");
28
28
  var _splitEntityProperty = require("./parsers/splitEntityProperty");
29
29
  var _retrieveRecord = require("./retrieveRecord");
30
30
  var _where = require("../queries/where");
31
+ var _retrieveRecords = require("./retrieveRecords");
31
32
  var _retrieveFile = require("./retrieveFile");
32
33
  var _retrieveIndexes = require("./retrieveIndexes");
33
34
  var _isSingleFieldKey = require("./isSingleFieldKey");
@@ -149,10 +150,8 @@ const getConditionIndexedList = async (parsed, recordData, dataSet, resolved = n
149
150
  }
150
151
  for (const entity of Object.keys(matchedFiles)) {
151
152
  resolved.add(entity);
152
- dataSet[entity] = [];
153
- for (const file of matchedFiles[entity]) {
154
- dataSet[entity].push(await (0, _retrieveFile.retrieveFile)(`${entity}/${file}`));
155
- }
153
+ const record = recordData[entity] || (await (0, _retrieveRecord.retrieveRecord)(entity));
154
+ dataSet[entity] = await (0, _retrieveRecords.retrieveEntryRows)(record, [...matchedFiles[entity]], _retrieveFile.retrieveFile);
156
155
  }
157
156
  return parsed;
158
157
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.flat-map.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.some.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey"),_conditionTree=require("./conditionTree");const conditionField=(e,r)=>(0,_isEntityProperty.isEntityProperty)(e.property)?(0,_splitEntityProperty.splitEntityProperty)(e.property):{entity:r,property:e.property},indexedFiles=async(e,r,t,s,i)=>{if(Object.prototype.hasOwnProperty.call(s,e)||(s[e]=await(0,_retrieveRecord.retrieveRecord)(e)),s[e].keys.some((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,r))))return i[e]=i[e]||{},Object.prototype.hasOwnProperty.call(i[e],r)||(i[e][r]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[r],s))[r]),new Set((0,_where.where)(i[e][r],{property:"value",comparator:t.comparator,value:t.value,type:t.type}).flatMap((e=>e.record)))},candidatesOf=async(e,r,t,s)=>{if((0,_conditionTree.isCondition)(e)){const{entity:i,property:o}=conditionField(e,r);return i===r?await indexedFiles(i,o,e,t,s):void 0}if("not"in e)return;if("or"in e){const i=new Set;for(const o of e.or){const e=await candidatesOf(o,r,t,s);if(void 0===e)return;e.forEach((e=>i.add(e)))}return i}let i;for(const o of e.and){const e=await candidatesOf(o,r,t,s);void 0!==e&&(i=void 0===i?e:new Set([...i].filter((r=>e.has(r)))))}return i},getConditionIndexedList=async(e,r,t,s=new Set)=>{const i={},o={};if(void 0!==e.where){const t=await candidatesOf(e.where,e.entity,r,o);void 0!==t&&(i[e.entity]=t)}for(const t of(0,_conditionTree.requiredConditions)(e.where)){const{entity:s,property:n}=conditionField(t,e.entity);if(s===e.entity)continue;const d=await indexedFiles(s,n,t,r,o);void 0!==d&&(i[s]=Object.prototype.hasOwnProperty.call(i,s)?new Set([...i[s]].filter((e=>d.has(e)))):d)}for(const e of Object.keys(i)){s.add(e),t[e]=[];for(const r of i[e])t[e].push(await(0,_retrieveFile.retrieveFile)(`${e}/${r}`))}return e};exports.getConditionIndexedList=getConditionIndexedList;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.flat-map.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.some.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveRecords=require("./retrieveRecords"),_retrieveFile=require("./retrieveFile"),_retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey"),_conditionTree=require("./conditionTree");const conditionField=(e,r)=>(0,_isEntityProperty.isEntityProperty)(e.property)?(0,_splitEntityProperty.splitEntityProperty)(e.property):{entity:r,property:e.property},indexedFiles=async(e,r,t,i,s)=>{if(Object.prototype.hasOwnProperty.call(i,e)||(i[e]=await(0,_retrieveRecord.retrieveRecord)(e)),i[e].keys.some((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,r))))return s[e]=s[e]||{},Object.prototype.hasOwnProperty.call(s[e],r)||(s[e][r]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[r],i))[r]),new Set((0,_where.where)(s[e][r],{property:"value",comparator:t.comparator,value:t.value,type:t.type}).flatMap((e=>e.record)))},candidatesOf=async(e,r,t,i)=>{if((0,_conditionTree.isCondition)(e)){const{entity:s,property:o}=conditionField(e,r);return s===r?await indexedFiles(s,o,e,t,i):void 0}if("not"in e)return;if("or"in e){const s=new Set;for(const o of e.or){const e=await candidatesOf(o,r,t,i);if(void 0===e)return;e.forEach((e=>s.add(e)))}return s}let s;for(const o of e.and){const e=await candidatesOf(o,r,t,i);void 0!==e&&(s=void 0===s?e:new Set([...s].filter((r=>e.has(r)))))}return s},getConditionIndexedList=async(e,r,t,i=new Set)=>{const s={},o={};if(void 0!==e.where){const t=await candidatesOf(e.where,e.entity,r,o);void 0!==t&&(s[e.entity]=t)}for(const t of(0,_conditionTree.requiredConditions)(e.where)){const{entity:i,property:n}=conditionField(t,e.entity);if(i===e.entity)continue;const d=await indexedFiles(i,n,t,r,o);void 0!==d&&(s[i]=Object.prototype.hasOwnProperty.call(s,i)?new Set([...s[i]].filter((e=>d.has(e)))):d)}for(const e of Object.keys(s)){i.add(e);const o=r[e]||await(0,_retrieveRecord.retrieveRecord)(e);t[e]=await(0,_retrieveRecords.retrieveEntryRows)(o,[...s[e]],_retrieveFile.retrieveFile)}return e};exports.getConditionIndexedList=getConditionIndexedList;
@@ -0,0 +1,35 @@
1
+ import { indexEntry } from './updateIndex';
2
+ /**
3
+ * One index file held in memory while a statement changes it many times: values are found through a Map instead of a
4
+ * search of the whole index each time, and the file is written once at the end (see insertEntity). It holds and
5
+ * changes the index exactly as updateIndex would, one row after another: a new value is added at the end, a file
6
+ * already listed for its value isn't listed twice.
7
+ */
8
+ export declare class IndexBuffer {
9
+ readonly entries: indexEntry[];
10
+ private readonly type;
11
+ private readonly byKey;
12
+ private readonly listed;
13
+ /**
14
+ * @param entries - The index as read from its file ([] when there's none yet).
15
+ * @param type - The key's value type (see keyValueType).
16
+ */
17
+ constructor(entries: indexEntry[], type: string | undefined);
18
+ /**
19
+ * The entry for `value`, as updateIndex finds it.
20
+ * @param value
21
+ */
22
+ find(value: any): indexEntry | undefined;
23
+ /**
24
+ * Whether a row holds `value`, as indexHas answers it: an entry for it lists a file (never for null or undefined).
25
+ * @param value
26
+ */
27
+ has(value: any): boolean;
28
+ /**
29
+ * List `fileName` under `value`, as updateIndex does.
30
+ * @param value
31
+ * @param fileName
32
+ */
33
+ add(value: any, fileName: string): void;
34
+ }
35
+ //# sourceMappingURL=indexBuffer.d.ts.map
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.IndexBuffer = void 0;
7
+ require("core-js/modules/es.array.includes.js");
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+ require("core-js/modules/esnext.iterator.find.js");
10
+ require("core-js/modules/esnext.iterator.some.js");
11
+ require("core-js/modules/esnext.map.delete-all.js");
12
+ require("core-js/modules/esnext.map.every.js");
13
+ require("core-js/modules/esnext.map.filter.js");
14
+ require("core-js/modules/esnext.map.find.js");
15
+ require("core-js/modules/esnext.map.find-key.js");
16
+ require("core-js/modules/esnext.map.includes.js");
17
+ require("core-js/modules/esnext.map.key-of.js");
18
+ require("core-js/modules/esnext.map.map-keys.js");
19
+ require("core-js/modules/esnext.map.map-values.js");
20
+ require("core-js/modules/esnext.map.merge.js");
21
+ require("core-js/modules/esnext.map.reduce.js");
22
+ require("core-js/modules/esnext.map.some.js");
23
+ require("core-js/modules/esnext.map.update.js");
24
+ require("core-js/modules/esnext.set.add-all.js");
25
+ require("core-js/modules/esnext.set.delete-all.js");
26
+ require("core-js/modules/esnext.set.difference.js");
27
+ require("core-js/modules/esnext.set.every.js");
28
+ require("core-js/modules/esnext.set.filter.js");
29
+ require("core-js/modules/esnext.set.find.js");
30
+ require("core-js/modules/esnext.set.intersection.js");
31
+ require("core-js/modules/esnext.set.is-disjoint-from.js");
32
+ require("core-js/modules/esnext.set.is-subset-of.js");
33
+ require("core-js/modules/esnext.set.is-superset-of.js");
34
+ require("core-js/modules/esnext.set.join.js");
35
+ require("core-js/modules/esnext.set.map.js");
36
+ require("core-js/modules/esnext.set.reduce.js");
37
+ require("core-js/modules/esnext.set.some.js");
38
+ require("core-js/modules/esnext.set.symmetric-difference.js");
39
+ require("core-js/modules/esnext.set.union.js");
40
+ require("core-js/modules/esnext.weak-map.delete-all.js");
41
+ var _compareAs = require("./compareAs");
42
+ const unkeyed = Symbol('unkeyed');
43
+ /**
44
+ * The key a value is found by in a Map, so that two values share a key exactly when sameValue says they're the same:
45
+ * compareAs gives that for the comparable types (a Map compares keys like ===). Other types compare with ==, and a
46
+ * value compareAs leaves as an object compares by identity, so those are searched in turn instead.
47
+ * @param type
48
+ * @param value
49
+ */
50
+ const keyOf = (type, value) => {
51
+ if (!_compareAs.comparableTypes.includes(type)) {
52
+ return unkeyed;
53
+ }
54
+ const key = (0, _compareAs.compareAs)(type, value);
55
+ return typeof key === 'object' && key !== null ? unkeyed : key;
56
+ };
57
+ /**
58
+ * One index file held in memory while a statement changes it many times: values are found through a Map instead of a
59
+ * search of the whole index each time, and the file is written once at the end (see insertEntity). It holds and
60
+ * changes the index exactly as updateIndex would, one row after another: a new value is added at the end, a file
61
+ * already listed for its value isn't listed twice.
62
+ */
63
+ class IndexBuffer {
64
+ /**
65
+ * @param entries - The index as read from its file ([] when there's none yet).
66
+ * @param type - The key's value type (see keyValueType).
67
+ */
68
+ constructor(entries, type) {
69
+ this.byKey = new Map();
70
+ // The files each entry lists, built when a file is first added to it: a value shared by every row (a foreign key to
71
+ // one parent) would otherwise be searched once per row, which grows with the square of the rows
72
+ this.listed = new WeakMap();
73
+ this.entries = entries;
74
+ this.type = type;
75
+ for (const entry of entries) {
76
+ const key = keyOf(type, entry.value);
77
+ // The first entry for a value is the one updateIndex's find() would give
78
+ if (key !== unkeyed && !this.byKey.has(key)) {
79
+ this.byKey.set(key, entry);
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * The entry for `value`, as updateIndex finds it.
85
+ * @param value
86
+ */
87
+ find(value) {
88
+ const key = keyOf(this.type, value);
89
+ return key === unkeyed ? this.entries.find(entry => (0, _compareAs.sameValue)(this.type, entry.value, value)) : this.byKey.get(key);
90
+ }
91
+ /**
92
+ * Whether a row holds `value`, as indexHas answers it: an entry for it lists a file (never for null or undefined).
93
+ * @param value
94
+ */
95
+ has(value) {
96
+ // where's = never matches null or a missing value (an index entry for a row without the field has no value)
97
+ if (value === null || typeof value === 'undefined') {
98
+ return false;
99
+ }
100
+ const listsFiles = entry => Boolean(entry && Array.isArray(entry.record) && entry.record.length);
101
+ const first = this.find(value);
102
+ if (!first || listsFiles(first)) {
103
+ // No entry at all for the value (the Map holds the first of each), or one that lists a file
104
+ return listsFiles(first);
105
+ }
106
+ // indexHas looks at every entry for the value; an index edited by hand can hold more than one
107
+ return this.entries.some(entry => (0, _compareAs.sameValue)(this.type, entry.value, value) && listsFiles(entry));
108
+ }
109
+ /**
110
+ * List `fileName` under `value`, as updateIndex does.
111
+ * @param value
112
+ * @param fileName
113
+ */
114
+ add(value, fileName) {
115
+ const existing = this.find(value);
116
+ if (existing) {
117
+ if (!this.listed.has(existing)) {
118
+ this.listed.set(existing, new Set(existing.record));
119
+ }
120
+ const files = this.listed.get(existing);
121
+ if (!files.has(fileName)) {
122
+ files.add(fileName);
123
+ existing.record.push(fileName);
124
+ }
125
+ return;
126
+ }
127
+ const entry = {
128
+ value,
129
+ record: [fileName]
130
+ };
131
+ this.entries.push(entry);
132
+ this.listed.set(entry, new Set(entry.record));
133
+ const key = keyOf(this.type, value);
134
+ if (key !== unkeyed) {
135
+ this.byKey.set(key, entry);
136
+ }
137
+ }
138
+ }
139
+ exports.IndexBuffer = IndexBuffer;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.IndexBuffer=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.some.js"),require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/esnext.weak-map.delete-all.js");var _compareAs=require("./compareAs");const unkeyed=Symbol("unkeyed"),keyOf=(e,s)=>{if(!_compareAs.comparableTypes.includes(e))return unkeyed;const r=(0,_compareAs.compareAs)(e,s);return"object"==typeof r&&null!==r?unkeyed:r};class IndexBuffer{constructor(e,s){this.byKey=new Map,this.listed=new WeakMap,this.entries=e,this.type=s;for(const r of e){const e=keyOf(s,r.value);e===unkeyed||this.byKey.has(e)||this.byKey.set(e,r)}}find(e){const s=keyOf(this.type,e);return s===unkeyed?this.entries.find((s=>(0,_compareAs.sameValue)(this.type,s.value,e))):this.byKey.get(s)}has(e){if(null==e)return!1;const s=e=>Boolean(e&&Array.isArray(e.record)&&e.record.length),r=this.find(e);return!r||s(r)?s(r):this.entries.some((r=>(0,_compareAs.sameValue)(this.type,r.value,e)&&s(r)))}add(e,s){const r=this.find(e);if(r){this.listed.has(r)||this.listed.set(r,new Set(r.record));const e=this.listed.get(r);return void(e.has(s)||(e.add(s),r.record.push(s)))}const t={value:e,record:[s]};this.entries.push(t),this.listed.set(t,new Set(t.record));const o=keyOf(this.type,e);o!==unkeyed&&this.byKey.set(o,t)}}exports.IndexBuffer=IndexBuffer;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Whether any row of `entity` has `property` = `value` (compared by the field's declared type, as where does: a null
3
+ * equals nothing), answered from the index of a single-field key on the field: one file instead of every row.
4
+ *
5
+ * Undefined when there is no such index, or its file can't be read or parsed (a key added to a record by hand, a file
6
+ * edited badly): the caller then reads the rows, which are the truth, as these checks always did. A record with no rows
7
+ * has none, whatever its index says.
8
+ * @param entity
9
+ * @param property
10
+ * @param value
11
+ */
12
+ export declare const indexHas: (entity: string, property: string, value: any) => Promise<boolean | undefined>;
13
+ //# sourceMappingURL=indexHas.d.ts.map
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.indexHas = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.find.js");
9
+ require("core-js/modules/esnext.iterator.some.js");
10
+ var _storage = require("../storage");
11
+ var _where = require("../queries/where");
12
+ var _retrieveRecord = require("./retrieveRecord");
13
+ var _isSingleFieldKey = require("./isSingleFieldKey");
14
+ var _fieldType = require("./fieldType");
15
+ /**
16
+ * Whether any row of `entity` has `property` = `value` (compared by the field's declared type, as where does: a null
17
+ * equals nothing), answered from the index of a single-field key on the field: one file instead of every row.
18
+ *
19
+ * Undefined when there is no such index, or its file can't be read or parsed (a key added to a record by hand, a file
20
+ * edited badly): the caller then reads the rows, which are the truth, as these checks always did. A record with no rows
21
+ * has none, whatever its index says.
22
+ * @param entity
23
+ * @param property
24
+ * @param value
25
+ */
26
+ const indexHas = async (entity, property, value) => {
27
+ const record = await (0, _retrieveRecord.retrieveRecord)(entity);
28
+ const key = record.keys.find(key => (0, _isSingleFieldKey.isSingleFieldKey)(key, property) && key.lookup);
29
+ if (!key) {
30
+ return undefined;
31
+ }
32
+ if (!(record.entries || []).length) {
33
+ return false;
34
+ }
35
+ let index;
36
+ try {
37
+ index = await (0, _storage.readJson)(`__indexes/${record.path}/${key.lookup}`);
38
+ } catch (err) {
39
+ return undefined;
40
+ }
41
+ return (0, _where.where)(index, {
42
+ property: 'value',
43
+ comparator: '=',
44
+ value,
45
+ type: (0, _fieldType.fieldType)(record, property)
46
+ }).some(entry => Array.isArray(entry.record) && entry.record.length > 0);
47
+ };
48
+ exports.indexHas = indexHas;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.indexHas=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.some.js");var _storage=require("../storage"),_where=require("../queries/where"),_retrieveRecord=require("./retrieveRecord"),_isSingleFieldKey=require("./isSingleFieldKey"),_fieldType=require("./fieldType");const indexHas=async(e,r,i)=>{const t=await(0,_retrieveRecord.retrieveRecord)(e),s=t.keys.find((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,r)&&e.lookup));if(!s)return;if(!(t.entries||[]).length)return!1;let o;try{o=await(0,_storage.readJson)(`__indexes/${t.path}/${s.lookup}`)}catch(e){return}return(0,_where.where)(o,{property:"value",comparator:"=",value:i,type:(0,_fieldType.fieldType)(t,r)}).some((e=>Array.isArray(e.record)&&e.record.length>0))};exports.indexHas=indexHas;
@@ -0,0 +1,29 @@
1
+ import { JoinSide } from './semiJoin';
2
+ /**
3
+ * One `on` clause, with each side's record, field and the declared type it's compared by.
4
+ */
5
+ export type JoinStep = {
6
+ entityA: string;
7
+ propertyA: string;
8
+ typeA: string | undefined;
9
+ comparator: string;
10
+ entityB: string;
11
+ propertyB: string;
12
+ typeB: string | undefined;
13
+ };
14
+ /**
15
+ * The rows a join reads for each record in it, once for the whole join (every row's join then works from them):
16
+ * - the queried record: its rows (already read, or narrowed by the where clause)
17
+ * - the joined record when the where clause already narrowed it: those rows
18
+ * - a record joined by `=` to one already read, through an index on its field and with both fields of one type: only
19
+ * the rows whose value one of those rows has (the others can't match any row's join, and the order is the record's
20
+ * own, so the join's result is the same as from all of them)
21
+ * - any other: all its rows, kept on the query's data as before (merge reads them from there)
22
+ * @param entity
23
+ * @param joinEntity
24
+ * @param dataSets
25
+ * @param steps
26
+ * @param joinAlreadyResolved
27
+ */
28
+ export declare const joinBases: (entity: string, joinEntity: string, dataSets: Object, steps: JoinStep[], joinAlreadyResolved: boolean) => Promise<Map<string, JoinSide>>;
29
+ //# sourceMappingURL=joinBases.d.ts.map
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.joinBases = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.filter.js");
9
+ require("core-js/modules/esnext.iterator.for-each.js");
10
+ require("core-js/modules/esnext.iterator.map.js");
11
+ require("core-js/modules/esnext.map.delete-all.js");
12
+ require("core-js/modules/esnext.map.every.js");
13
+ require("core-js/modules/esnext.map.filter.js");
14
+ require("core-js/modules/esnext.map.find.js");
15
+ require("core-js/modules/esnext.map.find-key.js");
16
+ require("core-js/modules/esnext.map.includes.js");
17
+ require("core-js/modules/esnext.map.key-of.js");
18
+ require("core-js/modules/esnext.map.map-keys.js");
19
+ require("core-js/modules/esnext.map.map-values.js");
20
+ require("core-js/modules/esnext.map.merge.js");
21
+ require("core-js/modules/esnext.map.reduce.js");
22
+ require("core-js/modules/esnext.map.some.js");
23
+ require("core-js/modules/esnext.map.update.js");
24
+ require("core-js/modules/esnext.set.add-all.js");
25
+ require("core-js/modules/esnext.set.delete-all.js");
26
+ require("core-js/modules/esnext.set.difference.js");
27
+ require("core-js/modules/esnext.set.every.js");
28
+ require("core-js/modules/esnext.set.filter.js");
29
+ require("core-js/modules/esnext.set.find.js");
30
+ require("core-js/modules/esnext.set.intersection.js");
31
+ require("core-js/modules/esnext.set.is-disjoint-from.js");
32
+ require("core-js/modules/esnext.set.is-subset-of.js");
33
+ require("core-js/modules/esnext.set.is-superset-of.js");
34
+ require("core-js/modules/esnext.set.join.js");
35
+ require("core-js/modules/esnext.set.map.js");
36
+ require("core-js/modules/esnext.set.reduce.js");
37
+ require("core-js/modules/esnext.set.some.js");
38
+ require("core-js/modules/esnext.set.symmetric-difference.js");
39
+ require("core-js/modules/esnext.set.union.js");
40
+ var _readEntity = require("../queries/readEntity");
41
+ var _retrieveRecord = require("./retrieveRecord");
42
+ var _retrieveRecords = require("./retrieveRecords");
43
+ var _retrieveIndexes = require("./retrieveIndexes");
44
+ var _joinKey = require("./joinKey");
45
+ var _rowLookup = require("./rowLookup");
46
+ /**
47
+ * The rows of `entity` whose `property` equals that field of at least one of `others`, found through the field's index
48
+ * (reading only those rows' files), or undefined when the field has no single-field index.
49
+ * @param entity
50
+ * @param property
51
+ * @param type
52
+ * @param others
53
+ * @param otherProperty
54
+ */
55
+ const indexedRows = async (entity, property, type, others, otherProperty) => {
56
+ const index = (await (0, _retrieveIndexes.retrieveIndexes)(entity, [property], {}))[property];
57
+ if (!index) {
58
+ return undefined;
59
+ }
60
+ const wanted = new Set(others.map(row => (0, _joinKey.joinKey)(type, row[otherProperty])).filter(key => typeof key !== 'undefined'));
61
+ const files = new Set();
62
+ for (const entry of index) {
63
+ if (wanted.has((0, _joinKey.joinKey)(type, entry.value))) {
64
+ entry.record.forEach(file => files.add(file));
65
+ }
66
+ }
67
+ // In the record's own order, as a full read gives them
68
+ const record = await (0, _retrieveRecord.retrieveRecord)(entity);
69
+ return (0, _retrieveRecords.retrieveEntryRows)(record, record.entries.filter(entry => files.has(entry)));
70
+ };
71
+ /**
72
+ * The rows a join reads for each record in it, once for the whole join (every row's join then works from them):
73
+ * - the queried record: its rows (already read, or narrowed by the where clause)
74
+ * - the joined record when the where clause already narrowed it: those rows
75
+ * - a record joined by `=` to one already read, through an index on its field and with both fields of one type: only
76
+ * the rows whose value one of those rows has (the others can't match any row's join, and the order is the record's
77
+ * own, so the join's result is the same as from all of them)
78
+ * - any other: all its rows, kept on the query's data as before (merge reads them from there)
79
+ * @param entity
80
+ * @param joinEntity
81
+ * @param dataSets
82
+ * @param steps
83
+ * @param joinAlreadyResolved
84
+ */
85
+ const joinBases = async (entity, joinEntity, dataSets, steps, joinAlreadyResolved) => {
86
+ const bases = new Map();
87
+ const keep = (name, rows) => bases.set(name, {
88
+ rows,
89
+ lookups: new _rowLookup.RowLookups(rows)
90
+ });
91
+ keep(entity, dataSets[entity]);
92
+ if (joinAlreadyResolved) {
93
+ keep(joinEntity, dataSets[joinEntity]);
94
+ }
95
+ const allRows = async name => (await (0, _readEntity.readEntity)(name, dataSets))[name];
96
+ for (const step of steps) {
97
+ const sides = [{
98
+ name: step.entityA,
99
+ property: step.propertyA,
100
+ other: step.entityB,
101
+ otherProperty: step.propertyB
102
+ }, {
103
+ name: step.entityB,
104
+ property: step.propertyB,
105
+ other: step.entityA,
106
+ otherProperty: step.propertyA
107
+ }];
108
+ for (const {
109
+ name,
110
+ property,
111
+ other,
112
+ otherProperty
113
+ } of sides) {
114
+ if (bases.has(name)) {
115
+ continue;
116
+ }
117
+ // Fields of two types could disagree on which rows match (each side compares by its own), so only one type
118
+ const narrowable = step.comparator === '=' && step.typeA === step.typeB && (0, _joinKey.isKeyedType)(step.typeA) && bases.has(other);
119
+ const rows = narrowable ? await indexedRows(name, property, step.typeA, bases.get(other).rows, otherProperty) : undefined;
120
+ keep(name, rows ?? (await allRows(name)));
121
+ }
122
+ }
123
+ if (!bases.has(joinEntity)) {
124
+ keep(joinEntity, await allRows(joinEntity));
125
+ }
126
+ return bases;
127
+ };
128
+ exports.joinBases = joinBases;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinBases=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _readEntity=require("../queries/readEntity"),_retrieveRecord=require("./retrieveRecord"),_retrieveRecords=require("./retrieveRecords"),_retrieveIndexes=require("./retrieveIndexes"),_joinKey=require("./joinKey"),_rowLookup=require("./rowLookup");const indexedRows=async(e,r,s,o,t)=>{const i=(await(0,_retrieveIndexes.retrieveIndexes)(e,[r],{}))[r];if(!i)return;const n=new Set(o.map((e=>(0,_joinKey.joinKey)(s,e[t]))).filter((e=>void 0!==e))),u=new Set;for(const e of i)n.has((0,_joinKey.joinKey)(s,e.value))&&e.record.forEach((e=>u.add(e)));const j=await(0,_retrieveRecord.retrieveRecord)(e);return(0,_retrieveRecords.retrieveEntryRows)(j,j.entries.filter((e=>u.has(e))))},joinBases=async(e,r,s,o,t)=>{const i=new Map,n=(e,r)=>i.set(e,{rows:r,lookups:new _rowLookup.RowLookups(r)});n(e,s[e]),t&&n(r,s[r]);const u=async e=>(await(0,_readEntity.readEntity)(e,s))[e];for(const e of o){const r=[{name:e.entityA,property:e.propertyA,other:e.entityB,otherProperty:e.propertyB},{name:e.entityB,property:e.propertyB,other:e.entityA,otherProperty:e.propertyA}];for(const{name:s,property:o,other:t,otherProperty:j}of r){if(i.has(s))continue;n(s,("="===e.comparator&&e.typeA===e.typeB&&(0,_joinKey.isKeyedType)(e.typeA)&&i.has(t)?await indexedRows(s,o,e.typeA,i.get(t).rows,j):void 0)??await u(s))}}return i.has(r)||n(r,await u(r)),i};exports.joinBases=joinBases;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The key a value is looked up by when joining on `=` for a field of the given declared type: two values are equal for
3
+ * that field (sameValue) exactly when their keys are the same Map key. Undefined for a null or missing value, which
4
+ * equals nothing (as in where).
5
+ *
6
+ * Only for the types sameValue normalizes (see isKeyedType); any other type compares loosely (`==`), which no Map key
7
+ * can express, so those joins keep comparing row by row.
8
+ * @param type
9
+ * @param value
10
+ */
11
+ export declare const joinKey: (type: string | undefined, value: any) => any;
12
+ /**
13
+ * Whether `=` on a field of this declared type can be answered by joinKey lookups.
14
+ * @param type
15
+ */
16
+ export declare const isKeyedType: (type: string | undefined) => boolean;
17
+ //# sourceMappingURL=joinKey.d.ts.map
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.joinKey = exports.isKeyedType = void 0;
7
+ require("core-js/modules/es.array.includes.js");
8
+ var _compareAs = require("./compareAs");
9
+ /**
10
+ * The key a value is looked up by when joining on `=` for a field of the given declared type: two values are equal for
11
+ * that field (sameValue) exactly when their keys are the same Map key. Undefined for a null or missing value, which
12
+ * equals nothing (as in where).
13
+ *
14
+ * Only for the types sameValue normalizes (see isKeyedType); any other type compares loosely (`==`), which no Map key
15
+ * can express, so those joins keep comparing row by row.
16
+ * @param type
17
+ * @param value
18
+ */
19
+ const joinKey = (type, value) => {
20
+ if (value === null || typeof value === 'undefined') {
21
+ return undefined;
22
+ }
23
+ return (0, _compareAs.compareAs)(type, value);
24
+ };
25
+ /**
26
+ * Whether `=` on a field of this declared type can be answered by joinKey lookups.
27
+ * @param type
28
+ */
29
+ exports.joinKey = joinKey;
30
+ const isKeyedType = type => _compareAs.comparableTypes.includes(type);
31
+ exports.isKeyedType = isKeyedType;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinKey=exports.isKeyedType=void 0,require("core-js/modules/es.array.includes.js");var _compareAs=require("./compareAs");const joinKey=(e,s)=>{if(null!=s)return(0,_compareAs.compareAs)(e,s)};exports.joinKey=joinKey;const isKeyedType=e=>_compareAs.comparableTypes.includes(e);exports.isKeyedType=isKeyedType;
@@ -0,0 +1,16 @@
1
+ import { recordDefinition } from '../introspect/definitions/record';
2
+ import { keyDefinition } from '../introspect/definitions/key';
3
+ /**
4
+ * The entry files a key's index lists for the values `matches` accepts, in the record's own order (the order its rows
5
+ * are read in). A composite key's index holds its combined value (see computeKeyValue), so `matches` is given that.
6
+ *
7
+ * Undefined when the key has no index, or its file can't be read or parsed: the caller then looks through every row.
8
+ * The files are candidates: callers read each one and check its value, and look through the rows for any value the
9
+ * index didn't lead to, so an index that's out of step with the rows costs time, not a wrong result (for primary
10
+ * key values, which inserts and updates keep unique; see removeMatchingEntries for a hand-edited exception).
11
+ * @param record
12
+ * @param key
13
+ * @param matches
14
+ */
15
+ export declare const keyIndexFiles: (record: recordDefinition, key: keyDefinition, matches: (value: any) => boolean) => Promise<string[] | undefined>;
16
+ //# sourceMappingURL=keyIndexFiles.d.ts.map
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.keyIndexFiles = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.filter.js");
9
+ require("core-js/modules/esnext.iterator.for-each.js");
10
+ require("core-js/modules/esnext.set.add-all.js");
11
+ require("core-js/modules/esnext.set.delete-all.js");
12
+ require("core-js/modules/esnext.set.difference.js");
13
+ require("core-js/modules/esnext.set.every.js");
14
+ require("core-js/modules/esnext.set.filter.js");
15
+ require("core-js/modules/esnext.set.find.js");
16
+ require("core-js/modules/esnext.set.intersection.js");
17
+ require("core-js/modules/esnext.set.is-disjoint-from.js");
18
+ require("core-js/modules/esnext.set.is-subset-of.js");
19
+ require("core-js/modules/esnext.set.is-superset-of.js");
20
+ require("core-js/modules/esnext.set.join.js");
21
+ require("core-js/modules/esnext.set.map.js");
22
+ require("core-js/modules/esnext.set.reduce.js");
23
+ require("core-js/modules/esnext.set.some.js");
24
+ require("core-js/modules/esnext.set.symmetric-difference.js");
25
+ require("core-js/modules/esnext.set.union.js");
26
+ var _storage = require("../storage");
27
+ /**
28
+ * The entry files a key's index lists for the values `matches` accepts, in the record's own order (the order its rows
29
+ * are read in). A composite key's index holds its combined value (see computeKeyValue), so `matches` is given that.
30
+ *
31
+ * Undefined when the key has no index, or its file can't be read or parsed: the caller then looks through every row.
32
+ * The files are candidates: callers read each one and check its value, and look through the rows for any value the
33
+ * index didn't lead to, so an index that's out of step with the rows costs time, not a wrong result (for primary
34
+ * key values, which inserts and updates keep unique; see removeMatchingEntries for a hand-edited exception).
35
+ * @param record
36
+ * @param key
37
+ * @param matches
38
+ */
39
+ const keyIndexFiles = async (record, key, matches) => {
40
+ if (!key.lookup) {
41
+ return undefined;
42
+ }
43
+ if (!(record.entries || []).length) {
44
+ return [];
45
+ }
46
+ let index;
47
+ try {
48
+ index = await (0, _storage.readJson)(`__indexes/${record.path}/${key.lookup}`);
49
+ } catch (err) {
50
+ return undefined;
51
+ }
52
+ const files = new Set();
53
+ for (const entry of Array.isArray(index) ? index : []) {
54
+ if (Array.isArray(entry.record) && matches(entry.value)) {
55
+ entry.record.forEach(file => files.add(file));
56
+ }
57
+ }
58
+ return record.entries.filter(file => files.has(file));
59
+ };
60
+ exports.keyIndexFiles = keyIndexFiles;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyIndexFiles=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _storage=require("../storage");const keyIndexFiles=async(e,s,r)=>{if(!s.lookup)return;if(!(e.entries||[]).length)return[];let t;try{t=await(0,_storage.readJson)(`__indexes/${e.path}/${s.lookup}`)}catch(e){return}const o=new Set;for(const e of Array.isArray(t)?t:[])Array.isArray(e.record)&&r(e.value)&&e.record.forEach((e=>o.add(e)));return e.entries.filter((e=>o.has(e)))};exports.keyIndexFiles=keyIndexFiles;