json-fs-query 3.1.4 → 3.2.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 (109) hide show
  1. package/browser/jsonFsQuery.js +2172 -5305
  2. package/browser/jsonFsQuery.min.js +1 -1
  3. package/dist/data/introspect/create.js +7 -22
  4. package/dist/data/introspect/create.min.js +1 -1
  5. package/dist/data/introspect/drop.js +5 -15
  6. package/dist/data/introspect/drop.min.js +1 -1
  7. package/dist/data/introspect/policies/foreignKeyExists.d.ts +2 -0
  8. package/dist/data/introspect/policies/foreignKeyExists.js +9 -3
  9. package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
  10. package/dist/data/introspect/policies/hasDependents.d.ts +3 -3
  11. package/dist/data/introspect/policies/hasDependents.js +11 -3
  12. package/dist/data/introspect/policies/hasDependents.min.js +1 -1
  13. package/dist/data/introspect/policies/keyUnique.d.ts +3 -0
  14. package/dist/data/introspect/policies/keyUnique.js +10 -0
  15. package/dist/data/introspect/policies/keyUnique.min.js +1 -1
  16. package/dist/data/queries/deleteEntity.js +29 -18
  17. package/dist/data/queries/deleteEntity.min.js +1 -1
  18. package/dist/data/queries/insertEntity.js +4 -12
  19. package/dist/data/queries/insertEntity.min.js +1 -1
  20. package/dist/data/queries/joinEntity.d.ts +15 -0
  21. package/dist/data/queries/joinEntity.js +91 -15
  22. package/dist/data/queries/joinEntity.min.js +1 -1
  23. package/dist/data/queries/updateEntity.js +15 -10
  24. package/dist/data/queries/updateEntity.min.js +1 -1
  25. package/dist/data/storage/fileExists.d.ts +6 -0
  26. package/dist/data/storage/fileExists.js +18 -0
  27. package/dist/data/storage/fileExists.min.js +1 -0
  28. package/dist/data/storage/index.d.ts +16 -0
  29. package/dist/data/storage/index.js +61 -0
  30. package/dist/data/storage/index.min.js +1 -0
  31. package/dist/data/storage/makeDirectory.d.ts +6 -0
  32. package/dist/data/storage/makeDirectory.js +18 -0
  33. package/dist/data/storage/makeDirectory.min.js +1 -0
  34. package/dist/data/storage/nodeFiles.d.ts +6 -0
  35. package/dist/data/storage/nodeFiles.js +12 -0
  36. package/dist/data/storage/nodeFiles.min.js +1 -0
  37. package/dist/data/storage/readCache.d.ts +37 -0
  38. package/dist/data/storage/readCache.js +117 -0
  39. package/dist/data/storage/readCache.min.js +1 -0
  40. package/dist/data/storage/readJson.d.ts +8 -0
  41. package/dist/data/storage/readJson.js +25 -0
  42. package/dist/data/storage/readJson.min.js +1 -0
  43. package/dist/data/storage/removeDirectory.d.ts +6 -0
  44. package/dist/data/storage/removeDirectory.js +24 -0
  45. package/dist/data/storage/removeDirectory.min.js +1 -0
  46. package/dist/data/storage/removeFile.d.ts +7 -0
  47. package/dist/data/storage/removeFile.js +22 -0
  48. package/dist/data/storage/removeFile.min.js +1 -0
  49. package/dist/data/storage/storagePath.d.ts +11 -0
  50. package/dist/data/storage/storagePath.js +25 -0
  51. package/dist/data/storage/storagePath.min.js +1 -0
  52. package/dist/data/storage/writeJson.d.ts +8 -0
  53. package/dist/data/storage/writeJson.js +23 -0
  54. package/dist/data/storage/writeJson.min.js +1 -0
  55. package/dist/data/utilities/compareAs.d.ts +1 -0
  56. package/dist/data/utilities/compareAs.js +2 -2
  57. package/dist/data/utilities/compareAs.min.js +1 -1
  58. package/dist/data/utilities/databaseLock.d.ts +2 -0
  59. package/dist/data/utilities/databaseLock.js +5 -2
  60. package/dist/data/utilities/databaseLock.min.js +1 -1
  61. package/dist/data/utilities/deregisterRecord.js +4 -10
  62. package/dist/data/utilities/deregisterRecord.min.js +1 -1
  63. package/dist/data/utilities/indexHas.d.ts +13 -0
  64. package/dist/data/utilities/indexHas.js +48 -0
  65. package/dist/data/utilities/indexHas.min.js +1 -0
  66. package/dist/data/utilities/joinBases.d.ts +29 -0
  67. package/dist/data/utilities/joinBases.js +136 -0
  68. package/dist/data/utilities/joinBases.min.js +1 -0
  69. package/dist/data/utilities/joinKey.d.ts +17 -0
  70. package/dist/data/utilities/joinKey.js +31 -0
  71. package/dist/data/utilities/joinKey.min.js +1 -0
  72. package/dist/data/utilities/keyIndexFiles.d.ts +16 -0
  73. package/dist/data/utilities/keyIndexFiles.js +60 -0
  74. package/dist/data/utilities/keyIndexFiles.min.js +1 -0
  75. package/dist/data/utilities/recordExists.js +2 -7
  76. package/dist/data/utilities/recordExists.min.js +1 -1
  77. package/dist/data/utilities/registerRecord.js +4 -10
  78. package/dist/data/utilities/registerRecord.min.js +1 -1
  79. package/dist/data/utilities/removeFromIndex.js +4 -10
  80. package/dist/data/utilities/removeFromIndex.min.js +1 -1
  81. package/dist/data/utilities/retrieveFile.d.ts +5 -0
  82. package/dist/data/utilities/retrieveFile.js +7 -16
  83. package/dist/data/utilities/retrieveFile.min.js +1 -1
  84. package/dist/data/utilities/rowLookup.d.ts +38 -0
  85. package/dist/data/utilities/rowLookup.js +99 -0
  86. package/dist/data/utilities/rowLookup.min.js +1 -0
  87. package/dist/data/utilities/runQuery.js +1 -2
  88. package/dist/data/utilities/runQuery.min.js +1 -1
  89. package/dist/data/utilities/semiJoin.d.ts +27 -0
  90. package/dist/data/utilities/semiJoin.js +97 -0
  91. package/dist/data/utilities/semiJoin.min.js +1 -0
  92. package/dist/data/utilities/updateIndex.js +5 -14
  93. package/dist/data/utilities/updateIndex.min.js +1 -1
  94. package/package.json +4 -2
  95. package/dist/data/utilities/getJoinIndexedList.d.ts +0 -3
  96. package/dist/data/utilities/getJoinIndexedList.js +0 -76
  97. package/dist/data/utilities/getJoinIndexedList.min.js +0 -1
  98. package/dist/data/utilities/getMatchingIndexes.d.ts +0 -2
  99. package/dist/data/utilities/getMatchingIndexes.js +0 -28
  100. package/dist/data/utilities/getMatchingIndexes.min.js +0 -1
  101. package/dist/data/utilities/matchIndexedJoins.d.ts +0 -2
  102. package/dist/data/utilities/matchIndexedJoins.js +0 -63
  103. package/dist/data/utilities/matchIndexedJoins.min.js +0 -1
  104. package/dist/data/utilities/restrictIndexedList.d.ts +0 -2
  105. package/dist/data/utilities/restrictIndexedList.js +0 -45
  106. package/dist/data/utilities/restrictIndexedList.min.js +0 -1
  107. package/dist/data/utilities/useJoinClause.d.ts +0 -6
  108. package/dist/data/utilities/useJoinClause.js +0 -57
  109. package/dist/data/utilities/useJoinClause.min.js +0 -1
