couchset 0.2.7 → 0.4.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 (117) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +292 -152
  3. package/dist/connection/connection.d.ts +68 -0
  4. package/dist/connection/connection.js +495 -0
  5. package/dist/connection/connection.js.map +1 -0
  6. package/dist/connection/env.d.ts +2 -0
  7. package/dist/connection/env.js +16 -0
  8. package/dist/connection/env.js.map +1 -0
  9. package/dist/connection/index.d.ts +3 -0
  10. package/dist/connection/index.js +25 -0
  11. package/dist/connection/index.js.map +1 -0
  12. package/dist/connection/types.d.ts +25 -0
  13. package/dist/connection/types.js +3 -0
  14. package/dist/connection/types.js.map +1 -0
  15. package/dist/database.d.ts +9 -0
  16. package/dist/database.js +196 -0
  17. package/dist/database.js.map +1 -0
  18. package/dist/index.d.ts +20 -6
  19. package/dist/index.js +55 -8
  20. package/dist/index.js.map +1 -1
  21. package/dist/legacy/connection.d.ts +2 -0
  22. package/dist/legacy/connection.js +24 -0
  23. package/dist/legacy/connection.js.map +1 -0
  24. package/dist/legacy/index.d.ts +10 -0
  25. package/dist/legacy/index.js +93 -0
  26. package/dist/legacy/index.js.map +1 -0
  27. package/dist/legacy/model.d.ts +55 -0
  28. package/dist/legacy/model.js +282 -0
  29. package/dist/legacy/model.js.map +1 -0
  30. package/dist/legacy/pagination/index.d.ts +1 -0
  31. package/dist/legacy/pagination/index.js +18 -0
  32. package/dist/legacy/pagination/index.js.map +1 -0
  33. package/dist/legacy/pagination/pagination.d.ts +12 -0
  34. package/dist/legacy/pagination/pagination.js +85 -0
  35. package/dist/legacy/pagination/pagination.js.map +1 -0
  36. package/dist/legacy/search/customQuery.d.ts +13 -0
  37. package/dist/legacy/search/customQuery.js +73 -0
  38. package/dist/legacy/search/customQuery.js.map +1 -0
  39. package/dist/legacy/search/index.d.ts +1 -0
  40. package/dist/legacy/search/index.js +18 -0
  41. package/dist/legacy/search/index.js.map +1 -0
  42. package/dist/model/default-scope.d.ts +10 -0
  43. package/dist/model/default-scope.js +47 -0
  44. package/dist/model/default-scope.js.map +1 -0
  45. package/dist/model/hydrated-document.d.ts +30 -0
  46. package/dist/model/hydrated-document.js +118 -0
  47. package/dist/model/hydrated-document.js.map +1 -0
  48. package/dist/model/include.d.ts +33 -0
  49. package/dist/model/include.js +250 -0
  50. package/dist/model/include.js.map +1 -0
  51. package/dist/model/index.d.ts +192 -52
  52. package/dist/model/index.js +646 -172
  53. package/dist/model/index.js.map +1 -1
  54. package/dist/model/indexes.d.ts +18 -0
  55. package/dist/model/indexes.js +155 -0
  56. package/dist/model/indexes.js.map +1 -0
  57. package/dist/model/keyspace.d.ts +9 -0
  58. package/dist/model/keyspace.js +28 -0
  59. package/dist/model/keyspace.js.map +1 -0
  60. package/dist/model/read-helpers.d.ts +36 -0
  61. package/dist/model/read-helpers.js +275 -0
  62. package/dist/model/read-helpers.js.map +1 -0
  63. package/dist/model/safe-query.d.ts +23 -0
  64. package/dist/model/safe-query.js +138 -0
  65. package/dist/model/safe-query.js.map +1 -0
  66. package/dist/model/ttl.d.ts +9 -0
  67. package/dist/model/ttl.js +73 -0
  68. package/dist/model/ttl.js.map +1 -0
  69. package/dist/model/validation.d.ts +5 -0
  70. package/dist/model/validation.js +104 -0
  71. package/dist/model/validation.js.map +1 -0
  72. package/dist/model/write-helpers.d.ts +39 -0
  73. package/dist/model/write-helpers.js +245 -0
  74. package/dist/model/write-helpers.js.map +1 -0
  75. package/dist/next.d.ts +204 -0
  76. package/dist/next.js +1190 -0
  77. package/dist/next.js.map +1 -0
  78. package/dist/next.types.d.ts +1 -0
  79. package/dist/next.types.js +38 -0
  80. package/dist/next.types.js.map +1 -0
  81. package/dist/pagination/index.d.ts +1 -0
  82. package/dist/pagination/index.js +1 -0
  83. package/dist/pagination/index.js.map +1 -1
  84. package/dist/pagination/pagination.d.ts +1 -8
  85. package/dist/pagination/pagination.js +16 -29
  86. package/dist/pagination/pagination.js.map +1 -1
  87. package/dist/pagination/safe-pagination.d.ts +15 -0
  88. package/dist/pagination/safe-pagination.js +221 -0
  89. package/dist/pagination/safe-pagination.js.map +1 -0
  90. package/dist/pagination/types.d.ts +11 -0
  91. package/dist/pagination/types.js +3 -0
  92. package/dist/pagination/types.js.map +1 -0
  93. package/dist/search/customQuery.d.ts +10 -3
  94. package/dist/search/customQuery.js +17 -18
  95. package/dist/search/customQuery.js.map +1 -1
  96. package/dist/shared/common.model.js +2 -2
  97. package/dist/shared/common.model.js.map +1 -1
  98. package/dist/timeseries/index.d.ts +1 -0
  99. package/dist/timeseries/index.js +18 -0
  100. package/dist/timeseries/index.js.map +1 -0
  101. package/dist/timeseries/time-series-model.d.ts +60 -0
  102. package/dist/timeseries/time-series-model.js +267 -0
  103. package/dist/timeseries/time-series-model.js.map +1 -0
  104. package/dist/utils/awaitTo.d.ts +1 -1
  105. package/dist/utils/awaitTo.js +1 -1
  106. package/dist/utils/awaitTo.js.map +1 -1
  107. package/docs/beta-migration.md +175 -0
  108. package/docs/document-modeling.md +133 -0
  109. package/docs/next-primitives.md +81 -0
  110. package/legacy/index.js +1 -0
  111. package/legacy/package.json +4 -0
  112. package/next/index.js +1 -0
  113. package/next/package.json +4 -0
  114. package/package.json +18 -10
  115. package/dist/connection.d.ts +0 -42
  116. package/dist/connection.js +0 -156
  117. package/dist/connection.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ import type { MutateInOptions, ReplaceOptions } from 'couchbase';
