@cubejs-client/core 1.3.14 → 1.3.16
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/dist/{cubejs-client-core.js → cubejs-client-core.cjs.js} +1016 -411
- package/dist/cubejs-client-core.cjs.js.map +1 -0
- package/dist/cubejs-client-core.umd.js +2901 -12088
- package/dist/cubejs-client-core.umd.js.map +1 -1
- package/dist/src/HttpTransport.d.ts +54 -0
- package/dist/src/HttpTransport.d.ts.map +1 -0
- package/dist/src/HttpTransport.js +55 -0
- package/dist/src/Meta.d.ts +62 -0
- package/dist/src/Meta.d.ts.map +1 -0
- package/dist/src/Meta.js +150 -0
- package/dist/src/ProgressResult.d.ts +8 -0
- package/dist/src/ProgressResult.d.ts.map +1 -0
- package/dist/src/ProgressResult.js +11 -0
- package/dist/src/RequestError.d.ts +6 -0
- package/dist/src/RequestError.d.ts.map +1 -0
- package/dist/src/RequestError.js +7 -0
- package/dist/src/ResultSet.d.ts +430 -0
- package/dist/src/ResultSet.d.ts.map +1 -0
- package/dist/src/ResultSet.js +952 -0
- package/dist/src/SqlQuery.d.ts +17 -0
- package/dist/src/SqlQuery.d.ts.map +1 -0
- package/dist/src/SqlQuery.js +11 -0
- package/dist/src/index.d.ts +194 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +411 -0
- package/dist/src/index.umd.d.ts +3 -0
- package/dist/src/index.umd.d.ts.map +1 -0
- package/dist/src/index.umd.js +6 -0
- package/dist/src/time.d.ts +70 -0
- package/dist/src/time.d.ts.map +1 -0
- package/dist/src/time.js +249 -0
- package/dist/src/types.d.ts +424 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils.d.ts +19 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +294 -0
- package/dist/test/CubeApi.test.d.ts +7 -0
- package/dist/test/CubeApi.test.d.ts.map +1 -0
- package/dist/test/CubeApi.test.js +279 -0
- package/dist/test/HttpTransport.test.d.ts +2 -0
- package/dist/test/HttpTransport.test.d.ts.map +1 -0
- package/dist/test/HttpTransport.test.js +244 -0
- package/dist/test/ResultSet.test.d.ts +7 -0
- package/dist/test/ResultSet.test.d.ts.map +1 -0
- package/dist/test/ResultSet.test.js +1725 -0
- package/dist/test/compare-date-range.test.d.ts +2 -0
- package/dist/test/compare-date-range.test.d.ts.map +1 -0
- package/dist/test/compare-date-range.test.js +742 -0
- package/dist/test/data-blending.test.d.ts +2 -0
- package/dist/test/data-blending.test.d.ts.map +1 -0
- package/dist/test/data-blending.test.js +423 -0
- package/dist/test/default-heuristics.test.d.ts +2 -0
- package/dist/test/default-heuristics.test.d.ts.map +1 -0
- package/dist/test/default-heuristics.test.js +108 -0
- package/dist/test/drill-down.test.d.ts +2 -0
- package/dist/test/drill-down.test.d.ts.map +1 -0
- package/dist/test/drill-down.test.js +373 -0
- package/dist/test/fixtures/datablending/load-responses.json +261 -0
- package/dist/test/granularity.test.d.ts +2 -0
- package/dist/test/granularity.test.d.ts.map +1 -0
- package/dist/test/granularity.test.js +218 -0
- package/dist/test/helpers.d.ts +283 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +974 -0
- package/dist/test/index.test.d.ts +7 -0
- package/dist/test/index.test.d.ts.map +1 -0
- package/dist/test/index.test.js +370 -0
- package/dist/test/table.test.d.ts +2 -0
- package/dist/test/table.test.d.ts.map +1 -0
- package/dist/test/table.test.js +757 -0
- package/dist/test/utils.test.d.ts +2 -0
- package/dist/test/utils.test.d.ts.map +1 -0
- package/dist/test/utils.test.js +32 -0
- package/package.json +26 -21
- package/dist/cubejs-client-core.esm.js +0 -1639
- package/dist/cubejs-client-core.esm.js.map +0 -1
- package/dist/cubejs-client-core.js.map +0 -1
- package/index.d.ts +0 -1338
- package/src/HttpTransport.js +0 -60
- package/src/HttpTransport.test.js +0 -117
- package/src/Meta.js +0 -142
- package/src/ProgressResult.js +0 -13
- package/src/RequestError.js +0 -7
- package/src/ResultSet.js +0 -746
- package/src/SqlQuery.js +0 -13
- package/src/index.js +0 -398
- package/src/index.test.js +0 -454
- package/src/index.umd.js +0 -8
- package/src/tests/ResultSet.test.js +0 -1655
- package/src/tests/compare-date-range.test.js +0 -753
- package/src/tests/data-blending.test.js +0 -432
- package/src/tests/default-heuristics.test.js +0 -118
- package/src/tests/drill-down.test.js +0 -402
- package/src/tests/fixtures/datablending/load-responses.json +0 -261
- package/src/tests/granularity.test.js +0 -225
- package/src/tests/table.test.js +0 -791
- package/src/tests/utils.test.js +0 -35
- package/src/time.js +0 -296
- package/src/utils.js +0 -368
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import 'url-search-params-polyfill';
|
|
2
|
+
export interface ErrorResponse {
|
|
3
|
+
error: string;
|
|
4
|
+
}
|
|
5
|
+
export type TransportOptions = {
|
|
6
|
+
/**
|
|
7
|
+
* [jwt auth token](security)
|
|
8
|
+
*/
|
|
9
|
+
authorization?: string;
|
|
10
|
+
/**
|
|
11
|
+
* path to `/cubejs-api/v1`
|
|
12
|
+
*/
|
|
13
|
+
apiUrl: string;
|
|
14
|
+
/**
|
|
15
|
+
* custom headers
|
|
16
|
+
*/
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
credentials?: 'omit' | 'same-origin' | 'include';
|
|
19
|
+
method?: 'GET' | 'PUT' | 'POST' | 'PATCH';
|
|
20
|
+
/**
|
|
21
|
+
* Fetch timeout in milliseconds. Would be passed as AbortSignal.timeout()
|
|
22
|
+
*/
|
|
23
|
+
fetchTimeout?: number;
|
|
24
|
+
/**
|
|
25
|
+
* AbortSignal to cancel requests
|
|
26
|
+
*/
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
};
|
|
29
|
+
export interface ITransportResponse<R> {
|
|
30
|
+
subscribe: <CBResult>(cb: (result: R | ErrorResponse, resubscribe: () => Promise<CBResult>) => CBResult) => Promise<CBResult>;
|
|
31
|
+
unsubscribe?: () => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface ITransport<R> {
|
|
34
|
+
request(method: string, params: Record<string, unknown>): ITransportResponse<R>;
|
|
35
|
+
authorization: TransportOptions['authorization'];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Default transport implementation.
|
|
39
|
+
*/
|
|
40
|
+
export declare class HttpTransport implements ITransport<Response> {
|
|
41
|
+
authorization: TransportOptions['authorization'];
|
|
42
|
+
protected apiUrl: TransportOptions['apiUrl'];
|
|
43
|
+
protected method: TransportOptions['method'];
|
|
44
|
+
protected headers: TransportOptions['headers'];
|
|
45
|
+
protected credentials: TransportOptions['credentials'];
|
|
46
|
+
protected fetchTimeout: number | undefined;
|
|
47
|
+
private readonly signal;
|
|
48
|
+
constructor({ authorization, apiUrl, method, headers, credentials, fetchTimeout, signal }: Omit<TransportOptions, 'headers'> & {
|
|
49
|
+
headers?: TransportOptions['headers'];
|
|
50
|
+
});
|
|
51
|
+
request(method: string, { baseRequestId, signal, ...params }: any): ITransportResponse<Response>;
|
|
52
|
+
}
|
|
53
|
+
export default HttpTransport;
|
|
54
|
+
//# sourceMappingURL=HttpTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpTransport.d.ts","sourceRoot":"","sources":["../../src/HttpTransport.ts"],"names":[],"mappings":"AACA,OAAO,4BAA4B,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC1C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,aAAa,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9H,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAChF,aAAa,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU,CAAC,QAAQ,CAAC;IACjD,aAAa,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAExD,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE/C,SAAS,CAAC,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAEvD,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAE9B,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;KAAE;IAU7K,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC;CA2CxG;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import fetch from 'cross-fetch';
|
|
2
|
+
import 'url-search-params-polyfill';
|
|
3
|
+
/**
|
|
4
|
+
* Default transport implementation.
|
|
5
|
+
*/
|
|
6
|
+
export class HttpTransport {
|
|
7
|
+
constructor({ authorization, apiUrl, method, headers = {}, credentials, fetchTimeout, signal }) {
|
|
8
|
+
this.authorization = authorization;
|
|
9
|
+
this.apiUrl = apiUrl;
|
|
10
|
+
this.method = method;
|
|
11
|
+
this.headers = headers;
|
|
12
|
+
this.credentials = credentials;
|
|
13
|
+
this.fetchTimeout = fetchTimeout;
|
|
14
|
+
this.signal = signal;
|
|
15
|
+
}
|
|
16
|
+
request(method, { baseRequestId, signal, ...params }) {
|
|
17
|
+
let spanCounter = 1;
|
|
18
|
+
const searchParams = new URLSearchParams(params && Object.keys(params)
|
|
19
|
+
.map(k => ({ [k]: typeof params[k] === 'object' ? JSON.stringify(params[k]) : params[k] }))
|
|
20
|
+
.reduce((a, b) => ({ ...a, ...b }), {}));
|
|
21
|
+
let url = `${this.apiUrl}/${method}${searchParams.toString().length ? `?${searchParams}` : ''}`;
|
|
22
|
+
const requestMethod = this.method || (url.length < 2000 ? 'GET' : 'POST');
|
|
23
|
+
if (requestMethod === 'POST') {
|
|
24
|
+
url = `${this.apiUrl}/${method}`;
|
|
25
|
+
this.headers['Content-Type'] = 'application/json';
|
|
26
|
+
}
|
|
27
|
+
// Currently, all methods make GET requests. If a method makes a request with a body payload,
|
|
28
|
+
// remember to add {'Content-Type': 'application/json'} to the header.
|
|
29
|
+
const runRequest = () => fetch(url, {
|
|
30
|
+
method: requestMethod,
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: this.authorization,
|
|
33
|
+
'x-request-id': baseRequestId && `${baseRequestId}-span-${spanCounter++}`,
|
|
34
|
+
...this.headers
|
|
35
|
+
},
|
|
36
|
+
credentials: this.credentials,
|
|
37
|
+
body: requestMethod === 'POST' ? JSON.stringify(params) : null,
|
|
38
|
+
signal: signal || this.signal || (this.fetchTimeout ? AbortSignal.timeout(this.fetchTimeout) : undefined),
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
/* eslint no-unsafe-finally: off */
|
|
42
|
+
async subscribe(callback) {
|
|
43
|
+
try {
|
|
44
|
+
const result = await runRequest();
|
|
45
|
+
return callback(result, () => this.subscribe(callback));
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
const result = { error: 'network Error' };
|
|
49
|
+
return callback(result, () => this.subscribe(callback));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export default HttpTransport;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Cube, CubesMap, MemberType, MetaResponse, TCubeMeasure, TCubeDimension, TCubeMember, TCubeMemberByType, Query, FilterOperator, TCubeSegment, NotFoundMember } from './types';
|
|
2
|
+
import { DeeplyReadonly } from './index';
|
|
3
|
+
export interface CubeMemberWrapper<T> {
|
|
4
|
+
cubeName: string;
|
|
5
|
+
cubeTitle: string;
|
|
6
|
+
type: 'view' | 'cube';
|
|
7
|
+
public: boolean;
|
|
8
|
+
members: T[];
|
|
9
|
+
}
|
|
10
|
+
export type AggregatedMembers = {
|
|
11
|
+
measures: CubeMemberWrapper<TCubeMeasure>[];
|
|
12
|
+
dimensions: CubeMemberWrapper<TCubeDimension>[];
|
|
13
|
+
segments: CubeMemberWrapper<TCubeSegment>[];
|
|
14
|
+
timeDimensions: CubeMemberWrapper<TCubeDimension>[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Contains information about available cubes and it's members.
|
|
18
|
+
*/
|
|
19
|
+
export default class Meta {
|
|
20
|
+
/**
|
|
21
|
+
* Raw meta response
|
|
22
|
+
*/
|
|
23
|
+
readonly meta: MetaResponse;
|
|
24
|
+
/**
|
|
25
|
+
* An array of all available cubes with their members
|
|
26
|
+
*/
|
|
27
|
+
readonly cubes: Cube[];
|
|
28
|
+
/**
|
|
29
|
+
* A map of all cubes where the key is a cube name
|
|
30
|
+
*/
|
|
31
|
+
readonly cubesMap: CubesMap;
|
|
32
|
+
constructor(metaResponse: MetaResponse);
|
|
33
|
+
/**
|
|
34
|
+
* Get all members of a specific type for a given query.
|
|
35
|
+
* If empty query is provided no filtering is done based on query context and all available members are retrieved.
|
|
36
|
+
* @param _query - context query to provide filtering of members available to add to this query
|
|
37
|
+
* @param memberType
|
|
38
|
+
*/
|
|
39
|
+
membersForQuery(_query: DeeplyReadonly<Query> | null, memberType: MemberType): (TCubeMeasure | TCubeDimension | TCubeMember | TCubeSegment)[];
|
|
40
|
+
membersGroupedByCube(): AggregatedMembers;
|
|
41
|
+
/**
|
|
42
|
+
* Get meta information for a cube member
|
|
43
|
+
* meta information contains:
|
|
44
|
+
* ```javascript
|
|
45
|
+
* {
|
|
46
|
+
* name,
|
|
47
|
+
* title,
|
|
48
|
+
* shortTitle,
|
|
49
|
+
* type,
|
|
50
|
+
* description,
|
|
51
|
+
* format
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
* @param memberName - Fully qualified member name in a form `Cube.memberName`
|
|
55
|
+
* @param memberType
|
|
56
|
+
* @return An object containing meta information about member
|
|
57
|
+
*/
|
|
58
|
+
resolveMember<T extends MemberType>(memberName: string, memberType: T | T[]): NotFoundMember | TCubeMemberByType<T>;
|
|
59
|
+
defaultTimeDimensionNameFor(memberName: string): string | null | undefined;
|
|
60
|
+
filterOperatorsForMember(memberName: string, memberType: MemberType | MemberType[]): FilterOperator[];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=Meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Meta.d.ts","sourceRoot":"","sources":["../../src/Meta.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,KAAK,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,CAAC,EAAE,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;IAChD,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;IAC5C,cAAc,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;CACrD,CAAC;AAyCF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI;IACvB;;OAEG;IACH,SAAgB,IAAI,EAAE,YAAY,CAAC;IAEnC;;OAEG;IACH,SAAgB,KAAK,EAAE,IAAI,EAAE,CAAC;IAE9B;;OAEG;IACH,SAAgB,QAAQ,EAAE,QAAQ,CAAC;gBAEhB,YAAY,EAAE,YAAY;IAgB7C;;;;;OAKG;IACI,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,YAAY,GAAG,cAAc,GAAG,WAAW,GAAG,YAAY,CAAC,EAAE;IAK7I,oBAAoB;IA8C3B;;;;;;;;;;;;;;;;OAgBG;IACI,aAAa,CAAC,CAAC,SAAS,UAAU,EACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,GAClB,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAsBjC,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;IAU1E,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,cAAc,EAAE;CAS7G"}
|
package/dist/src/Meta.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { unnest, fromPairs } from 'ramda';
|
|
2
|
+
const memberMap = (memberArray) => fromPairs(memberArray.map((m) => [m.name, m]));
|
|
3
|
+
const operators = {
|
|
4
|
+
string: [
|
|
5
|
+
{ name: 'contains', title: 'contains' },
|
|
6
|
+
{ name: 'notContains', title: 'does not contain' },
|
|
7
|
+
{ name: 'equals', title: 'equals' },
|
|
8
|
+
{ name: 'notEquals', title: 'does not equal' },
|
|
9
|
+
{ name: 'set', title: 'is set' },
|
|
10
|
+
{ name: 'notSet', title: 'is not set' },
|
|
11
|
+
{ name: 'startsWith', title: 'starts with' },
|
|
12
|
+
{ name: 'notStartsWith', title: 'does not start with' },
|
|
13
|
+
{ name: 'endsWith', title: 'ends with' },
|
|
14
|
+
{ name: 'notEndsWith', title: 'does not end with' },
|
|
15
|
+
],
|
|
16
|
+
number: [
|
|
17
|
+
{ name: 'equals', title: 'equals' },
|
|
18
|
+
{ name: 'notEquals', title: 'does not equal' },
|
|
19
|
+
{ name: 'set', title: 'is set' },
|
|
20
|
+
{ name: 'notSet', title: 'is not set' },
|
|
21
|
+
{ name: 'gt', title: '>' },
|
|
22
|
+
{ name: 'gte', title: '>=' },
|
|
23
|
+
{ name: 'lt', title: '<' },
|
|
24
|
+
{ name: 'lte', title: '<=' },
|
|
25
|
+
],
|
|
26
|
+
time: [
|
|
27
|
+
{ name: 'equals', title: 'equals' },
|
|
28
|
+
{ name: 'notEquals', title: 'does not equal' },
|
|
29
|
+
{ name: 'inDateRange', title: 'in date range' },
|
|
30
|
+
{ name: 'notInDateRange', title: 'not in date range' },
|
|
31
|
+
{ name: 'afterDate', title: 'after date' },
|
|
32
|
+
{ name: 'afterOrOnDate', title: 'after or on date' },
|
|
33
|
+
{ name: 'beforeDate', title: 'before date' },
|
|
34
|
+
{ name: 'beforeOrOnDate', title: 'before or on date' },
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Contains information about available cubes and it's members.
|
|
39
|
+
*/
|
|
40
|
+
export default class Meta {
|
|
41
|
+
constructor(metaResponse) {
|
|
42
|
+
this.meta = metaResponse;
|
|
43
|
+
const { cubes } = this.meta;
|
|
44
|
+
this.cubes = cubes;
|
|
45
|
+
this.cubesMap = fromPairs(cubes.map((c) => [
|
|
46
|
+
c.name,
|
|
47
|
+
{
|
|
48
|
+
measures: memberMap(c.measures),
|
|
49
|
+
dimensions: memberMap(c.dimensions),
|
|
50
|
+
segments: memberMap(c.segments),
|
|
51
|
+
},
|
|
52
|
+
]));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get all members of a specific type for a given query.
|
|
56
|
+
* If empty query is provided no filtering is done based on query context and all available members are retrieved.
|
|
57
|
+
* @param _query - context query to provide filtering of members available to add to this query
|
|
58
|
+
* @param memberType
|
|
59
|
+
*/
|
|
60
|
+
membersForQuery(_query, memberType) {
|
|
61
|
+
return unnest(this.cubes.map((c) => c[memberType]))
|
|
62
|
+
.sort((a, b) => (a.title > b.title ? 1 : -1));
|
|
63
|
+
}
|
|
64
|
+
membersGroupedByCube() {
|
|
65
|
+
const memberKeys = ['measures', 'dimensions', 'segments', 'timeDimensions'];
|
|
66
|
+
return this.cubes.reduce((memo, cube) => {
|
|
67
|
+
memberKeys.forEach((key) => {
|
|
68
|
+
let members = [];
|
|
69
|
+
// eslint-disable-next-line default-case
|
|
70
|
+
switch (key) {
|
|
71
|
+
case 'measures':
|
|
72
|
+
members = cube.measures || [];
|
|
73
|
+
break;
|
|
74
|
+
case 'dimensions':
|
|
75
|
+
members = cube.dimensions || [];
|
|
76
|
+
break;
|
|
77
|
+
case 'segments':
|
|
78
|
+
members = cube.segments || [];
|
|
79
|
+
break;
|
|
80
|
+
case 'timeDimensions':
|
|
81
|
+
members = cube.dimensions.filter((m) => m.type === 'time') || [];
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
// TODO: Convince TS this is working
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
memo[key].push({
|
|
87
|
+
cubeName: cube.name,
|
|
88
|
+
cubeTitle: cube.title,
|
|
89
|
+
type: cube.type,
|
|
90
|
+
public: cube.public,
|
|
91
|
+
members,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
return memo;
|
|
95
|
+
}, {
|
|
96
|
+
measures: [],
|
|
97
|
+
dimensions: [],
|
|
98
|
+
segments: [],
|
|
99
|
+
timeDimensions: [],
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get meta information for a cube member
|
|
104
|
+
* meta information contains:
|
|
105
|
+
* ```javascript
|
|
106
|
+
* {
|
|
107
|
+
* name,
|
|
108
|
+
* title,
|
|
109
|
+
* shortTitle,
|
|
110
|
+
* type,
|
|
111
|
+
* description,
|
|
112
|
+
* format
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
* @param memberName - Fully qualified member name in a form `Cube.memberName`
|
|
116
|
+
* @param memberType
|
|
117
|
+
* @return An object containing meta information about member
|
|
118
|
+
*/
|
|
119
|
+
resolveMember(memberName, memberType) {
|
|
120
|
+
const [cube] = memberName.split('.');
|
|
121
|
+
if (!this.cubesMap[cube]) {
|
|
122
|
+
return { title: memberName, error: `Cube not found ${cube} for path '${memberName}'` };
|
|
123
|
+
}
|
|
124
|
+
const memberTypes = Array.isArray(memberType) ? memberType : [memberType];
|
|
125
|
+
const member = memberTypes
|
|
126
|
+
.map((type) => this.cubesMap[cube][type] && this.cubesMap[cube][type][memberName])
|
|
127
|
+
.find((m) => m);
|
|
128
|
+
if (!member) {
|
|
129
|
+
return {
|
|
130
|
+
title: memberName,
|
|
131
|
+
error: `Path not found '${memberName}'`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return member;
|
|
135
|
+
}
|
|
136
|
+
defaultTimeDimensionNameFor(memberName) {
|
|
137
|
+
const [cube] = memberName.split('.');
|
|
138
|
+
if (!this.cubesMap[cube]) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return Object.keys(this.cubesMap[cube].dimensions || {}).find((d) => this.cubesMap[cube].dimensions[d].type === 'time');
|
|
142
|
+
}
|
|
143
|
+
filterOperatorsForMember(memberName, memberType) {
|
|
144
|
+
const member = this.resolveMember(memberName, memberType);
|
|
145
|
+
if ('error' in member || !('type' in member) || member.type === 'boolean') {
|
|
146
|
+
return operators.string;
|
|
147
|
+
}
|
|
148
|
+
return operators[member.type] || operators.string;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressResult.d.ts","sourceRoot":"","sources":["../../src/ProgressResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;gBAExB,gBAAgB,EAAE,gBAAgB;IAI9C,KAAK,IAAI,MAAM;IAIf,WAAW,IAAI,MAAM;CAG7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestError.d.ts","sourceRoot":"","sources":["../../src/RequestError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,KAAK;IACtC,QAAQ,EAAE,GAAG,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;CAKlE"}
|