diff --git a/docs/Cube.js-Frontend/@cubejs-client-core.md b/docs/Cube.js-Frontend/@cubejs-client-core.md index e9890c547186c..6e17e369cf535 100644 --- a/docs/Cube.js-Frontend/@cubejs-client-core.md +++ b/docs/Cube.js-Frontend/@cubejs-client-core.md @@ -133,7 +133,7 @@ Contains information about available cubes and it's members. ### membersForQuery -▸ **membersForQuery**(**query**: [Query](#types-query), **memberType**: [MemberType](#types-member-type)): *any* +▸ **membersForQuery**(**query**: [Query](#types-query) | null, **memberType**: [MemberType](#types-member-type)): *[TCubeMeasure](#types-t-cube-measure)[] | [TCubeDimension](#types-t-cube-dimension)[] | [TCubeMember](#types-t-cube-member)[]* Get all members of a specific type for a given query. If empty query is provided no filtering is done based on query context and all available members are retrieved. @@ -142,14 +142,14 @@ If empty query is provided no filtering is done based on query context and all a Name | Type | Description | ------ | ------ | ------ | -query | [Query](#types-query) | context query to provide filtering of members available to add to this query | +query | [Query](#types-query) | null | context query to provide filtering of members available to add to this query | memberType | [MemberType](#types-member-type) | - | ### resolveMember ▸ **resolveMember**(**memberName**: string, **memberType**: [MemberType](#types-member-type)): *Object* -Get meta information for member of a cube +Get meta information for a cube member Member meta information contains: ```javascript { @@ -206,6 +206,10 @@ const resultSet = await cubejsApi.load({ const copy = new ResultSet(resultSet.loadResponse); ``` +### annotation + +▸ **annotation**(): *[QueryAnnotations](#types-query-annotations)* + ### chartPivot ▸ **chartPivot**(**pivotConfig?**: [PivotConfig](#types-pivot-config)): *[ChartPivotRow](#types-chart-pivot-row)[]* @@ -783,6 +787,27 @@ sql | [SqlQueryTuple](#types-sql-query-tuple) | Ƭ **SqlQueryTuple**: *[string, boolean | string | number]* +### TCubeDimension + +Ƭ **TCubeDimension**: *[TCubeMember](#types-t-cube-member) & object* + +### TCubeMeasure + +Ƭ **TCubeMeasure**: *[TCubeMember](#types-t-cube-member) & object* + +### TCubeMember + +Name | Type | +------ | ------ | +name | string | +shortTitle | string | +title | string | +type | [TCubeMemberType](#types-t-cube-member-type) | + +### TCubeMemberType + +Ƭ **TCubeMemberType**: *"time" | "number" | "string" | "boolean"* + ### TableColumn Name | Type | diff --git a/docs/Cube.js-Frontend/@cubejs-client-react.md b/docs/Cube.js-Frontend/@cubejs-client-react.md index 317329f82dadc..1bc7bde840051 100644 --- a/docs/Cube.js-Frontend/@cubejs-client-react.md +++ b/docs/Cube.js-Frontend/@cubejs-client-react.md @@ -154,10 +154,10 @@ wrapWithQueryRenderer? | boolean | - | Name | Type | Description | ------ | ------ | ------ | -availableDimensions | [TAvailableDimension](#types-t-available-dimension)[] | An array of available dimensions to select. They are loaded via the API from Cube.js Backend. | -availableMeasures | [TAvailableMeasure](#types-t-available-measure)[] | An array of available measures to select. They are loaded via the API from Cube.js Backend. | -availableSegments | [TMember](#types-t-member)[] | An array of available segments to select. They are loaded via the API from Cube.js Backend. | -availableTimeDimensions | [TAvailableDimension](#types-t-available-dimension)[] | An array of available time dimensions to select. They are loaded via the API from Cube.js Backend. | +availableDimensions | TCubeDimension[] | An array of available dimensions to select. They are loaded via the API from Cube.js Backend. | +availableMeasures | TCubeMeasure[] | An array of available measures to select. They are loaded via the API from Cube.js Backend. | +availableSegments | TCubeMember[] | An array of available segments to select. They are loaded via the API from Cube.js Backend. | +availableTimeDimensions | TCubeDimension[] | An array of available time dimensions to select. They are loaded via the API from Cube.js Backend. | dimensions | string[] | - | isQueryPresent | boolean | Indicates whether the query is ready to be displayed or not | measures | string[] | - | @@ -201,7 +201,7 @@ resultSet | ResultSet | null | ## CubeProvider -• **CubeProvider**: *React.FC‹[CubeProviderVariables](#types-cube-provider-variables)›* +• **CubeProvider**: *React.FC‹[CubeProviderProps](#types-cube-provider-props)›* Cube.js context provider ```js @@ -226,13 +226,52 @@ export default function App() { } ``` +## CubeContext + +• **CubeContext**: *Context‹[CubeContextProps](#types-cube-context-props)›* + +In case when you need access to `cubejsApi` directly you can use `CubeContext` anywhere in your app + +```js +import React from 'react'; +import { CubeContext } from '@cubejs-client/react'; + +export default function DisplayComponent() { + const { cubejsApi } = React.useContext(CubeContext); + const [rawResults, setRawResults] = React.useState([]); + const query = { + ... + }; + + React.useEffect(() => { + cubejsApi.load(query).then((resultSet) => { + setRawResults(resultSet.rawData()); + }); + }, [query]); + + return ( + <> + {rawResults.map(row => ( + ... + ))} + + ) +} +``` + ## Types ### ChartType Ƭ **ChartType**: *"line" | "bar" | "table" | "area"* -### CubeProviderVariables +### CubeContextProps + +Name | Type | +------ | ------ | +cubejsApi | CubejsApi | + +### CubeProviderProps Name | Type | ------ | ------ | @@ -311,17 +350,9 @@ NOTE: if you need to add or remove more than one member at a time you should use Name | Type | ------ | ------ | -add | (**member**: [TMember](#types-t-member)) => *void* | -remove | (**member**: [TMember](#types-t-member)) => *void* | -update | (**member**: [TMember](#types-t-member), **updateWith**: [TMember](#types-t-member)) => *void* | - -### TAvailableDimension - -Ƭ **TAvailableDimension**: *[TMember](#types-t-member) & object* - -### TAvailableMeasure - -Ƭ **TAvailableMeasure**: *[TMember](#types-t-member) & object* +add | (**member**: MemberType) => *void* | +remove | (**member**: MemberType) => *void* | +update | (**member**: MemberType, **updateWith**: MemberType) => *void* | ### TLoadingState @@ -329,18 +360,6 @@ Name | Type | ------ | ------ | isLoading | boolean | -### TMember - -Name | Type | ------- | ------ | -name | string | -shortTitle | string | -title | string | - -### TMemberType - -Ƭ **TMemberType**: *"time" | "number" | "string" | "boolean"* - ### VizState Name | Type | diff --git a/packages/cubejs-client-core/index.d.ts b/packages/cubejs-client-core/index.d.ts index 1aee4f505bb99..5b597aa697b20 100644 --- a/packages/cubejs-client-core/index.d.ts +++ b/packages/cubejs-client-core/index.d.ts @@ -221,12 +221,12 @@ declare module '@cubejs-client/core' { /** * ```js * import { ResultSet } from '@cubejs-client/core'; - * + * * const resultSet = await cubejsApi.load(query); * // You can store the result somewhere * const tmp = resultSet.serialize(); - * - * // and restore it later + * + * // and restore it later * const resultSet = ResultSet.deserialize(tmp); * ``` * @param data the result of [serialize](#result-set-serialize) @@ -259,7 +259,7 @@ declare module '@cubejs-client/core' { * Can be used to stash the `ResultSet` in a storage and restored later with [deserialize](#result-set-deserialize) */ serialize(): Object; - + /** * @hidden */ @@ -627,6 +627,30 @@ declare module '@cubejs-client/core' { export type MemberType = 'measures' | 'dimensions' | 'segments'; + type TCubeMemberType = 'time' | 'number' | 'string' | 'boolean'; + + type TCubeMember = { + type: TCubeMemberType; + name: string; + title: string; + shortTitle: string; + }; + + type TCubeMeasure = TCubeMember & { + aggType: 'count' | 'number'; + cumulative: boolean; + cumulativeTotal: boolean; + drillMembers: string[]; + drillMembersGrouped: { + measures: string[]; + dimensions: string[]; + }; + }; + + type TCubeDimension = TCubeMember & { + suggestFilterValues: boolean; + }; + /** * Contains information about available cubes and it's members. * @order 4 @@ -637,10 +661,10 @@ declare module '@cubejs-client/core' { * If empty query is provided no filtering is done based on query context and all available members are retrieved. * @param query - context query to provide filtering of members available to add to this query */ - membersForQuery(query: Query, memberType: MemberType); + membersForQuery(query: Query | null, memberType: MemberType): TCubeMeasure[] | TCubeDimension[] | TCubeMember[]; /** - * Get meta information for member of a cube + * Get meta information for a cube member * Member meta information contains: * ```javascript * { @@ -706,7 +730,7 @@ declare module '@cubejs-client/core' { */ meta(options?: LoadMethodOptions, callback?: LoadMethodCallback): void; } - + /** * Creates an instance of the `CubejsApi`. The API entry point. * diff --git a/packages/cubejs-client-core/src/Meta.js b/packages/cubejs-client-core/src/Meta.js index 5fce21f21b45c..ca9eea1d2c81d 100644 --- a/packages/cubejs-client-core/src/Meta.js +++ b/packages/cubejs-client-core/src/Meta.js @@ -41,33 +41,10 @@ class Meta { ])); } - /** - * Get all members of specific type for a given query. - * If empty query is provided no filtering is done based on query context and all available members are retrieved. - * @param query - context query to provide filtering of members available to add to this query - * @param memberType - `measures`, `dimensions` or `segments` - */ membersForQuery(query, memberType) { return unnest(this.cubes.map(c => c[memberType])); } - - /** - * Get meta information for member of a cube - * Member meta information contains: - * ```javascript - * { - * name, - * title, - * shortTitle, - * type, - * description, - * format - * } - * ``` - * @param memberName - Fully qualified member name in a form `Cube.memberName` - * @param memberType - `measures`, `dimensions` or `segments` - * @return {Object} containing meta information about member - */ + resolveMember(memberName, memberType) { const [cube] = memberName.split('.'); if (!this.cubesMap[cube]) { diff --git a/packages/cubejs-client-core/src/index.js b/packages/cubejs-client-core/src/index.js index c7acfb541b0cf..b6bb803d6e605 100644 --- a/packages/cubejs-client-core/src/index.js +++ b/packages/cubejs-client-core/src/index.js @@ -41,22 +41,6 @@ class CubejsApi { return this.transport.request(method, { baseRequestId: uuid(), ...params }); } - /** - * Base method used to perform all API calls. - * Shouldn't be used directly. - * @param request - function that invoked to perform actual request using `transport.request()` method. - * @param toResult - function that maps results of invocation to method return result - * @param [options] - options object - * @param options.mutexObj - object to use to store MUTEX - * @param [options.mutexKey='default'] - key to use to store current request MUTEX inside `mutexObj`. - * MUTEX object is used to reject orphaned queries results when new queries are sent. - * For example if two queries are sent with same `mutexKey` only last one will return results. - * @param options.subscribe - pass `true` to use continuous fetch behavior. - * @param {Function} options.progressCallback - function that receives `ProgressResult` on each - * `Continue wait` message. - * @param [callback] - if passed `callback` function will be called instead of `Promise` returned - * @return {{unsubscribe: function()}} - */ loadMethod(request, toResult, options, callback) { const mutexValue = ++mutexCounter; if (typeof options === 'function' && !callback) { diff --git a/packages/cubejs-client-react/index.d.ts b/packages/cubejs-client-react/index.d.ts index e61af6625f8f1..64f807a4e5cac 100644 --- a/packages/cubejs-client-react/index.d.ts +++ b/packages/cubejs-client-react/index.d.ts @@ -1,5 +1,15 @@ import * as React from 'react'; -import { CubejsApi, Query, ResultSet, Filter, PivotConfig } from '@cubejs-client/core'; +import { + CubejsApi, + Query, + ResultSet, + Filter, + PivotConfig, + MemberType, + TCubeMeasure, + TCubeDimension, + TCubeMember, +} from '@cubejs-client/core'; /** * @title @cubejs-client/react @@ -11,7 +21,7 @@ import { CubejsApi, Query, ResultSet, Filter, PivotConfig } from '@cubejs-client */ declare module '@cubejs-client/react' { - type CubeProviderVariables = { + type CubeProviderProps = { cubejsApi: CubejsApi; children: React.ReactNode; }; @@ -42,21 +52,19 @@ declare module '@cubejs-client/react' { * @stickyTypes * @order 10 */ - export const CubeProvider: React.FC; - - type CubeContextVariables = { + export const CubeProvider: React.FC; + + type CubeContextProps = { cubejsApi: CubejsApi; - }; + } /** - * Cube.js context consumer - * In case when you need access to cubejsApi directly you can use CubeContext anywhere in your app + * In case when you need direct access to `cubejsApi` you can use `CubeContext` anywhere in your app * * ```js * import React from 'react'; * import { CubeContext } from '@cubejs-client/react'; * - * * export default function DisplayComponent() { * const { cubejsApi } = React.useContext(CubeContext); * const [rawResults, setRawResults] = React.useState([]); @@ -65,7 +73,7 @@ declare module '@cubejs-client/react' { * }; * * React.useEffect(() => { - * const resultSet = cubejsApi.load(query).then(resultSet => { + * cubejsApi.load(query).then((resultSet) => { * setRawResults(resultSet.rawData()); * }); * }, [query]); @@ -80,7 +88,7 @@ declare module '@cubejs-client/react' { * } * ``` */ - export const CubeContext: React.Context; + export const CubeContext: React.Context; type TLoadingState = { isLoading: boolean; @@ -182,19 +190,19 @@ declare module '@cubejs-client/react' { /** * An array of available measures to select. They are loaded via the API from Cube.js Backend. */ - availableMeasures: TAvailableMeasure[]; + availableMeasures: TCubeMeasure[]; /** * An array of available dimensions to select. They are loaded via the API from Cube.js Backend. */ - availableDimensions: TAvailableDimension[]; + availableDimensions: TCubeDimension[]; /** * An array of available time dimensions to select. They are loaded via the API from Cube.js Backend. */ - availableTimeDimensions: TAvailableDimension[]; + availableTimeDimensions: TCubeDimension[]; /** * An array of available segments to select. They are loaded via the API from Cube.js Backend. */ - availableSegments: TMember[]; + availableSegments: TCubeMember[]; updateMeasures: MemberUpdater; updateDimensions: MemberUpdater; @@ -336,28 +344,6 @@ declare module '@cubejs-client/react' { */ export function isQueryPresent(query: Query): boolean; - type TMember = { - name: string; - title: string; - shortTitle: string; - }; - - type TMemberType = 'time' | 'number' | 'string' | 'boolean'; - - type TAvailableMeasure = TMember & { - type: TMemberType; - drillMembers: string[]; - drillMembersGrouped: { - measures: TMember[]; - dimensions: TMember[]; - }; - }; - - type TAvailableDimension = TMember & { - type: TMemberType; - suggestFilterValues: boolean; - }; - /** * You can use the following methods for member manipulaltion * ```js @@ -428,8 +414,8 @@ declare module '@cubejs-client/react' { * ``` */ type MemberUpdater = { - add: (member: TMember) => void; - remove: (member: TMember) => void; - update: (member: TMember, updateWith: TMember) => void; + add: (member: MemberType) => void; + remove: (member: MemberType) => void; + update: (member: MemberType, updateWith: MemberType) => void; }; }