@stamhoofd/sql 2.1.1 → 2.1.3

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 (46) hide show
  1. package/LICENSE +661 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +12 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/SQL.d.ts +56 -0
  7. package/dist/src/SQL.d.ts.map +1 -0
  8. package/dist/src/SQL.js +47 -0
  9. package/dist/src/SQL.js.map +1 -0
  10. package/dist/src/SQLExpression.d.ts +15 -0
  11. package/dist/src/SQLExpression.d.ts.map +1 -0
  12. package/dist/src/SQLExpression.js +23 -0
  13. package/dist/src/SQLExpression.js.map +1 -0
  14. package/dist/src/SQLExpressions.d.ts +78 -0
  15. package/dist/src/SQLExpressions.d.ts.map +1 -0
  16. package/dist/src/SQLExpressions.js +197 -0
  17. package/dist/src/SQLExpressions.js.map +1 -0
  18. package/dist/src/SQLJoin.d.ts +29 -0
  19. package/dist/src/SQLJoin.d.ts.map +1 -0
  20. package/dist/src/SQLJoin.js +40 -0
  21. package/dist/src/SQLJoin.js.map +1 -0
  22. package/dist/src/SQLJsonExpressions.d.ts +41 -0
  23. package/dist/src/SQLJsonExpressions.d.ts.map +1 -0
  24. package/dist/src/SQLJsonExpressions.js +95 -0
  25. package/dist/src/SQLJsonExpressions.js.map +1 -0
  26. package/dist/src/SQLOrderBy.d.ts +28 -0
  27. package/dist/src/SQLOrderBy.d.ts.map +1 -0
  28. package/dist/src/SQLOrderBy.js +50 -0
  29. package/dist/src/SQLOrderBy.js.map +1 -0
  30. package/dist/src/SQLSelect.d.ts +44 -0
  31. package/dist/src/SQLSelect.d.ts.map +1 -0
  32. package/dist/src/SQLSelect.js +124 -0
  33. package/dist/src/SQLSelect.js.map +1 -0
  34. package/dist/src/SQLWhere.d.ts +92 -0
  35. package/dist/src/SQLWhere.d.ts.map +1 -0
  36. package/dist/src/SQLWhere.js +269 -0
  37. package/dist/src/SQLWhere.js.map +1 -0
  38. package/dist/src/filters/SQLFilter.d.ts +17 -0
  39. package/dist/src/filters/SQLFilter.d.ts.map +1 -0
  40. package/dist/src/filters/SQLFilter.js +187 -0
  41. package/dist/src/filters/SQLFilter.js.map +1 -0
  42. package/dist/src/filters/SQLSorter.d.ts +9 -0
  43. package/dist/src/filters/SQLSorter.d.ts.map +1 -0
  44. package/dist/src/filters/SQLSorter.js +20 -0
  45. package/dist/src/filters/SQLSorter.js.map +1 -0
  46. package/package.json +5 -3
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLJsonOverlaps = exports.SQLJsonContains = exports.SQLJsonSearch = exports.SQLJsonExtract = void 0;
4
+ const SQLExpression_1 = require("./SQLExpression");
5
+ const SQLExpressions_1 = require("./SQLExpressions");
6
+ /**
7
+ * Same as target->path, JSON_EXTRACT(target, path)
8
+ */
9
+ class SQLJsonExtract {
10
+ constructor(target, path) {
11
+ this.target = target;
12
+ this.path = path;
13
+ }
14
+ getSQL(options) {
15
+ return (0, SQLExpression_1.joinSQLQuery)([
16
+ 'JSON_EXTRACT(',
17
+ this.target.getSQL(options),
18
+ ',',
19
+ this.path.getSQL(options),
20
+ ')'
21
+ ]);
22
+ }
23
+ }
24
+ exports.SQLJsonExtract = SQLJsonExtract;
25
+ /**
26
+ * JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
27
+ */
28
+ class SQLJsonSearch {
29
+ constructor(target, oneOrAll, searchStr, path = null) {
30
+ this.target = target;
31
+ this.oneOrAll = oneOrAll;
32
+ this.searchStr = searchStr;
33
+ this.path = path;
34
+ }
35
+ getSQL(options) {
36
+ return (0, SQLExpression_1.joinSQLQuery)([
37
+ 'JSON_SEARCH(',
38
+ this.target.getSQL(options),
39
+ ',',
40
+ new SQLExpressions_1.SQLSafeValue(this.oneOrAll).getSQL(options),
41
+ ',',
42
+ this.searchStr.getSQL(options),
43
+ ...(this.path ? [
44
+ ',',
45
+ this.path.getSQL(options)
46
+ ] : []),
47
+ ')'
48
+ ]);
49
+ }
50
+ }
51
+ exports.SQLJsonSearch = SQLJsonSearch;
52
+ /**
53
+ * JSON_CONTAINS(target, candidate[, path])
54
+ */
55
+ class SQLJsonContains {
56
+ constructor(target, candidate, path = null) {
57
+ this.target = target;
58
+ this.candidate = candidate;
59
+ this.path = path;
60
+ }
61
+ getSQL(options) {
62
+ return (0, SQLExpression_1.joinSQLQuery)([
63
+ 'JSON_CONTAINS(',
64
+ this.target.getSQL(options),
65
+ ',',
66
+ this.candidate.getSQL(options),
67
+ ...(this.path ? [
68
+ ',',
69
+ this.path.getSQL(options)
70
+ ] : []),
71
+ ')'
72
+ ]);
73
+ }
74
+ }
75
+ exports.SQLJsonContains = SQLJsonContains;
76
+ /**
77
+ * JSON_CONTAINS(json_doc1, json_doc2)
78
+ */
79
+ class SQLJsonOverlaps {
80
+ constructor(jsonDoc1, jsonDoc2) {
81
+ this.jsonDoc1 = jsonDoc1;
82
+ this.jsonDoc2 = jsonDoc2;
83
+ }
84
+ getSQL(options) {
85
+ return (0, SQLExpression_1.joinSQLQuery)([
86
+ 'JSON_OVERLAPS(',
87
+ this.jsonDoc1.getSQL(options),
88
+ ',',
89
+ this.jsonDoc2.getSQL(options),
90
+ ')'
91
+ ]);
92
+ }
93
+ }
94
+ exports.SQLJsonOverlaps = SQLJsonOverlaps;
95
+ //# sourceMappingURL=SQLJsonExpressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLJsonExpressions.js","sourceRoot":"","sources":["../../src/SQLJsonExpressions.ts"],"names":[],"mappings":";;;AAAA,mDAA8F;AAC9F,qDAAgD;AAEhD;;GAEG;AACH,MAAa,cAAc;IAIvB,YAAY,MAAqB,EAAE,IAAmB;QAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAA8B;QACjC,OAAO,IAAA,4BAAY,EAAC;YAChB,eAAe;YACX,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,GAAG;YACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC7B,GAAG;SACN,CAAC,CAAA;IACN,CAAC;CACJ;AAlBD,wCAkBC;AAED;;GAEG;AACH,MAAa,aAAa;IAMtB,YAAY,MAAqB,EAAE,QAAqB,EAAE,SAAwB,EAAE,OAA2B,IAAI;QAC/G,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAA8B;QACjC,OAAO,IAAA,4BAAY,EAAC;YAChB,cAAc;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,GAAG;YACH,IAAI,6BAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC/C,GAAG;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACZ,GAAG;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC,CAAC,EAAE,CAAC;YACX,GAAG;SACN,CAAC,CAAA;IACN,CAAC;CACJ;AA5BD,sCA4BC;AAED;;GAEG;AACH,MAAa,eAAe;IAKxB,YAAY,MAAqB,EAAE,SAAwB,EAAE,OAA2B,IAAI;QACxF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAA8B;QACjC,OAAO,IAAA,4BAAY,EAAC;YAChB,gBAAgB;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,GAAG;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACZ,GAAG;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC,CAAC,EAAE,CAAC;YACX,GAAG;SACN,CAAC,CAAA;IACN,CAAC;CACJ;AAxBD,0CAwBC;AAGD;;GAEG;AACH,MAAa,eAAe;IAIxB,YAAY,QAAuB,EAAE,QAAuB;QACxD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,OAA8B;QACjC,OAAO,IAAA,4BAAY,EAAC;YAChB,gBAAgB;YACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YAC7B,GAAG;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YACjC,GAAG;SACN,CAAC,CAAA;IACN,CAAC;CACJ;AAlBD,0CAkBC"}
@@ -0,0 +1,28 @@
1
+ import { SQLExpression, SQLExpressionOptions, SQLQuery } from "./SQLExpression";
2
+ type GConstructor<T = {}> = new (...args: any[]) => T;
3
+ type Orderable = GConstructor<{
4
+ _orderBy: SQLOrderBy | null;
5
+ }>;
6
+ export declare function addOrderByHelpers<TBase extends Orderable>(Base: TBase): {
7
+ new (...args: any[]): {
8
+ orderBy(orderBy: SQLOrderBy): any;
9
+ orderBy(column: SQLExpression, direction?: SQLOrderByDirection): any;
10
+ _orderBy: SQLOrderBy | null;
11
+ };
12
+ } & TBase;
13
+ export type SQLOrderByDirection = 'ASC' | 'DESC';
14
+ export declare class SQLOrderBy implements SQLExpression {
15
+ orderBy: {
16
+ column: SQLExpression;
17
+ direction: SQLOrderByDirection;
18
+ }[];
19
+ constructor(...orderBy: {
20
+ column: SQLExpression;
21
+ direction: SQLOrderByDirection;
22
+ }[]);
23
+ static combine(orderBy: SQLOrderBy[]): SQLOrderBy;
24
+ add(orderBy: SQLOrderBy): void;
25
+ getSQL(options?: SQLExpressionOptions | undefined): SQLQuery;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=SQLOrderBy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLOrderBy.d.ts","sourceRoot":"","sources":["../../src/SQLOrderBy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAE9F,KAAK,YAAY,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACtD,KAAK,SAAS,GAAG,YAAY,CAAC;IAAE,QAAQ,EAAE,UAAU,GAAC,IAAI,CAAA;CAAE,CAAC,CAAC;AAE7D,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,SAAS,EAAE,IAAI,EAAE,KAAK;;yBAG7C,UAAU;wBACX,aAAa,cAAc,mBAAmB;;;UAgBrE;AAGD,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,CAAC;AACjD,qBAAa,UAAW,YAAW,aAAa;IAC5C,OAAO,EAAE;QAAC,MAAM,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,mBAAmB,CAAA;KAAC,EAAE,CAAM;gBAE5D,GAAG,OAAO,EAAE;QAAC,MAAM,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,mBAAmB,CAAA;KAAC,EAAE;IAIjF,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE;IAIpC,GAAG,CAAC,OAAO,EAAE,UAAU;IAIvB,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,GAAG,QAAQ;CAkB/D"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLOrderBy = exports.addOrderByHelpers = void 0;
4
+ const SQLExpression_1 = require("./SQLExpression");
5
+ function addOrderByHelpers(Base) {
6
+ return class extends Base {
7
+ orderBy(columnOrOrderBy, direction) {
8
+ let o = columnOrOrderBy;
9
+ if (!(columnOrOrderBy instanceof SQLOrderBy)) {
10
+ o = new SQLOrderBy({ column: columnOrOrderBy, direction: direction !== null && direction !== void 0 ? direction : 'ASC' });
11
+ }
12
+ if (this._orderBy) {
13
+ this._orderBy.add(o);
14
+ }
15
+ else {
16
+ this._orderBy = o;
17
+ }
18
+ return this;
19
+ }
20
+ };
21
+ }
22
+ exports.addOrderByHelpers = addOrderByHelpers;
23
+ class SQLOrderBy {
24
+ constructor(...orderBy) {
25
+ this.orderBy = [];
26
+ this.orderBy = orderBy;
27
+ }
28
+ static combine(orderBy) {
29
+ return new SQLOrderBy(...orderBy.flatMap(o => o.orderBy));
30
+ }
31
+ add(orderBy) {
32
+ this.orderBy.push(...orderBy.orderBy);
33
+ }
34
+ getSQL(options) {
35
+ if (this.orderBy.length === 0) {
36
+ return '';
37
+ }
38
+ return (0, SQLExpression_1.joinSQLQuery)([
39
+ 'ORDER BY ',
40
+ (0, SQLExpression_1.joinSQLQuery)(this.orderBy.map(o => {
41
+ return (0, SQLExpression_1.joinSQLQuery)([
42
+ o.column.getSQL(options),
43
+ o.direction
44
+ ], ' ');
45
+ }), ', ')
46
+ ]);
47
+ }
48
+ }
49
+ exports.SQLOrderBy = SQLOrderBy;
50
+ //# sourceMappingURL=SQLOrderBy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLOrderBy.js","sourceRoot":"","sources":["../../src/SQLOrderBy.ts"],"names":[],"mappings":";;;AAAA,mDAA8F;AAK9F,SAAgB,iBAAiB,CAA0B,IAAW;IAClE,OAAO,KAAM,SAAQ,IAAI;QAIrB,OAAO,CAAC,eAA8B,EAAE,SAA+B;YACnE,IAAI,CAAC,GAAG,eAA6B,CAAA;YACrC,IAAI,CAAC,CAAC,eAAe,YAAY,UAAU,CAAC,EAAE,CAAC;gBAC3C,CAAC,GAAG,IAAI,UAAU,CAAC,EAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,KAAK,EAAC,CAAC,CAAA;YAChF,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;KACJ,CAAA;AACL,CAAC;AApBD,8CAoBC;AAID,MAAa,UAAU;IAGnB,YAAY,GAAG,OAAkE;QAFjF,YAAO,GAA8D,EAAE,CAAC;QAGpE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAqB;QAChC,OAAO,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,GAAG,CAAC,OAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,CAAC,OAA0C;QAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO,IAAA,4BAAY,EAAC;YAChB,WAAW;YACX,IAAA,4BAAY,EACR,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACjB,OAAO,IAAA,4BAAY,EAAC;oBAChB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,SAAS;iBACd,EAAE,GAAG,CAAC,CAAA;YACX,CAAC,CAAC,EACF,IAAI,CACP;SACJ,CAAC,CAAA;IACN,CAAC;CACJ;AAjCD,gCAiCC"}
@@ -0,0 +1,44 @@
1
+ import { SQLExpression, SQLExpressionOptions, SQLQuery } from "./SQLExpression";
2
+ import { SQLOrderBy } from "./SQLOrderBy";
3
+ import { SQLWhere } from "./SQLWhere";
4
+ import { SQLResultNamespacedRow } from "@simonbackx/simple-database";
5
+ import { SQLJoin } from './SQLJoin';
6
+ declare class SelectBase implements SQLExpression {
7
+ _columns: SQLExpression[];
8
+ _from: SQLExpression;
9
+ _limit: number | null;
10
+ _offset: number | null;
11
+ _where: SQLWhere | null;
12
+ _orderBy: SQLOrderBy | null;
13
+ _joins: (InstanceType<typeof SQLJoin>)[];
14
+ constructor(...columns: SQLExpression[]);
15
+ clone(): this;
16
+ from(table: SQLExpression): this;
17
+ join(join: InstanceType<typeof SQLJoin>): this;
18
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
19
+ limit(limit: number | null, offset?: number | null): this;
20
+ fetch(): Promise<SQLResultNamespacedRow[]>;
21
+ first(required: false): Promise<SQLResultNamespacedRow | null>;
22
+ first(required: true): Promise<SQLResultNamespacedRow>;
23
+ count(): Promise<number>;
24
+ }
25
+ export declare const SQLSelect: {
26
+ new (...args: any[]): {
27
+ orderBy(orderBy: SQLOrderBy): any;
28
+ orderBy(column: SQLExpression, direction?: import("./SQLOrderBy").SQLOrderByDirection | undefined): any;
29
+ _orderBy: SQLOrderBy | null;
30
+ };
31
+ } & {
32
+ new (...args: any[]): {
33
+ parseWhere(...[whereOrColumn, signOrValue, value]: import("./SQLWhere").ParseWhereArguments): SQLWhere;
34
+ where<T>(this: T, ...args: import("./SQLWhere").ParseWhereArguments): T;
35
+ andWhere(...args: import("./SQLWhere").ParseWhereArguments): any;
36
+ orWhere(...args: import("./SQLWhere").ParseWhereArguments): any;
37
+ whereNot(...args: import("./SQLWhere").ParseWhereArguments): any;
38
+ andWhereNot(...args: import("./SQLWhere").ParseWhereArguments): any;
39
+ orWhereNot(...args: import("./SQLWhere").ParseWhereArguments): any;
40
+ _where: SQLWhere | null;
41
+ };
42
+ } & typeof SelectBase;
43
+ export {};
44
+ //# sourceMappingURL=SQLSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLSelect.d.ts","sourceRoot":"","sources":["../../src/SQLSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,QAAQ,EAAmC,MAAM,iBAAiB,CAAC;AACjH,OAAO,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AACvD,OAAO,EAAW,sBAAsB,EAAC,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,cAAM,UAAW,YAAW,aAAa;IACrC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,KAAK,EAAE,aAAa,CAAC;IAErB,MAAM,EAAE,MAAM,GAAC,IAAI,CAAQ;IAC3B,OAAO,EAAE,MAAM,GAAC,IAAI,CAAQ;IAE5B,MAAM,EAAE,QAAQ,GAAC,IAAI,CAAQ;IAC7B,QAAQ,EAAE,UAAU,GAAC,IAAI,CAAQ;IACjC,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,OAAO,CAAC,CAAC,EAAE,CAAM;gBAElC,GAAG,OAAO,EAAE,aAAa,EAAE;IAIvC,KAAK,IAAI,IAAI;IAMb,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKhC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,OAAO,CAAC,GAAG,IAAI;IAK9C,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,QAAQ;IAyChD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAC,IAAI,EAAE,MAAM,GAAE,MAAM,GAAC,IAAW,GAAG,IAAI;IAMrD,KAAK,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IA0BhD,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC,sBAAsB,GAAC,IAAI,CAAC;IAC5D,KAAK,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAYhD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CA8BjC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;qBAErB,CAAA"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLSelect = void 0;
4
+ const SQLExpression_1 = require("./SQLExpression");
5
+ const SQLOrderBy_1 = require("./SQLOrderBy");
6
+ const SQLWhere_1 = require("./SQLWhere");
7
+ const simple_database_1 = require("@simonbackx/simple-database");
8
+ const SQLExpressions_1 = require("./SQLExpressions");
9
+ class SelectBase {
10
+ constructor(...columns) {
11
+ this._limit = null;
12
+ this._offset = null;
13
+ this._where = null;
14
+ this._orderBy = null;
15
+ this._joins = [];
16
+ this._columns = columns;
17
+ }
18
+ clone() {
19
+ const c = new exports.SQLSelect(...this._columns);
20
+ Object.assign(c, this);
21
+ return c;
22
+ }
23
+ from(table) {
24
+ this._from = table;
25
+ return this;
26
+ }
27
+ join(join) {
28
+ this._joins.push(join);
29
+ return this;
30
+ }
31
+ getSQL(options) {
32
+ var _a, _b;
33
+ const query = [
34
+ 'SELECT'
35
+ ];
36
+ options = options !== null && options !== void 0 ? options : {};
37
+ options.defaultNamespace = (_b = (_a = this._from.namespace) !== null && _a !== void 0 ? _a : this._from.table) !== null && _b !== void 0 ? _b : undefined;
38
+ const columns = this._columns.map(c => c.getSQL(options));
39
+ query.push((0, SQLExpression_1.joinSQLQuery)(columns, ', '));
40
+ query.push('FROM');
41
+ query.push(this._from.getSQL(options));
42
+ query.push(...this._joins.map(j => j.getSQL(options)));
43
+ if (this._where) {
44
+ query.push('WHERE');
45
+ query.push(this._where.getSQL(options));
46
+ }
47
+ if (this._orderBy) {
48
+ query.push(this._orderBy.getSQL(options));
49
+ }
50
+ if (this._limit !== null) {
51
+ query.push('LIMIT ' + this._limit);
52
+ if (this._offset !== null && this._offset !== 0) {
53
+ query.push('OFFSET ' + this._offset);
54
+ }
55
+ }
56
+ return (0, SQLExpression_1.joinSQLQuery)(query, ' ');
57
+ }
58
+ limit(limit, offset = null) {
59
+ this._limit = limit;
60
+ this._offset = offset;
61
+ return this;
62
+ }
63
+ async fetch() {
64
+ var _a;
65
+ const { query, params } = (0, SQLExpression_1.normalizeSQLQuery)(this.getSQL());
66
+ console.log(query, params);
67
+ const [rows] = await simple_database_1.Database.select(query, params, { nestTables: true });
68
+ // Now map aggregated queries to the correct namespace
69
+ for (const row of rows) {
70
+ if (row['']) {
71
+ for (const column in row['']) {
72
+ const splitted = column.split('__');
73
+ if (splitted.length <= 1) {
74
+ console.warn('Aggregated column without namespace', column);
75
+ continue;
76
+ }
77
+ const namespace = splitted[0];
78
+ const name = splitted[1];
79
+ row[namespace] = (_a = row[namespace]) !== null && _a !== void 0 ? _a : {};
80
+ row[namespace][name] = row[''][column];
81
+ }
82
+ delete row[''];
83
+ }
84
+ }
85
+ return rows;
86
+ }
87
+ async first(required = true) {
88
+ const rows = await this.limit(1).fetch();
89
+ if (rows.length === 0) {
90
+ if (required) {
91
+ throw new Error('Required ' + this._from);
92
+ }
93
+ return null;
94
+ }
95
+ return rows[0];
96
+ }
97
+ async count() {
98
+ this._columns = [
99
+ new SQLExpressions_1.SQLSelectAs(new SQLExpressions_1.SQLCount(), new SQLExpressions_1.SQLAlias('c'))
100
+ ];
101
+ this._offset = null;
102
+ this._limit = null;
103
+ this._orderBy = null;
104
+ const { query, params } = (0, SQLExpression_1.normalizeSQLQuery)(this.getSQL());
105
+ console.log(query, params);
106
+ const [rows] = await simple_database_1.Database.select(query, params, { nestTables: true });
107
+ if (rows.length === 1) {
108
+ const row = rows[0];
109
+ if ('' in row) {
110
+ const namespaced = row[''];
111
+ if ('c' in namespaced) {
112
+ const value = namespaced['c'];
113
+ if (typeof value === 'number' && Number.isInteger(value)) {
114
+ return value;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ console.warn('Invalid count SQL response', rows);
120
+ return 0;
121
+ }
122
+ }
123
+ exports.SQLSelect = (0, SQLOrderBy_1.addOrderByHelpers)((0, SQLWhere_1.addWhereHelpers)(SelectBase));
124
+ //# sourceMappingURL=SQLSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLSelect.js","sourceRoot":"","sources":["../../src/SQLSelect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { SQLExpression, SQLExpressionOptions, SQLQuery } from "./SQLExpression";
2
+ import { SQLDynamicExpression } from "./SQLExpressions";
3
+ type GConstructor<T = {}> = new (...args: any[]) => T;
4
+ type Whereable = GConstructor<{
5
+ _where: SQLWhere | null;
6
+ }>;
7
+ export type ParseWhereArguments = [
8
+ where: SQLWhere
9
+ ] | [
10
+ whereOrColumn: SQLExpression,
11
+ sign: SQLWhereSign,
12
+ value: SQLDynamicExpression
13
+ ] | [
14
+ whereOrColumn: SQLExpression,
15
+ value: SQLDynamicExpression
16
+ ];
17
+ export declare function addWhereHelpers<TBase extends Whereable>(Base: TBase): {
18
+ new (...args: any[]): {
19
+ parseWhere(...[whereOrColumn, signOrValue, value]: ParseWhereArguments): SQLWhere;
20
+ where<T>(this: T, ...args: ParseWhereArguments): T;
21
+ andWhere(...args: ParseWhereArguments): any;
22
+ orWhere(...args: ParseWhereArguments): any;
23
+ whereNot(...args: ParseWhereArguments): any;
24
+ andWhereNot(...args: ParseWhereArguments): any;
25
+ orWhereNot(...args: ParseWhereArguments): any;
26
+ _where: SQLWhere | null;
27
+ };
28
+ } & TBase;
29
+ export declare abstract class SQLWhere implements SQLExpression {
30
+ and(...where: SQLWhere[]): SQLWhere;
31
+ or(...where: SQLWhere[]): SQLWhere;
32
+ get isSingle(): boolean;
33
+ abstract getSQL(options?: SQLExpressionOptions): SQLQuery;
34
+ }
35
+ export declare enum SQLWhereSign {
36
+ Equal = "=",
37
+ Greater = ">",
38
+ Less = "<",
39
+ NotEqual = "!="
40
+ }
41
+ export declare class SQLWhereEqual extends SQLWhere {
42
+ column: SQLExpression;
43
+ sign: SQLWhereSign;
44
+ value: SQLExpression;
45
+ constructor(column: SQLExpression, sign: SQLWhereSign, value: SQLExpression);
46
+ constructor(column: SQLExpression, value: SQLExpression);
47
+ clone(): this;
48
+ get isSingle(): boolean;
49
+ inverted(): this;
50
+ invert(): this;
51
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
52
+ }
53
+ export declare class SQLWhereLike extends SQLWhere {
54
+ column: SQLExpression;
55
+ notLike: boolean;
56
+ value: SQLExpression;
57
+ constructor(column: SQLExpression, value: SQLExpression);
58
+ static escape(str: string): string;
59
+ clone(): this;
60
+ get isSingle(): boolean;
61
+ inverted(): this;
62
+ invert(): this;
63
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
64
+ }
65
+ export declare class SQLWhereExists extends SQLWhere {
66
+ subquery: SQLExpression;
67
+ notExists: boolean;
68
+ constructor(subquery: SQLExpression);
69
+ clone(): this;
70
+ get isSingle(): boolean;
71
+ inverted(): this;
72
+ invert(): this;
73
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
74
+ }
75
+ export declare class SQLWhereAnd extends SQLWhere {
76
+ children: SQLWhere[];
77
+ constructor(children: SQLWhere[]);
78
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
79
+ }
80
+ export declare class SQLWhereOr extends SQLWhere {
81
+ children: SQLWhere[];
82
+ constructor(children: SQLWhere[]);
83
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
84
+ }
85
+ export declare class SQLWhereNot extends SQLWhere {
86
+ a: SQLWhere;
87
+ constructor(a: SQLWhere);
88
+ get isSingle(): boolean;
89
+ getSQL(options?: SQLExpressionOptions): SQLQuery;
90
+ }
91
+ export {};
92
+ //# sourceMappingURL=SQLWhere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLWhere.d.ts","sourceRoot":"","sources":["../../src/SQLWhere.ts"],"names":[],"mappings":"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"}