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
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Rows grouped by their join key on one field (see joinKey), each group in the rows' order. Rows whose field is null or
3
+ * missing are left out: they equal nothing.
4
+ * @param rows
5
+ * @param property
6
+ * @param type - The declared type the field is compared by.
7
+ */
8
+ export declare const groupRows: (rows: any[], property: string, type: string | undefined) => Map<any, any[]>;
9
+ /**
10
+ * The position of the first row with each join key on one field (see groupRows).
11
+ * @param rows
12
+ * @param property
13
+ * @param type - The declared type the field is compared by.
14
+ */
15
+ export declare const firstPositions: (rows: any[], property: string, type: string | undefined) => Map<any, number>;
16
+ /**
17
+ * Lookups over one list of rows, built once and kept for as long as the list (a join's rows of a record), so a join
18
+ * builds each lookup once rather than once per row joined.
19
+ */
20
+ export declare class RowLookups {
21
+ readonly rows: any[];
22
+ private groups;
23
+ private positions;
24
+ constructor(rows: any[]);
25
+ /**
26
+ * See groupRows.
27
+ * @param property
28
+ * @param type
29
+ */
30
+ groupsBy(property: string, type: string | undefined): Map<any, any[]>;
31
+ /**
32
+ * See firstPositions.
33
+ * @param property
34
+ * @param type
35
+ */
36
+ positionsBy(property: string, type: string | undefined): Map<any, number>;
37
+ }
38
+ //# sourceMappingURL=rowLookup.d.ts.map
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.groupRows = exports.firstPositions = exports.RowLookups = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.for-each.js");
9
+ require("core-js/modules/esnext.map.delete-all.js");
10
+ require("core-js/modules/esnext.map.every.js");
11
+ require("core-js/modules/esnext.map.filter.js");
12
+ require("core-js/modules/esnext.map.find.js");
13
+ require("core-js/modules/esnext.map.find-key.js");
14
+ require("core-js/modules/esnext.map.includes.js");
15
+ require("core-js/modules/esnext.map.key-of.js");
16
+ require("core-js/modules/esnext.map.map-keys.js");
17
+ require("core-js/modules/esnext.map.map-values.js");
18
+ require("core-js/modules/esnext.map.merge.js");
19
+ require("core-js/modules/esnext.map.reduce.js");
20
+ require("core-js/modules/esnext.map.some.js");
21
+ require("core-js/modules/esnext.map.update.js");
22
+ var _joinKey = require("./joinKey");
23
+ /**
24
+ * Rows grouped by their join key on one field (see joinKey), each group in the rows' order. Rows whose field is null or
25
+ * missing are left out: they equal nothing.
26
+ * @param rows
27
+ * @param property
28
+ * @param type - The declared type the field is compared by.
29
+ */
30
+ const groupRows = (rows, property, type) => {
31
+ const groups = new Map();
32
+ for (const row of rows) {
33
+ const key = (0, _joinKey.joinKey)(type, row[property]);
34
+ if (typeof key === 'undefined') {
35
+ continue;
36
+ }
37
+ const group = groups.get(key);
38
+ if (group) {
39
+ group.push(row);
40
+ } else {
41
+ groups.set(key, [row]);
42
+ }
43
+ }
44
+ return groups;
45
+ };
46
+ /**
47
+ * The position of the first row with each join key on one field (see groupRows).
48
+ * @param rows
49
+ * @param property
50
+ * @param type - The declared type the field is compared by.
51
+ */
52
+ exports.groupRows = groupRows;
53
+ const firstPositions = (rows, property, type) => {
54
+ const positions = new Map();
55
+ rows.forEach((row, position) => {
56
+ const key = (0, _joinKey.joinKey)(type, row[property]);
57
+ if (typeof key !== 'undefined' && !positions.has(key)) {
58
+ positions.set(key, position);
59
+ }
60
+ });
61
+ return positions;
62
+ };
63
+ /**
64
+ * Lookups over one list of rows, built once and kept for as long as the list (a join's rows of a record), so a join
65
+ * builds each lookup once rather than once per row joined.
66
+ */
67
+ exports.firstPositions = firstPositions;
68
+ class RowLookups {
69
+ constructor(rows) {
70
+ this.rows = rows;
71
+ this.groups = new Map();
72
+ this.positions = new Map();
73
+ }
74
+ /**
75
+ * See groupRows.
76
+ * @param property
77
+ * @param type
78
+ */
79
+ groupsBy(property, type) {
80
+ const name = `${property}\u0000${type}`;
81
+ if (!this.groups.has(name)) {
82
+ this.groups.set(name, groupRows(this.rows, property, type));
83
+ }
84
+ return this.groups.get(name);
85
+ }
86
+ /**
87
+ * See firstPositions.
88
+ * @param property
89
+ * @param type
90
+ */
91
+ positionsBy(property, type) {
92
+ const name = `${property}\u0000${type}`;
93
+ if (!this.positions.has(name)) {
94
+ this.positions.set(name, firstPositions(this.rows, property, type));
95
+ }
96
+ return this.positions.get(name);
97
+ }
98
+ }
99
+ exports.RowLookups = RowLookups;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupRows=exports.firstPositions=exports.RowLookups=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.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");var _joinKey=require("./joinKey");const groupRows=(e,s,o)=>{const r=new Map;for(const t of e){const e=(0,_joinKey.joinKey)(o,t[s]);if(void 0===e)continue;const i=r.get(e);i?i.push(t):r.set(e,[t])}return r};exports.groupRows=groupRows;const firstPositions=(e,s,o)=>{const r=new Map;return e.forEach(((e,t)=>{const i=(0,_joinKey.joinKey)(o,e[s]);void 0===i||r.has(i)||r.set(i,t)})),r};exports.firstPositions=firstPositions;class RowLookups{constructor(e){this.rows=e,this.groups=new Map,this.positions=new Map}groupsBy(e,s){const o=`${e}\0${s}`;return this.groups.has(o)||this.groups.set(o,groupRows(this.rows,e,s)),this.groups.get(o)}positionsBy(e,s){const o=`${e}\0${s}`;return this.positions.has(o)||this.positions.set(o,firstPositions(this.rows,e,s)),this.positions.get(o)}}exports.RowLookups=RowLookups;
@@ -28,6 +28,8 @@ var _updateEntity = require("../queries/updateEntity");
28
28
  var _createRecord = require("../queries/createRecord");