@@ -1,26 +1,17 @@
1
1
  "use strict";
2
2
 
3
- require("core-js/modules/esnext.weak-map.delete-all.js");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.retrieveFile = void 0;
8
- var jsEnv = _interopRequireWildcard(require("browser-or-node"));
9
- var _config = require("./config");
10
- var e;
11
- function _interopRequireWildcard(t, r) { if (!r && t && t.__esModule) return t; var n, a, o = Object.defineProperty, f = { __proto__: null, default: t }; if (Object(t) !== t) return f; if (e || "function" != typeof WeakMap || (e = new WeakMap()), e) { if (e.has(t)) return e.get(t); e.set(t, f); } for (a in t) "default" !== a && {}.hasOwnProperty.call(t, a) && ((n = o && Object.getOwnPropertyDescriptor(t, a)) && (n.get || n.set) ? o(f, a, n) : f[a] = t[a]); return f; }
7
+ var _storage = require("../storage");
8
+ /**
9
+ * Read one JSON file of the database (see readJson), logging the underlying error and throwing one that names the file.
10
+ * @param path - A path inside the database, such as `users.json`.
11
+ * @throws {Error} `Could not read <path>` when the file can't be read.
12
+ */
12
13
  const retrieveFile = async path => {
13
- let retrieveFn = url => fetch(url).then(res => res.json());
14
- const relativePath = jsEnv.isBrowser ? (0, _config.getSetting)('relativePath', '') : '';
15
- if (jsEnv.isNode) {
16
- const {
17
- readFile
18
- } = require('fs/promises');
19
- retrieveFn = url => readFile(url).then(res => JSON.parse(res));
20
- }
21
- const databasePath = (0, _config.getSetting)('databasePath', 'database/');
22
- const fetchUrl = `${relativePath}${databasePath}${path}`;
23
- const recordInfo = await retrieveFn(fetchUrl).catch(err => console.error(err));
14
+ const recordInfo = await (0, _storage.readJson)(path).catch(err => console.error(err));
24
15
  if (!recordInfo) {
25
16
  throw new Error(`Could not read ${path}`);
26
17
  }
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFile=void 0;var e,jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("./config");function _interopRequireWildcard(r,t){if(!t&&r&&r.__esModule)return r;var i,o,n=Object.defineProperty,s={__proto__:null,default:r};if(Object(r)!==r)return s;if(e||"function"!=typeof WeakMap||(e=new WeakMap),e){if(e.has(r))return e.get(r);e.set(r,s)}for(o in r)"default"!==o&&{}.hasOwnProperty.call(r,o)&&((i=n&&Object.getOwnPropertyDescriptor(r,o))&&(i.get||i.set)?n(s,o,i):s[o]=r[o]);return s}const retrieveFile=async e=>{let r=e=>fetch(e).then((e=>e.json()));const t=jsEnv.isBrowser?(0,_config.getSetting)("relativePath",""):"";if(jsEnv.isNode){const{readFile:e}=require("fs/promises");r=r=>e(r).then((e=>JSON.parse(e)))}const i=`${t}${(0,_config.getSetting)("databasePath","database/")}${e}`,o=await r(i).catch((e=>console.error(e)));if(!o)throw new Error(`Could not read ${e}`);return o};exports.retrieveFile=retrieveFile;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFile=void 0;var _storage=require("../storage");const retrieveFile=async e=>{const r=await(0,_storage.readJson)(e).catch((e=>console.error(e)));if(!r)throw new Error(`Could not read ${e}`);return r};exports.retrieveFile=retrieveFile;
@@ -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;
@@ -38,7 +38,6 @@ var _limitOffset = require("../queries/limitOffset");
38
38
  var _selectFields = require("../queries/selectFields");
39
39
  var _retrieveRecord = require("./retrieveRecord");
40
40
  var _getConditionIndexedList = require("./getConditionIndexedList");
41
- var _getJoinIndexedList = require("./getJoinIndexedList");
42
41
  var _isEntityProperty = require("./parsers/isEntityProperty");
43
42
  var _splitEntityProperty = require("./parsers/splitEntityProperty");
44
43
  var _fieldType = require("./fieldType");
@@ -112,7 +111,7 @@ const runQuery = async parsed => {
112
111
  const resolved = new Set();
113
112
  parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet, resolved);
114
113
  const entityResolved = resolved.has(parsed.entity);
115
- parsed = await (0, _getJoinIndexedList.getJoinIndexedList)(parsed, recordData, dataSet);
114
+ // The join is joinEntity's (below), for rows an index narrowed too
116
115
  // delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
117
116
  // everything and lets the where-reduce below narrow it down afterward, they never get a second
118
117
  // pass. So every condition is applied to the candidates (all rows, or the ones the indexes picked)
@@ -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"),_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");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.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;
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "3.1.4",
3
+ "version": "3.2.0",
4
4
  "description": "Use json files to manage and read data.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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",
