json-fs-query 2.1.0 → 2.1.1

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.
@@ -1,3 +1,15 @@
1
1
  import { ParsedQuery } from './parsers/parseQuery';
2
- export declare const getConditionIndexedList: (parsed: ParsedQuery, recordData: any, dataSet: any) => Promise<ParsedQuery>;
2
+ /**
3
+ * Load only the rows the indexed conditions match, and leave the other conditions for where() to apply later.
4
+ * Conditions are joined by `and`, so a row is loaded only when every indexed condition on its entity matched it: each
5
+ * condition narrows the files the ones before it matched. (Each indexed condition used to replace the rows of the one
6
+ * before, so `where date = 'x' and where exercise_id = 1` returned every row with exercise_id 1, whatever its date.)
7
+ * @param parsed
8
+ * @param recordData
9
+ * @param dataSet
10
+ * @param resolved - Filled with each entity whose rows were loaded here: its rows in dataSet are final (possibly none)
11
+ * and must not be reloaded, even when other conditions are left for where() (an empty list otherwise reads as "not
12
+ * loaded yet", see readEntity).
13
+ */
14
+ export declare const getConditionIndexedList: (parsed: ParsedQuery, recordData: any, dataSet: any, resolved?: Set<string>) => Promise<ParsedQuery>;
3
15
  //# sourceMappingURL=getConditionIndexedList.d.ts.map
@@ -4,14 +4,47 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getConditionIndexedList = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.filter.js");
9
+ require("core-js/modules/esnext.iterator.flat-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");
7
26
  var _isEntityProperty = require("./parsers/isEntityProperty");
8
27
  var _splitEntityProperty = require("./parsers/splitEntityProperty");
9
28
  var _retrieveRecord = require("./retrieveRecord");
10
29
  var _where = require("../queries/where");
11
30
  var _retrieveFile = require("./retrieveFile");
12
31
  var _getMatchingIndexes = require("./getMatchingIndexes");