2
+ import type { PatchByIdArgs } from './write-helpers';
3
+ import type { AutoModelFields, DeleteByIdOptions, UpdateOptions } from './index';
4
+ export interface HydratedModel<T> {
5
+ getById(id: string): Promise<T & AutoModelFields>;
6
+ replaceById(id: string, data: T, options?: UpdateOptions): Promise<T & AutoModelFields>;
7
+ patchById(id: string, patch: PatchByIdArgs, options?: MutateInOptions): Promise<T & AutoModelFields>;
8
+ deleteById(id: string, options?: DeleteByIdOptions): Promise<boolean | (T & AutoModelFields)>;
9
+ }
10
+ export type HydratedDocumentData<T> = T & AutoModelFields;
11
+ export declare class HydratedDocument<T extends {
12
+ id: string;
13
+ } = any> {
14
+ private readonly __model;
15
+ constructor(model: HydratedModel<T>, data: HydratedDocumentData<T>);
16
+ save(options?: ReplaceOptions & {
17
+ validate?: boolean;
18
+ cas?: any;
19
+ }): Promise<this>;
20
+ patch(patch: PatchByIdArgs, options?: MutateInOptions): Promise<this>;
21
+ reload(): Promise<this>;
22
+ delete(options?: DeleteByIdOptions): Promise<boolean | (T & AutoModelFields)>;
23
+ toJSON(): HydratedDocumentData<T>;
24
+ }
25
+ export type Hydrated<T extends {
26
+ id: string;
27
+ } = any> = HydratedDocument<T> & HydratedDocumentData<T>;
28
+ export declare const hydrate: <T extends {
29
+ id: string;
30
+ }>(model: HydratedModel<T>, data: HydratedDocumentData<T>) => Hydrated<T>;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.hydrate = exports.HydratedDocument = void 0;
40
+ var HydratedDocument = /** @class */ (function () {
41
+ function HydratedDocument(model, data) {
42
+ Object.defineProperty(this, '__model', {
43
+ value: model,
44
+ enumerable: false,
45
+ });
46
+ Object.assign(this, data);
47
+ }
48
+ HydratedDocument.prototype.save = function (options) {
49
+ return __awaiter(this, void 0, void 0, function () {
50
+ var data, saved;
51
+ return __generator(this, function (_a) {
52
+ switch (_a.label) {
53
+ case 0:
54
+ data = this.toJSON();
55
+ return [4 /*yield*/, this.__model.replaceById(data.id, data, options)];
56
+ case 1:
57
+ saved = _a.sent();
58
+ Object.assign(this, saved);
59
+ return [2 /*return*/, this];
60
+ }
61
+ });
62
+ });
63
+ };
64
+ HydratedDocument.prototype.patch = function (patch, options) {
65
+ return __awaiter(this, void 0, void 0, function () {
66
+ var data, patched;
67
+ return __generator(this, function (_a) {
68
+ switch (_a.label) {
69
+ case 0:
70
+ data = this.toJSON();
71
+ return [4 /*yield*/, this.__model.patchById(data.id, patch, options)];
72
+ case 1:
73
+ patched = _a.sent();
74
+ Object.assign(this, patched);
75
+ return [2 /*return*/, this];
76
+ }
77
+ });
78
+ });
79
+ };
80
+ HydratedDocument.prototype.reload = function () {
81
+ return __awaiter(this, void 0, void 0, function () {
82
+ var data, reloaded;
83
+ return __generator(this, function (_a) {
84
+ switch (_a.label) {
85
+ case 0:
86
+ data = this.toJSON();
87
+ return [4 /*yield*/, this.__model.getById(data.id)];
88
+ case 1:
89
+ reloaded = _a.sent();
90
+ Object.assign(this, reloaded);
91
+ return [2 /*return*/, this];
92
+ }
93
+ });
94
+ });
95
+ };
96
+ HydratedDocument.prototype.delete = function (options) {
97
+ return __awaiter(this, void 0, void 0, function () {
98
+ var data;
99
+ return __generator(this, function (_a) {
100
+ data = this.toJSON();
101
+ return [2 /*return*/, this.__model.deleteById(data.id, options)];
102
+ });
103
+ });
104
+ };
105
+ HydratedDocument.prototype.toJSON = function () {
106
+ var _this = this;
107
+ var json = {};
108
+ Object.keys(this).forEach(function (key) {
109
+ json[key] = _this[key];
110
+ });
111
+ return json;
112
+ };
113
+ return HydratedDocument;
114
+ }());
115
+ exports.HydratedDocument = HydratedDocument;
116
+ var hydrate = function (model, data) { return new HydratedDocument(model, data); };
117
+ exports.hydrate = hydrate;
118
+ //# sourceMappingURL=hydrated-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrated-document.js","sourceRoot":"","sources":["../../src/model/hydrated-document.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA;IAGI,0BAAY,KAAuB,EAAE,IAA6B;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE;YACnC,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEY,+BAAI,GAAjB,UAAkB,OAA0D;;;;;;wBAClE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAsB,CAAC;wBACjC,qBAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAwB,CAAC,EAAA;;wBAA/E,KAAK,GAAG,SAAuE;wBACrF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;wBAE3B,sBAAO,IAAI,EAAC;;;;KACf;IAEY,gCAAK,GAAlB,UAAmB,KAAoB,EAAE,OAAyB;;;;;;wBACxD,IAAI,GAAG,IAAI,CAAC,MAAM,EAAsB,CAAC;wBAC/B,qBAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAA;;wBAA/D,OAAO,GAAG,SAAqD;wBACrE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAE7B,sBAAO,IAAI,EAAC;;;;KACf;IAEY,iCAAM,GAAnB;;;;;;wBACU,IAAI,GAAG,IAAI,CAAC,MAAM,EAAsB,CAAC;wBAC9B,qBAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAA;;wBAA9C,QAAQ,GAAG,SAAmC;wBACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;wBAE9B,sBAAO,IAAI,EAAC;;;;KACf;IAEY,iCAAM,GAAnB,UAAoB,OAA2B;;;;gBACrC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAsB,CAAC;gBAE/C,sBAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC;;;KACpD;IAEM,iCAAM,GAAb;QAAA,iBAQC;QAPG,IAAM,IAAI,GAAQ,EAAE,CAAC;QAErB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,uBAAC;AAAD,CAAC,AAnDD,IAmDC;AAnDY,4CAAgB;AAuDtB,IAAM,OAAO,GAAG,UACnB,KAAuB,EACvB,IAA6B,IACf,OAAA,IAAI,gBAAgB,CAAI,KAAK,EAAE,IAAI,CAAgB,EAAnD,CAAmD,CAAC;AAHzD,QAAA,OAAO,WAGkD","sourcesContent":["import type {MutateInOptions, ReplaceOptions} from 'couchbase';\n\nimport type {PatchByIdArgs} from './write-helpers';\n\nimport type {AutoModelFields, DeleteByIdOptions, UpdateOptions} from './index';\n\nexport interface HydratedModel<T> {\n getById(id: string): Promise<T & AutoModelFields>;\n replaceById(id: string, data: T, options?: UpdateOptions): Promise<T & AutoModelFields>;\n patchById(\n id: string,\n patch: PatchByIdArgs,\n options?: MutateInOptions\n ): Promise<T & AutoModelFields>;\n deleteById(id: string, options?: DeleteByIdOptions): Promise<boolean | (T & AutoModelFields)>;\n}\n\nexport type HydratedDocumentData<T> = T & AutoModelFields;\n\nexport class HydratedDocument<T extends {id: string} = any> {\n private readonly __model: HydratedModel<T>;\n\n constructor(model: HydratedModel<T>, data: HydratedDocumentData<T>) {\n Object.defineProperty(this, '__model', {\n value: model,\n enumerable: false,\n });\n\n Object.assign(this, data);\n }\n\n public async save(options?: ReplaceOptions & {validate?: boolean; cas?: any}): Promise<this> {\n const data = this.toJSON() as T & {id: string};\n const saved = await this.__model.replaceById(data.id, data, options as UpdateOptions);\n Object.assign(this, saved);\n\n return this;\n }\n\n public async patch(patch: PatchByIdArgs, options?: MutateInOptions): Promise<this> {\n const data = this.toJSON() as T & {id: string};\n const patched = await this.__model.patchById(data.id, patch, options);\n Object.assign(this, patched);\n\n return this;\n }\n\n public async reload(): Promise<this> {\n const data = this.toJSON() as T & {id: string};\n const reloaded = await this.__model.getById(data.id);\n Object.assign(this, reloaded);\n\n return this;\n }\n\n public async delete(options?: DeleteByIdOptions): Promise<boolean | (T & AutoModelFields)> {\n const data = this.toJSON() as T & {id: string};\n\n return this.__model.deleteById(data.id, options);\n }\n\n public toJSON(): HydratedDocumentData<T> {\n const json: any = {};\n\n Object.keys(this).forEach((key) => {\n json[key] = this[key];\n });\n\n return json;\n }\n}\n\nexport type Hydrated<T extends {id: string} = any> = HydratedDocument<T> & HydratedDocumentData<T>;\n\nexport const hydrate = <T extends {id: string}>(\n model: HydratedModel<T>,\n data: HydratedDocumentData<T>\n): Hydrated<T> => new HydratedDocument<T>(model, data) as Hydrated<T>;\n"]}
@@ -0,0 +1,33 @@
1
+ import { LogicalWhereExpr, SortType } from '../query/interface/query.types';
2
+ export type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';
3
+ export interface IncludeDefinition {
4
+ as: string;
5
+ key?: string;
6
+ keys?: string;
7
+ keyspace?: string;
8
+ model?: string | {
9
+ keyspace: () => string;
10
+ };
11
+ type?: IncludeType;
12
+ optional?: boolean;
13
+ }
14
+ export interface IncludedSelectionQueryArgs {
15
+ keyspace: string;
16
+ collectionName: string;
17
+ select?: any[] | string;
18
+ where?: LogicalWhereExpr;
19
+ orderBy?: Record<string, SortType>;
20
+ include?: IncludeDefinition[];
21
+ limit?: number;
22
+ page?: number;
23
+ offset?: number;
24
+ sourceAlias?: string;
25
+ }
26
+ export interface IncludedSelectionQuery {
27
+ query: string;
28
+ parameters: Record<string, any>;
29
+ selectAll: boolean;
30
+ resultKey?: string;
31
+ }
32
+ export declare const buildIncludeClauses: (keyspace: string, include?: IncludeDefinition[], sourceAlias?: string) => string;
33
+ export declare const buildIncludedSelectionQuery: (args: IncludedSelectionQueryArgs) => IncludedSelectionQuery;
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
19
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
+ if (ar || !(i in from)) {
21
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
+ ar[i] = from[i];
23
+ }
24
+ }
25
+ return to.concat(ar || Array.prototype.slice.call(from));
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = void 0;
29
+ var helpers_1 = require("../query/helpers");
30
+ var utils_1 = require("../query/utils");
31
+ var keyspace_1 = require("./keyspace");
32
+ var comparisonOperators = {
33
+ $eq: '=',
34
+ $neq: '!=',
35
+ $gt: '>',
36
+ $gte: '>=',
37
+ $lt: '<',
38
+ $lte: '<=',
39
+ };
40
+ var stringComparisonOperators = {
41
+ $like: 'LIKE',
42
+ $notLike: 'NOT LIKE',
43
+ };
44
+ var emptyComparisonOperators = {
45
+ $isNull: 'IS NULL',
46
+ $isNotNull: 'IS NOT NULL',
47
+ $isMissing: 'IS MISSING',
48
+ $isNotMissing: 'IS NOT MISSING',
49
+ $isValued: 'IS VALUED',
50
+ $isNotValued: 'IS NOT VALUED',
51
+ };
52
+ var multipleComparisonOperators = {
53
+ $btw: 'BETWEEN',
54
+ $notBtw: 'NOT BETWEEN',
55
+ };
56
+ var logicalOperators = {
57
+ $and: 'AND',
58
+ $or: 'OR',
59
+ };
60
+ var IncludeParameterStore = /** @class */ (function () {
61
+ function IncludeParameterStore() {
62
+ this.parameters = {};
63
+ this.index = 0;
64
+ }
65
+ IncludeParameterStore.prototype.add = function (value) {
66
+ var key = "cs_param_".concat(this.index);
67
+ this.index += 1;
68
+ this.parameters[key] = value;
69
+ return "$".concat(key);
70
+ };
71
+ IncludeParameterStore.prototype.set = function (key, value) {
72
+ this.parameters[key] = value;
73
+ return "$".concat(key);
74
+ };
75
+ return IncludeParameterStore;
76
+ }());
77
+ var safeAlias = function (alias) {
78
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(alias) ? alias : (0, keyspace_1.escapeIdentifier)(alias);
79
+ };
80
+ var keyspaceFromInclude = function (include, defaultKeyspace) {
81
+ if (include.keyspace) {
82
+ return include.keyspace;
83
+ }
84
+ if (typeof include.model === 'string') {
85
+ return include.model;
86
+ }
87
+ if (include.model) {
88
+ return include.model.keyspace();
89
+ }
90
+ return defaultKeyspace;
91
+ };
92
+ var sourceField = function (field, sourceAlias) {
93
+ if (field.indexOf("".concat(sourceAlias, ".")) === 0) {
94
+ return field;
95
+ }
96
+ return "".concat(sourceAlias, ".").concat((0, utils_1.escapeReservedWords)(field));
97
+ };
98
+ var includeOperator = function (include) {
99
+ if (include.type === 'leftNest') {
100
+ return 'LEFT NEST';
101
+ }
102
+ if (include.type === 'nest') {
103
+ return include.optional ? 'LEFT NEST' : 'NEST';
104
+ }
105
+ if (include.type === 'leftJoin') {
106
+ return 'LEFT JOIN';
107
+ }
108
+ if (include.keys) {
109
+ return include.optional ? 'LEFT NEST' : 'NEST';
110
+ }
111
+ return include.optional ? 'LEFT JOIN' : 'JOIN';
112
+ };
113
+ var buildIncludeClauses = function (keyspace, include, sourceAlias) {
114
+ if (include === void 0) { include = []; }
115
+ if (sourceAlias === void 0) { sourceAlias = 'doc'; }
116
+ return include
117
+ .map(function (item) {
118
+ var key = item.key || item.keys;
119
+ if (!key) {
120
+ throw new Error("include ".concat(item.as, " requires key or keys"));
121
+ }
122
+ var alias = safeAlias(item.as);
123
+ return "".concat(includeOperator(item), " ").concat(keyspaceFromInclude(item, keyspace), " AS ").concat(alias, " ON KEYS ").concat(sourceField(key, sourceAlias));
124
+ })
125
+ .join(' ');
126
+ };
127
+ exports.buildIncludeClauses = buildIncludeClauses;
128
+ var hasLogicalOperator = function (clause) {
129
+ return Object.keys(clause).some(function (key) { return ['$and', '$or', '$not'].includes(key); });
130
+ };
131
+ var buildComparisonExpr = function (fieldName, comparison, store, sourceAlias) {
132
+ var field = sourceField(fieldName, sourceAlias);
133
+ var expr = Object.keys(comparison)
134
+ .map(function (operator) {
135
+ if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {
136
+ return "".concat(field, " ").concat(emptyComparisonOperators[operator]);
137
+ }
138
+ if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {
139
+ return "".concat(field).concat(comparisonOperators[operator]).concat(store.add(comparison[operator]));
140
+ }
141
+ if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {
142
+ return "".concat(field, " ").concat(stringComparisonOperators[operator], " ").concat(store.add(comparison[operator]));
143
+ }
144
+ if (Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&
145
+ Array.isArray(comparison[operator])) {
146
+ var _a = __read(comparison[operator], 2), from = _a[0], to = _a[1];
147
+ return "".concat(field, " ").concat(multipleComparisonOperators[operator], " ").concat(store.add(from), " AND ").concat(store.add(to));
148
+ }
149
+ throw new Error("Unsupported include where operator: ".concat(operator));
150
+ })
151
+ .join(' AND ');
152
+ return Object.keys(comparison).length > 1 ? "(".concat(expr, ")") : expr;
153
+ };
154
+ var buildFieldExpr = function (field, store, sourceAlias) {
155
+ return Object.keys(field)
156
+ .map(function (fieldName) {
157
+ var value = field[fieldName];
158
+ if (value &&
159
+ typeof value === 'object' &&
160
+ !Array.isArray(value) &&
161
+ Object.keys(value).some(function (operator) { return operator.indexOf('$') === 0; })) {
162
+ return buildComparisonExpr(fieldName, value, store, sourceAlias);
163
+ }
164
+ if (fieldName.indexOf('$') === -1) {
165
+ return "".concat(sourceField(fieldName, sourceAlias), "=").concat(store.add(value));
166
+ }
167
+ throw new Error("Unsupported include where field: ".concat(fieldName));
168
+ })
169
+ .join(' AND ');
170
+ };
171
+ var buildWhereClauseExpr = function (clause, store, sourceAlias) {
172
+ if (!hasLogicalOperator(clause)) {
173
+ return buildFieldExpr(clause, store, sourceAlias);
174
+ }
175
+ return Object.keys(clause)
176
+ .map(function (key) {
177
+ var _a;
178
+ var value = clause[key];
179
+ if (Array.isArray(value) &&
180
+ Object.prototype.hasOwnProperty.call(logicalOperators, key)) {
181
+ return "(".concat(value
182
+ .map(function (item) {
183
+ return buildWhereClauseExpr(item, store, sourceAlias);
184
+ })
185
+ .join(" ".concat(logicalOperators[key], " ")), ")");
186
+ }
187
+ if (key === '$not' && Array.isArray(value)) {
188
+ return "NOT (".concat(value
189
+ .map(function (item) {
190
+ return buildWhereClauseExpr(item, store, sourceAlias);
191
+ })
192
+ .join(' AND '), ")");
193
+ }
194
+ return buildWhereClauseExpr((_a = {}, _a[key] = value, _a), store, sourceAlias);
195
+ })
196
+ .join(' AND ');
197
+ };
198
+ var buildWhereExpr = function (expr, store, sourceAlias) {
199
+ return expr ? " WHERE ".concat(buildWhereClauseExpr(expr, store, sourceAlias)) : '';
200
+ };
201
+ var buildOrderByExpr = function (orderBy, sourceAlias) {
202
+ return orderBy
203
+ ? " ORDER BY ".concat(Object.keys(orderBy)
204
+ .map(function (field) { return "".concat(sourceField(field, sourceAlias), " ").concat(orderBy[field]); })
205
+ .join(','))
206
+ : '';
207
+ };
208
+ var buildSelectExpr = function (select, include, sourceAlias) {
209
+ if (!select || select === '*') {
210
+ var aliases = include.map(function (item) { return safeAlias(item.as); });
211
+ var mergeObject = aliases.map(function (alias) { return "".concat(JSON.stringify(alias), ": ").concat(alias); }).join(',');
212
+ return {
213
+ expr: "OBJECT_CONCAT(".concat(sourceAlias, ", {").concat(mergeObject, "}) AS ").concat(sourceAlias),
214
+ selectAll: true,
215
+ resultKey: sourceAlias,
216
+ };
217
+ }
218
+ var includeSelect = include.map(function (item) {
219
+ var alias = safeAlias(item.as);
220
+ return "".concat(alias, " AS ").concat(alias);
221
+ });
222
+ if (typeof select === 'string') {
223
+ return { expr: __spreadArray([select], __read(includeSelect), false).join(','), selectAll: false };
224
+ }
225
+ var modelSelect = select.map(function (item) {
226
+ return typeof item === 'string'
227
+ ? sourceField(item, sourceAlias)
228
+ : (0, helpers_1.buildSelectArrayExpr)([item]);
229
+ });
230
+ return { expr: __spreadArray(__spreadArray([], __read(modelSelect), false), __read(includeSelect), false).join(','), selectAll: false };
231
+ };
232
+ var buildIncludedSelectionQuery = function (args) {
233
+ var sourceAlias = safeAlias(args.sourceAlias || 'doc');
234
+ var include = args.include || [];
235
+ var store = new IncludeParameterStore();
236
+ var limit = typeof args.limit === 'number' ? args.limit : 10;
237
+ var page = typeof args.page === 'number' ? args.page : 0;
238
+ var offset = typeof args.offset === 'number' ? args.offset : page * limit;
239
+ var _a = buildSelectExpr(args.select, include, sourceAlias), expr = _a.expr, selectAll = _a.selectAll, resultKey = _a.resultKey;
240
+ var joins = (0, exports.buildIncludeClauses)(args.keyspace, include, sourceAlias);
241
+ var limitExpr = " LIMIT ".concat(store.set('cs_limit', limit), " OFFSET ").concat(store.set('cs_offset', offset));
242
+ return {
243
+ query: "SELECT ".concat(expr, " FROM ").concat(args.keyspace, " AS ").concat(sourceAlias, " ").concat(joins).concat(buildWhereExpr(args.where, store, sourceAlias)).concat(buildOrderByExpr(args.orderBy, sourceAlias)).concat(limitExpr),
244
+ parameters: store.parameters,
245
+ resultKey: resultKey,
246
+ selectAll: selectAll,
247
+ };
248
+ };
249
+ exports.buildIncludedSelectionQuery = buildIncludedSelectionQuery;
250
+ //# sourceMappingURL=include.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":"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","sourcesContent":["import {buildSelectArrayExpr} from '../query/helpers';\nimport {LogicalWhereExpr, SortType} from '../query/interface/query.types';\nimport {escapeReservedWords} from '../query/utils';\n\nimport {escapeIdentifier} from './keyspace';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n key?: string;\n keys?: string;\n keyspace?: string;\n model?: string | {keyspace: () => string};\n type?: IncludeType;\n optional?: boolean;\n}\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = (alias: string): string => {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(alias) ? alias : escapeIdentifier(alias);\n};\n\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n if (include.keyspace) {\n return include.keyspace;\n }\n\n if (typeof include.model === 'string') {\n return include.model;\n }\n\n if (include.model) {\n return include.model.keyspace();\n }\n\n return defaultKeyspace;\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n if (field.indexOf(`${sourceAlias}.`) === 0) {\n return field;\n }\n\n return `${sourceAlias}.${escapeReservedWords(field)}`;\n};\n\nconst includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: IncludeDefinition[] = [],\n sourceAlias = 'doc'\n): string => {\n return include\n .map((item) => {\n const key = item.key || item.keys;\n\n if (!key) {\n throw new Error(`include ${item.as} requires key or keys`);\n }\n\n const alias = safeAlias(item.as);\n\n return `${includeOperator(item)} ${keyspaceFromInclude(\n item,\n keyspace\n )} AS ${alias} ON KEYS ${sourceField(key, sourceAlias)}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => `${sourceField(field, sourceAlias)} ${orderBy[field]}`)\n .join(',')}`\n : '';\n};\n\nconst buildSelectExpr = (\n select: any[] | string | undefined,\n include: IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n if (!select || select === '*') {\n const aliases = include.map((item) => safeAlias(item.as));\n const mergeObject = aliases.map((alias) => `${JSON.stringify(alias)}: ${alias}`).join(',');\n\n return {\n expr: `OBJECT_CONCAT(${sourceAlias}, {${mergeObject}}) AS ${sourceAlias}`,\n selectAll: true,\n resultKey: sourceAlias,\n };\n }\n\n const includeSelect = include.map((item) => {\n const alias = safeAlias(item.as);\n\n return `${alias} AS ${alias}`;\n });\n\n if (typeof select === 'string') {\n return {expr: [select, ...includeSelect].join(','), selectAll: false};\n }\n\n const modelSelect = select.map((item) => {\n return typeof item === 'string'\n ? sourceField(item, sourceAlias)\n : buildSelectArrayExpr([item]);\n });\n\n return {expr: [...modelSelect, ...includeSelect].join(','), selectAll: false};\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = safeAlias(args.sourceAlias || 'doc');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${sourceAlias} ${joins}${buildWhereExpr(\n args.where,\n store,\n sourceAlias\n )}${buildOrderByExpr(args.orderBy, sourceAlias)}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}