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.
- package/README.md +257 -15
- package/browser/jsonFsQuery.js +3884 -5057
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/alter.d.ts +12 -0
- package/dist/data/introspect/alter.js +304 -0
- package/dist/data/introspect/alter.min.js +1 -0
- package/dist/data/introspect/create.d.ts +10 -0
- package/dist/data/introspect/create.js +9 -23
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/drop.js +7 -15
- package/dist/data/introspect/drop.min.js +1 -1
- package/dist/data/introspect/formatDatabase.d.ts +17 -0
- package/dist/data/introspect/formatDatabase.js +56 -0
- package/dist/data/introspect/formatDatabase.min.js +1 -0
- package/dist/data/introspect/index.d.ts +9 -0
- package/dist/data/introspect/index.js +18 -5
- package/dist/data/introspect/index.min.js +1 -1
- package/dist/data/introspect/packDatabase.d.ts +27 -0
- package/dist/data/introspect/packDatabase.js +113 -0
- package/dist/data/introspect/packDatabase.min.js +1 -0
- package/dist/data/introspect/policies/foreignKeyExists.d.ts +2 -0
- package/dist/data/introspect/policies/foreignKeyExists.js +9 -3
- package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
- package/dist/data/introspect/policies/hasDependents.d.ts +3 -3
- package/dist/data/introspect/policies/hasDependents.js +11 -3
- package/dist/data/introspect/policies/hasDependents.min.js +1 -1
- package/dist/data/introspect/policies/keyUnique.d.ts +3 -0
- package/dist/data/introspect/policies/keyUnique.js +10 -0
- package/dist/data/introspect/policies/keyUnique.min.js +1 -1
- package/dist/data/queries/databaseStatements.d.ts +31 -0
- package/dist/data/queries/databaseStatements.js +97 -0
- package/dist/data/queries/databaseStatements.min.js +1 -0
- package/dist/data/queries/deleteEntity.js +35 -19
- package/dist/data/queries/deleteEntity.min.js +1 -1
- package/dist/data/queries/insertEntity.d.ts +8 -0
- package/dist/data/queries/insertEntity.js +340 -43
- package/dist/data/queries/insertEntity.min.js +1 -1
- package/dist/data/queries/joinEntity.d.ts +15 -0
- package/dist/data/queries/joinEntity.js +91 -15
- package/dist/data/queries/joinEntity.min.js +1 -1
- package/dist/data/queries/query.d.ts +2 -1
- package/dist/data/queries/query.js +5 -2
- package/dist/data/queries/query.min.js +1 -1
- package/dist/data/queries/selectFields.d.ts +5 -4
- package/dist/data/queries/selectFields.js +25 -11
- package/dist/data/queries/selectFields.min.js +1 -1
- package/dist/data/queries/updateEntity.js +54 -15
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/storage/databases.d.ts +32 -0
- package/dist/data/storage/databases.js +93 -0
- package/dist/data/storage/databases.min.js +1 -0
- package/dist/data/storage/fileExists.d.ts +7 -0
- package/dist/data/storage/fileExists.js +25 -0
- package/dist/data/storage/fileExists.min.js +1 -0
- package/dist/data/storage/index.d.ts +19 -0
- package/dist/data/storage/index.js +124 -0
- package/dist/data/storage/index.min.js +1 -0
- package/dist/data/storage/listFiles.d.ts +8 -0
- package/dist/data/storage/listFiles.js +52 -0
- package/dist/data/storage/listFiles.min.js +1 -0
- package/dist/data/storage/makeDirectory.d.ts +7 -0
- package/dist/data/storage/makeDirectory.js +24 -0
- package/dist/data/storage/makeDirectory.min.js +1 -0
- package/dist/data/storage/nodeFiles.d.ts +6 -0
- package/dist/data/storage/nodeFiles.js +12 -0
- package/dist/data/storage/nodeFiles.min.js +1 -0
- package/dist/data/storage/readCache.d.ts +37 -0
- package/dist/data/storage/readCache.js +117 -0
- package/dist/data/storage/readCache.min.js +1 -0
- package/dist/data/storage/readJson.d.ts +16 -0
- package/dist/data/storage/readJson.js +38 -0
- package/dist/data/storage/readJson.min.js +1 -0
- package/dist/data/storage/removeDirectory.d.ts +8 -0
- package/dist/data/storage/removeDirectory.js +30 -0
- package/dist/data/storage/removeDirectory.min.js +1 -0
- package/dist/data/storage/removeFile.d.ts +8 -0
- package/dist/data/storage/removeFile.js +31 -0
- package/dist/data/storage/removeFile.min.js +1 -0
- package/dist/data/storage/storagePath.d.ts +11 -0
- package/dist/data/storage/storagePath.js +25 -0
- package/dist/data/storage/storagePath.min.js +1 -0
- package/dist/data/storage/writeJson.d.ts +17 -0
- package/dist/data/storage/writeJson.js +37 -0
- package/dist/data/storage/writeJson.min.js +1 -0
- package/dist/data/storage/writeSet.d.ts +64 -0
- package/dist/data/storage/writeSet.js +306 -0
- package/dist/data/storage/writeSet.min.js +1 -0
- package/dist/data/utilities/compareAs.d.ts +1 -0
- package/dist/data/utilities/compareAs.js +2 -2
- package/dist/data/utilities/compareAs.min.js +1 -1
- package/dist/data/utilities/config.d.ts +37 -0
- package/dist/data/utilities/config.js +77 -5
- package/dist/data/utilities/config.min.js +1 -1
- package/dist/data/utilities/databaseLock.d.ts +7 -0
- package/dist/data/utilities/databaseLock.js +19 -4
- package/dist/data/utilities/databaseLock.min.js +1 -1
- package/dist/data/utilities/deregisterRecord.js +4 -10
- package/dist/data/utilities/deregisterRecord.min.js +1 -1
- package/dist/data/utilities/getConditionIndexedList.js +3 -4
- package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
- package/dist/data/utilities/indexBuffer.d.ts +35 -0
- package/dist/data/utilities/indexBuffer.js +139 -0
- package/dist/data/utilities/indexBuffer.min.js +1 -0
- package/dist/data/utilities/indexHas.d.ts +13 -0
- package/dist/data/utilities/indexHas.js +48 -0
- package/dist/data/utilities/indexHas.min.js +1 -0
- package/dist/data/utilities/joinBases.d.ts +29 -0
- package/dist/data/utilities/joinBases.js +128 -0
- package/dist/data/utilities/joinBases.min.js +1 -0
- package/dist/data/utilities/joinKey.d.ts +17 -0
- package/dist/data/utilities/joinKey.js +31 -0
- package/dist/data/utilities/joinKey.min.js +1 -0
- package/dist/data/utilities/keyIndexFiles.d.ts +16 -0
- package/dist/data/utilities/keyIndexFiles.js +60 -0
- package/dist/data/utilities/keyIndexFiles.min.js +1 -0
- package/dist/data/utilities/knownFields.d.ts +26 -0
- package/dist/data/utilities/knownFields.js +128 -0
- package/dist/data/utilities/knownFields.min.js +1 -0
- package/dist/data/utilities/packedTable.d.ts +34 -0
- package/dist/data/utilities/packedTable.js +60 -0
- package/dist/data/utilities/packedTable.min.js +1 -0
- package/dist/data/utilities/parsers/findInsertValues.d.ts +3 -3
- package/dist/data/utilities/parsers/findInsertValues.js +28 -12
- package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
- package/dist/data/utilities/parsers/maskStrings.js +11 -2
- package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
- package/dist/data/utilities/parsers/parseAlter.d.ts +33 -0
- package/dist/data/utilities/parsers/parseAlter.js +84 -0
- package/dist/data/utilities/parsers/parseAlter.min.js +1 -0
- package/dist/data/utilities/parsers/parseCreate.d.ts +14 -0
- package/dist/data/utilities/parsers/parseCreate.js +13 -5
- package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
- package/dist/data/utilities/parsers/parseDatabaseStatement.d.ts +17 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.js +82 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.min.js +1 -0
- package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
- package/dist/data/utilities/parsers/parseQuery.js +24 -0
- package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.min.js +1 -1
- package/dist/data/utilities/recordExists.js +2 -7
- package/dist/data/utilities/recordExists.min.js +1 -1
- package/dist/data/utilities/registerRecord.js +4 -10
- package/dist/data/utilities/registerRecord.min.js +1 -1
- package/dist/data/utilities/removeFromIndex.js +4 -10
- package/dist/data/utilities/removeFromIndex.min.js +1 -1
- package/dist/data/utilities/retrieveFile.d.ts +5 -0
- package/dist/data/utilities/retrieveFile.js +7 -16
- package/dist/data/utilities/retrieveFile.min.js +1 -1
- package/dist/data/utilities/retrieveFiles.d.ts +15 -0
- package/dist/data/utilities/retrieveFiles.js +48 -0
- package/dist/data/utilities/retrieveFiles.min.js +1 -0
- package/dist/data/utilities/retrieveRecord.d.ts +6 -0
- package/dist/data/utilities/retrieveRecord.js +24 -1
- package/dist/data/utilities/retrieveRecord.min.js +1 -1
- package/dist/data/utilities/retrieveRecords.d.ts +22 -0
- package/dist/data/utilities/retrieveRecords.js +60 -10
- package/dist/data/utilities/retrieveRecords.min.js +1 -1
- package/dist/data/utilities/rowLookup.d.ts +38 -0
- package/dist/data/utilities/rowLookup.js +99 -0
- package/dist/data/utilities/rowLookup.min.js +1 -0
- package/dist/data/utilities/runQuery.js +28 -4
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/data/utilities/semiJoin.d.ts +27 -0
- package/dist/data/utilities/semiJoin.js +97 -0
- package/dist/data/utilities/semiJoin.min.js +1 -0
- package/dist/data/utilities/updateIndex.js +5 -14
- package/dist/data/utilities/updateIndex.min.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +24 -0
- package/dist/index.min.js +1 -1
- package/package.json +10 -4
- package/dist/data/utilities/getJoinIndexedList.d.ts +0 -3
- package/dist/data/utilities/getJoinIndexedList.js +0 -76
- package/dist/data/utilities/getJoinIndexedList.min.js +0 -1
- package/dist/data/utilities/getMatchingIndexes.d.ts +0 -2
- package/dist/data/utilities/getMatchingIndexes.js +0 -28
- package/dist/data/utilities/getMatchingIndexes.min.js +0 -1
- package/dist/data/utilities/matchIndexedJoins.d.ts +0 -2
- package/dist/data/utilities/matchIndexedJoins.js +0 -63
- package/dist/data/utilities/matchIndexedJoins.min.js +0 -1
- package/dist/data/utilities/restrictIndexedList.d.ts +0 -2
- package/dist/data/utilities/restrictIndexedList.js +0 -45
- package/dist/data/utilities/restrictIndexedList.min.js +0 -1
- package/dist/data/utilities/useJoinClause.d.ts +0 -6
- package/dist/data/utilities/useJoinClause.js +0 -57
- 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
|
-
|
|
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"),
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
53
|
-
|
|
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/
|
|
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.
|
|
4
|
-
"description": "
|
|
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,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;
|