13
- const getConditionIndexedList = async (parsed, recordData, dataSet) => {
32
+ /**
33
+ * Load only the rows the indexed conditions match, and leave the other conditions for where() to apply later.
34
+ * Conditions are joined by `and`, so a row is loaded only when every indexed condition on its entity matched it: each
35
+ * condition narrows the files the ones before it matched. (Each indexed condition used to replace the rows of the one
36
+ * before, so `where date = 'x' and where exercise_id = 1` returned every row with exercise_id 1, whatever its date.)
37
+ * @param parsed
38
+ * @param recordData
39
+ * @param dataSet
40
+ * @param resolved - Filled with each entity whose rows were loaded here: its rows in dataSet are final (possibly none)
41
+ * and must not be reloaded, even when other conditions are left for where() (an empty list otherwise reads as "not
42
+ * loaded yet", see readEntity).
43
+ */
44
+ const getConditionIndexedList = async (parsed, recordData, dataSet, resolved = new Set()) => {
14
45
  const reducedConditions = [];
46
+ const matchedFiles = {};
47
+ const indexed = {};
15
48
  for (const condition of parsed.conditions) {
16
49
  let entity = parsed.entity;
17
50
  let property = condition.property;
@@ -23,25 +56,27 @@ const getConditionIndexedList = async (parsed, recordData, dataSet) => {
23
56
  if (!Object.prototype.hasOwnProperty.call(recordData, entity)) {
24
57
  recordData[entity] = await (0, _retrieveRecord.retrieveRecord)(entity);
25
58
  }
26
- const indexed = {};
27
- const retrieveMatchedFiles = async (entity, property, recordData, condition, dataSet, indexed) => {
28
- const matchedRecords = (0, _where.where)(indexed[entity][property], {
59
+ const narrowMatchedFiles = async (entity, property, recordData, condition, dataSet, indexed) => {
60
+ const files = new Set((0, _where.where)(indexed[entity][property], {
29
61
  property: 'value',
30
62
  comparator: condition.comparator,
31
63
  value: condition.value,
32
64
  type: condition.type
33
- });
34
- for (const matchedRecord of matchedRecords) {
35
- for (const file of matchedRecord.record) {
36
- dataSet[entity].push(await (0, _retrieveFile.retrieveFile)(`${entity}/${file}`));
37
- }
38
- }
65
+ }).flatMap(matchedRecord => matchedRecord.record));
66
+ matchedFiles[entity] = Object.prototype.hasOwnProperty.call(matchedFiles, entity) ? matchedFiles[entity].filter(file => files.has(file)) : [...files];
39
67
  };
40
- const isIndexed = await (0, _getMatchingIndexes.getMatchingIndexes)(entity, property, recordData, condition, dataSet, indexed, retrieveMatchedFiles);
68
+ const isIndexed = await (0, _getMatchingIndexes.getMatchingIndexes)(entity, property, recordData, condition, dataSet, indexed, narrowMatchedFiles);
41
69
  if (!isIndexed) {
42
70
  reducedConditions.push(condition);
43
71
  }
44
72
  }
73
+ for (const entity of Object.keys(matchedFiles)) {
74
+ resolved.add(entity);
75
+ dataSet[entity] = [];
76
+ for (const file of matchedFiles[entity]) {
77
+ dataSet[entity].push(await (0, _retrieveFile.retrieveFile)(`${entity}/${file}`));
78
+ }
79
+ }
45
80
  parsed.conditions = reducedConditions;
46
81
  return parsed;
47
82
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0;var _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_getMatchingIndexes=require("./getMatchingIndexes");const getConditionIndexedList=async(e,t,r)=>{const i=[];for(const o of e.conditions){let n=e.entity,s=o.property;if((0,_isEntityProperty.isEntityProperty)(s)){const e=(0,_splitEntityProperty.splitEntityProperty)(s);n=e.entity,s=e.property}Object.prototype.hasOwnProperty.call(t,n)||(t[n]=await(0,_retrieveRecord.retrieveRecord)(n));const p={},y=async(e,t,r,i,o,n)=>{const s=(0,_where.where)(n[e][t],{property:"value",comparator:i.comparator,value:i.value,type:i.type});for(const t of s)for(const r of t.record)o[e].push(await(0,_retrieveFile.retrieveFile)(`${e}/${r}`))};await(0,_getMatchingIndexes.getMatchingIndexes)(n,s,t,o,r,p,y)||i.push(o)}return e.conditions=i,e};exports.getConditionIndexedList=getConditionIndexedList;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.flat-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 _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_getMatchingIndexes=require("./getMatchingIndexes");const getConditionIndexedList=async(e,r,t,s=new Set)=>{const o=[],i={},n={};for(const s of e.conditions){let u=e.entity,c=s.property;if((0,_isEntityProperty.isEntityProperty)(c)){const e=(0,_splitEntityProperty.splitEntityProperty)(c);u=e.entity,c=e.property}Object.prototype.hasOwnProperty.call(r,u)||(r[u]=await(0,_retrieveRecord.retrieveRecord)(u));const d=async(e,r,t,s,o,n)=>{const u=new Set((0,_where.where)(n[e][r],{property:"value",comparator:s.comparator,value:s.value,type:s.type}).flatMap((e=>e.record)));i[e]=Object.prototype.hasOwnProperty.call(i,e)?i[e].filter((e=>u.has(e))):[...u]};await(0,_getMatchingIndexes.getMatchingIndexes)(u,c,r,s,t,n,d)||o.push(s)}for(const e of Object.keys(i)){s.add(e),t[e]=[];for(const r of i[e])t[e].push(await(0,_retrieveFile.retrieveFile)(`${e}/${r}`))}return e.conditions=o,e};exports.getConditionIndexedList=getConditionIndexedList;
@@ -4,12 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getMatchingIndexes = void 0;
7
- require("core-js/modules/es.array.includes.js");
8
7
  var _retrieveIndexes = require("./retrieveIndexes");
8
+ var _isSingleFieldKey = require("./isSingleFieldKey");
9
9
  const getMatchingIndexes = async (entity, property, recordData, clause, dataSet, indexed, cb = null) => {
10
10
  let isIndexed = false;
11
11
  for (const key of recordData[entity].keys) {
12
- if (key.fields.includes(property)) {
12
+ if ((0, _isSingleFieldKey.isSingleFieldKey)(key, property)) {
13
13
  dataSet[entity] = [];
14
14
  if (!Object.prototype.hasOwnProperty.call(indexed, entity)) {
15
15
  indexed[entity] = {};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getMatchingIndexes=void 0,require("core-js/modules/es.array.includes.js");var _retrieveIndexes=require("./retrieveIndexes");const getMatchingIndexes=async(e,t,r,s,n,o,i=null)=>{let a=!1;for(const c of r[e].keys)c.fields.includes(t)&&(n[e]=[],Object.prototype.hasOwnProperty.call(o,e)||(o[e]={}),Object.prototype.hasOwnProperty.call(o[e],t)||(o[e][t]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[t],r))[t]),"function"==typeof i&&await i(e,t,r,s,n,o),a=!0);return a};exports.getMatchingIndexes=getMatchingIndexes;
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;
@@ -0,0 +1,10 @@
1
+ import { keyDefinition } from '../introspect/definitions/key';
2
+ /**
3
+ * Whether a key indexes exactly this one field, so its index file can answer a condition or join on that field. A
4
+ * composite key's index holds combined values (`["a",1]`, see computeKeyValue), which never equal one field's value:
5
+ * using it for that field matched nothing. (Using a composite index for its leftmost field is a planned improvement.)
6
+ * @param key
7
+ * @param property
8
+ */
9
+ export declare const isSingleFieldKey: (key: keyDefinition, property: string) => boolean;
10
+ //# sourceMappingURL=isSingleFieldKey.d.ts.map
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isSingleFieldKey = void 0;
7
+ /**
8
+ * Whether a key indexes exactly this one field, so its index file can answer a condition or join on that field. A
9
+ * composite key's index holds combined values (`["a",1]`, see computeKeyValue), which never equal one field's value:
10
+ * using it for that field matched nothing. (Using a composite index for its leftmost field is a planned improvement.)
11
+ * @param key
12
+ * @param property
13
+ */
14
+ const isSingleFieldKey = (key, property) => key.fields.length === 1 && key.fields[0] === property;
15
+ exports.isSingleFieldKey = isSingleFieldKey;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isSingleFieldKey=void 0;const isSingleFieldKey=(e,i)=>1===e.fields.length&&e.fields[0]===i;exports.isSingleFieldKey=isSingleFieldKey;
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.retrieveIndexes = void 0;
7
- require("core-js/modules/es.array.includes.js");
8
7
  var _retrieveFile = require("./retrieveFile");
9
8
  var _retrieveRecord = require("./retrieveRecord");
9
+ var _isSingleFieldKey = require("./isSingleFieldKey");
10
10
  const retrieveIndexes = async (entity = '', properties = [], recordData = {}) => {
11
11
  if (!Object.prototype.hasOwnProperty.call(recordData, entity)) {
12
12
  recordData[entity] = await (0, _retrieveRecord.retrieveRecord)(entity);
@@ -14,7 +14,7 @@ const retrieveIndexes = async (entity = '', properties = [], recordData = {}) =>
14
14
  const indexSet = {};
15
15
  for (const property of properties) {
16
16
  for (const key of recordData[entity].keys) {
17
- if (key.fields.includes(property)) {
17
+ if ((0, _isSingleFieldKey.isSingleFieldKey)(key, property)) {
18
18
  indexSet[property] = await (0, _retrieveFile.retrieveFile)(`__indexes/${entity}/${key.lookup}`);
19
19
  }
20
20
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveIndexes=void 0,require("core-js/modules/es.array.includes.js");var _retrieveFile=require("./retrieveFile"),_retrieveRecord=require("./retrieveRecord");const retrieveIndexes=async(e="",r=[],t={})=>{Object.prototype.hasOwnProperty.call(t,e)||(t[e]=await(0,_retrieveRecord.retrieveRecord)(e));const i={};for(const o of r)for(const r of t[e].keys)r.fields.includes(o)&&(i[o]=await(0,_retrieveFile.retrieveFile)(`__indexes/${e}/${r.lookup}`));return i};exports.retrieveIndexes=retrieveIndexes;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveIndexes=void 0;var _retrieveFile=require("./retrieveFile"),_retrieveRecord=require("./retrieveRecord"),_isSingleFieldKey=require("./isSingleFieldKey");const retrieveIndexes=async(e="",r=[],i={})=>{Object.prototype.hasOwnProperty.call(i,e)||(i[e]=await(0,_retrieveRecord.retrieveRecord)(e));const t={};for(const o of r)for(const r of i[e].keys)(0,_isSingleFieldKey.isSingleFieldKey)(r,o)&&(t[o]=await(0,_retrieveFile.retrieveFile)(`__indexes/${e}/${r.lookup}`));return t};exports.retrieveIndexes=retrieveIndexes;
@@ -6,6 +6,22 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.runQuery = void 0;
7
7
  require("core-js/modules/esnext.iterator.constructor.js");
8
8
  require("core-js/modules/esnext.iterator.reduce.js");
9
+ require("core-js/modules/esnext.set.add-all.js");
10
+ require("core-js/modules/esnext.set.delete-all.js");
11
+ require("core-js/modules/esnext.set.difference.js");
12
+ require("core-js/modules/esnext.set.every.js");
13
+ require("core-js/modules/esnext.set.filter.js");
14
+ require("core-js/modules/esnext.set.find.js");
15
+ require("core-js/modules/esnext.set.intersection.js");
16
+ require("core-js/modules/esnext.set.is-disjoint-from.js");
17
+ require("core-js/modules/esnext.set.is-subset-of.js");
18
+ require("core-js/modules/esnext.set.is-superset-of.js");
19
+ require("core-js/modules/esnext.set.join.js");
20
+ require("core-js/modules/esnext.set.map.js");
21
+ require("core-js/modules/esnext.set.reduce.js");
22
+ require("core-js/modules/esnext.set.some.js");
23
+ require("core-js/modules/esnext.set.symmetric-difference.js");
24
+ require("core-js/modules/esnext.set.union.js");
9
25
  var _deleteEntity = require("../queries/deleteEntity");
10
26
  var _insertEntity = require("../queries/insertEntity");
11
27
  var _readEntity = require("../queries/readEntity");
@@ -79,21 +95,22 @@ const runQuery = async parsed => {
79
95
  let dataSet = {
80
96
  [parsed.entity]: []
81
97
  };
82
- // A condition that's indexed but genuinely matches nothing leaves dataSet[entity] at [] - the
83
- // same state it starts in before anything has looked at it at all. readEntity() (below) can't
84
- // tell those two states apart on its own (it reloads whenever the array is empty, regardless of
85
- // why), so capture here, before that ambiguity can happen, whether every condition actually got
86
- // resolved this way - if so, dataSet[entity] is already correct and must not be reloaded.
87
- const hadConditions = parsed.conditions.length > 0;
88
- parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet);
89
- const conditionsFullyIndexed = hadConditions && parsed.conditions.length === 0;
98
+ // An indexed condition that matches nothing leaves dataSet[entity] at [] - the same state it starts in before
99
+ // anything has looked at it at all. readEntity() (below) can't tell those two states apart on its own (it reloads
100
+ // whenever the array is empty), so getConditionIndexedList reports which entities it resolved: once any indexed
101
+ // condition has narrowed entity's rows, they are final (the conditions left over are applied to them below) and
102
+ // must not be reloaded. This used to ask whether EVERY condition was indexed, so `where date = 'none' and where
103
+ // reps = 10` reloaded every row and returned, updated or deleted all rows with reps 10.
104
+ const resolved = new Set();
105
+ parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet, resolved);
106
+ const entityResolved = resolved.has(parsed.entity);
90
107
  parsed = await (0, _getJoinIndexedList.getJoinIndexedList)(parsed, recordData, dataSet);
91
108
  // delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
92
109
  // everything and lets the where-reduce below narrow it down afterward, they never get a second
93
110
  // pass. So the matching rows have to be fully resolved (indexed conditions already are, via
94
111
  // getConditionIndexedList above; anything left in parsed.conditions is not) before either runs.
95
112
  if (parsed.command === 'delete' || parsed.command === 'update') {
96
- if (!conditionsFullyIndexed) {
113
+ if (!entityResolved) {
97
114
  dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
98
115
  }
99
116
  dataSet[parsed.entity] = parsed.conditions.reduce((remainingData, condition) => (0, _where.where)(remainingData, condition), dataSet[parsed.entity]);
@@ -106,7 +123,7 @@ const runQuery = async parsed => {
106
123
  dataSet = await (0, _insertEntity.insertEntity)(parsed.entity, parsed.insertValues, dataSet);
107
124
  break;
108
125
  case 'read':
109
- if (!conditionsFullyIndexed) {
126
+ if (!entityResolved) {
110
127
  dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
111
128
  }
112
129
  break;
@@ -116,7 +133,7 @@ const runQuery = async parsed => {
116
133
  default:
117
134
  throw new Error(`Unknown command: ${parsed.command}`);
118
135
  }
119
- dataSet = await (0, _joinEntity.joinEntity)(parsed.entity, parsed.joinEntity, dataSet, parsed.joinClauses, conditionsFullyIndexed);
136
+ dataSet = await (0, _joinEntity.joinEntity)(parsed.entity, parsed.joinEntity, dataSet, parsed.joinClauses, entityResolved);
120
137
  dataSet = await (0, _mergeJoins.mergeJoins)(dataSet, parsed.mergeJoins);
121
138
  // delete/update already had parsed.conditions applied above, before they ran. Re-applying the
122
139
  // same conditions here would be wrong, not just redundant, for update specifically: if the
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.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");const typeConditions=async(e,t)=>{for(const r of e.conditions){let i=e.entity,n=r.property;(0,_isEntityProperty.isEntityProperty)(n)&&({entity:i,property:n}=(0,_splitEntityProperty.splitEntityProperty)(n)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],n)}},runQuery=async e=>{switch(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 t={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(t[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeConditions(e,t);let r={[e.entity]:[]};const i=e.conditions.length>0;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,t,r);const n=i&&0===e.conditions.length;switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,t,r)).command&&"update"!==e.command||(n||(r=await(0,_readEntity.readEntity)(e.entity,r)),r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),e.command){case"delete":r=await(0,_deleteEntity.deleteEntity)(e.entity,r);break;case"insert":r=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,r);break;case"read":n||(r=await(0,_readEntity.readEntity)(e.entity,r));break;case"update":r=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,r);break;default:throw new Error(`Unknown command: ${e.command}`)}return r=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,r,e.joinClauses,n),r=await(0,_mergeJoins.mergeJoins)(r,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),r[e.entity]=(0,_sortBy.sortBy)(r[e.entity],e.sortClauses),r[e.entity]=(0,_limitOffset.limitOffset)(r[e.entity],e.offset,e.limit),r[e.entity]=(0,_groupBy.groupBy)(r[e.entity],e.groupBy),r[e.entity]=(0,_selectFields.selectFields)(r[e.entity],e.selectClauses),r};exports.runQuery=runQuery;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.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");const typeConditions=async(e,t)=>{for(const r of e.conditions){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=>{switch(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 t={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(t[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeConditions(e,t);let r={[e.entity]:[]};const i=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,t,r,i);const s=i.has(e.entity);switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,t,r)).command&&"update"!==e.command||(s||(r=await(0,_readEntity.readEntity)(e.entity,r)),r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),e.command){case"delete":r=await(0,_deleteEntity.deleteEntity)(e.entity,r);break;case"insert":r=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,r);break;case"read":s||(r=await(0,_readEntity.readEntity)(e.entity,r));break;case"update":r=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,r);break;default:throw new Error(`Unknown command: ${e.command}`)}return r=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,r,e.joinClauses,s),r=await(0,_mergeJoins.mergeJoins)(r,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),r[e.entity]=(0,_sortBy.sortBy)(r[e.entity],e.sortClauses),r[e.entity]=(0,_limitOffset.limitOffset)(r[e.entity],e.offset,e.limit),r[e.entity]=(0,_groupBy.groupBy)(r[e.entity],e.groupBy),r[e.entity]=(0,_selectFields.selectFields)(r[e.entity],e.selectClauses),r};exports.runQuery=runQuery;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "Use json files to manage and read data.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",