couchset 0.2.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +284 -153
- package/dist/connection/connection.d.ts +68 -0
- package/dist/connection/connection.js +485 -0
- package/dist/connection/connection.js.map +1 -0
- package/dist/connection/env.d.ts +2 -0
- package/dist/connection/env.js +16 -0
- package/dist/connection/env.js.map +1 -0
- package/dist/connection/index.d.ts +3 -0
- package/dist/connection/index.js +25 -0
- package/dist/connection/index.js.map +1 -0
- package/dist/connection/types.d.ts +25 -0
- package/dist/connection/types.js +3 -0
- package/dist/connection/types.js.map +1 -0
- package/dist/database.d.ts +9 -0
- package/dist/database.js +196 -0
- package/dist/database.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +53 -8
- package/dist/index.js.map +1 -1
- package/dist/legacy/connection.d.ts +2 -0
- package/dist/legacy/connection.js +24 -0
- package/dist/legacy/connection.js.map +1 -0
- package/dist/legacy/index.d.ts +10 -0
- package/dist/legacy/index.js +93 -0
- package/dist/legacy/index.js.map +1 -0
- package/dist/legacy/model.d.ts +55 -0
- package/dist/legacy/model.js +282 -0
- package/dist/legacy/model.js.map +1 -0
- package/dist/legacy/pagination/index.d.ts +1 -0
- package/dist/legacy/pagination/index.js +18 -0
- package/dist/legacy/pagination/index.js.map +1 -0
- package/dist/legacy/pagination/pagination.d.ts +12 -0
- package/dist/legacy/pagination/pagination.js +85 -0
- package/dist/legacy/pagination/pagination.js.map +1 -0
- package/dist/legacy/search/customQuery.d.ts +13 -0
- package/dist/legacy/search/customQuery.js +73 -0
- package/dist/legacy/search/customQuery.js.map +1 -0
- package/dist/legacy/search/index.d.ts +1 -0
- package/dist/legacy/search/index.js +18 -0
- package/dist/legacy/search/index.js.map +1 -0
- package/dist/model/default-scope.d.ts +10 -0
- package/dist/model/default-scope.js +47 -0
- package/dist/model/default-scope.js.map +1 -0
- package/dist/model/hydrated-document.d.ts +30 -0
- package/dist/model/hydrated-document.js +118 -0
- package/dist/model/hydrated-document.js.map +1 -0
- package/dist/model/include.d.ts +33 -0
- package/dist/model/include.js +250 -0
- package/dist/model/include.js.map +1 -0
- package/dist/model/index.d.ts +137 -51
- package/dist/model/index.js +519 -174
- package/dist/model/index.js.map +1 -1
- package/dist/model/indexes.d.ts +16 -0
- package/dist/model/indexes.js +155 -0
- package/dist/model/indexes.js.map +1 -0
- package/dist/model/keyspace.d.ts +9 -0
- package/dist/model/keyspace.js +28 -0
- package/dist/model/keyspace.js.map +1 -0
- package/dist/model/read-helpers.d.ts +36 -0
- package/dist/model/read-helpers.js +275 -0
- package/dist/model/read-helpers.js.map +1 -0
- package/dist/model/safe-query.d.ts +23 -0
- package/dist/model/safe-query.js +138 -0
- package/dist/model/safe-query.js.map +1 -0
- package/dist/model/ttl.d.ts +9 -0
- package/dist/model/ttl.js +73 -0
- package/dist/model/ttl.js.map +1 -0
- package/dist/model/validation.d.ts +5 -0
- package/dist/model/validation.js +104 -0
- package/dist/model/validation.js.map +1 -0
- package/dist/model/write-helpers.d.ts +31 -0
- package/dist/model/write-helpers.js +220 -0
- package/dist/model/write-helpers.js.map +1 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +1 -0
- package/dist/pagination/index.js.map +1 -1
- package/dist/pagination/pagination.d.ts +1 -8
- package/dist/pagination/pagination.js +16 -29
- package/dist/pagination/pagination.js.map +1 -1
- package/dist/pagination/safe-pagination.d.ts +15 -0
- package/dist/pagination/safe-pagination.js +221 -0
- package/dist/pagination/safe-pagination.js.map +1 -0
- package/dist/pagination/types.d.ts +11 -0
- package/dist/pagination/types.js +3 -0
- package/dist/pagination/types.js.map +1 -0
- package/dist/search/customQuery.d.ts +10 -3
- package/dist/search/customQuery.js +17 -18
- package/dist/search/customQuery.js.map +1 -1
- package/dist/shared/common.model.js +2 -2
- package/dist/shared/common.model.js.map +1 -1
- package/dist/timeseries/index.d.ts +1 -0
- package/dist/timeseries/index.js +18 -0
- package/dist/timeseries/index.js.map +1 -0
- package/dist/timeseries/time-series-model.d.ts +60 -0
- package/dist/timeseries/time-series-model.js +267 -0
- package/dist/timeseries/time-series-model.js.map +1 -0
- package/dist/utils/awaitTo.d.ts +1 -1
- package/dist/utils/awaitTo.js +1 -1
- package/dist/utils/awaitTo.js.map +1 -1
- package/docs/beta-migration.md +175 -0
- package/legacy/index.js +1 -0
- package/legacy/package.json +4 -0
- package/next/index.js +1 -0
- package/next/package.json +4 -0
- package/package.json +13 -8
- package/dist/connection.d.ts +0 -42
- package/dist/connection.js +0 -156
- package/dist/connection.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pagination/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface PaginationArgs {\n bucketName: string;\n resultKey?: string;\n select?: any[] | string;\n where: any;\n page?: number;\n limit?: number;\n offset?: number;\n orderBy?: any;\n throwOnError?: boolean;\n}\n"]}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
export type CustomQueryParameters = {
|
|
2
|
+
[key: string]: any;
|
|
3
|
+
} | any[];
|
|
4
|
+
export type CustomQueryLogger = (message: string, details?: any) => void;
|
|
1
5
|
export interface CustomQueryArgs {
|
|
2
|
-
query:
|
|
6
|
+
query: string;
|
|
3
7
|
limit: number;
|
|
4
|
-
params
|
|
8
|
+
params?: CustomQueryParameters;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
logger?: CustomQueryLogger;
|
|
11
|
+
throwOnError?: boolean;
|
|
5
12
|
}
|
|
6
13
|
export interface CustomQueryPagination {
|
|
7
14
|
hasNext: boolean;
|
|
8
|
-
params
|
|
15
|
+
params?: CustomQueryParameters;
|
|
9
16
|
}
|
|
10
17
|
/**
|
|
11
18
|
* Common pagination
|
|
@@ -49,31 +49,30 @@ var connection_1 = __importDefault(require("../connection"));
|
|
|
49
49
|
* @param args PaginationArgs
|
|
50
50
|
*/
|
|
51
51
|
var CustomQuery = function (args) { return __awaiter(void 0, void 0, void 0, function () {
|
|
52
|
-
var query, limit, params, cluster,
|
|
53
|
-
return __generator(this, function (
|
|
54
|
-
switch (
|
|
52
|
+
var query, limit, params, _a, debug, logger, _b, throwOnError, cluster, queryOptions, _c, rows, totalItems, hasNext, error_1;
|
|
53
|
+
return __generator(this, function (_d) {
|
|
54
|
+
switch (_d.label) {
|
|
55
55
|
case 0:
|
|
56
|
-
query = args.query, limit = args.limit, params = args.params;
|
|
56
|
+
query = args.query, limit = args.limit, params = args.params, _a = args.debug, debug = _a === void 0 ? false : _a, logger = args.logger, _b = args.throwOnError, throwOnError = _b === void 0 ? true : _b;
|
|
57
57
|
cluster = connection_1.default.Instance.cluster;
|
|
58
|
-
|
|
58
|
+
queryOptions = params === undefined ? undefined : { parameters: params };
|
|
59
|
+
_d.label = 1;
|
|
59
60
|
case 1:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
_d.trys.push([1, 3, , 4]);
|
|
62
|
+
if (debug && logger) {
|
|
63
|
+
logger('couchset customQuery', { query: query, options: queryOptions });
|
|
64
|
+
}
|
|
65
|
+
return [4 /*yield*/, cluster.query(query, queryOptions)];
|
|
63
66
|
case 2:
|
|
64
|
-
|
|
67
|
+
_c = (_d.sent()).rows, rows = _c === void 0 ? [] : _c;
|
|
65
68
|
totalItems = rows.length;
|
|
66
|
-
hasNext =
|
|
67
|
-
if (totalItems >= limit) {
|
|
68
|
-
hasNext = true;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
hasNext = false;
|
|
72
|
-
}
|
|
69
|
+
hasNext = totalItems >= limit;
|
|
73
70
|
return [2 /*return*/, [rows, { params: params, hasNext: hasNext }]];
|
|
74
71
|
case 3:
|
|
75
|
-
error_1 =
|
|
76
|
-
|
|
72
|
+
error_1 = _d.sent();
|
|
73
|
+
if (throwOnError) {
|
|
74
|
+
throw error_1;
|
|
75
|
+
}
|
|
77
76
|
return [2 /*return*/, [[], { params: params, hasNext: false }]];
|
|
78
77
|
case 4: return [2 /*return*/];
|
|
79
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customQuery.js","sourceRoot":"","sources":["../../src/search/customQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAAgD;
|
|
1
|
+
{"version":3,"file":"customQuery.js","sourceRoot":"","sources":["../../src/search/customQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAAgD;AAmBhD;;;;;;GAMG;AACI,IAAM,WAAW,GAAG,UACvB,IAAqB;;;;;gBAEd,KAAK,GAA+D,IAAI,MAAnE,EAAE,KAAK,GAAwD,IAAI,MAA5D,EAAE,MAAM,GAAgD,IAAI,OAApD,EAAE,KAA8C,IAAI,MAArC,EAAb,KAAK,mBAAG,KAAK,KAAA,EAAE,MAAM,GAAyB,IAAI,OAA7B,EAAE,KAAuB,IAAI,aAAR,EAAnB,YAAY,mBAAG,IAAI,KAAA,CAAS;gBAE1E,OAAO,GAAG,oBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC/C,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,UAAU,EAAE,MAAM,EAAC,CAAC;;;;gBAGzE,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;oBAClB,MAAM,CAAC,sBAAsB,EAAE,EAAC,KAAK,OAAA,EAAE,OAAO,EAAE,YAAY,EAAC,CAAC,CAAC;gBACnE,CAAC;gBAEmB,qBAAM,OAAO,CAAC,KAAK,CAAI,KAAK,EAAE,YAAY,CAAC,EAAA;;gBAAxD,KAAa,CAAA,SAA2C,CAAA,KAA/C,EAAT,IAAI,mBAAG,EAAE,KAAA;gBAEV,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBAEzB,OAAO,GAAG,UAAU,IAAI,KAAK,CAAC;gBAEpC,sBAAO,CAAC,IAAI,EAAE,EAAC,MAAM,QAAA,EAAE,OAAO,SAAA,EAAC,CAAC,EAAC;;;gBAEjC,IAAI,YAAY,EAAE,CAAC;oBACf,MAAM,OAAK,CAAC;gBAChB,CAAC;gBAED,sBAAO,CAAC,EAAE,EAAE,EAAC,MAAM,QAAA,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC,EAAC;;;;KAE7C,CAAC;AA3BW,QAAA,WAAW,eA2BtB","sourcesContent":["import CouchbaseConnection from '../connection';\n\nexport type CustomQueryParameters = {[key: string]: any} | any[];\nexport type CustomQueryLogger = (message: string, details?: any) => void;\n\nexport interface CustomQueryArgs {\n query: string;\n limit: number;\n params?: CustomQueryParameters;\n debug?: boolean;\n logger?: CustomQueryLogger;\n throwOnError?: boolean;\n}\n\nexport interface CustomQueryPagination {\n hasNext: boolean;\n params?: CustomQueryParameters;\n}\n\n/**\n * Common pagination\n * query,\n bucketName = \"\",\n select = [\"id\", \"owner\"] || \"*\"\n * @param args PaginationArgs\n */\nexport const CustomQuery = async <T>(\n args: CustomQueryArgs\n): Promise<[T[], CustomQueryPagination]> => {\n const {query, limit, params, debug = false, logger, throwOnError = true} = args;\n\n const cluster = CouchbaseConnection.Instance.cluster;\n const queryOptions = params === undefined ? undefined : {parameters: params};\n\n try {\n if (debug && logger) {\n logger('couchset customQuery', {query, options: queryOptions});\n }\n\n const {rows = []} = await cluster.query<T>(query, queryOptions);\n\n const totalItems = rows.length;\n\n const hasNext = totalItems >= limit;\n\n return [rows, {params, hasNext}];\n } catch (error) {\n if (throwOnError) {\n throw error;\n }\n\n return [[], {params, hasNext: false}];\n }\n};\n"]}
|
|
@@ -55,12 +55,12 @@ var createUpdate = function (args) { return __awaiter(void 0, void 0, void 0, fu
|
|
|
55
55
|
_a.trys.push([1, 5, , 6]);
|
|
56
56
|
if (!!(0, isEmpty_1.default)(id)) return [3 /*break*/, 3];
|
|
57
57
|
// update
|
|
58
|
-
return [4 /*yield*/, model.
|
|
58
|
+
return [4 /*yield*/, model.replaceById(id, data)];
|
|
59
59
|
case 2:
|
|
60
60
|
// update
|
|
61
61
|
_a.sent();
|
|
62
62
|
return [2 /*return*/, data];
|
|
63
|
-
case 3: return [4 /*yield*/, model.
|
|
63
|
+
case 3: return [4 /*yield*/, model.insert(data)];
|
|
64
64
|
case 4:
|
|
65
65
|
createdItem = _a.sent();
|
|
66
66
|
return [2 /*return*/, createdItem];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.model.js","sourceRoot":"","sources":["../../src/shared/common.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAAqC;AACrC,yDAAmC;AACnC,6DAAuC;AAWhC,IAAM,YAAY,GAAG,UAAU,IAAkB;;;;;gBAC7C,KAAK,GAAQ,IAAI,MAAZ,EAAE,EAAE,GAAI,IAAI,GAAR,CAAS;gBACnB,IAAI,GAAQ,IAAA,gBAAM,EAAC,IAAI,CAAC,IAAI,EAAE,kBAAQ,CAAC,CAAC;;;;qBAGtC,CAAC,IAAA,iBAAO,EAAC,EAAE,CAAC,EAAZ,wBAAY;gBACZ,SAAS;gBACT,qBAAM,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"common.model.js","sourceRoot":"","sources":["../../src/shared/common.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAAqC;AACrC,yDAAmC;AACnC,6DAAuC;AAWhC,IAAM,YAAY,GAAG,UAAU,IAAkB;;;;;gBAC7C,KAAK,GAAQ,IAAI,MAAZ,EAAE,EAAE,GAAI,IAAI,GAAR,CAAS;gBACnB,IAAI,GAAQ,IAAA,gBAAM,EAAC,IAAI,CAAC,IAAI,EAAE,kBAAQ,CAAC,CAAC;;;;qBAGtC,CAAC,IAAA,iBAAO,EAAC,EAAE,CAAC,EAAZ,wBAAY;gBACZ,SAAS;gBACT,qBAAM,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,EAAA;;gBADjC,SAAS;gBACT,SAAiC,CAAC;gBAClC,sBAAO,IAAI,EAAC;oBAGI,qBAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAA;;gBAAtC,WAAW,GAAG,SAAwB;gBAC5C,sBAAO,WAAW,EAAC;;;gBAEnB,OAAO,CAAC,KAAK,CAAC,6BAAsB,KAAK,CAAC,cAAc,CAAE,EAAE,OAAK,CAAC,CAAC;gBACnE,sBAAO,IAAI,EAAC;;;;KAEnB,CAAC;AAjBW,QAAA,YAAY,gBAiBvB","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport pickBy from 'lodash/pickBy';\nimport identity from 'lodash/identity';\n\nimport {Model} from '../model';\n\ninterface CreateUpdate {\n model: Model;\n id?: string;\n owner?: string;\n data: any;\n}\n\nexport const createUpdate = async <T>(args: CreateUpdate): Promise<T | null> => {\n const {model, id} = args;\n const data: any = pickBy(args.data, identity);\n\n try {\n if (!isEmpty(id)) {\n // update\n await model.replaceById(id, data);\n return data;\n }\n // create\n const createdItem = await model.insert(data);\n return createdItem;\n } catch (error) {\n console.error(`error creating for ${model.collectionName}`, error);\n return null;\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './time-series-model';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./time-series-model"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/timeseries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC","sourcesContent":["export * from './time-series-model';\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Model, { QueryParameters, SafeQueryOptions, AutoModelFields } from '../model';
|
|
2
|
+
export type TimeSeriesChunkSize = 'hour' | 'day' | 'month';
|
|
3
|
+
export type TimeSeriesAggregate = 'AVG' | 'SUM' | 'MIN' | 'MAX' | 'COUNT';
|
|
4
|
+
export interface TimeSeriesValueMapping {
|
|
5
|
+
field: string;
|
|
6
|
+
alias?: string;
|
|
7
|
+
index?: number;
|
|
8
|
+
aggregate?: TimeSeriesAggregate;
|
|
9
|
+
}
|
|
10
|
+
export interface TimeSeriesModelOptions<T = any> {
|
|
11
|
+
keyField: keyof T | string;
|
|
12
|
+
timeField: keyof T | string;
|
|
13
|
+
values: Array<keyof T | string | TimeSeriesValueMapping>;
|
|
14
|
+
chunkSize?: TimeSeriesChunkSize;
|
|
15
|
+
interval?: string | number;
|
|
16
|
+
model?: Model;
|
|
17
|
+
}
|
|
18
|
+
export interface TimeSeriesAppendOptions {
|
|
19
|
+
chunkDate?: Date | string | number;
|
|
20
|
+
chunkSize?: TimeSeriesChunkSize;
|
|
21
|
+
interval?: string | number;
|
|
22
|
+
writeOptions?: any;
|
|
23
|
+
}
|
|
24
|
+
export interface TimeSeriesRangeArgs {
|
|
25
|
+
startDate: Date | string | number;
|
|
26
|
+
endDate: Date | string | number;
|
|
27
|
+
interval?: string | number;
|
|
28
|
+
where?: Record<string, any>;
|
|
29
|
+
order?: 'ASC' | 'DESC';
|
|
30
|
+
limit?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface TimeSeriesChunk<T = any> {
|
|
33
|
+
id: string;
|
|
34
|
+
key: string;
|
|
35
|
+
[field: string]: any;
|
|
36
|
+
ts_start: number;
|
|
37
|
+
ts_end: number;
|
|
38
|
+
ts_interval?: number;
|
|
39
|
+
ts_data: any[];
|
|
40
|
+
rows: T[];
|
|
41
|
+
}
|
|
42
|
+
export interface TimeSeriesQuery {
|
|
43
|
+
query: string;
|
|
44
|
+
params: QueryParameters;
|
|
45
|
+
}
|
|
46
|
+
export declare const intervalToMilliseconds: (interval: string | number) => number;
|
|
47
|
+
export declare class TimeSeriesModel<T = any> {
|
|
48
|
+
name: string;
|
|
49
|
+
private options;
|
|
50
|
+
model: Model;
|
|
51
|
+
private values;
|
|
52
|
+
constructor(name: string, options: TimeSeriesModelOptions<T>);
|
|
53
|
+
chunkId(key: string, date?: Date | string | number, chunkSize?: TimeSeriesChunkSize): string;
|
|
54
|
+
buildChunk(key: string, rows: T[], options?: TimeSeriesAppendOptions): TimeSeriesChunk<T>;
|
|
55
|
+
appendChunk(key: string, rows: T[], options?: TimeSeriesAppendOptions): Promise<TimeSeriesChunk<T> & AutoModelFields>;
|
|
56
|
+
rangeQuery(key: string, args: TimeSeriesRangeArgs): TimeSeriesQuery;
|
|
57
|
+
range<R = any>(key: string, args: TimeSeriesRangeArgs, options?: SafeQueryOptions): Promise<R[]>;
|
|
58
|
+
queryRows<R = any>(query: string, params?: QueryParameters, options?: SafeQueryOptions): Promise<R[]>;
|
|
59
|
+
}
|
|
60
|
+
export default TimeSeriesModel;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
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);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
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;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
+
if (!m) return o;
|
|
52
|
+
var i = m.call(o), r, ar = [], e;
|
|
53
|
+
try {
|
|
54
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
+
}
|
|
56
|
+
catch (error) { e = { error: error }; }
|
|
57
|
+
finally {
|
|
58
|
+
try {
|
|
59
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
+
}
|
|
61
|
+
finally { if (e) throw e.error; }
|
|
62
|
+
}
|
|
63
|
+
return ar;
|
|
64
|
+
};
|
|
65
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
66
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
67
|
+
if (ar || !(i in from)) {
|
|
68
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
69
|
+
ar[i] = from[i];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
73
|
+
};
|
|
74
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
75
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
76
|
+
};
|
|
77
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
78
|
+
exports.TimeSeriesModel = exports.intervalToMilliseconds = void 0;
|
|
79
|
+
var model_1 = __importDefault(require("../model"));
|
|
80
|
+
var intervalUnits = {
|
|
81
|
+
ms: 1,
|
|
82
|
+
s: 1000,
|
|
83
|
+
m: 60 * 1000,
|
|
84
|
+
h: 60 * 60 * 1000,
|
|
85
|
+
d: 24 * 60 * 60 * 1000,
|
|
86
|
+
};
|
|
87
|
+
var normalizeTime = function (date) {
|
|
88
|
+
if (date instanceof Date) {
|
|
89
|
+
return date.getTime();
|
|
90
|
+
}
|
|
91
|
+
if (typeof date === 'number') {
|
|
92
|
+
return date;
|
|
93
|
+
}
|
|
94
|
+
return new Date(date).getTime();
|
|
95
|
+
};
|
|
96
|
+
var intervalToMilliseconds = function (interval) {
|
|
97
|
+
if (typeof interval === 'number') {
|
|
98
|
+
return interval;
|
|
99
|
+
}
|
|
100
|
+
var match = interval.trim().match(/^(\d+)\s*(ms|s|m|h|d)$/);
|
|
101
|
+
if (!match) {
|
|
102
|
+
throw new Error('interval must be milliseconds or a string ending in ms, s, m, h, or d');
|
|
103
|
+
}
|
|
104
|
+
return Number(match[1]) * intervalUnits[match[2]];
|
|
105
|
+
};
|
|
106
|
+
exports.intervalToMilliseconds = intervalToMilliseconds;
|
|
107
|
+
var datePart = function (date, chunkSize) {
|
|
108
|
+
var year = date.getUTCFullYear();
|
|
109
|
+
var pad = function (value) { return (value < 10 ? "0".concat(value) : "".concat(value)); };
|
|
110
|
+
var month = pad(date.getUTCMonth() + 1);
|
|
111
|
+
var day = pad(date.getUTCDate());
|
|
112
|
+
var hour = pad(date.getUTCHours());
|
|
113
|
+
if (chunkSize === 'month') {
|
|
114
|
+
return "".concat(year, "-").concat(month);
|
|
115
|
+
}
|
|
116
|
+
if (chunkSize === 'hour') {
|
|
117
|
+
return "".concat(year, "-").concat(month, "-").concat(day, "T").concat(hour);
|
|
118
|
+
}
|
|
119
|
+
return "".concat(year, "-").concat(month, "-").concat(day);
|
|
120
|
+
};
|
|
121
|
+
var valueMapping = function (value, index) {
|
|
122
|
+
if (typeof value === 'string') {
|
|
123
|
+
return { field: value, index: index };
|
|
124
|
+
}
|
|
125
|
+
return __assign(__assign({}, value), { index: typeof value.index === 'number' ? value.index : index });
|
|
126
|
+
};
|
|
127
|
+
var valueAlias = function (mapping) { return mapping.alias || mapping.field; };
|
|
128
|
+
var TimeSeriesModel = /** @class */ (function () {
|
|
129
|
+
function TimeSeriesModel(name, options) {
|
|
130
|
+
this.name = name;
|
|
131
|
+
this.options = options;
|
|
132
|
+
this.model = options.model || new model_1.default(name);
|
|
133
|
+
this.values = options.values.map(function (value, index) {
|
|
134
|
+
return valueMapping(value, index);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
TimeSeriesModel.prototype.chunkId = function (key, date, chunkSize) {
|
|
138
|
+
if (date === void 0) { date = new Date(); }
|
|
139
|
+
if (chunkSize === void 0) { chunkSize = this.options.chunkSize || 'day'; }
|
|
140
|
+
var chunkDate = date instanceof Date ? date : new Date(date);
|
|
141
|
+
return "".concat(this.name, ":").concat(key, ":").concat(datePart(chunkDate, chunkSize));
|
|
142
|
+
};
|
|
143
|
+
TimeSeriesModel.prototype.buildChunk = function (key, rows, options) {
|
|
144
|
+
var _a;
|
|
145
|
+
var _this = this;
|
|
146
|
+
var _b;
|
|
147
|
+
if (options === void 0) { options = {}; }
|
|
148
|
+
if (!rows.length) {
|
|
149
|
+
throw new Error('appendChunk requires at least one row');
|
|
150
|
+
}
|
|
151
|
+
var interval = (_b = options.interval) !== null && _b !== void 0 ? _b : this.options.interval;
|
|
152
|
+
var keyField = this.options.keyField;
|
|
153
|
+
var timeField = this.options.timeField;
|
|
154
|
+
var normalizedRows = rows
|
|
155
|
+
.map(function (row) { return ({ row: row, time: normalizeTime(row[timeField]) }); })
|
|
156
|
+
.sort(function (a, b) { return a.time - b.time; });
|
|
157
|
+
var chunkDate = options.chunkDate || normalizedRows[0].time;
|
|
158
|
+
var intervalMs = interval ? (0, exports.intervalToMilliseconds)(interval) : undefined;
|
|
159
|
+
var tsData = normalizedRows.map(function (_a) {
|
|
160
|
+
var row = _a.row, time = _a.time;
|
|
161
|
+
var values = _this.values.map(function (value) { return row[value.field]; });
|
|
162
|
+
return intervalMs ? values : __spreadArray([time], __read(values), false);
|
|
163
|
+
});
|
|
164
|
+
return _a = {
|
|
165
|
+
id: this.chunkId(key, chunkDate, options.chunkSize || this.options.chunkSize || 'day'),
|
|
166
|
+
key: key
|
|
167
|
+
},
|
|
168
|
+
_a[keyField] = key,
|
|
169
|
+
_a.rows = normalizedRows.map(function (item) { return item.row; }),
|
|
170
|
+
_a.ts_data = tsData,
|
|
171
|
+
_a.ts_end = normalizedRows[normalizedRows.length - 1].time,
|
|
172
|
+
_a.ts_interval = intervalMs,
|
|
173
|
+
_a.ts_start = normalizedRows[0].time,
|
|
174
|
+
_a;
|
|
175
|
+
};
|
|
176
|
+
TimeSeriesModel.prototype.appendChunk = function (key_1, rows_1) {
|
|
177
|
+
return __awaiter(this, arguments, void 0, function (key, rows, options) {
|
|
178
|
+
var chunk, existing, error_1;
|
|
179
|
+
if (options === void 0) { options = {}; }
|
|
180
|
+
return __generator(this, function (_a) {
|
|
181
|
+
switch (_a.label) {
|
|
182
|
+
case 0:
|
|
183
|
+
chunk = this.buildChunk(key, rows, options);
|
|
184
|
+
existing = null;
|
|
185
|
+
_a.label = 1;
|
|
186
|
+
case 1:
|
|
187
|
+
_a.trys.push([1, 3, , 4]);
|
|
188
|
+
return [4 /*yield*/, this.model.getById(chunk.id)];
|
|
189
|
+
case 2:
|
|
190
|
+
existing = _a.sent();
|
|
191
|
+
return [3 /*break*/, 4];
|
|
192
|
+
case 3:
|
|
193
|
+
error_1 = _a.sent();
|
|
194
|
+
existing = null;
|
|
195
|
+
return [3 /*break*/, 4];
|
|
196
|
+
case 4:
|
|
197
|
+
if (existing && Array.isArray(existing.ts_data)) {
|
|
198
|
+
chunk.ts_data = existing.ts_data.concat(chunk.ts_data);
|
|
199
|
+
chunk.rows = (existing.rows || []).concat(chunk.rows);
|
|
200
|
+
chunk.ts_start = Math.min(existing.ts_start, chunk.ts_start);
|
|
201
|
+
chunk.ts_end = Math.max(existing.ts_end, chunk.ts_end);
|
|
202
|
+
}
|
|
203
|
+
return [2 /*return*/, this.model.upsert(chunk, options.writeOptions)];
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
TimeSeriesModel.prototype.rangeQuery = function (key, args) {
|
|
209
|
+
var start = normalizeTime(args.startDate);
|
|
210
|
+
var end = normalizeTime(args.endDate);
|
|
211
|
+
var params = {
|
|
212
|
+
key: key,
|
|
213
|
+
rangeEnd: end,
|
|
214
|
+
rangeStart: start,
|
|
215
|
+
type: this.name,
|
|
216
|
+
};
|
|
217
|
+
var additionalWhere = args.where || {};
|
|
218
|
+
var keyField = this.options.keyField;
|
|
219
|
+
var whereExpr = Object.keys(additionalWhere)
|
|
220
|
+
.map(function (field) {
|
|
221
|
+
params[field] = additionalWhere[field];
|
|
222
|
+
return "d.".concat(field, "=$").concat(field);
|
|
223
|
+
})
|
|
224
|
+
.join(' AND ');
|
|
225
|
+
var rangeFilter = "d._type=$type AND d.".concat(keyField, "=$key AND (d.ts_start <= $rangeEnd AND d.ts_end >= $rangeStart)");
|
|
226
|
+
var where = whereExpr ? "".concat(rangeFilter, " AND ").concat(whereExpr) : rangeFilter;
|
|
227
|
+
var order = args.order || 'ASC';
|
|
228
|
+
var limit = typeof args.limit === 'number' ? " LIMIT ".concat(args.limit) : '';
|
|
229
|
+
if (args.interval) {
|
|
230
|
+
params.intervalMs = (0, exports.intervalToMilliseconds)(args.interval);
|
|
231
|
+
var bucket = 'IDIV(t._t, $intervalMs) * $intervalMs';
|
|
232
|
+
var values_1 = this.values.map(function (mapping) {
|
|
233
|
+
var aggregate = mapping.aggregate || 'AVG';
|
|
234
|
+
return "".concat(aggregate, "(t._v").concat(mapping.index, ") AS ").concat(valueAlias(mapping));
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
params: params,
|
|
238
|
+
query: "SELECT MILLIS_TO_TZ(bucket, \"UTC\") AS ".concat(this.options.timeField, ",bucket AS time,").concat(values_1.join(','), " FROM ").concat(this.model.keyspace(), " AS d UNNEST _timeseries(d, {\"ts_ranges\": [$rangeStart, $rangeEnd]}) AS t WHERE ").concat(where, " GROUP BY ").concat(bucket, " AS bucket ORDER BY bucket ").concat(order).concat(limit),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
var values = this.values.map(function (mapping) { return "t._v".concat(mapping.index, " AS ").concat(valueAlias(mapping)); });
|
|
242
|
+
return {
|
|
243
|
+
params: params,
|
|
244
|
+
query: "SELECT MILLIS_TO_TZ(t._t, \"UTC\") AS ".concat(this.options.timeField, ",t._t AS time,").concat(values.join(','), " FROM ").concat(this.model.keyspace(), " AS d UNNEST _timeseries(d, {\"ts_ranges\": [$rangeStart, $rangeEnd]}) AS t WHERE ").concat(where, " ORDER BY t._t ").concat(order).concat(limit),
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
TimeSeriesModel.prototype.range = function (key, args, options) {
|
|
248
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
249
|
+
var _a, query, params;
|
|
250
|
+
return __generator(this, function (_b) {
|
|
251
|
+
_a = this.rangeQuery(key, args), query = _a.query, params = _a.params;
|
|
252
|
+
return [2 /*return*/, this.queryRows(query, params, options)];
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
TimeSeriesModel.prototype.queryRows = function (query, params, options) {
|
|
257
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
258
|
+
return __generator(this, function (_a) {
|
|
259
|
+
return [2 /*return*/, this.model.queryRows(query, params, options)];
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
};
|
|
263
|
+
return TimeSeriesModel;
|
|
264
|
+
}());
|
|
265
|
+
exports.TimeSeriesModel = TimeSeriesModel;
|
|
266
|
+
exports.default = TimeSeriesModel;
|
|
267
|
+
//# sourceMappingURL=time-series-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-series-model.js","sourceRoot":"","sources":["../../src/timeseries/time-series-model.ts"],"names":[],"mappings":"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","sourcesContent":["import Model, {QueryParameters, SafeQueryOptions, AutoModelFields} from '../model';\n\nexport type TimeSeriesChunkSize = 'hour' | 'day' | 'month';\nexport type TimeSeriesAggregate = 'AVG' | 'SUM' | 'MIN' | 'MAX' | 'COUNT';\n\nexport interface TimeSeriesValueMapping {\n field: string;\n alias?: string;\n index?: number;\n aggregate?: TimeSeriesAggregate;\n}\n\nexport interface TimeSeriesModelOptions<T = any> {\n keyField: keyof T | string;\n timeField: keyof T | string;\n values: Array<keyof T | string | TimeSeriesValueMapping>;\n chunkSize?: TimeSeriesChunkSize;\n interval?: string | number;\n model?: Model;\n}\n\nexport interface TimeSeriesAppendOptions {\n chunkDate?: Date | string | number;\n chunkSize?: TimeSeriesChunkSize;\n interval?: string | number;\n writeOptions?: any;\n}\n\nexport interface TimeSeriesRangeArgs {\n startDate: Date | string | number;\n endDate: Date | string | number;\n interval?: string | number;\n where?: Record<string, any>;\n order?: 'ASC' | 'DESC';\n limit?: number;\n}\n\nexport interface TimeSeriesChunk<T = any> {\n id: string;\n key: string;\n [field: string]: any;\n ts_start: number;\n ts_end: number;\n ts_interval?: number;\n ts_data: any[];\n rows: T[];\n}\n\nexport interface TimeSeriesQuery {\n query: string;\n params: QueryParameters;\n}\n\nconst intervalUnits: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n};\n\nconst normalizeTime = (date: Date | string | number): number => {\n if (date instanceof Date) {\n return date.getTime();\n }\n\n if (typeof date === 'number') {\n return date;\n }\n\n return new Date(date).getTime();\n};\n\nexport const intervalToMilliseconds = (interval: string | number): number => {\n if (typeof interval === 'number') {\n return interval;\n }\n\n const match = interval.trim().match(/^(\\d+)\\s*(ms|s|m|h|d)$/);\n\n if (!match) {\n throw new Error('interval must be milliseconds or a string ending in ms, s, m, h, or d');\n }\n\n return Number(match[1]) * intervalUnits[match[2]];\n};\n\nconst datePart = (date: Date, chunkSize: TimeSeriesChunkSize): string => {\n const year = date.getUTCFullYear();\n const pad = (value: number): string => (value < 10 ? `0${value}` : `${value}`);\n const month = pad(date.getUTCMonth() + 1);\n const day = pad(date.getUTCDate());\n const hour = pad(date.getUTCHours());\n\n if (chunkSize === 'month') {\n return `${year}-${month}`;\n }\n\n if (chunkSize === 'hour') {\n return `${year}-${month}-${day}T${hour}`;\n }\n\n return `${year}-${month}-${day}`;\n};\n\nconst valueMapping = (\n value: string | TimeSeriesValueMapping,\n index: number\n): TimeSeriesValueMapping => {\n if (typeof value === 'string') {\n return {field: value, index};\n }\n\n return {\n ...value,\n index: typeof value.index === 'number' ? value.index : index,\n };\n};\n\nconst valueAlias = (mapping: TimeSeriesValueMapping): string => mapping.alias || mapping.field;\n\nexport class TimeSeriesModel<T = any> {\n public model: Model;\n private values: TimeSeriesValueMapping[];\n\n constructor(public name: string, private options: TimeSeriesModelOptions<T>) {\n this.model = options.model || new Model(name);\n this.values = options.values.map((value, index) =>\n valueMapping(value as string | TimeSeriesValueMapping, index)\n );\n }\n\n public chunkId(\n key: string,\n date: Date | string | number = new Date(),\n chunkSize = this.options.chunkSize || 'day'\n ): string {\n const chunkDate = date instanceof Date ? date : new Date(date);\n\n return `${this.name}:${key}:${datePart(chunkDate, chunkSize)}`;\n }\n\n public buildChunk(\n key: string,\n rows: T[],\n options: TimeSeriesAppendOptions = {}\n ): TimeSeriesChunk<T> {\n if (!rows.length) {\n throw new Error('appendChunk requires at least one row');\n }\n\n const interval = options.interval ?? this.options.interval;\n const keyField = this.options.keyField as string;\n const timeField = this.options.timeField as string;\n const normalizedRows = rows\n .map((row: any) => ({row, time: normalizeTime(row[timeField])}))\n .sort((a, b) => a.time - b.time);\n const chunkDate = options.chunkDate || normalizedRows[0].time;\n const intervalMs = interval ? intervalToMilliseconds(interval) : undefined;\n const tsData = normalizedRows.map(({row, time}) => {\n const values = this.values.map((value) => row[value.field]);\n\n return intervalMs ? values : [time, ...values];\n });\n\n return {\n id: this.chunkId(key, chunkDate, options.chunkSize || this.options.chunkSize || 'day'),\n key,\n [keyField]: key,\n rows: normalizedRows.map((item) => item.row),\n ts_data: tsData,\n ts_end: normalizedRows[normalizedRows.length - 1].time,\n ts_interval: intervalMs,\n ts_start: normalizedRows[0].time,\n };\n }\n\n public async appendChunk(\n key: string,\n rows: T[],\n options: TimeSeriesAppendOptions = {}\n ): Promise<TimeSeriesChunk<T> & AutoModelFields> {\n const chunk = this.buildChunk(key, rows, options);\n let existing: TimeSeriesChunk<T> | null = null;\n\n try {\n existing = await this.model.getById(chunk.id);\n } catch (error) {\n existing = null;\n }\n\n if (existing && Array.isArray(existing.ts_data)) {\n chunk.ts_data = existing.ts_data.concat(chunk.ts_data);\n chunk.rows = (existing.rows || []).concat(chunk.rows);\n chunk.ts_start = Math.min(existing.ts_start, chunk.ts_start);\n chunk.ts_end = Math.max(existing.ts_end, chunk.ts_end);\n }\n\n return this.model.upsert<TimeSeriesChunk<T>>(chunk, options.writeOptions);\n }\n\n public rangeQuery(key: string, args: TimeSeriesRangeArgs): TimeSeriesQuery {\n const start = normalizeTime(args.startDate);\n const end = normalizeTime(args.endDate);\n const params: QueryParameters = {\n key,\n rangeEnd: end,\n rangeStart: start,\n type: this.name,\n };\n const additionalWhere = args.where || {};\n const keyField = this.options.keyField as string;\n const whereExpr = Object.keys(additionalWhere)\n .map((field) => {\n params[field] = additionalWhere[field];\n\n return `d.${field}=$${field}`;\n })\n .join(' AND ');\n const rangeFilter = `d._type=$type AND d.${keyField}=$key AND (d.ts_start <= $rangeEnd AND d.ts_end >= $rangeStart)`;\n const where = whereExpr ? `${rangeFilter} AND ${whereExpr}` : rangeFilter;\n const order = args.order || 'ASC';\n const limit = typeof args.limit === 'number' ? ` LIMIT ${args.limit}` : '';\n\n if (args.interval) {\n params.intervalMs = intervalToMilliseconds(args.interval);\n const bucket = 'IDIV(t._t, $intervalMs) * $intervalMs';\n const values = this.values.map((mapping) => {\n const aggregate = mapping.aggregate || 'AVG';\n\n return `${aggregate}(t._v${mapping.index}) AS ${valueAlias(mapping)}`;\n });\n\n return {\n params,\n query: `SELECT MILLIS_TO_TZ(bucket, \"UTC\") AS ${\n this.options.timeField as string\n },bucket AS time,${values.join(\n ','\n )} FROM ${this.model.keyspace()} AS d UNNEST _timeseries(d, {\"ts_ranges\": [$rangeStart, $rangeEnd]}) AS t WHERE ${where} GROUP BY ${bucket} AS bucket ORDER BY bucket ${order}${limit}`,\n };\n }\n\n const values = this.values.map(\n (mapping) => `t._v${mapping.index} AS ${valueAlias(mapping)}`\n );\n\n return {\n params,\n query: `SELECT MILLIS_TO_TZ(t._t, \"UTC\") AS ${\n this.options.timeField as string\n },t._t AS time,${values.join(\n ','\n )} FROM ${this.model.keyspace()} AS d UNNEST _timeseries(d, {\"ts_ranges\": [$rangeStart, $rangeEnd]}) AS t WHERE ${where} ORDER BY t._t ${order}${limit}`,\n };\n }\n\n public async range<R = any>(\n key: string,\n args: TimeSeriesRangeArgs,\n options?: SafeQueryOptions\n ): Promise<R[]> {\n const {query, params} = this.rangeQuery(key, args);\n\n return this.queryRows<R>(query, params, options);\n }\n\n public async queryRows<R = any>(\n query: string,\n params?: QueryParameters,\n options?: SafeQueryOptions\n ): Promise<R[]> {\n return this.model.queryRows<R>(query, params, options);\n }\n}\n\nexport default TimeSeriesModel;\n"]}
|
package/dist/utils/awaitTo.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
let err, user, savedTask;
|
|
8
8
|
|
|
9
|
-
[ err, user ] = await awaitTo(UserModel.
|
|
9
|
+
[ err, user ] = await awaitTo(UserModel.getById(1));
|
|
10
10
|
if(!user) return cb('No user found');
|
|
11
11
|
|
|
12
12
|
[ err, savedTask ] = await awaitTo(TaskModel({userId: user.id, name: 'Demo Task'}));
|
package/dist/utils/awaitTo.js
CHANGED
|
@@ -9,7 +9,7 @@ exports.awaitTo = awaitTo;
|
|
|
9
9
|
*
|
|
10
10
|
let err, user, savedTask;
|
|
11
11
|
|
|
12
|
-
[ err, user ] = await awaitTo(UserModel.
|
|
12
|
+
[ err, user ] = await awaitTo(UserModel.getById(1));
|
|
13
13
|
if(!user) return cb('No user found');
|
|
14
14
|
|
|
15
15
|
[ err, savedTask ] = await awaitTo(TaskModel({userId: user.id, name: 'Demo Task'}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awaitTo.js","sourceRoot":"","sources":["../../src/utils/awaitTo.ts"],"names":[],"mappings":";;AAeA,0BAaC;AA5BD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,OAAO,CACnB,OAAmB,EACnB,QAA8B;IAE9B,OAAO,OAAO;SACT,IAAI,CAAY,UAAC,IAAO,IAAK,OAAA,CAAC,IAAI,EAAE,IAAI,CAAC,EAAZ,CAAY,CAAC;SAC1C,KAAK,CAAiB,UAAC,GAAM;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACX,CAAC;AAED,kBAAe,OAAO,CAAC","sourcesContent":["/**\n * Async await wrapper for easy error handling\n * @param { Promise } promise\n * @param { Object= } errorExt - Additional Information you can pass to the err object\n * @return { Promise }\n * \n let err, user, savedTask;\n\n [ err, user ] = await awaitTo(UserModel.
|
|
1
|
+
{"version":3,"file":"awaitTo.js","sourceRoot":"","sources":["../../src/utils/awaitTo.ts"],"names":[],"mappings":";;AAeA,0BAaC;AA5BD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,OAAO,CACnB,OAAmB,EACnB,QAA8B;IAE9B,OAAO,OAAO;SACT,IAAI,CAAY,UAAC,IAAO,IAAK,OAAA,CAAC,IAAI,EAAE,IAAI,CAAC,EAAZ,CAAY,CAAC;SAC1C,KAAK,CAAiB,UAAC,GAAM;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACX,CAAC;AAED,kBAAe,OAAO,CAAC","sourcesContent":["/**\n * Async await wrapper for easy error handling\n * @param { Promise } promise\n * @param { Object= } errorExt - Additional Information you can pass to the err object\n * @return { Promise }\n * \n let err, user, savedTask;\n\n [ err, user ] = await awaitTo(UserModel.getById(1));\n if(!user) return cb('No user found');\n\n [ err, savedTask ] = await awaitTo(TaskModel({userId: user.id, name: 'Demo Task'}));\n if(err) return cb('Error occurred while saving task');\n\n */\nexport function awaitTo<T, U = Error>(\n promise: Promise<T>,\n errorExt?: Record<string, any>\n): Promise<[U, undefined] | [null, T]> {\n return promise\n .then<[null, T]>((data: T) => [null, data])\n .catch<[U, undefined]>((err: U) => {\n if (errorExt) {\n Object.assign(err, errorExt);\n }\n\n return [err, undefined];\n });\n}\n\nexport default awaitTo;\n"]}
|