29
29
  var _dropRecord = require("../queries/dropRecord");
30
30
  var _describeRecord = require("../queries/describeRecord");
31
+ var _alter = require("../introspect/alter");
32
+ var _databaseStatements = require("../queries/databaseStatements");
31
33
  var _showRecords = require("../queries/showRecords");
32
34
  var _joinEntity = require("../queries/joinEntity");
33
35
  var _mergeJoins = require("../queries/mergeJoins");
@@ -38,13 +40,13 @@ var _limitOffset = require("../queries/limitOffset");
38
40
  var _selectFields = require("../queries/selectFields");
39
41
  var _retrieveRecord = require("./retrieveRecord");
40
42
  var _getConditionIndexedList = require("./getConditionIndexedList");
41
- var _getJoinIndexedList = require("./getJoinIndexedList");
42
43
  var _isEntityProperty = require("./parsers/isEntityProperty");
43
44
  var _splitEntityProperty = require("./parsers/splitEntityProperty");
44
45
  var _fieldType = require("./fieldType");
45
46
  var _conditionTree = require("./conditionTree");
46
47
  var _conditionEntities = require("./conditionEntities");
47
48
  var _requireNode = require("./requireNode");
49
+ var _knownFields = require("./knownFields");
48
50
  /**
49
51
  * Give each condition and sort clause its field's declared type, so where and sortBy compare by it
50
52
  * (a joined entity's field is looked up on that entity's record).
@@ -71,7 +73,7 @@ const runQuery = async parsed => {
71
73
  // Checked before anything is read: which entity each condition is on, and whether it needs per-pair evaluation
72
74
  const perPair = typeof parsed.where !== 'undefined' && (0, _conditionEntities.conditionEntities)(parsed);
73
75
  // Writes and schema changes need the filesystem; say so plainly in a browser
74
- if (['insert', 'update', 'delete', 'create', 'drop'].includes(parsed.command)) {
76
+ if (['insert', 'update', 'delete', 'create', 'drop', 'alter'].includes(parsed.command)) {
75
77
  (0, _requireNode.requireNode)(`"${parsed.command}"`);
76
78
  }
77
79
  // Schema statements act on the database, not on entries (for create there is no record to read yet)
@@ -88,6 +90,26 @@ const runQuery = async parsed => {
88
90
  return {
89
91
  [parsed.entity]: await (0, _describeRecord.describeRecord)(parsed.entity)
90
92
  };
93
+ case 'alter':
94
+ return {
95
+ [parsed.entity]: await (0, _alter.alter)(parsed.entity, parsed.alter)
96
+ };
97
+ case 'create database':
98
+ return {
99
+ [parsed.entity]: await (0, _databaseStatements.createDatabase)(parsed.entity, parsed.ifNotExists)
100
+ };
101
+ case 'drop database':
102
+ return {
103
+ [parsed.entity]: await (0, _databaseStatements.dropDatabase)(parsed.entity, parsed.ifExists)
104
+ };
105
+ case 'use':
106
+ return {
107
+ [parsed.entity]: await (0, _databaseStatements.useDatabase)(parsed.entity)
108
+ };
109
+ case 'show databases':
110
+ return {
111
+ [parsed.entity]: await (0, _databaseStatements.showDatabases)()
112
+ };
91
113
  case 'show':
92
114
  return {
93
115
  [parsed.entity]: await (0, _showRecords.showRecords)()
@@ -99,6 +121,8 @@ const runQuery = async parsed => {
99
121
  if (typeof parsed.joinEntity !== 'undefined') {
100
122
  recordData[parsed.joinEntity] = await (0, _retrieveRecord.retrieveRecord)(parsed.joinEntity);
101
123
  }
124
+ // Every field the query names must be one its record defines: a misspelled one would otherwise match nothing
125
+ await (0, _knownFields.assertKnownFields)(parsed, recordData);
102
126
  await typeClauses(parsed, recordData);
103
127
  let dataSet = {
104
128
  [parsed.entity]: []
@@ -112,7 +136,7 @@ const runQuery = async parsed => {
112
136
  const resolved = new Set();
113
137
  parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet, resolved);
114
138
  const entityResolved = resolved.has(parsed.entity);
115
- parsed = await (0, _getJoinIndexedList.getJoinIndexedList)(parsed, recordData, dataSet);
139
+ // The join is joinEntity's (below), for rows an index narrowed too
116
140
  // delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
117
141
  // everything and lets the where-reduce below narrow it down afterward, they never get a second
118
142
  // pass. So every condition is applied to the candidates (all rows, or the ones the indexes picked)
@@ -154,7 +178,7 @@ const runQuery = async parsed => {
154
178
  dataSet[parsed.entity] = (0, _sortBy.sortBy)(dataSet[parsed.entity], parsed.sortClauses);
155
179
  dataSet[parsed.entity] = (0, _groupBy.groupBy)(dataSet[parsed.entity], parsed.groupBy);
156
180
  dataSet[parsed.entity] = (0, _limitOffset.limitOffset)(dataSet[parsed.entity], parsed.offset, parsed.limit);
157
- dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses, Boolean(parsed.groupBy?.length));
181
+ dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses, Boolean(parsed.groupBy?.length), parsed.entity);
158
182
  return dataSet;
159
183
  };
160
184
  exports.runQuery = runQuery;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/es.array.includes.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 _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_getJoinIndexedList=require("./getJoinIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities"),_requireNode=require("./requireNode");const typeClauses=async(e,t)=>{for(const r of[...(0,_conditionTree.conditionsOf)(e.where),...e.sortClauses]){let i=e.entity,s=r.property;(0,_isEntityProperty.isEntityProperty)(s)&&({entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(s)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],s)}},runQuery=async e=>{const t=void 0!==e.where&&(0,_conditionEntities.conditionEntities)(e);switch(["insert","update","delete","create","drop"].includes(e.command)&&(0,_requireNode.requireNode)(`"${e.command}"`),e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}const r={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(r[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeClauses(e,r);let i={[e.entity]:[]};const s=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,r,i,s);const n=s.has(e.entity);switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,r,i)).command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where)),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n,s.has(e.joinEntity)),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where,t?e.joinEntity:void 0)),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses,Boolean(e.groupBy?.length)),i};exports.runQuery=runQuery;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/es.array.includes.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 _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_alter=require("../introspect/alter"),_databaseStatements=require("../queries/databaseStatements"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities"),_requireNode=require("./requireNode"),_knownFields=require("./knownFields");const typeClauses=async(e,t)=>{for(const r of[...(0,_conditionTree.conditionsOf)(e.where),...e.sortClauses]){let i=e.entity,s=r.property;(0,_isEntityProperty.isEntityProperty)(s)&&({entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(s)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],s)}},runQuery=async e=>{const t=void 0!==e.where&&(0,_conditionEntities.conditionEntities)(e);switch(["insert","update","delete","create","drop","alter"].includes(e.command)&&(0,_requireNode.requireNode)(`"${e.command}"`),e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"alter":return{[e.entity]:await(0,_alter.alter)(e.entity,e.alter)};case"create database":return{[e.entity]:await(0,_databaseStatements.createDatabase)(e.entity,e.ifNotExists)};case"drop database":return{[e.entity]:await(0,_databaseStatements.dropDatabase)(e.entity,e.ifExists)};case"use":return{[e.entity]:await(0,_databaseStatements.useDatabase)(e.entity)};case"show databases":return{[e.entity]:await(0,_databaseStatements.showDatabases)()};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}const r={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(r[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await(0,_knownFields.assertKnownFields)(e,r),await typeClauses(e,r);let i={[e.entity]:[]};const s=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,r,i,s);const n=s.has(e.entity);switch("delete"!==e.command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where)),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n,s.has(e.joinEntity)),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where,t?e.joinEntity:void 0)),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses,Boolean(e.groupBy?.length),e.entity),i};exports.runQuery=runQuery;
@@ -0,0 +1,27 @@
1
+ import { RowLookups } from './rowLookup';
2
+ /**
3
+ * Rows of one record in a join: either all the rows the join read for it (with their lookups, built once and reused
4
+ * for every row joined) or a narrower list for one row's join.
5
+ */
6
+ export type JoinSide = {
7
+ rows: any[];
8
+ lookups?: RowLookups;
9
+ };
10
+ /**
11
+ * One step of a join, `target.targetProperty <comparator> source.sourceProperty`: the target rows that match at least
12
+ * one source row, compared by `type` (the target field's declared type).
13
+ *
14
+ * The order is the one the join has always produced: through the source rows in order, each adding the target rows it
15
+ * matches (in their order) that aren't in yet. For `=` on a keyed type (see isKeyedType) that's computed from lookups
16
+ * instead of comparing every pair: by going through the source rows and taking each key's group of target rows once,
17
+ * or, when the source is all of its record's rows and the target is smaller, by placing each target row at its key's
18
+ * first source row. Other comparators, and types compared loosely, compare row by row as before.
19
+ * @param target
20
+ * @param source
21
+ * @param targetProperty
22
+ * @param sourceProperty
23
+ * @param comparator
24
+ * @param type
25
+ */
26
+ export declare const semiJoin: (target: JoinSide, source: JoinSide, targetProperty: string, sourceProperty: string, comparator: string, type: string | undefined) => any[];
27
+ //# sourceMappingURL=semiJoin.d.ts.map
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.semiJoin = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.for-each.js");
9
+ require("core-js/modules/esnext.iterator.map.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 _where = require("../queries/where");
27
+ var _joinKey = require("./joinKey");
28
+ var _rowLookup = require("./rowLookup");
29
+ /**
30
+ * One step of a join, `target.targetProperty <comparator> source.sourceProperty`: the target rows that match at least
31
+ * one source row, compared by `type` (the target field's declared type).
32
+ *
33
+ * The order is the one the join has always produced: through the source rows in order, each adding the target rows it
34
+ * matches (in their order) that aren't in yet. For `=` on a keyed type (see isKeyedType) that's computed from lookups
35
+ * instead of comparing every pair: by going through the source rows and taking each key's group of target rows once,
36
+ * or, when the source is all of its record's rows and the target is smaller, by placing each target row at its key's
37
+ * first source row. Other comparators, and types compared loosely, compare row by row as before.
38
+ * @param target
39
+ * @param source
40
+ * @param targetProperty
41
+ * @param sourceProperty
42
+ * @param comparator
43
+ * @param type
44
+ */
45
+ const semiJoin = (target, source, targetProperty, sourceProperty, comparator, type) => {
46
+ if (comparator === '=' && (0, _joinKey.isKeyedType)(type)) {
47
+ if (source.lookups && target.rows.length < source.rows.length) {
48
+ const positions = source.lookups.positionsBy(sourceProperty, type);
49
+ const placed = [];
50
+ target.rows.forEach((row, index) => {
51
+ const position = positions.get((0, _joinKey.joinKey)(type, row[targetProperty]));
52
+ if (typeof position !== 'undefined') {
53
+ placed.push({
54
+ row,
55
+ position,
56
+ index
57
+ });
58
+ }
59
+ });
60
+ return placed.sort((a, b) => a.position - b.position || a.index - b.index).map(({
61
+ row
62
+ }) => row);
63
+ }
64
+ const groups = target.lookups ? target.lookups.groupsBy(targetProperty, type) : (0, _rowLookup.groupRows)(target.rows, targetProperty, type);
65
+ const matched = [];
66
+ const taken = new Set();
67
+ for (const row of source.rows) {
68
+ const key = (0, _joinKey.joinKey)(type, row[sourceProperty]);
69
+ if (typeof key === 'undefined' || taken.has(key)) {
70
+ continue;
71
+ }
72
+ taken.add(key);
73
+ const group = groups.get(key);
74
+ if (group) {
75
+ matched.push(...group);
76
+ }
77
+ }
78
+ return matched;
79
+ }
80
+ const matched = [];
81
+ const kept = new Set();
82
+ for (const row of source.rows) {
83
+ for (const match of (0, _where.where)(target.rows, {
84
+ property: targetProperty,
85
+ comparator,
86
+ value: row[sourceProperty],
87
+ type
88
+ })) {
89
+ if (!kept.has(match)) {
90
+ kept.add(match);
91
+ matched.push(match);
92
+ }
93
+ }
94
+ }
95
+ return matched;
96
+ };
97
+ exports.semiJoin = semiJoin;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.semiJoin=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.map.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 _where=require("../queries/where"),_joinKey=require("./joinKey"),_rowLookup=require("./rowLookup");const semiJoin=(e,s,o,r,t,i)=>{if("="===t&&(0,_joinKey.isKeyedType)(i)){if(s.lookups&&e.rows.length<s.rows.length){const t=s.lookups.positionsBy(r,i),n=[];return e.rows.forEach(((e,s)=>{const r=t.get((0,_joinKey.joinKey)(i,e[o]));void 0!==r&&n.push({row:e,position:r,index:s})})),n.sort(((e,s)=>e.position-s.position||e.index-s.index)).map((({row:e})=>e))}const t=e.lookups?e.lookups.groupsBy(o,i):(0,_rowLookup.groupRows)(e.rows,o,i),n=[],u=new Set;for(const e of s.rows){const s=(0,_joinKey.joinKey)(i,e[r]);if(void 0===s||u.has(s))continue;u.add(s);const o=t.get(s);o&&n.push(...o)}return n}const n=[],u=new Set;for(const j of s.rows)for(const s of(0,_where.where)(e.rows,{property:o,comparator:t,value:j[r],type:i}))u.has(s)||(u.add(s),n.push(s));return n};exports.semiJoin=semiJoin;
@@ -5,16 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.updateIndex = void 0;
7
7
  require("core-js/modules/es.array.includes.js");
8
- require("core-js/modules/es.json.stringify.js");
9
8
  require("core-js/modules/esnext.iterator.constructor.js");
10
9
  require("core-js/modules/esnext.iterator.find.js");
11
- var _config = require("./config");
12
10
  var _compareAs = require("./compareAs");
13
- const {
14
- readFile,
15
- writeFile,
16
- mkdir
17
- } = require('fs/promises');
11
+ var _storage = require("../storage");
18
12
  /**
19
13
  * Add a single entry file to the index that backs one of a record's keys, creating the index
20
14
  * file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
@@ -29,12 +23,11 @@ const updateIndex = async (path = '', key = null, value = undefined, fileName =
29
23
  if (!key || !key.lookup) {
30
24
  return null;
31
25
  }
32
- const databasePath = (0, _config.getSetting)('databasePath', 'database/');
33
- const indexDir = `${databasePath}__indexes/${path}`;
26
+ const indexDir = `__indexes/${path}`;
34
27
  const indexPath = `${indexDir}/${key.lookup}`;
35
28
  let index = [];
36
29
  try {
37
- index = JSON.parse(await readFile(indexPath, 'utf8'));
30
+ index = await (0, _storage.readJson)(indexPath);
38
31
  } catch (err) {
39
32
  index = [];
40
33
  }
@@ -49,10 +42,8 @@ const updateIndex = async (path = '', key = null, value = undefined, fileName =
49
42
  record: [fileName]
50
43
  });
51
44
  }
52
- await mkdir(indexDir, {
53
- recursive: true
54
- });
55
- await writeFile(indexPath, JSON.stringify(index, null, 2));
45
+ await (0, _storage.makeDirectory)(indexDir);
46
+ await (0, _storage.writeJson)(indexPath, index);
56
47
  return index;
57
48
  };
58
49
  exports.updateIndex = updateIndex;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js");var _config=require("./config"),_compareAs=require("./compareAs");const{readFile:readFile,writeFile:writeFile,mkdir:mkdir}=require("fs/promises"),updateIndex=async(e="",r=null,s=void 0,i="",t=void 0)=>{if(!r||!r.lookup)return null;const o=`${(0,_config.getSetting)("databasePath","database/")}__indexes/${e}`,a=`${o}/${r.lookup}`;let u=[];try{u=JSON.parse(await readFile(a,"utf8"))}catch(e){u=[]}const d=u.find((e=>(0,_compareAs.sameValue)(t,e.value,s)));return d?d.record.includes(i)||d.record.push(i):u.push({value:s,record:[i]}),await mkdir(o,{recursive:!0}),await writeFile(a,JSON.stringify(u,null,2)),u};exports.updateIndex=updateIndex;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=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");var _compareAs=require("./compareAs"),_storage=require("../storage");const updateIndex=async(e="",r=null,o=void 0,s="",t=void 0)=>{if(!r||!r.lookup)return null;const a=`__indexes/${e}`,u=`${a}/${r.lookup}`;let d=[];try{d=await(0,_storage.readJson)(u)}catch(e){d=[]}const i=d.find((e=>(0,_compareAs.sameValue)(t,e.value,o)));return i?i.record.includes(s)||i.record.push(s):d.push({value:o,record:[s]}),await(0,_storage.makeDirectory)(a),await(0,_storage.writeJson)(u,d),d};exports.updateIndex=updateIndex;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { query } from './data/queries/query';
2
2
  export { quote } from './data/queries/quote';
3
3
  export { queryStatus, QueryStatus } from './data/queries/queryStatus';
4
- export { create, drop, describe } from './data/introspect';
4
+ export { create, drop, alter, describe, formatDatabase, packDatabase, checkPacked } from './data/introspect';
5
5
  export { configure } from './data/utilities/config';
6
6
  export { fieldProperties, fieldDefinition, fieldName, keyProperties, keyDefinition, indexType, indexLocation, referenceProperties, reference, recordProperties, recordDefinition, recordPath, entityPath } from './data/introspect';
7
7
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -7,6 +7,18 @@ require("core-js/modules/esnext.iterator.drop.js");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
+ Object.defineProperty(exports, "alter", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _introspect.alter;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "checkPacked", {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _introspect.checkPacked;
20
+ }
21
+ });
10
22
  Object.defineProperty(exports, "configure", {
11
23
  enumerable: true,
12
24
  get: function () {
@@ -31,6 +43,18 @@ Object.defineProperty(exports, "drop", {
31
43
  return _introspect.drop;
32
44
  }
33
45
  });
46
+ Object.defineProperty(exports, "formatDatabase", {
47
+ enumerable: true,
48
+ get: function () {
49
+ return _introspect.formatDatabase;
50
+ }
51
+ });
52
+ Object.defineProperty(exports, "packDatabase", {
53
+ enumerable: true,
54
+ get: function () {
55
+ return _introspect.packDatabase;
56
+ }
57
+ });
34
58
  Object.defineProperty(exports, "query", {
35
59
  enumerable: true,
36
60
  get: function () {
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"configure",{enumerable:!0,get:function(){return _config.configure}}),Object.defineProperty(exports,"create",{enumerable:!0,get:function(){return _introspect.create}}),Object.defineProperty(exports,"describe",{enumerable:!0,get:function(){return _introspect.describe}}),Object.defineProperty(exports,"drop",{enumerable:!0,get:function(){return _introspect.drop}}),Object.defineProperty(exports,"query",{enumerable:!0,get:function(){return _query.query}}),Object.defineProperty(exports,"queryStatus",{enumerable:!0,get:function(){return _queryStatus.queryStatus}}),Object.defineProperty(exports,"quote",{enumerable:!0,get:function(){return _quote.quote}});var _query=require("./data/queries/query"),_quote=require("./data/queries/quote"),_queryStatus=require("./data/queries/queryStatus"),_introspect=require("./data/introspect"),_config=require("./data/utilities/config");
1
+ "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"alter",{enumerable:!0,get:function(){return _introspect.alter}}),Object.defineProperty(exports,"checkPacked",{enumerable:!0,get:function(){return _introspect.checkPacked}}),Object.defineProperty(exports,"configure",{enumerable:!0,get:function(){return _config.configure}}),Object.defineProperty(exports,"create",{enumerable:!0,get:function(){return _introspect.create}}),Object.defineProperty(exports,"describe",{enumerable:!0,get:function(){return _introspect.describe}}),Object.defineProperty(exports,"drop",{enumerable:!0,get:function(){return _introspect.drop}}),Object.defineProperty(exports,"formatDatabase",{enumerable:!0,get:function(){return _introspect.formatDatabase}}),Object.defineProperty(exports,"packDatabase",{enumerable:!0,get:function(){return _introspect.packDatabase}}),Object.defineProperty(exports,"query",{enumerable:!0,get:function(){return _query.query}}),Object.defineProperty(exports,"queryStatus",{enumerable:!0,get:function(){return _queryStatus.queryStatus}}),Object.defineProperty(exports,"quote",{enumerable:!0,get:function(){return _quote.quote}});var _query=require("./data/queries/query"),_quote=require("./data/queries/quote"),_queryStatus=require("./data/queries/queryStatus"),_introspect=require("./data/introspect"),_config=require("./data/utilities/config");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "3.1.4",
4
- "description": "Use json files to manage and read data.",
3
+ "version": "3.3.0",
4
+ "description": "A git-native JSON data store for static sites: JSON files with a schema, enforced keys and a SQL-like query language, read straight from static hosting.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "unpkg": "browser/jsonFsQuery.min.js",
@@ -24,7 +24,8 @@
24
24
  "watch": "gulp watchFull",
25
25
  "watch:test": "gulp watchTest",
26
26
  "lint": "gulp lint",
27
- "prepublishOnly": "npm run build"
27
+ "prepublishOnly": "npm run build",
28
+ "benchmark": "node scripts/benchmark.cjs"
28
29
  },
29
30
  "repository": {
30
31
  "type": "git",
@@ -34,7 +35,11 @@
34
35
  "database",
35
36
  "filesystem",
36
37
  "json",
37
- "data"
38
+ "data",
39
+ "static-site",
40
+ "git",
41
+ "query",
42
+ "sql"
38
43
  ],
39
44
  "author": "Joshua Heagle <joshuaheagle@gmail.com>",
40
45
  "license": "GPL-3.0-or-later",
@@ -46,6 +51,7 @@
46
51
  "@babel/core": "^8.1.0",
47
52
  "gulp": "^5.0.1",
48
53
  "js-build-tools": "^8.0.0",
54
+ "playwright": "~1.64.1",
49
55
  "release-it": "^21.1.1",
50
56
  "test-filesystem": "^2.0.2",
51
57
  "typedoc": "^0.28.20"
@@ -1,3 +0,0 @@
1
- import { ParsedQuery } from './parsers/parseQuery';
2
- export declare const getJoinIndexedList: (parsed: ParsedQuery, recordData: any, dataSets: any) => Promise<ParsedQuery>;
3
- //# sourceMappingURL=getJoinIndexedList.d.ts.map
@@ -1,76 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getJoinIndexedList = void 0;
7
- var _siFunciona = _interopRequireDefault(require("si-funciona"));
8
- var _splitEntityProperty = require("./parsers/splitEntityProperty");
9
- var _retrieveRecord = require("./retrieveRecord");
10
- var _getMatchingIndexes = require("./getMatchingIndexes");
11
- var _matchIndexedJoins = require("./matchIndexedJoins");
12
- var _restrictIndexedList = require("./restrictIndexedList");
13
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- const getJoinIndexedList = async (parsed, recordData, dataSets) => {
15
- const reducedJoins = [];
16
- const indexed = {};
17
- let firstIteration = true;
18
- const entity = parsed.entity;
19
- const joinEntity = parsed.joinEntity;
20
- const joinClauses = parsed.joinClauses;
21
- if (!dataSets[entity].length) {
22
- // Nothing indexed entity's own rows yet (no WHERE condition narrowed them down ahead of this -
23
- // that only happens via getConditionIndexedList, called just before this). The loop below can't
24
- // pre-resolve anything against zero rows, so leave parsed.joinClauses exactly as parsed: the
25
- // later, unconditional joinEntity() call (once this command's own read actually runs) still
26
- // needs the real clauses to do the join itself. Previously this fell through to the loop,
27
- // which never ran, leaving reducedJoins (and so parsed.joinClauses) empty regardless of what
28
- // was actually parsed - silently discarding every join clause whenever the query had no WHERE.
29
- return parsed;
30
- }
31
- if (!joinClauses.length) {
32
- // A WHERE condition DID index entity's own rows above, but this query has no join at all -
33
- // joinEntity is undefined. The loop below writes dataSets[entity][anEntity][joinEntity]
34
- // unconditionally; left unguarded, that assigns a literal "undefined" key (object[undefined]
35
- // coerces to the string "undefined") onto every row, since there's no join to actually attach.
36
- return parsed;
37
- }
38
- for (const anEntity in dataSets[entity]) {
39
- const currentEntity = dataSets[entity][anEntity];
40
- // Loop over each of the main entities
41
- const filterJoins = {};
42
- filterJoins[entity] = [_siFunciona.default.cloneObject(currentEntity)];
43
- for (const joinClause of joinClauses) {
44
- let indexedClone = _siFunciona.default.cloneObject(indexed);
45
- const {
46
- entity: entityA,
47
- property: propertyA
48
- } = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyA);
49
- const {
50
- entity: entityB,
51
- property: propertyB
52
- } = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyB);
53
- // Get the record for the entities A and B, store on the recordData
54
- if (!Object.prototype.hasOwnProperty.call(recordData, entityA)) {
55
- recordData[entityA] = await (0, _retrieveRecord.retrieveRecord)(entityA);
56
- }
57
- if (!Object.prototype.hasOwnProperty.call(recordData, entityB)) {
58
- recordData[entityB] = await (0, _retrieveRecord.retrieveRecord)(entityB);
59
- }
60
- indexedClone = (0, _restrictIndexedList.restrictIndexedList)(joinClause, filterJoins, indexedClone);
61
- const retrieveMatchedFiles = (0, _matchIndexedJoins.matchIndexedJoins)(entity, indexedClone, dataSets);
62
- // Check if there are matching keys for the join condition
63
- const matchAResult = await (0, _getMatchingIndexes.getMatchingIndexes)(entityA, propertyA, recordData, joinClause, filterJoins, indexed);
64
- const matchBResult = await (0, _getMatchingIndexes.getMatchingIndexes)(entityB, propertyB, recordData, joinClause, filterJoins, indexed, retrieveMatchedFiles);
65
- const isIndexed = matchAResult || matchBResult;
66
- if (!isIndexed && firstIteration) {
67
- reducedJoins.push(joinClause);
68
- firstIteration = false;
69
- }
70
- }
71
- dataSets[entity][anEntity][joinEntity] = filterJoins[joinEntity];
72
- }
73
- parsed.joinClauses = reducedJoins;
74
- return parsed;
75
- };
76
- exports.getJoinIndexedList = getJoinIndexedList;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getJoinIndexedList=void 0;var _siFunciona=_interopRequireDefault(require("si-funciona")),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_getMatchingIndexes=require("./getMatchingIndexes"),_matchIndexedJoins=require("./matchIndexedJoins"),_restrictIndexedList=require("./restrictIndexedList");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const getJoinIndexedList=async(e,t,r)=>{const i=[],n={};let o=!0;const s=e.entity,c=e.joinEntity,d=e.joinClauses;if(!r[s].length)return e;if(!d.length)return e;for(const e in r[s]){const a=r[s][e],p={};p[s]=[_siFunciona.default.cloneObject(a)];for(const e of d){let c=_siFunciona.default.cloneObject(n);const{entity:d,property:a}=(0,_splitEntityProperty.splitEntityProperty)(e.propertyA),{entity:u,property:l}=(0,_splitEntityProperty.splitEntityProperty)(e.propertyB);Object.prototype.hasOwnProperty.call(t,d)||(t[d]=await(0,_retrieveRecord.retrieveRecord)(d)),Object.prototype.hasOwnProperty.call(t,u)||(t[u]=await(0,_retrieveRecord.retrieveRecord)(u)),c=(0,_restrictIndexedList.restrictIndexedList)(e,p,c);const y=(0,_matchIndexedJoins.matchIndexedJoins)(s,c,r),_=await(0,_getMatchingIndexes.getMatchingIndexes)(d,a,t,e,p,n),x=await(0,_getMatchingIndexes.getMatchingIndexes)(u,l,t,e,p,n,y);!(_||x)&&o&&(i.push(e),o=!1)}r[s][e][c]=p[c]}return e.joinClauses=i,e};exports.getJoinIndexedList=getJoinIndexedList;
@@ -1,2 +0,0 @@
1
- export declare const getMatchingIndexes: (entity: string, property: string, recordData: Object, clause: Object, dataSet: Object, indexed: Object, cb?: Function) => Promise<boolean>;
2
- //# sourceMappingURL=getMatchingIndexes.d.ts.map