@cubejs-client/react 0.30.46 → 0.30.69
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/CHANGELOG.md +24 -0
- package/dist/cubejs-client-react.esm.js +907 -1422
- package/dist/cubejs-client-react.esm.js.map +1 -1
- package/dist/cubejs-client-react.js +65 -138
- package/dist/cubejs-client-react.js.map +1 -1
- package/dist/cubejs-client-react.umd.js +4512 -9950
- package/dist/cubejs-client-react.umd.js.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +3 -5
- package/src/QueryBuilder.jsx +28 -22
- package/src/QueryRenderer.jsx +13 -14
- package/src/QueryRendererWithTotals.jsx +0 -7
- package/src/utils.js +0 -78
|
@@ -1,437 +1,256 @@
|
|
|
1
|
-
import 'core-js/modules/es.reflect.construct.js';
|
|
2
|
-
import 'core-js/modules/es.object.keys.js';
|
|
3
|
-
import 'core-js/modules/es.symbol.js';
|
|
4
|
-
import 'core-js/modules/es.array.filter.js';
|
|
5
|
-
import 'core-js/modules/es.object.get-own-property-descriptor.js';
|
|
6
|
-
import 'core-js/modules/es.array.for-each.js';
|
|
7
|
-
import 'core-js/modules/web.dom-collections.for-each.js';
|
|
8
|
-
import 'core-js/modules/es.object.get-own-property-descriptors.js';
|
|
9
|
-
import 'core-js/modules/es.object.define-properties.js';
|
|
10
|
-
import 'core-js/modules/es.object.define-property.js';
|
|
11
|
-
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
12
|
-
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
13
|
-
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
|
|
14
|
-
import _createClass from '@babel/runtime/helpers/createClass';
|
|
15
|
-
import _inherits from '@babel/runtime/helpers/inherits';
|
|
16
|
-
import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';
|
|
17
|
-
import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
|
|
18
|
-
import 'core-js/modules/es.array.iterator.js';
|
|
19
|
-
import 'core-js/modules/es.object.to-string.js';
|
|
20
|
-
import 'core-js/modules/es.promise.js';
|
|
21
|
-
import 'core-js/modules/es.string.iterator.js';
|
|
22
|
-
import 'core-js/modules/web.dom-collections.iterator.js';
|
|
23
|
-
import 'core-js/modules/es.array.map.js';
|
|
24
|
-
import 'core-js/modules/es.date.to-string.js';
|
|
25
|
-
import 'core-js/modules/es.regexp.to-string.js';
|
|
26
1
|
import React, { createContext, useRef, useEffect, useContext, useState } from 'react';
|
|
27
2
|
import { equals, toPairs, fromPairs, uniqBy, prop, indexBy, uniq, pick, clone } from 'ramda';
|
|
28
|
-
import { isQueryPresent, getQueryMembers, flattenFilters, moveItemInArray, movePivotItem, removeEmptyQueryFields,
|
|
29
|
-
import _typeof from '@babel/runtime/helpers/typeof';
|
|
30
|
-
import 'core-js/modules/es.regexp.exec.js';
|
|
31
|
-
import 'core-js/modules/es.string.split.js';
|
|
32
|
-
import 'core-js/modules/es.string.replace.js';
|
|
33
|
-
import 'core-js/modules/es.array.concat.js';
|
|
34
|
-
import 'core-js/modules/es.object.from-entries.js';
|
|
35
|
-
import 'core-js/modules/es.object.entries.js';
|
|
36
|
-
import 'core-js/modules/es.array.is-array.js';
|
|
37
|
-
import Anser from 'anser';
|
|
38
|
-
import { encode } from 'html-entities';
|
|
39
|
-
import _extends from '@babel/runtime/helpers/extends';
|
|
40
|
-
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
|
41
|
-
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
42
|
-
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
43
|
-
import _assertThisInitialized from '@babel/runtime/helpers/assertThisInitialized';
|
|
44
|
-
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
45
|
-
import 'core-js/modules/es.function.name.js';
|
|
46
|
-
import 'core-js/modules/es.array.splice.js';
|
|
47
|
-
import 'core-js/modules/es.array.sort.js';
|
|
48
|
-
import 'core-js/modules/es.array.find.js';
|
|
49
|
-
import 'core-js/modules/es.array.reduce.js';
|
|
3
|
+
import { isQueryPresent, getQueryMembers, flattenFilters, moveItemInArray, movePivotItem, removeEmptyQueryFields, defaultOrder, ResultSet, validateQuery, defaultHeuristics, areQueriesEqual } from '@cubejs-client/core';
|
|
50
4
|
|
|
51
5
|
var CubeContext = /*#__PURE__*/createContext(null);
|
|
52
6
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
'ansi-bright-yellow': 'yellow',
|
|
69
|
-
'ansi-yellow': 'yellow',
|
|
70
|
-
'ansi-bright-green': 'green',
|
|
71
|
-
'ansi-green': 'green',
|
|
72
|
-
'ansi-bright-cyan': 'cyan',
|
|
73
|
-
'ansi-cyan': 'cyan',
|
|
74
|
-
'ansi-bright-red': 'red',
|
|
75
|
-
'ansi-red': 'red',
|
|
76
|
-
'ansi-bright-magenta': 'magenta',
|
|
77
|
-
'ansi-magenta': 'magenta',
|
|
78
|
-
'ansi-white': 'darkgrey'
|
|
79
|
-
};
|
|
80
|
-
function generateAnsiHTML(txt) {
|
|
81
|
-
var arr = new Anser().ansiToJson(encode(txt), {
|
|
82
|
-
use_classes: true
|
|
83
|
-
});
|
|
84
|
-
var result = '';
|
|
85
|
-
var open = false;
|
|
86
|
-
|
|
87
|
-
for (var index = 0; index < arr.length; ++index) {
|
|
88
|
-
var c = arr[index];
|
|
89
|
-
var content = c.content;
|
|
90
|
-
var fg = c.fg;
|
|
91
|
-
var contentParts = content.split('\n');
|
|
92
|
-
|
|
93
|
-
for (var j = 0; j < contentParts.length; ++j) {
|
|
94
|
-
if (!open) {
|
|
95
|
-
result += '<span data-ansi-line="true">';
|
|
96
|
-
open = true;
|
|
97
|
-
}
|
|
7
|
+
class QueryRenderer extends React.Component {
|
|
8
|
+
static contextType = CubeContext;
|
|
9
|
+
static defaultProps = {
|
|
10
|
+
cubejsApi: null,
|
|
11
|
+
query: null,
|
|
12
|
+
render: null,
|
|
13
|
+
queries: null,
|
|
14
|
+
loadSql: null,
|
|
15
|
+
updateOnlyOnStateChange: false,
|
|
16
|
+
resetResultSetOnChange: true
|
|
17
|
+
}; // @deprected use `isQueryPresent` from `@cubejs-client/core`
|
|
18
|
+
|
|
19
|
+
static isQueryPresent(query) {
|
|
20
|
+
return isQueryPresent(query);
|
|
21
|
+
}
|
|
98
22
|
|
|
99
|
-
|
|
100
|
-
|
|
23
|
+
constructor(props) {
|
|
24
|
+
super(props);
|
|
25
|
+
this.state = {};
|
|
26
|
+
this.mutexObj = {};
|
|
27
|
+
}
|
|
101
28
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
29
|
+
componentDidMount() {
|
|
30
|
+
const {
|
|
31
|
+
query,
|
|
32
|
+
queries
|
|
33
|
+
} = this.props;
|
|
108
34
|
|
|
109
|
-
|
|
110
|
-
|
|
35
|
+
if (query) {
|
|
36
|
+
this.load(query);
|
|
37
|
+
}
|
|
111
38
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
open = false;
|
|
115
|
-
result += '<br/>';
|
|
116
|
-
}
|
|
39
|
+
if (queries) {
|
|
40
|
+
this.loadQueries(queries);
|
|
117
41
|
}
|
|
118
42
|
}
|
|
119
43
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
44
|
+
shouldComponentUpdate(nextProps, nextState) {
|
|
45
|
+
const {
|
|
46
|
+
query,
|
|
47
|
+
queries,
|
|
48
|
+
render,
|
|
49
|
+
cubejsApi,
|
|
50
|
+
loadSql,
|
|
51
|
+
updateOnlyOnStateChange
|
|
52
|
+
} = this.props;
|
|
53
|
+
|
|
54
|
+
if (!updateOnlyOnStateChange) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
123
57
|
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
function removeEmpty(obj) {
|
|
127
|
-
if (_typeof(obj) !== 'object') {
|
|
128
|
-
return obj;
|
|
58
|
+
return !equals(nextProps.query, query) || !equals(nextProps.queries, queries) || (nextProps.render == null || render == null) && nextProps.render !== render || nextProps.cubejsApi !== cubejsApi || nextProps.loadSql !== loadSql || !equals(nextState, this.state) || nextProps.updateOnlyOnStateChange !== updateOnlyOnStateChange;
|
|
129
59
|
}
|
|
130
60
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}).map(function (_ref3) {
|
|
137
|
-
var _ref4 = _slicedToArray(_ref3, 2),
|
|
138
|
-
k = _ref4[0],
|
|
139
|
-
v = _ref4[1];
|
|
61
|
+
componentDidUpdate(prevProps) {
|
|
62
|
+
const {
|
|
63
|
+
query,
|
|
64
|
+
queries
|
|
65
|
+
} = this.props;
|
|
140
66
|
|
|
141
|
-
if (
|
|
142
|
-
|
|
67
|
+
if (!equals(prevProps.query, query)) {
|
|
68
|
+
this.load(query);
|
|
143
69
|
}
|
|
144
70
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
150
|
-
|
|
151
|
-
function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$6(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
152
|
-
|
|
153
|
-
function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
154
|
-
|
|
155
|
-
function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
156
|
-
|
|
157
|
-
var QueryRenderer = /*#__PURE__*/function (_React$Component) {
|
|
158
|
-
_inherits(QueryRenderer, _React$Component);
|
|
159
|
-
|
|
160
|
-
var _super = _createSuper$1(QueryRenderer);
|
|
161
|
-
|
|
162
|
-
function QueryRenderer(props) {
|
|
163
|
-
var _this;
|
|
71
|
+
if (!equals(prevProps.queries, queries)) {
|
|
72
|
+
this.loadQueries(queries);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
164
75
|
|
|
165
|
-
|
|
76
|
+
cubejsApi() {
|
|
77
|
+
// eslint-disable-next-line react/destructuring-assignment
|
|
78
|
+
return this.props.cubejsApi || this.context && this.context.cubejsApi;
|
|
79
|
+
}
|
|
166
80
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
81
|
+
load(query) {
|
|
82
|
+
const {
|
|
83
|
+
resetResultSetOnChange
|
|
84
|
+
} = this.props;
|
|
85
|
+
this.setState({
|
|
86
|
+
isLoading: true,
|
|
87
|
+
error: null,
|
|
88
|
+
sqlQuery: null,
|
|
89
|
+
...(resetResultSetOnChange ? {
|
|
90
|
+
resultSet: null
|
|
91
|
+
} : {})
|
|
92
|
+
});
|
|
93
|
+
const {
|
|
94
|
+
loadSql
|
|
95
|
+
} = this.props;
|
|
96
|
+
const cubejsApi = this.cubejsApi();
|
|
97
|
+
|
|
98
|
+
if (query && isQueryPresent(query)) {
|
|
99
|
+
if (loadSql === 'only') {
|
|
100
|
+
cubejsApi.sql(query, {
|
|
101
|
+
mutexObj: this.mutexObj,
|
|
102
|
+
mutexKey: 'sql'
|
|
103
|
+
}).then(sqlQuery => this.setState({
|
|
104
|
+
sqlQuery,
|
|
105
|
+
error: null,
|
|
106
|
+
isLoading: false
|
|
107
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
108
|
+
resultSet: null
|
|
109
|
+
} : {}),
|
|
110
|
+
error,
|
|
111
|
+
isLoading: false
|
|
112
|
+
}));
|
|
113
|
+
} else if (loadSql) {
|
|
114
|
+
Promise.all([cubejsApi.sql(query, {
|
|
115
|
+
mutexObj: this.mutexObj,
|
|
116
|
+
mutexKey: 'sql'
|
|
117
|
+
}), cubejsApi.load(query, {
|
|
118
|
+
mutexObj: this.mutexObj,
|
|
119
|
+
mutexKey: 'query'
|
|
120
|
+
})]).then(([sqlQuery, resultSet]) => this.setState({
|
|
121
|
+
sqlQuery,
|
|
122
|
+
resultSet,
|
|
123
|
+
error: null,
|
|
124
|
+
isLoading: false
|
|
125
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
126
|
+
resultSet: null
|
|
127
|
+
} : {}),
|
|
128
|
+
error,
|
|
129
|
+
isLoading: false
|
|
130
|
+
}));
|
|
131
|
+
} else {
|
|
132
|
+
cubejsApi.load(query, {
|
|
133
|
+
mutexObj: this.mutexObj,
|
|
134
|
+
mutexKey: 'query'
|
|
135
|
+
}).then(resultSet => this.setState({
|
|
136
|
+
resultSet,
|
|
137
|
+
error: null,
|
|
138
|
+
isLoading: false
|
|
139
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
140
|
+
resultSet: null
|
|
141
|
+
} : {}),
|
|
142
|
+
error,
|
|
143
|
+
isLoading: false
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
171
147
|
}
|
|
172
148
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
149
|
+
loadQueries(queries) {
|
|
150
|
+
const cubejsApi = this.cubejsApi();
|
|
151
|
+
const {
|
|
152
|
+
resetResultSetOnChange
|
|
153
|
+
} = this.props;
|
|
154
|
+
this.setState({
|
|
155
|
+
isLoading: true,
|
|
156
|
+
...(resetResultSetOnChange ? {
|
|
157
|
+
resultSet: null
|
|
158
|
+
} : {}),
|
|
159
|
+
error: null
|
|
160
|
+
});
|
|
161
|
+
const resultPromises = Promise.all(toPairs(queries).map(([name, query]) => cubejsApi.load(query, {
|
|
162
|
+
mutexObj: this.mutexObj,
|
|
163
|
+
mutexKey: name
|
|
164
|
+
}).then(r => [name, r])));
|
|
165
|
+
resultPromises.then(resultSet => this.setState({
|
|
166
|
+
resultSet: fromPairs(resultSet),
|
|
167
|
+
error: null,
|
|
168
|
+
isLoading: false
|
|
169
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
170
|
+
resultSet: null
|
|
171
|
+
} : {}),
|
|
172
|
+
error,
|
|
173
|
+
isLoading: false
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
179
176
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
177
|
+
render() {
|
|
178
|
+
const {
|
|
179
|
+
error,
|
|
180
|
+
queries,
|
|
181
|
+
resultSet,
|
|
182
|
+
isLoading,
|
|
183
|
+
sqlQuery
|
|
184
|
+
} = this.state;
|
|
185
|
+
const {
|
|
186
|
+
render
|
|
187
|
+
} = this.props;
|
|
188
|
+
const loadState = {
|
|
189
|
+
error: error ? new Error(error.response?.plainError || error.message || error.toString()) : null,
|
|
190
|
+
resultSet: queries ? resultSet || {} : resultSet,
|
|
191
|
+
loadingState: {
|
|
192
|
+
isLoading
|
|
193
|
+
},
|
|
194
|
+
sqlQuery
|
|
195
|
+
};
|
|
183
196
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
197
|
+
if (render) {
|
|
198
|
+
return render(loadState);
|
|
187
199
|
}
|
|
188
|
-
}, {
|
|
189
|
-
key: "shouldComponentUpdate",
|
|
190
|
-
value: function shouldComponentUpdate(nextProps, nextState) {
|
|
191
|
-
var _this$props2 = this.props,
|
|
192
|
-
query = _this$props2.query,
|
|
193
|
-
queries = _this$props2.queries,
|
|
194
|
-
render = _this$props2.render,
|
|
195
|
-
cubejsApi = _this$props2.cubejsApi,
|
|
196
|
-
loadSql = _this$props2.loadSql,
|
|
197
|
-
updateOnlyOnStateChange = _this$props2.updateOnlyOnStateChange;
|
|
198
|
-
|
|
199
|
-
if (!updateOnlyOnStateChange) {
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
200
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}, {
|
|
206
|
-
key: "componentDidUpdate",
|
|
207
|
-
value: function componentDidUpdate(prevProps) {
|
|
208
|
-
var _this$props3 = this.props,
|
|
209
|
-
query = _this$props3.query,
|
|
210
|
-
queries = _this$props3.queries;
|
|
211
|
-
|
|
212
|
-
if (!equals(prevProps.query, query)) {
|
|
213
|
-
this.load(query);
|
|
214
|
-
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
215
203
|
|
|
216
|
-
|
|
217
|
-
this.loadQueries(queries);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}, {
|
|
221
|
-
key: "cubejsApi",
|
|
222
|
-
value: function cubejsApi() {
|
|
223
|
-
// eslint-disable-next-line react/destructuring-assignment
|
|
224
|
-
return this.props.cubejsApi || this.context && this.context.cubejsApi;
|
|
225
|
-
}
|
|
226
|
-
}, {
|
|
227
|
-
key: "load",
|
|
228
|
-
value: function load(query) {
|
|
229
|
-
var _this2 = this;
|
|
204
|
+
}
|
|
230
205
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
var loadSql = this.props.loadSql;
|
|
240
|
-
var cubejsApi = this.cubejsApi();
|
|
241
|
-
|
|
242
|
-
if (query && isQueryPresent(query)) {
|
|
243
|
-
if (loadSql === 'only') {
|
|
244
|
-
cubejsApi.sql(query, {
|
|
245
|
-
mutexObj: this.mutexObj,
|
|
246
|
-
mutexKey: 'sql'
|
|
247
|
-
}).then(function (sqlQuery) {
|
|
248
|
-
return _this2.setState({
|
|
249
|
-
sqlQuery: sqlQuery,
|
|
250
|
-
error: null,
|
|
251
|
-
isLoading: false
|
|
252
|
-
});
|
|
253
|
-
})["catch"](function (error) {
|
|
254
|
-
return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
|
|
255
|
-
resultSet: null
|
|
256
|
-
} : {}), {}, {
|
|
257
|
-
error: error,
|
|
258
|
-
isLoading: false
|
|
259
|
-
}));
|
|
260
|
-
});
|
|
261
|
-
} else if (loadSql) {
|
|
262
|
-
Promise.all([cubejsApi.sql(query, {
|
|
263
|
-
mutexObj: this.mutexObj,
|
|
264
|
-
mutexKey: 'sql'
|
|
265
|
-
}), cubejsApi.load(query, {
|
|
266
|
-
mutexObj: this.mutexObj,
|
|
267
|
-
mutexKey: 'query'
|
|
268
|
-
})]).then(function (_ref) {
|
|
269
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
270
|
-
sqlQuery = _ref2[0],
|
|
271
|
-
resultSet = _ref2[1];
|
|
272
|
-
|
|
273
|
-
return _this2.setState({
|
|
274
|
-
sqlQuery: sqlQuery,
|
|
275
|
-
resultSet: resultSet,
|
|
276
|
-
error: null,
|
|
277
|
-
isLoading: false
|
|
278
|
-
});
|
|
279
|
-
})["catch"](function (error) {
|
|
280
|
-
return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
|
|
281
|
-
resultSet: null
|
|
282
|
-
} : {}), {}, {
|
|
283
|
-
error: error,
|
|
284
|
-
isLoading: false
|
|
285
|
-
}));
|
|
286
|
-
});
|
|
287
|
-
} else {
|
|
288
|
-
cubejsApi.load(query, {
|
|
289
|
-
mutexObj: this.mutexObj,
|
|
290
|
-
mutexKey: 'query'
|
|
291
|
-
}).then(function (resultSet) {
|
|
292
|
-
return _this2.setState({
|
|
293
|
-
resultSet: resultSet,
|
|
294
|
-
error: null,
|
|
295
|
-
isLoading: false
|
|
296
|
-
});
|
|
297
|
-
})["catch"](function (error) {
|
|
298
|
-
return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
|
|
299
|
-
resultSet: null
|
|
300
|
-
} : {}), {}, {
|
|
301
|
-
error: error,
|
|
302
|
-
isLoading: false
|
|
303
|
-
}));
|
|
304
|
-
});
|
|
206
|
+
function _extends() {
|
|
207
|
+
_extends = Object.assign || function (target) {
|
|
208
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
209
|
+
var source = arguments[i];
|
|
210
|
+
|
|
211
|
+
for (var key in source) {
|
|
212
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
213
|
+
target[key] = source[key];
|
|
305
214
|
}
|
|
306
215
|
}
|
|
307
216
|
}
|
|
308
|
-
}, {
|
|
309
|
-
key: "loadQueries",
|
|
310
|
-
value: function loadQueries(queries) {
|
|
311
|
-
var _this3 = this;
|
|
312
|
-
|
|
313
|
-
var cubejsApi = this.cubejsApi();
|
|
314
|
-
var resetResultSetOnChange = this.props.resetResultSetOnChange;
|
|
315
|
-
this.setState(_objectSpread$6(_objectSpread$6({
|
|
316
|
-
isLoading: true
|
|
317
|
-
}, resetResultSetOnChange ? {
|
|
318
|
-
resultSet: null
|
|
319
|
-
} : {}), {}, {
|
|
320
|
-
error: null
|
|
321
|
-
}));
|
|
322
|
-
var resultPromises = Promise.all(toPairs(queries).map(function (_ref3) {
|
|
323
|
-
var _ref4 = _slicedToArray(_ref3, 2),
|
|
324
|
-
name = _ref4[0],
|
|
325
|
-
query = _ref4[1];
|
|
326
|
-
|
|
327
|
-
return cubejsApi.load(query, {
|
|
328
|
-
mutexObj: _this3.mutexObj,
|
|
329
|
-
mutexKey: name
|
|
330
|
-
}).then(function (r) {
|
|
331
|
-
return [name, r];
|
|
332
|
-
});
|
|
333
|
-
}));
|
|
334
|
-
resultPromises.then(function (resultSet) {
|
|
335
|
-
return _this3.setState({
|
|
336
|
-
resultSet: fromPairs(resultSet),
|
|
337
|
-
error: null,
|
|
338
|
-
isLoading: false
|
|
339
|
-
});
|
|
340
|
-
})["catch"](function (error) {
|
|
341
|
-
return _this3.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
|
|
342
|
-
resultSet: null
|
|
343
|
-
} : {}), {}, {
|
|
344
|
-
error: error,
|
|
345
|
-
isLoading: false
|
|
346
|
-
}));
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}, {
|
|
350
|
-
key: "render",
|
|
351
|
-
value: function render() {
|
|
352
|
-
var _this$state = this.state,
|
|
353
|
-
error = _this$state.error,
|
|
354
|
-
queries = _this$state.queries,
|
|
355
|
-
resultSet = _this$state.resultSet,
|
|
356
|
-
isLoading = _this$state.isLoading,
|
|
357
|
-
sqlQuery = _this$state.sqlQuery;
|
|
358
|
-
var render = this.props.render;
|
|
359
|
-
var loadState = {
|
|
360
|
-
error: error ? new Error(generateAnsiHTML(error.message || error.toString())) : null,
|
|
361
|
-
resultSet: queries ? resultSet || {} : resultSet,
|
|
362
|
-
loadingState: {
|
|
363
|
-
isLoading: isLoading
|
|
364
|
-
},
|
|
365
|
-
sqlQuery: sqlQuery
|
|
366
|
-
};
|
|
367
217
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
218
|
+
return target;
|
|
219
|
+
};
|
|
371
220
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
}], [{
|
|
375
|
-
key: "isQueryPresent",
|
|
376
|
-
value: // @deprected use `isQueryPresent` from `@cubejs-client/core`
|
|
377
|
-
function isQueryPresent$1(query) {
|
|
378
|
-
return isQueryPresent(query);
|
|
379
|
-
}
|
|
380
|
-
}]);
|
|
381
|
-
|
|
382
|
-
return QueryRenderer;
|
|
383
|
-
}(React.Component);
|
|
384
|
-
QueryRenderer.contextType = CubeContext;
|
|
385
|
-
QueryRenderer.defaultProps = {
|
|
386
|
-
cubejsApi: null,
|
|
387
|
-
query: null,
|
|
388
|
-
render: null,
|
|
389
|
-
queries: null,
|
|
390
|
-
loadSql: null,
|
|
391
|
-
updateOnlyOnStateChange: false,
|
|
392
|
-
resetResultSetOnChange: true
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
var _excluded$1 = ["query"];
|
|
396
|
-
|
|
397
|
-
function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
398
|
-
|
|
399
|
-
function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$5(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
400
|
-
|
|
401
|
-
var QueryRendererWithTotals = function QueryRendererWithTotals(_ref) {
|
|
402
|
-
var query = _ref.query,
|
|
403
|
-
restProps = _objectWithoutProperties(_ref, _excluded$1);
|
|
404
|
-
|
|
405
|
-
return /*#__PURE__*/React.createElement(QueryRenderer, _extends({
|
|
406
|
-
queries: {
|
|
407
|
-
totals: _objectSpread$5(_objectSpread$5({}, query), {}, {
|
|
408
|
-
dimensions: [],
|
|
409
|
-
timeDimensions: query.timeDimensions ? query.timeDimensions.map(function (td) {
|
|
410
|
-
return _objectSpread$5(_objectSpread$5({}, td), {}, {
|
|
411
|
-
granularity: null
|
|
412
|
-
});
|
|
413
|
-
}) : undefined
|
|
414
|
-
}),
|
|
415
|
-
main: query
|
|
416
|
-
}
|
|
417
|
-
}, restProps));
|
|
418
|
-
};
|
|
221
|
+
return _extends.apply(this, arguments);
|
|
222
|
+
}
|
|
419
223
|
|
|
420
|
-
QueryRendererWithTotals
|
|
421
|
-
query
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
224
|
+
const QueryRendererWithTotals = ({
|
|
225
|
+
query,
|
|
226
|
+
...restProps
|
|
227
|
+
}) => /*#__PURE__*/React.createElement(QueryRenderer, _extends({
|
|
228
|
+
queries: {
|
|
229
|
+
totals: { ...query,
|
|
230
|
+
dimensions: [],
|
|
231
|
+
timeDimensions: query.timeDimensions ? query.timeDimensions.map(td => ({ ...td,
|
|
232
|
+
granularity: null
|
|
233
|
+
})) : undefined
|
|
234
|
+
},
|
|
235
|
+
main: query
|
|
236
|
+
}
|
|
237
|
+
}, restProps));
|
|
426
238
|
|
|
427
|
-
function
|
|
239
|
+
function removeEmpty(obj) {
|
|
240
|
+
if (typeof obj !== 'object') {
|
|
241
|
+
return obj;
|
|
242
|
+
}
|
|
428
243
|
|
|
429
|
-
|
|
244
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null).map(([k, v]) => {
|
|
245
|
+
if (Array.isArray(v)) {
|
|
246
|
+
return [k, v.map(removeEmpty)];
|
|
247
|
+
}
|
|
430
248
|
|
|
431
|
-
|
|
249
|
+
return [k, typeof v === 'object' ? removeEmpty(v) : v];
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
432
252
|
|
|
433
|
-
|
|
434
|
-
var granularities = [{
|
|
253
|
+
const granularities = [{
|
|
435
254
|
name: undefined,
|
|
436
255
|
title: 'w/o grouping'
|
|
437
256
|
}, {
|
|
@@ -459,77 +278,79 @@ var granularities = [{
|
|
|
459
278
|
name: 'year',
|
|
460
279
|
title: 'Year'
|
|
461
280
|
}];
|
|
281
|
+
class QueryBuilder extends React.Component {
|
|
282
|
+
static contextType = CubeContext;
|
|
283
|
+
static defaultProps = {
|
|
284
|
+
cubejsApi: null,
|
|
285
|
+
stateChangeHeuristics: null,
|
|
286
|
+
disableHeuristics: false,
|
|
287
|
+
render: null,
|
|
288
|
+
wrapWithQueryRenderer: true,
|
|
289
|
+
defaultChartType: 'line',
|
|
290
|
+
defaultQuery: {},
|
|
291
|
+
initialVizState: null,
|
|
292
|
+
onVizStateChanged: null,
|
|
293
|
+
// deprecated
|
|
294
|
+
query: null,
|
|
295
|
+
setQuery: null,
|
|
296
|
+
vizState: null,
|
|
297
|
+
setVizState: null
|
|
298
|
+
}; // This is an anti-pattern, only kept for backward compatibility
|
|
299
|
+
// https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
|
|
300
|
+
|
|
301
|
+
static getDerivedStateFromProps(props, state) {
|
|
302
|
+
if (props.query || props.vizState) {
|
|
303
|
+
const nextState = { ...state,
|
|
304
|
+
...(props.vizState || {})
|
|
305
|
+
};
|
|
462
306
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
var _super = _createSuper(QueryBuilder);
|
|
307
|
+
if (Array.isArray(props.query)) {
|
|
308
|
+
throw new Error('Array of queries is not supported.');
|
|
309
|
+
}
|
|
467
310
|
|
|
468
|
-
|
|
469
|
-
|
|
311
|
+
return { ...nextState,
|
|
312
|
+
query: { ...nextState.query,
|
|
313
|
+
...(props.query || {})
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
470
317
|
|
|
471
|
-
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
472
320
|
|
|
473
|
-
|
|
321
|
+
static resolveMember(type, {
|
|
322
|
+
meta,
|
|
323
|
+
query
|
|
324
|
+
}) {
|
|
325
|
+
if (!meta) {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
474
328
|
|
|
475
|
-
|
|
476
|
-
|
|
329
|
+
if (Array.isArray(query)) {
|
|
330
|
+
return query.reduce((memo, currentQuery) => memo.concat(QueryBuilder.resolveMember(type, {
|
|
331
|
+
meta,
|
|
332
|
+
query: currentQuery
|
|
333
|
+
})), []);
|
|
334
|
+
}
|
|
477
335
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
336
|
+
if (type === 'timeDimensions') {
|
|
337
|
+
return (query.timeDimensions || []).map((m, index) => ({ ...m,
|
|
338
|
+
dimension: { ...meta.resolveMember(m.dimension, 'dimensions'),
|
|
339
|
+
granularities
|
|
340
|
+
},
|
|
341
|
+
index
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
486
344
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
_context.prev = 4;
|
|
493
|
-
|
|
494
|
-
_this.setState({
|
|
495
|
-
isFetchingMeta: true
|
|
496
|
-
});
|
|
497
|
-
|
|
498
|
-
_context.next = 8;
|
|
499
|
-
return _this.cubejsApi().meta();
|
|
500
|
-
|
|
501
|
-
case 8:
|
|
502
|
-
meta = _context.sent;
|
|
503
|
-
_context.next = 15;
|
|
504
|
-
break;
|
|
505
|
-
|
|
506
|
-
case 11:
|
|
507
|
-
_context.prev = 11;
|
|
508
|
-
_context.t0 = _context["catch"](4);
|
|
509
|
-
metaError = _context.t0;
|
|
510
|
-
metaErrorStack = ((_error$response = _context.t0.response) === null || _error$response === void 0 ? void 0 : (_error$response$stack = _error$response.stack) === null || _error$response$stack === void 0 ? void 0 : _error$response$stack.replace(_context.t0.message || '', '')) || '';
|
|
511
|
-
|
|
512
|
-
case 15:
|
|
513
|
-
_this.setState({
|
|
514
|
-
meta: meta,
|
|
515
|
-
metaError: metaError ? new Error(generateAnsiHTML(metaError.message || metaError.toString())) : null,
|
|
516
|
-
metaErrorStack: metaErrorStack,
|
|
517
|
-
isFetchingMeta: false
|
|
518
|
-
}, function () {
|
|
519
|
-
// Run update query to force viz state update
|
|
520
|
-
// This will catch any new missing members, and also validate the query against the new meta
|
|
521
|
-
_this.updateQuery({});
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
case 16:
|
|
525
|
-
case "end":
|
|
526
|
-
return _context.stop();
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}, _callee, null, [[4, 11]]);
|
|
530
|
-
})));
|
|
345
|
+
return (query[type] || []).map((m, index) => ({
|
|
346
|
+
index,
|
|
347
|
+
...meta.resolveMember(m, type)
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
531
350
|
|
|
532
|
-
|
|
351
|
+
constructor(props) {
|
|
352
|
+
super(props);
|
|
353
|
+
this.state = {
|
|
533
354
|
query: props.defaultQuery || props.query,
|
|
534
355
|
chartType: props.defaultChartType,
|
|
535
356
|
validatedQuery: props.query,
|
|
@@ -537,705 +358,540 @@ var QueryBuilder = /*#__PURE__*/function (_React$Component) {
|
|
|
537
358
|
missingMembers: [],
|
|
538
359
|
// todo: rename to `isMetaReady`
|
|
539
360
|
isFetchingMeta: true,
|
|
540
|
-
dryRunResponse: null
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
361
|
+
dryRunResponse: null,
|
|
362
|
+
...props.vizState,
|
|
363
|
+
// deprecated
|
|
364
|
+
...props.initialVizState
|
|
365
|
+
};
|
|
366
|
+
this.mutexObj = {};
|
|
367
|
+
this.orderMembersOrderKeys = [];
|
|
545
368
|
}
|
|
546
369
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
552
|
-
while (1) {
|
|
553
|
-
switch (_context2.prev = _context2.next) {
|
|
554
|
-
case 0:
|
|
555
|
-
this.prevContext = this.context;
|
|
556
|
-
_context2.next = 3;
|
|
557
|
-
return this.fetchMeta();
|
|
558
|
-
|
|
559
|
-
case 3:
|
|
560
|
-
case "end":
|
|
561
|
-
return _context2.stop();
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
}, _callee2, this);
|
|
565
|
-
}));
|
|
566
|
-
|
|
567
|
-
function componentDidMount() {
|
|
568
|
-
return _componentDidMount.apply(this, arguments);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
return componentDidMount;
|
|
572
|
-
}()
|
|
573
|
-
}, {
|
|
574
|
-
key: "componentDidUpdate",
|
|
575
|
-
value: function () {
|
|
576
|
-
var _componentDidUpdate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(prevProps) {
|
|
577
|
-
var _this$prevContext,
|
|
578
|
-
_this$context,
|
|
579
|
-
_this2 = this;
|
|
580
|
-
|
|
581
|
-
var _this$props, schemaVersion, onSchemaChange, meta, newMeta;
|
|
582
|
-
|
|
583
|
-
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
584
|
-
while (1) {
|
|
585
|
-
switch (_context4.prev = _context4.next) {
|
|
586
|
-
case 0:
|
|
587
|
-
_this$props = this.props, schemaVersion = _this$props.schemaVersion, onSchemaChange = _this$props.onSchemaChange;
|
|
588
|
-
meta = this.state.meta;
|
|
589
|
-
|
|
590
|
-
if (!(((_this$prevContext = this.prevContext) === null || _this$prevContext === void 0 ? void 0 : _this$prevContext.cubejsApi) !== ((_this$context = this.context) === null || _this$context === void 0 ? void 0 : _this$context.cubejsApi))) {
|
|
591
|
-
_context4.next = 6;
|
|
592
|
-
break;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
this.prevContext = this.context;
|
|
596
|
-
_context4.next = 6;
|
|
597
|
-
return this.fetchMeta();
|
|
598
|
-
|
|
599
|
-
case 6:
|
|
600
|
-
if (!(prevProps.schemaVersion !== schemaVersion)) {
|
|
601
|
-
_context4.next = 17;
|
|
602
|
-
break;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
_context4.prev = 7;
|
|
606
|
-
_context4.next = 10;
|
|
607
|
-
return this.cubejsApi().meta();
|
|
608
|
-
|
|
609
|
-
case 10:
|
|
610
|
-
newMeta = _context4.sent;
|
|
611
|
-
|
|
612
|
-
if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
|
|
613
|
-
onSchemaChange({
|
|
614
|
-
schemaVersion: schemaVersion,
|
|
615
|
-
refresh: function () {
|
|
616
|
-
var _refresh = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
617
|
-
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
618
|
-
while (1) {
|
|
619
|
-
switch (_context3.prev = _context3.next) {
|
|
620
|
-
case 0:
|
|
621
|
-
_context3.next = 2;
|
|
622
|
-
return _this2.fetchMeta();
|
|
623
|
-
|
|
624
|
-
case 2:
|
|
625
|
-
case "end":
|
|
626
|
-
return _context3.stop();
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}, _callee3);
|
|
630
|
-
}));
|
|
631
|
-
|
|
632
|
-
function refresh() {
|
|
633
|
-
return _refresh.apply(this, arguments);
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
return refresh;
|
|
637
|
-
}()
|
|
638
|
-
});
|
|
639
|
-
}
|
|
370
|
+
async componentDidMount() {
|
|
371
|
+
this.prevContext = this.context;
|
|
372
|
+
await this.fetchMeta();
|
|
373
|
+
}
|
|
640
374
|
|
|
641
|
-
|
|
642
|
-
|
|
375
|
+
async componentDidUpdate(prevProps) {
|
|
376
|
+
const {
|
|
377
|
+
schemaVersion,
|
|
378
|
+
onSchemaChange
|
|
379
|
+
} = this.props;
|
|
380
|
+
const {
|
|
381
|
+
meta
|
|
382
|
+
} = this.state;
|
|
383
|
+
|
|
384
|
+
if (this.prevContext?.cubejsApi !== this.context?.cubejsApi) {
|
|
385
|
+
this.prevContext = this.context;
|
|
386
|
+
await this.fetchMeta();
|
|
387
|
+
}
|
|
643
388
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
// eslint-disable-next-line
|
|
648
|
-
this.setState({
|
|
649
|
-
metaError: _context4.t0
|
|
650
|
-
});
|
|
389
|
+
if (prevProps.schemaVersion !== schemaVersion) {
|
|
390
|
+
try {
|
|
391
|
+
const newMeta = await this.cubejsApi().meta();
|
|
651
392
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
393
|
+
if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
|
|
394
|
+
onSchemaChange({
|
|
395
|
+
schemaVersion,
|
|
396
|
+
refresh: async () => {
|
|
397
|
+
await this.fetchMeta();
|
|
655
398
|
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
})
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
// eslint-disable-next-line
|
|
403
|
+
this.setState({
|
|
404
|
+
metaError: error
|
|
405
|
+
});
|
|
662
406
|
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
663
409
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
410
|
+
fetchMeta = async () => {
|
|
411
|
+
if (!this.cubejsApi()) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
let meta;
|
|
416
|
+
let metaError = null;
|
|
417
|
+
let richMetaError = null;
|
|
418
|
+
let metaErrorStack = null;
|
|
670
419
|
|
|
671
|
-
|
|
420
|
+
try {
|
|
421
|
+
this.setState({
|
|
422
|
+
isFetchingMeta: true
|
|
423
|
+
});
|
|
424
|
+
meta = await this.cubejsApi().meta();
|
|
425
|
+
} catch (error) {
|
|
426
|
+
metaError = error.response?.plainError || error;
|
|
427
|
+
richMetaError = error;
|
|
428
|
+
metaErrorStack = error.response?.stack?.replace(error.message || '', '') || '';
|
|
672
429
|
}
|
|
673
|
-
}, {
|
|
674
|
-
key: "getMissingMembers",
|
|
675
|
-
value: function getMissingMembers(query, meta) {
|
|
676
|
-
if (!meta) {
|
|
677
|
-
return [];
|
|
678
|
-
}
|
|
679
430
|
|
|
680
|
-
|
|
681
|
-
|
|
431
|
+
this.setState({
|
|
432
|
+
meta,
|
|
433
|
+
metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
|
|
434
|
+
richMetaError,
|
|
435
|
+
metaErrorStack,
|
|
436
|
+
isFetchingMeta: false
|
|
437
|
+
}, () => {
|
|
438
|
+
// Run update query to force viz state update
|
|
439
|
+
// This will catch any new missing members, and also validate the query against the new meta
|
|
440
|
+
this.updateQuery({});
|
|
441
|
+
});
|
|
442
|
+
};
|
|
682
443
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
444
|
+
cubejsApi() {
|
|
445
|
+
const {
|
|
446
|
+
cubejsApi
|
|
447
|
+
} = this.props; // eslint-disable-next-line react/destructuring-assignment
|
|
686
448
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
var query = this.state.query;
|
|
694
|
-
return QueryRenderer.isQueryPresent(query);
|
|
449
|
+
return cubejsApi || this.context && this.context.cubejsApi;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
getMissingMembers(query, meta) {
|
|
453
|
+
if (!meta) {
|
|
454
|
+
return [];
|
|
695
455
|
}
|
|
696
|
-
}, {
|
|
697
|
-
key: "prepareRenderProps",
|
|
698
|
-
value: function prepareRenderProps(queryRendererProps) {
|
|
699
|
-
var _this3 = this;
|
|
700
456
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
};
|
|
457
|
+
return getQueryMembers(query).map(member => {
|
|
458
|
+
const resolvedMember = meta.resolveMember(member, ['measures', 'dimensions', 'segments']);
|
|
704
459
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
} : {
|
|
709
|
-
dateRange: member.dateRange
|
|
710
|
-
};
|
|
711
|
-
return removeEmpty(_objectSpread$4({
|
|
712
|
-
dimension: member.dimension.name,
|
|
713
|
-
granularity: member.granularity
|
|
714
|
-
}, rangeSelection));
|
|
715
|
-
};
|
|
460
|
+
if (resolvedMember.error) {
|
|
461
|
+
return member;
|
|
462
|
+
}
|
|
716
463
|
|
|
717
|
-
|
|
718
|
-
|
|
464
|
+
return false;
|
|
465
|
+
}).filter(Boolean);
|
|
466
|
+
}
|
|
719
467
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
468
|
+
isQueryPresent() {
|
|
469
|
+
const {
|
|
470
|
+
query
|
|
471
|
+
} = this.state;
|
|
472
|
+
return QueryRenderer.isQueryPresent(query);
|
|
473
|
+
}
|
|
726
474
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
remove: function remove(member) {
|
|
736
|
-
var query = _this3.state.query;
|
|
737
|
-
return _this3.updateQuery(_defineProperty({}, memberType, (query[memberType] || []).filter(function (_, index) {
|
|
738
|
-
return index !== member.index;
|
|
739
|
-
})));
|
|
740
|
-
},
|
|
741
|
-
update: function update(member, updateWith) {
|
|
742
|
-
var query = _this3.state.query;
|
|
743
|
-
var members = (query[memberType] || []).concat([]);
|
|
744
|
-
members.splice(member.index, 1, toQuery(updateWith));
|
|
745
|
-
return _this3.updateQuery(_defineProperty({}, memberType, members));
|
|
746
|
-
}
|
|
747
|
-
};
|
|
475
|
+
prepareRenderProps(queryRendererProps) {
|
|
476
|
+
const getName = member => member.name;
|
|
477
|
+
|
|
478
|
+
const toTimeDimension = member => {
|
|
479
|
+
const rangeSelection = member.compareDateRange ? {
|
|
480
|
+
compareDateRange: member.compareDateRange
|
|
481
|
+
} : {
|
|
482
|
+
dateRange: member.dateRange
|
|
748
483
|
};
|
|
484
|
+
return removeEmpty({
|
|
485
|
+
dimension: member.dimension.name,
|
|
486
|
+
granularity: member.granularity,
|
|
487
|
+
...rangeSelection
|
|
488
|
+
});
|
|
489
|
+
};
|
|
749
490
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
return "".concat(prop('member', filter)).concat(prop('operator', filter));
|
|
764
|
-
}, flattenFilters(meta && query.filters || []).map(function (filter) {
|
|
765
|
-
return _objectSpread$4(_objectSpread$4({}, filter), {}, {
|
|
766
|
-
member: filter.member || filter.dimension
|
|
491
|
+
const toFilter = member => ({
|
|
492
|
+
member: member.member?.name || member.dimension?.name,
|
|
493
|
+
operator: member.operator,
|
|
494
|
+
values: member.values
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
const updateMethods = (memberType, toQuery = getName) => ({
|
|
498
|
+
add: member => {
|
|
499
|
+
const {
|
|
500
|
+
query
|
|
501
|
+
} = this.state;
|
|
502
|
+
this.updateQuery({
|
|
503
|
+
[memberType]: (query[memberType] || []).concat(toQuery(member))
|
|
767
504
|
});
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
505
|
+
},
|
|
506
|
+
remove: member => {
|
|
507
|
+
const {
|
|
508
|
+
query
|
|
509
|
+
} = this.state;
|
|
510
|
+
return this.updateQuery({
|
|
511
|
+
[memberType]: (query[memberType] || []).filter((_, index) => index !== member.index)
|
|
774
512
|
});
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
var availableMeasures = [];
|
|
785
|
-
var availableDimensions = [];
|
|
786
|
-
var availableSegments = [];
|
|
787
|
-
var availableFilterMembers = [];
|
|
788
|
-
var availableMembers = (meta === null || meta === void 0 ? void 0 : meta.membersGroupedByCube()) || {
|
|
789
|
-
measures: [],
|
|
790
|
-
dimensions: [],
|
|
791
|
-
segments: [],
|
|
792
|
-
timeDimensions: []
|
|
793
|
-
};
|
|
794
|
-
|
|
795
|
-
if (meta) {
|
|
796
|
-
availableMeasures = meta.membersForQuery(query, 'measures');
|
|
797
|
-
availableDimensions = meta.membersForQuery(query, 'dimensions');
|
|
798
|
-
availableSegments = meta.membersForQuery(query, 'segments');
|
|
799
|
-
var indexedMeasures = indexBy(prop('cubeName'), availableMembers.measures);
|
|
800
|
-
var indexedDimensions = indexBy(prop('cubeName'), availableMembers.dimensions);
|
|
801
|
-
var cubeNames = uniq([].concat(_toConsumableArray(Object.keys(indexedMeasures)), _toConsumableArray(Object.keys(indexedDimensions)))).sort();
|
|
802
|
-
availableFilterMembers = cubeNames.map(function (name) {
|
|
803
|
-
var _indexedMeasures$name, _indexedDimensions$na;
|
|
804
|
-
|
|
805
|
-
var cube = indexedMeasures[name] || indexedDimensions[name];
|
|
806
|
-
return _objectSpread$4(_objectSpread$4({}, cube), {}, {
|
|
807
|
-
members: [].concat(_toConsumableArray((_indexedMeasures$name = indexedMeasures[name]) === null || _indexedMeasures$name === void 0 ? void 0 : _indexedMeasures$name.members), _toConsumableArray((_indexedDimensions$na = indexedDimensions[name]) === null || _indexedDimensions$na === void 0 ? void 0 : _indexedDimensions$na.members)).sort(function (a, b) {
|
|
808
|
-
return a.shortTitle > b.shortTitle ? 1 : -1;
|
|
809
|
-
})
|
|
810
|
-
});
|
|
513
|
+
},
|
|
514
|
+
update: (member, updateWith) => {
|
|
515
|
+
const {
|
|
516
|
+
query
|
|
517
|
+
} = this.state;
|
|
518
|
+
const members = (query[memberType] || []).concat([]);
|
|
519
|
+
members.splice(member.index, 1, toQuery(updateWith));
|
|
520
|
+
return this.updateQuery({
|
|
521
|
+
[memberType]: members
|
|
811
522
|
});
|
|
812
523
|
}
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
const {
|
|
527
|
+
meta,
|
|
528
|
+
metaError,
|
|
529
|
+
richMetaError,
|
|
530
|
+
query,
|
|
531
|
+
queryError,
|
|
532
|
+
chartType,
|
|
533
|
+
pivotConfig,
|
|
534
|
+
validatedQuery,
|
|
535
|
+
missingMembers,
|
|
536
|
+
isFetchingMeta,
|
|
537
|
+
dryRunResponse,
|
|
538
|
+
metaErrorStack
|
|
539
|
+
} = this.state;
|
|
540
|
+
const flatFilters = uniqBy(filter => `${prop('member', filter)}${prop('operator', filter)}`, flattenFilters(meta && query.filters || []).map(filter => ({ ...filter,
|
|
541
|
+
member: filter.member || filter.dimension
|
|
542
|
+
})));
|
|
543
|
+
const filters = flatFilters.map((m, i) => ({ ...m,
|
|
544
|
+
dimension: meta.resolveMember(m.member || m.dimension, ['dimensions', 'measures']),
|
|
545
|
+
operators: meta.filterOperatorsForMember(m.member || m.dimension, ['dimensions', 'measures']),
|
|
546
|
+
index: i
|
|
547
|
+
}));
|
|
548
|
+
const measures = QueryBuilder.resolveMember('measures', this.state);
|
|
549
|
+
const dimensions = QueryBuilder.resolveMember('dimensions', this.state);
|
|
550
|
+
const timeDimensions = QueryBuilder.resolveMember('timeDimensions', this.state);
|
|
551
|
+
const segments = (meta && query.segments || []).map((m, i) => ({
|
|
552
|
+
index: i,
|
|
553
|
+
...meta.resolveMember(m, 'segments')
|
|
554
|
+
}));
|
|
555
|
+
let availableMeasures = [];
|
|
556
|
+
let availableDimensions = [];
|
|
557
|
+
let availableSegments = [];
|
|
558
|
+
let availableFilterMembers = [];
|
|
559
|
+
const availableMembers = meta?.membersGroupedByCube() || {
|
|
560
|
+
measures: [],
|
|
561
|
+
dimensions: [],
|
|
562
|
+
segments: [],
|
|
563
|
+
timeDimensions: []
|
|
564
|
+
};
|
|
813
565
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
order: (activeOrder === null || activeOrder === void 0 ? void 0 : activeOrder[name]) || 'none'
|
|
566
|
+
if (meta) {
|
|
567
|
+
availableMeasures = meta.membersForQuery(query, 'measures');
|
|
568
|
+
availableDimensions = meta.membersForQuery(query, 'dimensions');
|
|
569
|
+
availableSegments = meta.membersForQuery(query, 'segments');
|
|
570
|
+
const indexedMeasures = indexBy(prop('cubeName'), availableMembers.measures);
|
|
571
|
+
const indexedDimensions = indexBy(prop('cubeName'), availableMembers.dimensions);
|
|
572
|
+
const cubeNames = uniq([...Object.keys(indexedMeasures), ...Object.keys(indexedDimensions)]).sort();
|
|
573
|
+
availableFilterMembers = cubeNames.map(name => {
|
|
574
|
+
const cube = indexedMeasures[name] || indexedDimensions[name];
|
|
575
|
+
return { ...cube,
|
|
576
|
+
members: [...indexedMeasures[name]?.members, ...indexedDimensions[name]?.members].sort((a, b) => a.shortTitle > b.shortTitle ? 1 : -1)
|
|
826
577
|
};
|
|
827
|
-
})
|
|
578
|
+
});
|
|
579
|
+
}
|
|
828
580
|
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
581
|
+
const activeOrder = Array.isArray(query.order) ? Object.fromEntries(query.order) : query.order;
|
|
582
|
+
const members = [...measures, ...dimensions, ...timeDimensions.map(({
|
|
583
|
+
dimension
|
|
584
|
+
}) => dimension)];
|
|
585
|
+
let orderMembers = uniqBy(prop('id'), [// uniqBy prefers first, so these will only be added if not already in the query
|
|
586
|
+
...members.map(({
|
|
587
|
+
name,
|
|
588
|
+
title
|
|
589
|
+
}) => ({
|
|
590
|
+
id: name,
|
|
591
|
+
title,
|
|
592
|
+
order: activeOrder?.[name] || 'none'
|
|
593
|
+
}))]);
|
|
594
|
+
|
|
595
|
+
if (this.orderMembersOrderKeys.length !== orderMembers.length) {
|
|
596
|
+
this.orderMembersOrderKeys = orderMembers.map(({
|
|
597
|
+
id
|
|
598
|
+
}) => id);
|
|
599
|
+
}
|
|
835
600
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
return member.id === id;
|
|
842
|
-
});
|
|
843
|
-
});
|
|
844
|
-
}
|
|
601
|
+
if (this.orderMembersOrderKeys.length) {
|
|
602
|
+
// Preserve order until the members change or manually re-ordered
|
|
603
|
+
// This is needed so that when an order member becomes active, it doesn't jump to the top of the list
|
|
604
|
+
orderMembers = (this.orderMembersOrderKeys || []).map(id => orderMembers.find(member => member.id === id));
|
|
605
|
+
}
|
|
845
606
|
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
607
|
+
return {
|
|
608
|
+
meta,
|
|
609
|
+
metaError,
|
|
610
|
+
richMetaError,
|
|
611
|
+
metaErrorStack,
|
|
612
|
+
query,
|
|
613
|
+
error: queryError,
|
|
614
|
+
// Match same name as QueryRenderer prop
|
|
615
|
+
validatedQuery,
|
|
616
|
+
isQueryPresent: this.isQueryPresent(),
|
|
617
|
+
chartType,
|
|
618
|
+
measures,
|
|
619
|
+
dimensions,
|
|
620
|
+
timeDimensions,
|
|
621
|
+
segments,
|
|
622
|
+
filters,
|
|
623
|
+
orderMembers,
|
|
624
|
+
availableMeasures,
|
|
625
|
+
availableDimensions,
|
|
626
|
+
availableTimeDimensions: availableDimensions.filter(m => m.type === 'time'),
|
|
627
|
+
availableSegments,
|
|
628
|
+
availableMembers,
|
|
629
|
+
availableFilterMembers,
|
|
630
|
+
updateQuery: queryUpdate => this.updateQuery(queryUpdate),
|
|
631
|
+
updateMeasures: updateMethods('measures'),
|
|
632
|
+
updateDimensions: updateMethods('dimensions'),
|
|
633
|
+
updateSegments: updateMethods('segments'),
|
|
634
|
+
updateTimeDimensions: updateMethods('timeDimensions', toTimeDimension),
|
|
635
|
+
updateFilters: updateMethods('filters', toFilter),
|
|
636
|
+
updateChartType: newChartType => this.updateVizState({
|
|
637
|
+
chartType: newChartType
|
|
638
|
+
}),
|
|
639
|
+
updateOrder: {
|
|
640
|
+
set: (memberId, newOrder = 'asc') => {
|
|
641
|
+
this.updateQuery({
|
|
642
|
+
order: orderMembers.map(orderMember => ({ ...orderMember,
|
|
643
|
+
order: orderMember.id === memberId ? newOrder : orderMember.order
|
|
644
|
+
})).reduce((acc, {
|
|
645
|
+
id,
|
|
646
|
+
order
|
|
647
|
+
}) => order !== 'none' ? [...acc, [id, order]] : acc, [])
|
|
881
648
|
});
|
|
882
649
|
},
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
_this3.updateQuery({
|
|
888
|
-
order: orderMembers.map(function (orderMember) {
|
|
889
|
-
return _objectSpread$4(_objectSpread$4({}, orderMember), {}, {
|
|
890
|
-
order: orderMember.id === memberId ? newOrder : orderMember.order
|
|
891
|
-
});
|
|
892
|
-
}).reduce(function (acc, _ref5) {
|
|
893
|
-
var id = _ref5.id,
|
|
894
|
-
order = _ref5.order;
|
|
895
|
-
return order !== 'none' ? [].concat(_toConsumableArray(acc), [[id, order]]) : acc;
|
|
896
|
-
}, [])
|
|
897
|
-
});
|
|
898
|
-
},
|
|
899
|
-
update: function update(order) {
|
|
900
|
-
_this3.updateQuery({
|
|
901
|
-
order: order
|
|
902
|
-
});
|
|
903
|
-
},
|
|
904
|
-
reorder: function reorder(sourceIndex, destinationIndex) {
|
|
905
|
-
if (sourceIndex == null || destinationIndex == null) {
|
|
906
|
-
return;
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
var nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
|
|
910
|
-
_this3.orderMembersOrderKeys = nextArray.map(function (_ref6) {
|
|
911
|
-
var id = _ref6.id;
|
|
912
|
-
return id;
|
|
913
|
-
});
|
|
914
|
-
|
|
915
|
-
_this3.updateQuery({
|
|
916
|
-
order: nextArray.reduce(function (acc, _ref7) {
|
|
917
|
-
var id = _ref7.id,
|
|
918
|
-
order = _ref7.order;
|
|
919
|
-
return order !== 'none' ? [].concat(_toConsumableArray(acc), [[id, order]]) : acc;
|
|
920
|
-
}, [])
|
|
921
|
-
});
|
|
922
|
-
}
|
|
650
|
+
update: order => {
|
|
651
|
+
this.updateQuery({
|
|
652
|
+
order
|
|
653
|
+
});
|
|
923
654
|
},
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
var sourceIndex = _ref8.sourceIndex,
|
|
928
|
-
destinationIndex = _ref8.destinationIndex,
|
|
929
|
-
sourceAxis = _ref8.sourceAxis,
|
|
930
|
-
destinationAxis = _ref8.destinationAxis;
|
|
931
|
-
|
|
932
|
-
_this3.updateVizState({
|
|
933
|
-
pivotConfig: movePivotItem(pivotConfig, sourceIndex, destinationIndex, sourceAxis, destinationAxis)
|
|
934
|
-
});
|
|
935
|
-
},
|
|
936
|
-
update: function update(config) {
|
|
937
|
-
var limit = config.limit;
|
|
938
|
-
|
|
939
|
-
_this3.updateVizState(_objectSpread$4({
|
|
940
|
-
pivotConfig: _objectSpread$4(_objectSpread$4({}, pivotConfig), config)
|
|
941
|
-
}, limit ? {
|
|
942
|
-
query: _objectSpread$4(_objectSpread$4({}, query), {}, {
|
|
943
|
-
limit: limit
|
|
944
|
-
})
|
|
945
|
-
} : null));
|
|
655
|
+
reorder: (sourceIndex, destinationIndex) => {
|
|
656
|
+
if (sourceIndex == null || destinationIndex == null) {
|
|
657
|
+
return;
|
|
946
658
|
}
|
|
947
|
-
},
|
|
948
|
-
missingMembers: missingMembers,
|
|
949
|
-
refresh: this.fetchMeta,
|
|
950
|
-
isFetchingMeta: isFetchingMeta,
|
|
951
|
-
dryRunResponse: dryRunResponse
|
|
952
|
-
}, queryRendererProps);
|
|
953
|
-
}
|
|
954
|
-
}, {
|
|
955
|
-
key: "updateQuery",
|
|
956
|
-
value: function updateQuery(queryUpdate) {
|
|
957
|
-
var query = this.state.query;
|
|
958
|
-
this.updateVizState({
|
|
959
|
-
query: removeEmptyQueryFields(_objectSpread$4(_objectSpread$4({}, query), queryUpdate))
|
|
960
|
-
});
|
|
961
|
-
}
|
|
962
|
-
}, {
|
|
963
|
-
key: "updateVizState",
|
|
964
|
-
value: function () {
|
|
965
|
-
var _updateVizState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(state) {
|
|
966
|
-
var _this4 = this;
|
|
967
|
-
|
|
968
|
-
var _this$props2, setQuery, setVizState, _this$state2, stateQuery, statePivotConfig, chartType, meta, finalState, vizStateSent, handleVizStateChange, runSetters, shouldFetchDryRun, response;
|
|
969
|
-
|
|
970
|
-
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
971
|
-
while (1) {
|
|
972
|
-
switch (_context5.prev = _context5.next) {
|
|
973
|
-
case 0:
|
|
974
|
-
_this$props2 = this.props, setQuery = _this$props2.setQuery, setVizState = _this$props2.setVizState;
|
|
975
|
-
_this$state2 = this.state, stateQuery = _this$state2.query, statePivotConfig = _this$state2.pivotConfig, chartType = _this$state2.chartType, meta = _this$state2.meta;
|
|
976
|
-
finalState = this.applyStateChangeHeuristics(state);
|
|
977
|
-
|
|
978
|
-
if (!finalState.query) {
|
|
979
|
-
finalState.query = _objectSpread$4({}, stateQuery);
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
vizStateSent = null;
|
|
983
659
|
|
|
984
|
-
|
|
985
|
-
|
|
660
|
+
const nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
|
|
661
|
+
this.orderMembersOrderKeys = nextArray.map(({
|
|
662
|
+
id
|
|
663
|
+
}) => id);
|
|
664
|
+
this.updateQuery({
|
|
665
|
+
order: nextArray.reduce((acc, {
|
|
666
|
+
id,
|
|
667
|
+
order
|
|
668
|
+
}) => order !== 'none' ? [...acc, [id, order]] : acc, [])
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
pivotConfig,
|
|
673
|
+
updatePivotConfig: {
|
|
674
|
+
moveItem: ({
|
|
675
|
+
sourceIndex,
|
|
676
|
+
destinationIndex,
|
|
677
|
+
sourceAxis,
|
|
678
|
+
destinationAxis
|
|
679
|
+
}) => {
|
|
680
|
+
this.updateVizState({
|
|
681
|
+
pivotConfig: movePivotItem(pivotConfig, sourceIndex, destinationIndex, sourceAxis, destinationAxis)
|
|
682
|
+
});
|
|
683
|
+
},
|
|
684
|
+
update: config => {
|
|
685
|
+
const {
|
|
686
|
+
limit
|
|
687
|
+
} = config;
|
|
688
|
+
this.updateVizState({
|
|
689
|
+
pivotConfig: { ...pivotConfig,
|
|
690
|
+
...config
|
|
691
|
+
},
|
|
692
|
+
...(limit ? {
|
|
693
|
+
query: { ...query,
|
|
694
|
+
limit
|
|
695
|
+
}
|
|
696
|
+
} : null)
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
},
|
|
700
|
+
missingMembers,
|
|
701
|
+
refresh: this.fetchMeta,
|
|
702
|
+
isFetchingMeta,
|
|
703
|
+
dryRunResponse,
|
|
704
|
+
...queryRendererProps
|
|
705
|
+
};
|
|
706
|
+
}
|
|
986
707
|
|
|
987
|
-
|
|
988
|
-
|
|
708
|
+
updateQuery(queryUpdate) {
|
|
709
|
+
const {
|
|
710
|
+
query
|
|
711
|
+
} = this.state;
|
|
712
|
+
this.updateVizState({
|
|
713
|
+
query: removeEmptyQueryFields({ ...query,
|
|
714
|
+
...queryUpdate
|
|
715
|
+
})
|
|
716
|
+
});
|
|
717
|
+
}
|
|
989
718
|
|
|
990
|
-
|
|
991
|
-
|
|
719
|
+
async updateVizState(state) {
|
|
720
|
+
const {
|
|
721
|
+
setQuery,
|
|
722
|
+
setVizState
|
|
723
|
+
} = this.props;
|
|
724
|
+
const {
|
|
725
|
+
query: stateQuery,
|
|
726
|
+
pivotConfig: statePivotConfig,
|
|
727
|
+
chartType,
|
|
728
|
+
meta
|
|
729
|
+
} = this.state;
|
|
730
|
+
const finalState = this.applyStateChangeHeuristics(state);
|
|
731
|
+
|
|
732
|
+
if (!finalState.query) {
|
|
733
|
+
finalState.query = { ...stateQuery
|
|
734
|
+
};
|
|
735
|
+
}
|
|
992
736
|
|
|
993
|
-
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}; // deprecated, setters replaced by onVizStateChanged
|
|
737
|
+
let vizStateSent = null;
|
|
997
738
|
|
|
739
|
+
const handleVizStateChange = currentState => {
|
|
740
|
+
const {
|
|
741
|
+
onVizStateChanged
|
|
742
|
+
} = this.props;
|
|
998
743
|
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
|
|
1002
|
-
}
|
|
744
|
+
if (onVizStateChanged) {
|
|
745
|
+
const newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState); // Don't run callbacks more than once unless the viz state has changed since last time
|
|
1003
746
|
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
}
|
|
1007
|
-
};
|
|
747
|
+
if (!vizStateSent || !equals(vizStateSent, newVizState)) {
|
|
748
|
+
onVizStateChanged(newVizState); // use clone to make sure we don't save object references
|
|
1008
749
|
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
750
|
+
vizStateSent = clone(newVizState);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}; // deprecated, setters replaced by onVizStateChanged
|
|
1012
754
|
|
|
1013
|
-
finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
|
|
1014
|
-
finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
|
|
1015
|
-
finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
|
|
1016
755
|
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
756
|
+
const runSetters = currentState => {
|
|
757
|
+
if (setVizState) {
|
|
758
|
+
setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
|
|
759
|
+
}
|
|
1020
760
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
|
|
761
|
+
if (currentState.query && setQuery) {
|
|
762
|
+
setQuery(currentState.query);
|
|
763
|
+
}
|
|
764
|
+
};
|
|
1026
765
|
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
}
|
|
766
|
+
if (finalState.shouldApplyHeuristicOrder) {
|
|
767
|
+
finalState.query.order = defaultOrder(finalState.query);
|
|
768
|
+
}
|
|
1031
769
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
mutexObj: this.mutexObj
|
|
1036
|
-
});
|
|
770
|
+
finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
|
|
771
|
+
finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
|
|
772
|
+
finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
|
|
1037
773
|
|
|
1038
|
-
|
|
1039
|
-
|
|
774
|
+
runSetters({ ...state,
|
|
775
|
+
query: finalState.query
|
|
776
|
+
}); // Update optimistically so that UI does not stutter
|
|
1040
777
|
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
778
|
+
this.setState({ ...finalState,
|
|
779
|
+
queryError: null
|
|
780
|
+
});
|
|
781
|
+
handleVizStateChange(finalState);
|
|
782
|
+
const shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
|
|
1046
783
|
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
784
|
+
if (shouldFetchDryRun && isQueryPresent(finalState.query) && finalState.missingMembers.length === 0) {
|
|
785
|
+
try {
|
|
786
|
+
const response = await this.cubejsApi().dryRun(finalState.query, {
|
|
787
|
+
mutexObj: this.mutexObj
|
|
788
|
+
});
|
|
1050
789
|
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
790
|
+
if (finalState.shouldApplyHeuristicOrder) {
|
|
791
|
+
finalState.query.order = (response.queryOrder || []).reduce((memo, current) => ({ ...memo,
|
|
792
|
+
...current
|
|
793
|
+
}), {});
|
|
794
|
+
}
|
|
1054
795
|
|
|
1055
|
-
|
|
1056
|
-
|
|
796
|
+
finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(response.pivotQuery, finalState.pivotConfig);
|
|
797
|
+
finalState.validatedQuery = this.validatedQuery(finalState);
|
|
798
|
+
finalState.dryRunResponse = response; // deprecated
|
|
1057
799
|
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
800
|
+
if (isQueryPresent(stateQuery)) {
|
|
801
|
+
runSetters({ ...this.state,
|
|
802
|
+
...finalState
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
} catch (error) {
|
|
806
|
+
this.setState({
|
|
807
|
+
queryError: new Error(error.response?.plainError || error.message),
|
|
808
|
+
richQueryError: new Error(error.message || error.toString())
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
}
|
|
1064
812
|
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
return handleVizStateChange(_this4.state);
|
|
1068
|
-
});
|
|
813
|
+
this.setState(finalState, () => handleVizStateChange(this.state));
|
|
814
|
+
}
|
|
1069
815
|
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
}));
|
|
816
|
+
validatedQuery(state) {
|
|
817
|
+
const {
|
|
818
|
+
query
|
|
819
|
+
} = state || this.state;
|
|
820
|
+
return validateQuery(query);
|
|
821
|
+
}
|
|
1077
822
|
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
823
|
+
defaultHeuristics(newState) {
|
|
824
|
+
const {
|
|
825
|
+
query,
|
|
826
|
+
sessionGranularity,
|
|
827
|
+
meta
|
|
828
|
+
} = this.state;
|
|
829
|
+
return defaultHeuristics(newState, query, {
|
|
830
|
+
meta,
|
|
831
|
+
sessionGranularity: sessionGranularity || 'day'
|
|
832
|
+
});
|
|
833
|
+
}
|
|
1081
834
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
var _ref9 = state || this.state,
|
|
1088
|
-
query = _ref9.query;
|
|
835
|
+
applyStateChangeHeuristics(newState) {
|
|
836
|
+
const {
|
|
837
|
+
stateChangeHeuristics,
|
|
838
|
+
disableHeuristics
|
|
839
|
+
} = this.props;
|
|
1089
840
|
|
|
1090
|
-
|
|
841
|
+
if (disableHeuristics) {
|
|
842
|
+
return newState;
|
|
1091
843
|
}
|
|
1092
|
-
}, {
|
|
1093
|
-
key: "defaultHeuristics",
|
|
1094
|
-
value: function defaultHeuristics$1(newState) {
|
|
1095
|
-
var _this$state3 = this.state,
|
|
1096
|
-
query = _this$state3.query,
|
|
1097
|
-
sessionGranularity = _this$state3.sessionGranularity,
|
|
1098
|
-
meta = _this$state3.meta;
|
|
1099
|
-
return defaultHeuristics(newState, query, {
|
|
1100
|
-
meta: meta,
|
|
1101
|
-
sessionGranularity: sessionGranularity || 'day'
|
|
1102
|
-
});
|
|
1103
|
-
}
|
|
1104
|
-
}, {
|
|
1105
|
-
key: "applyStateChangeHeuristics",
|
|
1106
|
-
value: function applyStateChangeHeuristics(newState) {
|
|
1107
|
-
var _this$props3 = this.props,
|
|
1108
|
-
stateChangeHeuristics = _this$props3.stateChangeHeuristics,
|
|
1109
|
-
disableHeuristics = _this$props3.disableHeuristics;
|
|
1110
|
-
|
|
1111
|
-
if (disableHeuristics) {
|
|
1112
|
-
return newState;
|
|
1113
|
-
}
|
|
1114
844
|
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
}, {
|
|
1118
|
-
key: "render",
|
|
1119
|
-
value: function render() {
|
|
1120
|
-
var _this5 = this;
|
|
1121
|
-
|
|
1122
|
-
var query = this.state.query;
|
|
1123
|
-
var _this$props4 = this.props,
|
|
1124
|
-
cubejsApi = _this$props4.cubejsApi,
|
|
1125
|
-
_render = _this$props4.render,
|
|
1126
|
-
wrapWithQueryRenderer = _this$props4.wrapWithQueryRenderer;
|
|
1127
|
-
|
|
1128
|
-
if (wrapWithQueryRenderer) {
|
|
1129
|
-
return /*#__PURE__*/React.createElement(QueryRenderer, {
|
|
1130
|
-
query: query,
|
|
1131
|
-
cubejsApi: cubejsApi,
|
|
1132
|
-
resetResultSetOnChange: false,
|
|
1133
|
-
render: function render(queryRendererProps) {
|
|
1134
|
-
if (_render) {
|
|
1135
|
-
return _render(_this5.prepareRenderProps(queryRendererProps));
|
|
1136
|
-
}
|
|
845
|
+
return stateChangeHeuristics && stateChangeHeuristics(this.state, newState) || this.defaultHeuristics(newState);
|
|
846
|
+
}
|
|
1137
847
|
|
|
1138
|
-
|
|
848
|
+
render() {
|
|
849
|
+
const {
|
|
850
|
+
query
|
|
851
|
+
} = this.state;
|
|
852
|
+
const {
|
|
853
|
+
cubejsApi,
|
|
854
|
+
render,
|
|
855
|
+
wrapWithQueryRenderer
|
|
856
|
+
} = this.props;
|
|
857
|
+
|
|
858
|
+
if (wrapWithQueryRenderer) {
|
|
859
|
+
return /*#__PURE__*/React.createElement(QueryRenderer, {
|
|
860
|
+
query: query,
|
|
861
|
+
cubejsApi: cubejsApi,
|
|
862
|
+
resetResultSetOnChange: false,
|
|
863
|
+
render: queryRendererProps => {
|
|
864
|
+
if (render) {
|
|
865
|
+
return render(this.prepareRenderProps(queryRendererProps));
|
|
1139
866
|
}
|
|
1140
|
-
});
|
|
1141
|
-
} else {
|
|
1142
|
-
if (_render) {
|
|
1143
|
-
return _render(this.prepareRenderProps());
|
|
1144
|
-
}
|
|
1145
867
|
|
|
1146
|
-
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
}], [{
|
|
1150
|
-
key: "getDerivedStateFromProps",
|
|
1151
|
-
value: // This is an anti-pattern, only kept for backward compatibility
|
|
1152
|
-
// https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
|
|
1153
|
-
function getDerivedStateFromProps(props, state) {
|
|
1154
|
-
if (props.query || props.vizState) {
|
|
1155
|
-
var nextState = _objectSpread$4(_objectSpread$4({}, state), props.vizState || {});
|
|
1156
|
-
|
|
1157
|
-
if (Array.isArray(props.query)) {
|
|
1158
|
-
throw new Error('Array of queries is not supported.');
|
|
868
|
+
return null;
|
|
1159
869
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
870
|
+
});
|
|
871
|
+
} else {
|
|
872
|
+
if (render) {
|
|
873
|
+
return render(this.prepareRenderProps());
|
|
1164
874
|
}
|
|
1165
875
|
|
|
1166
876
|
return null;
|
|
1167
877
|
}
|
|
1168
|
-
}
|
|
1169
|
-
key: "resolveMember",
|
|
1170
|
-
value: function resolveMember(type, _ref10) {
|
|
1171
|
-
var meta = _ref10.meta,
|
|
1172
|
-
query = _ref10.query;
|
|
1173
|
-
|
|
1174
|
-
if (!meta) {
|
|
1175
|
-
return [];
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
if (Array.isArray(query)) {
|
|
1179
|
-
return query.reduce(function (memo, currentQuery) {
|
|
1180
|
-
return memo.concat(QueryBuilder.resolveMember(type, {
|
|
1181
|
-
meta: meta,
|
|
1182
|
-
query: currentQuery
|
|
1183
|
-
}));
|
|
1184
|
-
}, []);
|
|
1185
|
-
}
|
|
878
|
+
}
|
|
1186
879
|
|
|
1187
|
-
|
|
1188
|
-
return (query.timeDimensions || []).map(function (m, index) {
|
|
1189
|
-
return _objectSpread$4(_objectSpread$4({}, m), {}, {
|
|
1190
|
-
dimension: _objectSpread$4(_objectSpread$4({}, meta.resolveMember(m.dimension, 'dimensions')), {}, {
|
|
1191
|
-
granularities: granularities
|
|
1192
|
-
}),
|
|
1193
|
-
index: index
|
|
1194
|
-
});
|
|
1195
|
-
});
|
|
1196
|
-
}
|
|
880
|
+
}
|
|
1197
881
|
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
});
|
|
1203
|
-
}
|
|
1204
|
-
}]);
|
|
1205
|
-
|
|
1206
|
-
return QueryBuilder;
|
|
1207
|
-
}(React.Component);
|
|
1208
|
-
|
|
1209
|
-
_defineProperty(QueryBuilder, "contextType", CubeContext);
|
|
1210
|
-
QueryBuilder.defaultProps = {
|
|
1211
|
-
cubejsApi: null,
|
|
1212
|
-
stateChangeHeuristics: null,
|
|
1213
|
-
disableHeuristics: false,
|
|
1214
|
-
render: null,
|
|
1215
|
-
wrapWithQueryRenderer: true,
|
|
1216
|
-
defaultChartType: 'line',
|
|
1217
|
-
defaultQuery: {},
|
|
1218
|
-
initialVizState: null,
|
|
1219
|
-
onVizStateChanged: null,
|
|
1220
|
-
// deprecated
|
|
1221
|
-
query: null,
|
|
1222
|
-
setQuery: null,
|
|
1223
|
-
vizState: null,
|
|
1224
|
-
setVizState: null
|
|
1225
|
-
};
|
|
1226
|
-
|
|
1227
|
-
function CubeProvider(_ref) {
|
|
1228
|
-
var cubejsApi = _ref.cubejsApi,
|
|
1229
|
-
children = _ref.children;
|
|
882
|
+
function CubeProvider({
|
|
883
|
+
cubejsApi,
|
|
884
|
+
children
|
|
885
|
+
}) {
|
|
1230
886
|
return /*#__PURE__*/React.createElement(CubeContext.Provider, {
|
|
1231
887
|
value: {
|
|
1232
|
-
cubejsApi
|
|
888
|
+
cubejsApi
|
|
1233
889
|
}
|
|
1234
890
|
}, children);
|
|
1235
891
|
}
|
|
1236
892
|
|
|
1237
893
|
function useDeepCompareMemoize(value) {
|
|
1238
|
-
|
|
894
|
+
const ref = useRef([]);
|
|
1239
895
|
|
|
1240
896
|
if (!equals(value, ref.current)) {
|
|
1241
897
|
ref.current = value;
|
|
@@ -1245,388 +901,218 @@ function useDeepCompareMemoize(value) {
|
|
|
1245
901
|
}
|
|
1246
902
|
|
|
1247
903
|
function useIsMounted() {
|
|
1248
|
-
|
|
1249
|
-
useEffect(
|
|
904
|
+
const isMounted = useRef(false);
|
|
905
|
+
useEffect(() => {
|
|
1250
906
|
isMounted.current = true;
|
|
1251
|
-
return
|
|
907
|
+
return () => {
|
|
1252
908
|
isMounted.current = false;
|
|
1253
909
|
};
|
|
1254
910
|
}, []);
|
|
1255
|
-
return
|
|
1256
|
-
return isMounted.current;
|
|
1257
|
-
};
|
|
911
|
+
return () => isMounted.current;
|
|
1258
912
|
}
|
|
1259
913
|
|
|
1260
|
-
function
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
1267
|
-
var isMounted = useIsMounted();
|
|
1268
|
-
var context = useContext(CubeContext);
|
|
1269
|
-
var mutexRef = useRef({});
|
|
1270
|
-
|
|
1271
|
-
var _useState = useState({
|
|
914
|
+
function useCubeFetch(method, options = {}) {
|
|
915
|
+
const isMounted = useIsMounted();
|
|
916
|
+
const context = useContext(CubeContext);
|
|
917
|
+
const mutexRef = useRef({});
|
|
918
|
+
const [response, setResponse] = useState({
|
|
1272
919
|
isLoading: false,
|
|
1273
920
|
response: null
|
|
1274
|
-
})
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
query,
|
|
1297
|
-
queryCondition,
|
|
1298
|
-
coreOptions,
|
|
1299
|
-
args,
|
|
1300
|
-
_response,
|
|
1301
|
-
_args = arguments;
|
|
1302
|
-
|
|
1303
|
-
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
1304
|
-
while (1) {
|
|
1305
|
-
switch (_context.prev = _context.next) {
|
|
1306
|
-
case 0:
|
|
1307
|
-
loadOptions = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
|
|
1308
|
-
ignoreSkip = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
|
|
1309
|
-
cubejsApi = options.cubejsApi || (context === null || context === void 0 ? void 0 : context.cubejsApi);
|
|
1310
|
-
query = loadOptions.query || options.query;
|
|
1311
|
-
queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
|
|
1312
|
-
|
|
1313
|
-
if (!(cubejsApi && (ignoreSkip || !skip) && queryCondition)) {
|
|
1314
|
-
_context.next = 20;
|
|
1315
|
-
break;
|
|
1316
|
-
}
|
|
1317
|
-
|
|
1318
|
-
setError(null);
|
|
1319
|
-
setResponse({
|
|
1320
|
-
isLoading: true,
|
|
1321
|
-
response: null
|
|
1322
|
-
});
|
|
1323
|
-
coreOptions = {
|
|
1324
|
-
mutexObj: mutexRef.current,
|
|
1325
|
-
mutexKey: method
|
|
1326
|
-
};
|
|
1327
|
-
args = method === 'meta' ? [coreOptions] : [query, coreOptions];
|
|
1328
|
-
_context.prev = 10;
|
|
1329
|
-
_context.next = 13;
|
|
1330
|
-
return cubejsApi[method].apply(cubejsApi, args);
|
|
1331
|
-
|
|
1332
|
-
case 13:
|
|
1333
|
-
_response = _context.sent;
|
|
1334
|
-
|
|
1335
|
-
if (isMounted()) {
|
|
1336
|
-
setResponse({
|
|
1337
|
-
response: _response,
|
|
1338
|
-
isLoading: false
|
|
1339
|
-
});
|
|
1340
|
-
}
|
|
1341
|
-
|
|
1342
|
-
_context.next = 20;
|
|
1343
|
-
break;
|
|
1344
|
-
|
|
1345
|
-
case 17:
|
|
1346
|
-
_context.prev = 17;
|
|
1347
|
-
_context.t0 = _context["catch"](10);
|
|
921
|
+
});
|
|
922
|
+
const [error, setError] = useState(null);
|
|
923
|
+
const {
|
|
924
|
+
skip = false
|
|
925
|
+
} = options;
|
|
926
|
+
|
|
927
|
+
async function load(loadOptions = {}, ignoreSkip = false) {
|
|
928
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
929
|
+
const query = loadOptions.query || options.query;
|
|
930
|
+
const queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
|
|
931
|
+
|
|
932
|
+
if (cubejsApi && (ignoreSkip || !skip) && queryCondition) {
|
|
933
|
+
setError(null);
|
|
934
|
+
setResponse({
|
|
935
|
+
isLoading: true,
|
|
936
|
+
response: null
|
|
937
|
+
});
|
|
938
|
+
const coreOptions = {
|
|
939
|
+
mutexObj: mutexRef.current,
|
|
940
|
+
mutexKey: method
|
|
941
|
+
};
|
|
942
|
+
const args = method === 'meta' ? [coreOptions] : [query, coreOptions];
|
|
1348
943
|
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
setResponse({
|
|
1352
|
-
isLoading: false,
|
|
1353
|
-
response: null
|
|
1354
|
-
});
|
|
1355
|
-
}
|
|
944
|
+
try {
|
|
945
|
+
const response = await cubejsApi[method](...args);
|
|
1356
946
|
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
947
|
+
if (isMounted()) {
|
|
948
|
+
setResponse({
|
|
949
|
+
response,
|
|
950
|
+
isLoading: false
|
|
951
|
+
});
|
|
1361
952
|
}
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
|
|
953
|
+
} catch (error) {
|
|
954
|
+
if (isMounted()) {
|
|
955
|
+
setError(error);
|
|
956
|
+
setResponse({
|
|
957
|
+
isLoading: false,
|
|
958
|
+
response: null
|
|
959
|
+
});
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
1365
963
|
}
|
|
1366
964
|
|
|
1367
|
-
useEffect(
|
|
965
|
+
useEffect(() => {
|
|
1368
966
|
load();
|
|
1369
|
-
}, useDeepCompareMemoize([Object.keys(
|
|
1370
|
-
return
|
|
1371
|
-
error
|
|
1372
|
-
refetch:
|
|
1373
|
-
|
|
1374
|
-
}
|
|
1375
|
-
});
|
|
967
|
+
}, useDeepCompareMemoize([Object.keys(options.query?.order || {}), options, context]));
|
|
968
|
+
return { ...response,
|
|
969
|
+
error,
|
|
970
|
+
refetch: options => load(options, true)
|
|
971
|
+
};
|
|
1376
972
|
}
|
|
1377
973
|
|
|
1378
|
-
function
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
1383
|
-
return useCubeFetch('sql', _objectSpread$2(_objectSpread$2({}, options), {}, {
|
|
1384
|
-
query: query
|
|
1385
|
-
}));
|
|
974
|
+
function useCubeSql(query, options = {}) {
|
|
975
|
+
return useCubeFetch('sql', { ...options,
|
|
976
|
+
query
|
|
977
|
+
});
|
|
1386
978
|
}
|
|
1387
979
|
|
|
1388
|
-
function
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
1393
|
-
return useCubeFetch('dryRun', _objectSpread$1(_objectSpread$1({}, options), {}, {
|
|
1394
|
-
query: query
|
|
1395
|
-
}));
|
|
980
|
+
function useDryRun(query, options = {}) {
|
|
981
|
+
return useCubeFetch('dryRun', { ...options,
|
|
982
|
+
query
|
|
983
|
+
});
|
|
1396
984
|
}
|
|
1397
985
|
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
1405
|
-
|
|
1406
|
-
var _useCubeFetch = useCubeFetch('dryRun', _objectSpread(_objectSpread({}, options), {}, {
|
|
1407
|
-
query: query,
|
|
986
|
+
function useLazyDryRun(query, options = {}) {
|
|
987
|
+
const {
|
|
988
|
+
refetch,
|
|
989
|
+
...result
|
|
990
|
+
} = useCubeFetch('dryRun', { ...options,
|
|
991
|
+
query,
|
|
1408
992
|
skip: true
|
|
1409
|
-
})
|
|
1410
|
-
refetch = _useCubeFetch.refetch,
|
|
1411
|
-
result = _objectWithoutProperties(_useCubeFetch, _excluded);
|
|
1412
|
-
|
|
993
|
+
});
|
|
1413
994
|
return [refetch, result];
|
|
1414
995
|
}
|
|
1415
996
|
|
|
1416
|
-
function useCubeQuery(query) {
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
var _useState7 = useState(null),
|
|
1437
|
-
_useState8 = _slicedToArray(_useState7, 2),
|
|
1438
|
-
progress = _useState8[0],
|
|
1439
|
-
setProgress = _useState8[1];
|
|
1440
|
-
|
|
1441
|
-
var _useState9 = useState(null),
|
|
1442
|
-
_useState10 = _slicedToArray(_useState9, 2),
|
|
1443
|
-
error = _useState10[0],
|
|
1444
|
-
setError = _useState10[1];
|
|
1445
|
-
|
|
1446
|
-
var context = useContext(CubeContext);
|
|
1447
|
-
var subscribeRequest = null;
|
|
1448
|
-
|
|
1449
|
-
var progressCallback = function progressCallback(_ref) {
|
|
1450
|
-
var progressResponse = _ref.progressResponse;
|
|
1451
|
-
return setProgress(progressResponse);
|
|
1452
|
-
};
|
|
1453
|
-
|
|
1454
|
-
function fetch() {
|
|
1455
|
-
return _fetch.apply(this, arguments);
|
|
1456
|
-
}
|
|
1457
|
-
|
|
1458
|
-
function _fetch() {
|
|
1459
|
-
_fetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
1460
|
-
var resetResultSetOnChange, cubejsApi, response;
|
|
1461
|
-
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
1462
|
-
while (1) {
|
|
1463
|
-
switch (_context2.prev = _context2.next) {
|
|
1464
|
-
case 0:
|
|
1465
|
-
resetResultSetOnChange = options.resetResultSetOnChange;
|
|
1466
|
-
cubejsApi = options.cubejsApi || (context === null || context === void 0 ? void 0 : context.cubejsApi);
|
|
1467
|
-
|
|
1468
|
-
if (cubejsApi) {
|
|
1469
|
-
_context2.next = 4;
|
|
1470
|
-
break;
|
|
1471
|
-
}
|
|
1472
|
-
|
|
1473
|
-
throw new Error('Cube.js API client is not provided');
|
|
1474
|
-
|
|
1475
|
-
case 4:
|
|
1476
|
-
if (resetResultSetOnChange) {
|
|
1477
|
-
setResultSet(null);
|
|
1478
|
-
}
|
|
1479
|
-
|
|
1480
|
-
setError(null);
|
|
1481
|
-
setLoading(true);
|
|
1482
|
-
_context2.prev = 7;
|
|
1483
|
-
_context2.next = 10;
|
|
1484
|
-
return cubejsApi.load(query, {
|
|
1485
|
-
mutexObj: mutexRef.current,
|
|
1486
|
-
mutexKey: 'query',
|
|
1487
|
-
progressCallback: progressCallback
|
|
1488
|
-
});
|
|
997
|
+
function useCubeQuery(query, options = {}) {
|
|
998
|
+
const mutexRef = useRef({});
|
|
999
|
+
const isMounted = useIsMounted();
|
|
1000
|
+
const [currentQuery, setCurrentQuery] = useState(null);
|
|
1001
|
+
const [isLoading, setLoading] = useState(false);
|
|
1002
|
+
const [resultSet, setResultSet] = useState(null);
|
|
1003
|
+
const [progress, setProgress] = useState(null);
|
|
1004
|
+
const [error, setError] = useState(null);
|
|
1005
|
+
const context = useContext(CubeContext);
|
|
1006
|
+
let subscribeRequest = null;
|
|
1007
|
+
|
|
1008
|
+
const progressCallback = ({
|
|
1009
|
+
progressResponse
|
|
1010
|
+
}) => setProgress(progressResponse);
|
|
1011
|
+
|
|
1012
|
+
async function fetch() {
|
|
1013
|
+
const {
|
|
1014
|
+
resetResultSetOnChange
|
|
1015
|
+
} = options;
|
|
1016
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
1489
1017
|
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
if (isMounted()) {
|
|
1494
|
-
setResultSet(response);
|
|
1495
|
-
setProgress(null);
|
|
1496
|
-
}
|
|
1018
|
+
if (!cubejsApi) {
|
|
1019
|
+
throw new Error('Cube.js API client is not provided');
|
|
1020
|
+
}
|
|
1497
1021
|
|
|
1498
|
-
|
|
1499
|
-
|
|
1022
|
+
if (resetResultSetOnChange) {
|
|
1023
|
+
setResultSet(null);
|
|
1024
|
+
}
|
|
1500
1025
|
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
_context2.t0 = _context2["catch"](7);
|
|
1026
|
+
setError(null);
|
|
1027
|
+
setLoading(true);
|
|
1504
1028
|
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1029
|
+
try {
|
|
1030
|
+
const response = await cubejsApi.load(query, {
|
|
1031
|
+
mutexObj: mutexRef.current,
|
|
1032
|
+
mutexKey: 'query',
|
|
1033
|
+
progressCallback
|
|
1034
|
+
});
|
|
1510
1035
|
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1036
|
+
if (isMounted()) {
|
|
1037
|
+
setResultSet(response);
|
|
1038
|
+
setProgress(null);
|
|
1039
|
+
}
|
|
1040
|
+
} catch (error) {
|
|
1041
|
+
if (isMounted()) {
|
|
1042
|
+
setError(error);
|
|
1043
|
+
setResultSet(null);
|
|
1044
|
+
setProgress(null);
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1515
1047
|
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
}, _callee2, null, [[7, 14]]);
|
|
1522
|
-
}));
|
|
1523
|
-
return _fetch.apply(this, arguments);
|
|
1048
|
+
if (isMounted()) {
|
|
1049
|
+
setLoading(false);
|
|
1050
|
+
}
|
|
1524
1051
|
}
|
|
1525
1052
|
|
|
1526
|
-
useEffect(
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1053
|
+
useEffect(() => {
|
|
1054
|
+
const {
|
|
1055
|
+
skip = false,
|
|
1056
|
+
resetResultSetOnChange
|
|
1057
|
+
} = options;
|
|
1058
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
1531
1059
|
|
|
1532
1060
|
if (!cubejsApi) {
|
|
1533
1061
|
throw new Error('Cube.js API client is not provided');
|
|
1534
1062
|
}
|
|
1535
1063
|
|
|
1536
|
-
function loadQuery() {
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
1543
|
-
while (1) {
|
|
1544
|
-
switch (_context.prev = _context.next) {
|
|
1545
|
-
case 0:
|
|
1546
|
-
if (!(!skip && isQueryPresent(query))) {
|
|
1547
|
-
_context.next = 20;
|
|
1548
|
-
break;
|
|
1549
|
-
}
|
|
1550
|
-
|
|
1551
|
-
if (!areQueriesEqual(currentQuery, query)) {
|
|
1552
|
-
if (resetResultSetOnChange == null || resetResultSetOnChange) {
|
|
1553
|
-
setResultSet(null);
|
|
1554
|
-
}
|
|
1555
|
-
|
|
1556
|
-
setCurrentQuery(query);
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
setError(null);
|
|
1560
|
-
setLoading(true);
|
|
1561
|
-
_context.prev = 4;
|
|
1562
|
-
|
|
1563
|
-
if (!subscribeRequest) {
|
|
1564
|
-
_context.next = 9;
|
|
1565
|
-
break;
|
|
1566
|
-
}
|
|
1064
|
+
async function loadQuery() {
|
|
1065
|
+
if (!skip && isQueryPresent(query)) {
|
|
1066
|
+
if (!areQueriesEqual(currentQuery, query)) {
|
|
1067
|
+
if (resetResultSetOnChange == null || resetResultSetOnChange) {
|
|
1068
|
+
setResultSet(null);
|
|
1069
|
+
}
|
|
1567
1070
|
|
|
1568
|
-
|
|
1569
|
-
|
|
1071
|
+
setCurrentQuery(query);
|
|
1072
|
+
}
|
|
1570
1073
|
|
|
1571
|
-
|
|
1572
|
-
|
|
1074
|
+
setError(null);
|
|
1075
|
+
setLoading(true);
|
|
1573
1076
|
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1077
|
+
try {
|
|
1078
|
+
if (subscribeRequest) {
|
|
1079
|
+
await subscribeRequest.unsubscribe();
|
|
1080
|
+
subscribeRequest = null;
|
|
1081
|
+
}
|
|
1579
1082
|
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
setLoading(false);
|
|
1593
|
-
setProgress(null);
|
|
1594
|
-
}
|
|
1595
|
-
});
|
|
1596
|
-
_context.next = 15;
|
|
1597
|
-
break;
|
|
1598
|
-
|
|
1599
|
-
case 13:
|
|
1600
|
-
_context.next = 15;
|
|
1601
|
-
return fetch();
|
|
1602
|
-
|
|
1603
|
-
case 15:
|
|
1604
|
-
_context.next = 20;
|
|
1605
|
-
break;
|
|
1606
|
-
|
|
1607
|
-
case 17:
|
|
1608
|
-
_context.prev = 17;
|
|
1609
|
-
_context.t0 = _context["catch"](4);
|
|
1610
|
-
|
|
1611
|
-
if (isMounted()) {
|
|
1612
|
-
setError(_context.t0);
|
|
1613
|
-
setResultSet(null);
|
|
1614
|
-
setLoading(false);
|
|
1615
|
-
setProgress(null);
|
|
1083
|
+
if (options.subscribe) {
|
|
1084
|
+
subscribeRequest = cubejsApi.subscribe(query, {
|
|
1085
|
+
mutexObj: mutexRef.current,
|
|
1086
|
+
mutexKey: 'query',
|
|
1087
|
+
progressCallback
|
|
1088
|
+
}, (e, result) => {
|
|
1089
|
+
if (isMounted()) {
|
|
1090
|
+
if (e) {
|
|
1091
|
+
setError(e);
|
|
1092
|
+
} else {
|
|
1093
|
+
setResultSet(result);
|
|
1616
1094
|
}
|
|
1617
1095
|
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
}
|
|
1096
|
+
setLoading(false);
|
|
1097
|
+
setProgress(null);
|
|
1098
|
+
}
|
|
1099
|
+
});
|
|
1100
|
+
} else {
|
|
1101
|
+
await fetch();
|
|
1622
1102
|
}
|
|
1623
|
-
}
|
|
1624
|
-
|
|
1625
|
-
|
|
1103
|
+
} catch (e) {
|
|
1104
|
+
if (isMounted()) {
|
|
1105
|
+
setError(e);
|
|
1106
|
+
setResultSet(null);
|
|
1107
|
+
setLoading(false);
|
|
1108
|
+
setProgress(null);
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1626
1112
|
}
|
|
1627
1113
|
|
|
1628
1114
|
loadQuery();
|
|
1629
|
-
return
|
|
1115
|
+
return () => {
|
|
1630
1116
|
if (subscribeRequest) {
|
|
1631
1117
|
subscribeRequest.unsubscribe();
|
|
1632
1118
|
subscribeRequest = null;
|
|
@@ -1634,17 +1120,16 @@ function useCubeQuery(query) {
|
|
|
1634
1120
|
};
|
|
1635
1121
|
}, useDeepCompareMemoize([query, Object.keys(query && query.order || {}), options, context]));
|
|
1636
1122
|
return {
|
|
1637
|
-
isLoading
|
|
1638
|
-
resultSet
|
|
1639
|
-
error
|
|
1640
|
-
progress
|
|
1123
|
+
isLoading,
|
|
1124
|
+
resultSet,
|
|
1125
|
+
error,
|
|
1126
|
+
progress,
|
|
1641
1127
|
previousQuery: currentQuery,
|
|
1642
1128
|
refetch: fetch
|
|
1643
1129
|
};
|
|
1644
1130
|
}
|
|
1645
1131
|
|
|
1646
|
-
function useCubeMeta() {
|
|
1647
|
-
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1132
|
+
function useCubeMeta(options = {}) {
|
|
1648
1133
|
return useCubeFetch('meta', options);
|
|
1649
1134
|
}
|
|
1650
1135
|
|