@@ -46,6 +47,7 @@
46
47
  "@babel/core": "^8.1.0",
47
48
  "gulp": "^5.0.1",
48
49
  "js-build-tools": "^8.0.0",
50
+ "playwright": "~1.64.1",
49
51
  "release-it": "^21.1.1",
50
52
  "test-filesystem": "^2.0.2",
51
53
  "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
@@ -1,28 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getMatchingIndexes = void 0;
7
- var _retrieveIndexes = require("./retrieveIndexes");
8
- var _isSingleFieldKey = require("./isSingleFieldKey");
9
- const getMatchingIndexes = async (entity, property, recordData, clause, dataSet, indexed, cb = null) => {
10
- let isIndexed = false;
11
- for (const key of recordData[entity].keys) {
12
- if ((0, _isSingleFieldKey.isSingleFieldKey)(key, property)) {
13
- dataSet[entity] = [];
14
- if (!Object.prototype.hasOwnProperty.call(indexed, entity)) {
15
- indexed[entity] = {};
16
- }
17
- if (!Object.prototype.hasOwnProperty.call(indexed[entity], property)) {
18
- indexed[entity][property] = (await (0, _retrieveIndexes.retrieveIndexes)(entity, [property], recordData))[property];
19
- }
20
- if (typeof cb === 'function') {
21
- await cb(entity, property, recordData, clause, dataSet, indexed);
22
- }
23
- isIndexed = true;
24
- }
25
- }
26
- return isIndexed;
27
- };
28
- exports.getMatchingIndexes = getMatchingIndexes;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getMatchingIndexes=void 0;var _retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey");const getMatchingIndexes=async(e,t,i,r,n,s,o=null)=>{let l=!1;for(const a of i[e].keys)(0,_isSingleFieldKey.isSingleFieldKey)(a,t)&&(n[e]=[],Object.prototype.hasOwnProperty.call(s,e)||(s[e]={}),Object.prototype.hasOwnProperty.call(s[e],t)||(s[e][t]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[t],i))[t]),"function"==typeof o&&await o(e,t,i,r,n,s),l=!0);return l};exports.getMatchingIndexes=getMatchingIndexes;
@@ -1,2 +0,0 @@
1
- export declare const matchIndexedJoins: (entity: any, indexedClone: any, dataSets: any) => (focusEntity: any, property: any, recordData: any, joinClause: any, filterJoins: any, indexed: any) => Promise<void>;
2
- //# sourceMappingURL=matchIndexedJoins.d.ts.map
@@ -1,63 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.matchIndexedJoins = void 0;
7
- require("core-js/modules/esnext.iterator.constructor.js");
8
- require("core-js/modules/esnext.iterator.reduce.js");
9
- var _siFunciona = _interopRequireDefault(require("si-funciona"));
10
- var _where = require("../queries/where");
11
- var _retrieveFile = require("./retrieveFile");
12
- var _splitEntityProperty = require("./parsers/splitEntityProperty");
13
- var _fieldType = require("./fieldType");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- const matchIndexedJoins = (entity, indexedClone, dataSets) => async (focusEntity, property, recordData, joinClause, filterJoins, indexed) => {
16
- const {
17
- entity: entityA,
18
- property: propertyA
19
- } = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyA);
20
- const {
21
- entity: entityB,
22
- property: propertyB
23
- } = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyB);
24
- const properties = [{
25
- entityFirst: entityA,
26
- propertyFirst: propertyA,
27
- entitySecond: entityB,
28
- propertySecond: propertyB
29
- }, {
30
- entityFirst: entityB,
31
- propertyFirst: propertyB,
32
- entitySecond: entityA,
33
- propertySecond: propertyA
34
- }];
35
- for (const checkProp of properties) {
36
- if (!Object.prototype.hasOwnProperty.call(indexedClone, checkProp.entitySecond)) {
37
- indexedClone[checkProp.entitySecond] = _siFunciona.default.cloneObject(indexed[checkProp.entitySecond]);
38
- }
39
- const matchedRecords = indexedClone[checkProp.entitySecond][checkProp.propertySecond].reduce((dataA, dataB) => _siFunciona.default.mergeArrays(dataA, (0, _where.where)(indexedClone[checkProp.entityFirst][checkProp.propertyFirst], {
40
- property: 'value',
41
- comparator: joinClause.comparator,
42
- value: dataB.value,
43
- type: (0, _fieldType.fieldType)(recordData[checkProp.entityFirst], checkProp.propertyFirst)
44
- })), []);
45
- const skipPush = checkProp.entityFirst === entity;
46
- if (!Object.prototype.hasOwnProperty.call(dataSets, checkProp.entityFirst)) {
47
- dataSets[checkProp.entityFirst] = [];
48
- }
49
- for (const matchedRecord of matchedRecords) {
50
- for (const file of matchedRecord.record) {
51
- let entityRecord = file;
52
- if (typeof file === 'string') {
53
- entityRecord = await (0, _retrieveFile.retrieveFile)(`${checkProp.entityFirst}/${file}`);
54
- }
55
- if (!skipPush) {
56
- dataSets[checkProp.entityFirst].push(entityRecord);
57
- }
58
- filterJoins[checkProp.entityFirst].push(entityRecord);
59
- }
60
- }
61
- }
62
- };
63
- exports.matchIndexedJoins = matchIndexedJoins;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.matchIndexedJoins=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _siFunciona=_interopRequireDefault(require("si-funciona")),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const matchIndexedJoins=(e,t,r)=>async(i,o,n,s,p,y)=>{const{entity:c,property:u}=(0,_splitEntityProperty.splitEntityProperty)(s.propertyA),{entity:a,property:d}=(0,_splitEntityProperty.splitEntityProperty)(s.propertyB),l=[{entityFirst:c,propertyFirst:u,entitySecond:a,propertySecond:d},{entityFirst:a,propertyFirst:d,entitySecond:c,propertySecond:u}];for(const i of l){Object.prototype.hasOwnProperty.call(t,i.entitySecond)||(t[i.entitySecond]=_siFunciona.default.cloneObject(y[i.entitySecond]));const o=t[i.entitySecond][i.propertySecond].reduce(((e,r)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(t[i.entityFirst][i.propertyFirst],{property:"value",comparator:s.comparator,value:r.value,type:(0,_fieldType.fieldType)(n[i.entityFirst],i.propertyFirst)}))),[]),c=i.entityFirst===e;Object.prototype.hasOwnProperty.call(r,i.entityFirst)||(r[i.entityFirst]=[]);for(const e of o)for(const t of e.record){let e=t;"string"==typeof t&&(e=await(0,_retrieveFile.retrieveFile)(`${i.entityFirst}/${t}`)),c||r[i.entityFirst].push(e),p[i.entityFirst].push(e)}}};exports.matchIndexedJoins=matchIndexedJoins;