@cubejs-client/react 0.30.40 → 0.30.64
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 +878 -1386
- package/dist/cubejs-client-react.esm.js.map +1 -1
- package/dist/cubejs-client-react.js +56 -125
- package/dist/cubejs-client-react.js.map +1 -1
- package/dist/cubejs-client-react.umd.js +4502 -9936
- 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 +10 -4
- package/src/QueryRenderer.jsx +1 -2
- package/src/utils.js +0 -78
|
@@ -1,386 +1,197 @@
|
|
|
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
|
-
green: 'green',
|
|
58
|
-
yellow: 'orange',
|
|
59
|
-
blue: 'blue',
|
|
60
|
-
magenta: 'magenta',
|
|
61
|
-
cyan: 'cyan',
|
|
62
|
-
gray: 'gray',
|
|
63
|
-
lightgrey: 'lightgrey',
|
|
64
|
-
darkgrey: 'darkgrey'
|
|
65
|
-
};
|
|
66
|
-
var anserMap = {
|
|
67
|
-
'ansi-bright-black': 'black',
|
|
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
|
-
}
|
|
98
|
-
|
|
99
|
-
var part = contentParts[j].replace('\r', '');
|
|
100
|
-
var color = colors[anserMap[fg]];
|
|
101
|
-
|
|
102
|
-
if (color != null) {
|
|
103
|
-
result += "<span style=\"color: ".concat(color, ";\">").concat(part, "</span>");
|
|
104
|
-
} else {
|
|
105
|
-
if (fg != null) {
|
|
106
|
-
console.log('Missing color mapping: ', fg);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
result += "<span>".concat(part, "</span>");
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (j < contentParts.length - 1) {
|
|
113
|
-
result += '</span>';
|
|
114
|
-
open = false;
|
|
115
|
-
result += '<br/>';
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (open) {
|
|
121
|
-
result += '</span>';
|
|
7
|
+
class QueryRenderer extends React.Component {
|
|
8
|
+
// @deprected use `isQueryPresent` from `@cubejs-client/core`
|
|
9
|
+
static isQueryPresent(query) {
|
|
10
|
+
return isQueryPresent(query);
|
|
122
11
|
}
|
|
123
12
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return obj;
|
|
13
|
+
constructor(props) {
|
|
14
|
+
super(props);
|
|
15
|
+
this.state = {};
|
|
16
|
+
this.mutexObj = {};
|
|
129
17
|
}
|
|
130
18
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
19
|
+
componentDidMount() {
|
|
20
|
+
const {
|
|
21
|
+
query,
|
|
22
|
+
queries
|
|
23
|
+
} = this.props;
|
|
134
24
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
var _ref4 = _slicedToArray(_ref3, 2),
|
|
138
|
-
k = _ref4[0],
|
|
139
|
-
v = _ref4[1];
|
|
140
|
-
|
|
141
|
-
if (Array.isArray(v)) {
|
|
142
|
-
return [k, v.map(removeEmpty)];
|
|
25
|
+
if (query) {
|
|
26
|
+
this.load(query);
|
|
143
27
|
}
|
|
144
28
|
|
|
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;
|
|
29
|
+
if (queries) {
|
|
30
|
+
this.loadQueries(queries);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
164
33
|
|
|
165
|
-
|
|
34
|
+
shouldComponentUpdate(nextProps, nextState) {
|
|
35
|
+
const {
|
|
36
|
+
query,
|
|
37
|
+
queries,
|
|
38
|
+
render,
|
|
39
|
+
cubejsApi,
|
|
40
|
+
loadSql,
|
|
41
|
+
updateOnlyOnStateChange
|
|
42
|
+
} = this.props;
|
|
43
|
+
|
|
44
|
+
if (!updateOnlyOnStateChange) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
166
47
|
|
|
167
|
-
|
|
168
|
-
_this.state = {};
|
|
169
|
-
_this.mutexObj = {};
|
|
170
|
-
return _this;
|
|
48
|
+
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;
|
|
171
49
|
}
|
|
172
50
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
queries = _this$props.queries;
|
|
179
|
-
|
|
180
|
-
if (query) {
|
|
181
|
-
this.load(query);
|
|
182
|
-
}
|
|
51
|
+
componentDidUpdate(prevProps) {
|
|
52
|
+
const {
|
|
53
|
+
query,
|
|
54
|
+
queries
|
|
55
|
+
} = this.props;
|
|
183
56
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
57
|
+
if (!equals(prevProps.query, query)) {
|
|
58
|
+
this.load(query);
|
|
187
59
|
}
|
|
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
60
|
|
|
203
|
-
|
|
61
|
+
if (!equals(prevProps.queries, queries)) {
|
|
62
|
+
this.loadQueries(queries);
|
|
204
63
|
}
|
|
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
|
-
}
|
|
64
|
+
}
|
|
215
65
|
|
|
216
|
-
|
|
217
|
-
|
|
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;
|
|
66
|
+
cubejsApi() {
|
|
67
|
+
// eslint-disable-next-line react/destructuring-assignment
|
|
68
|
+
return this.props.cubejsApi || this.context && this.context.cubejsApi;
|
|
69
|
+
}
|
|
230
70
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
});
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
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 ? {
|
|
71
|
+
load(query) {
|
|
72
|
+
const {
|
|
73
|
+
resetResultSetOnChange
|
|
74
|
+
} = this.props;
|
|
75
|
+
this.setState({
|
|
76
|
+
isLoading: true,
|
|
77
|
+
error: null,
|
|
78
|
+
sqlQuery: null,
|
|
79
|
+
...(resetResultSetOnChange ? {
|
|
318
80
|
resultSet: null
|
|
319
|
-
} : {})
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
}));
|
|
334
|
-
resultPromises.then(function (resultSet) {
|
|
335
|
-
return _this3.setState({
|
|
336
|
-
resultSet: fromPairs(resultSet),
|
|
81
|
+
} : {})
|
|
82
|
+
});
|
|
83
|
+
const {
|
|
84
|
+
loadSql
|
|
85
|
+
} = this.props;
|
|
86
|
+
const cubejsApi = this.cubejsApi();
|
|
87
|
+
|
|
88
|
+
if (query && isQueryPresent(query)) {
|
|
89
|
+
if (loadSql === 'only') {
|
|
90
|
+
cubejsApi.sql(query, {
|
|
91
|
+
mutexObj: this.mutexObj,
|
|
92
|
+
mutexKey: 'sql'
|
|
93
|
+
}).then(sqlQuery => this.setState({
|
|
94
|
+
sqlQuery,
|
|
337
95
|
error: null,
|
|
338
96
|
isLoading: false
|
|
339
|
-
})
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
} : {}), {}, {
|
|
344
|
-
error: error,
|
|
97
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
98
|
+
resultSet: null
|
|
99
|
+
} : {}),
|
|
100
|
+
error,
|
|
345
101
|
isLoading: false
|
|
346
102
|
}));
|
|
347
|
-
})
|
|
103
|
+
} else if (loadSql) {
|
|
104
|
+
Promise.all([cubejsApi.sql(query, {
|
|
105
|
+
mutexObj: this.mutexObj,
|
|
106
|
+
mutexKey: 'sql'
|
|
107
|
+
}), cubejsApi.load(query, {
|
|
108
|
+
mutexObj: this.mutexObj,
|
|
109
|
+
mutexKey: 'query'
|
|
110
|
+
})]).then(([sqlQuery, resultSet]) => this.setState({
|
|
111
|
+
sqlQuery,
|
|
112
|
+
resultSet,
|
|
113
|
+
error: null,
|
|
114
|
+
isLoading: false
|
|
115
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
116
|
+
resultSet: null
|
|
117
|
+
} : {}),
|
|
118
|
+
error,
|
|
119
|
+
isLoading: false
|
|
120
|
+
}));
|
|
121
|
+
} else {
|
|
122
|
+
cubejsApi.load(query, {
|
|
123
|
+
mutexObj: this.mutexObj,
|
|
124
|
+
mutexKey: 'query'
|
|
125
|
+
}).then(resultSet => this.setState({
|
|
126
|
+
resultSet,
|
|
127
|
+
error: null,
|
|
128
|
+
isLoading: false
|
|
129
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
130
|
+
resultSet: null
|
|
131
|
+
} : {}),
|
|
132
|
+
error,
|
|
133
|
+
isLoading: false
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
348
136
|
}
|
|
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
|
-
};
|
|
137
|
+
}
|
|
367
138
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
139
|
+
loadQueries(queries) {
|
|
140
|
+
const cubejsApi = this.cubejsApi();
|
|
141
|
+
const {
|
|
142
|
+
resetResultSetOnChange
|
|
143
|
+
} = this.props;
|
|
144
|
+
this.setState({
|
|
145
|
+
isLoading: true,
|
|
146
|
+
...(resetResultSetOnChange ? {
|
|
147
|
+
resultSet: null
|
|
148
|
+
} : {}),
|
|
149
|
+
error: null
|
|
150
|
+
});
|
|
151
|
+
const resultPromises = Promise.all(toPairs(queries).map(([name, query]) => cubejsApi.load(query, {
|
|
152
|
+
mutexObj: this.mutexObj,
|
|
153
|
+
mutexKey: name
|
|
154
|
+
}).then(r => [name, r])));
|
|
155
|
+
resultPromises.then(resultSet => this.setState({
|
|
156
|
+
resultSet: fromPairs(resultSet),
|
|
157
|
+
error: null,
|
|
158
|
+
isLoading: false
|
|
159
|
+
})).catch(error => this.setState({ ...(resetResultSetOnChange ? {
|
|
160
|
+
resultSet: null
|
|
161
|
+
} : {}),
|
|
162
|
+
error,
|
|
163
|
+
isLoading: false
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
371
166
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
167
|
+
render() {
|
|
168
|
+
const {
|
|
169
|
+
error,
|
|
170
|
+
queries,
|
|
171
|
+
resultSet,
|
|
172
|
+
isLoading,
|
|
173
|
+
sqlQuery
|
|
174
|
+
} = this.state;
|
|
175
|
+
const {
|
|
176
|
+
render
|
|
177
|
+
} = this.props;
|
|
178
|
+
const loadState = {
|
|
179
|
+
error: error ? new Error(error.response?.plainError || error.message || error.toString()) : null,
|
|
180
|
+
resultSet: queries ? resultSet || {} : resultSet,
|
|
181
|
+
loadingState: {
|
|
182
|
+
isLoading
|
|
183
|
+
},
|
|
184
|
+
sqlQuery
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
if (render) {
|
|
188
|
+
return render(loadState);
|
|
379
189
|
}
|
|
380
|
-
}]);
|
|
381
190
|
|
|
382
|
-
|
|
383
|
-
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
}
|
|
384
195
|
QueryRenderer.contextType = CubeContext;
|
|
385
196
|
QueryRenderer.defaultProps = {
|
|
386
197
|
cubejsApi: null,
|
|
@@ -392,30 +203,38 @@ QueryRenderer.defaultProps = {
|
|
|
392
203
|
resetResultSetOnChange: true
|
|
393
204
|
};
|
|
394
205
|
|
|
395
|
-
|
|
206
|
+
function _extends() {
|
|
207
|
+
_extends = Object.assign || function (target) {
|
|
208
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
209
|
+
var source = arguments[i];
|
|
396
210
|
|
|
397
|
-
|
|
211
|
+
for (var key in source) {
|
|
212
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
213
|
+
target[key] = source[key];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
398
217
|
|
|
399
|
-
|
|
218
|
+
return target;
|
|
219
|
+
};
|
|
400
220
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
restProps = _objectWithoutProperties(_ref, _excluded$1);
|
|
221
|
+
return _extends.apply(this, arguments);
|
|
222
|
+
}
|
|
404
223
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
})
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
}
|
|
418
|
-
};
|
|
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));
|
|
419
238
|
|
|
420
239
|
QueryRendererWithTotals.defaultProps = {
|
|
421
240
|
query: null,
|
|
@@ -424,14 +243,21 @@ QueryRendererWithTotals.defaultProps = {
|
|
|
424
243
|
loadSql: null
|
|
425
244
|
};
|
|
426
245
|
|
|
427
|
-
function
|
|
246
|
+
function removeEmpty(obj) {
|
|
247
|
+
if (typeof obj !== 'object') {
|
|
248
|
+
return obj;
|
|
249
|
+
}
|
|
428
250
|
|
|
429
|
-
|
|
251
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null).map(([k, v]) => {
|
|
252
|
+
if (Array.isArray(v)) {
|
|
253
|
+
return [k, v.map(removeEmpty)];
|
|
254
|
+
}
|
|
430
255
|
|
|
431
|
-
|
|
256
|
+
return [k, typeof v === 'object' ? removeEmpty(v) : v];
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
432
259
|
|
|
433
|
-
|
|
434
|
-
var granularities = [{
|
|
260
|
+
const granularities = [{
|
|
435
261
|
name: undefined,
|
|
436
262
|
title: 'w/o grouping'
|
|
437
263
|
}, {
|
|
@@ -459,77 +285,63 @@ var granularities = [{
|
|
|
459
285
|
name: 'year',
|
|
460
286
|
title: 'Year'
|
|
461
287
|
}];
|
|
288
|
+
class QueryBuilder extends React.Component {
|
|
289
|
+
static contextType = CubeContext; // This is an anti-pattern, only kept for backward compatibility
|
|
290
|
+
// https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
|
|
291
|
+
|
|
292
|
+
static getDerivedStateFromProps(props, state) {
|
|
293
|
+
if (props.query || props.vizState) {
|
|
294
|
+
const nextState = { ...state,
|
|
295
|
+
...(props.vizState || {})
|
|
296
|
+
};
|
|
462
297
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
var _super = _createSuper(QueryBuilder);
|
|
298
|
+
if (Array.isArray(props.query)) {
|
|
299
|
+
throw new Error('Array of queries is not supported.');
|
|
300
|
+
}
|
|
467
301
|
|
|
468
|
-
|
|
469
|
-
|
|
302
|
+
return { ...nextState,
|
|
303
|
+
query: { ...nextState.query,
|
|
304
|
+
...(props.query || {})
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
}
|
|
470
308
|
|
|
471
|
-
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
472
311
|
|
|
473
|
-
|
|
312
|
+
static resolveMember(type, {
|
|
313
|
+
meta,
|
|
314
|
+
query
|
|
315
|
+
}) {
|
|
316
|
+
if (!meta) {
|
|
317
|
+
return [];
|
|
318
|
+
}
|
|
474
319
|
|
|
475
|
-
|
|
476
|
-
|
|
320
|
+
if (Array.isArray(query)) {
|
|
321
|
+
return query.reduce((memo, currentQuery) => memo.concat(QueryBuilder.resolveMember(type, {
|
|
322
|
+
meta,
|
|
323
|
+
query: currentQuery
|
|
324
|
+
})), []);
|
|
325
|
+
}
|
|
477
326
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
327
|
+
if (type === 'timeDimensions') {
|
|
328
|
+
return (query.timeDimensions || []).map((m, index) => ({ ...m,
|
|
329
|
+
dimension: { ...meta.resolveMember(m.dimension, 'dimensions'),
|
|
330
|
+
granularities
|
|
331
|
+
},
|
|
332
|
+
index
|
|
333
|
+
}));
|
|
334
|
+
}
|
|
486
335
|
|
|
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
|
-
})));
|
|
336
|
+
return (query[type] || []).map((m, index) => ({
|
|
337
|
+
index,
|
|
338
|
+
...meta.resolveMember(m, type)
|
|
339
|
+
}));
|
|
340
|
+
}
|
|
531
341
|
|
|
532
|
-
|
|
342
|
+
constructor(props) {
|
|
343
|
+
super(props);
|
|
344
|
+
this.state = {
|
|
533
345
|
query: props.defaultQuery || props.query,
|
|
534
346
|
chartType: props.defaultChartType,
|
|
535
347
|
validatedQuery: props.query,
|
|
@@ -537,676 +349,526 @@ var QueryBuilder = /*#__PURE__*/function (_React$Component) {
|
|
|
537
349
|
missingMembers: [],
|
|
538
350
|
// todo: rename to `isMetaReady`
|
|
539
351
|
isFetchingMeta: true,
|
|
540
|
-
dryRunResponse: null
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
352
|
+
dryRunResponse: null,
|
|
353
|
+
...props.vizState,
|
|
354
|
+
// deprecated
|
|
355
|
+
...props.initialVizState
|
|
356
|
+
};
|
|
357
|
+
this.mutexObj = {};
|
|
358
|
+
this.orderMembersOrderKeys = [];
|
|
545
359
|
}
|
|
546
360
|
|
|
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
|
-
}
|
|
361
|
+
async componentDidMount() {
|
|
362
|
+
this.prevContext = this.context;
|
|
363
|
+
await this.fetchMeta();
|
|
364
|
+
}
|
|
640
365
|
|
|
641
|
-
|
|
642
|
-
|
|
366
|
+
async componentDidUpdate(prevProps) {
|
|
367
|
+
const {
|
|
368
|
+
schemaVersion,
|
|
369
|
+
onSchemaChange
|
|
370
|
+
} = this.props;
|
|
371
|
+
const {
|
|
372
|
+
meta
|
|
373
|
+
} = this.state;
|
|
374
|
+
|
|
375
|
+
if (this.prevContext?.cubejsApi !== this.context?.cubejsApi) {
|
|
376
|
+
this.prevContext = this.context;
|
|
377
|
+
await this.fetchMeta();
|
|
378
|
+
}
|
|
643
379
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
// eslint-disable-next-line
|
|
648
|
-
this.setState({
|
|
649
|
-
metaError: _context4.t0
|
|
650
|
-
});
|
|
380
|
+
if (prevProps.schemaVersion !== schemaVersion) {
|
|
381
|
+
try {
|
|
382
|
+
const newMeta = await this.cubejsApi().meta();
|
|
651
383
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
384
|
+
if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
|
|
385
|
+
onSchemaChange({
|
|
386
|
+
schemaVersion,
|
|
387
|
+
refresh: async () => {
|
|
388
|
+
await this.fetchMeta();
|
|
655
389
|
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
})
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
} catch (error) {
|
|
393
|
+
// eslint-disable-next-line
|
|
394
|
+
this.setState({
|
|
395
|
+
metaError: error
|
|
396
|
+
});
|
|
662
397
|
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
663
400
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
401
|
+
fetchMeta = async () => {
|
|
402
|
+
if (!this.cubejsApi()) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
let meta;
|
|
407
|
+
let metaError = null;
|
|
408
|
+
let richMetaError = null;
|
|
409
|
+
let metaErrorStack = null;
|
|
670
410
|
|
|
671
|
-
|
|
411
|
+
try {
|
|
412
|
+
this.setState({
|
|
413
|
+
isFetchingMeta: true
|
|
414
|
+
});
|
|
415
|
+
meta = await this.cubejsApi().meta();
|
|
416
|
+
} catch (error) {
|
|
417
|
+
metaError = error.response?.plainError || error;
|
|
418
|
+
richMetaError = error;
|
|
419
|
+
metaErrorStack = error.response?.stack?.replace(error.message || '', '') || '';
|
|
672
420
|
}
|
|
673
|
-
}, {
|
|
674
|
-
key: "getMissingMembers",
|
|
675
|
-
value: function getMissingMembers(query, meta) {
|
|
676
|
-
if (!meta) {
|
|
677
|
-
return [];
|
|
678
|
-
}
|
|
679
421
|
|
|
680
|
-
|
|
681
|
-
|
|
422
|
+
this.setState({
|
|
423
|
+
meta,
|
|
424
|
+
metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
|
|
425
|
+
richMetaError,
|
|
426
|
+
metaErrorStack,
|
|
427
|
+
isFetchingMeta: false
|
|
428
|
+
}, () => {
|
|
429
|
+
// Run update query to force viz state update
|
|
430
|
+
// This will catch any new missing members, and also validate the query against the new meta
|
|
431
|
+
this.updateQuery({});
|
|
432
|
+
});
|
|
433
|
+
};
|
|
682
434
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
435
|
+
cubejsApi() {
|
|
436
|
+
const {
|
|
437
|
+
cubejsApi
|
|
438
|
+
} = this.props; // eslint-disable-next-line react/destructuring-assignment
|
|
686
439
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
var query = this.state.query;
|
|
694
|
-
return QueryRenderer.isQueryPresent(query);
|
|
440
|
+
return cubejsApi || this.context && this.context.cubejsApi;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
getMissingMembers(query, meta) {
|
|
444
|
+
if (!meta) {
|
|
445
|
+
return [];
|
|
695
446
|
}
|
|
696
|
-
}, {
|
|
697
|
-
key: "prepareRenderProps",
|
|
698
|
-
value: function prepareRenderProps(queryRendererProps) {
|
|
699
|
-
var _this3 = this;
|
|
700
447
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
};
|
|
448
|
+
return getQueryMembers(query).map(member => {
|
|
449
|
+
const resolvedMember = meta.resolveMember(member, ['measures', 'dimensions', 'segments']);
|
|
704
450
|
|
|
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
|
-
};
|
|
451
|
+
if (resolvedMember.error) {
|
|
452
|
+
return member;
|
|
453
|
+
}
|
|
716
454
|
|
|
717
|
-
|
|
718
|
-
|
|
455
|
+
return false;
|
|
456
|
+
}).filter(Boolean);
|
|
457
|
+
}
|
|
719
458
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
459
|
+
isQueryPresent() {
|
|
460
|
+
const {
|
|
461
|
+
query
|
|
462
|
+
} = this.state;
|
|
463
|
+
return QueryRenderer.isQueryPresent(query);
|
|
464
|
+
}
|
|
726
465
|
|
|
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
|
-
};
|
|
466
|
+
prepareRenderProps(queryRendererProps) {
|
|
467
|
+
const getName = member => member.name;
|
|
468
|
+
|
|
469
|
+
const toTimeDimension = member => {
|
|
470
|
+
const rangeSelection = member.compareDateRange ? {
|
|
471
|
+
compareDateRange: member.compareDateRange
|
|
472
|
+
} : {
|
|
473
|
+
dateRange: member.dateRange
|
|
748
474
|
};
|
|
475
|
+
return removeEmpty({
|
|
476
|
+
dimension: member.dimension.name,
|
|
477
|
+
granularity: member.granularity,
|
|
478
|
+
...rangeSelection
|
|
479
|
+
});
|
|
480
|
+
};
|
|
749
481
|
|
|
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
|
|
482
|
+
const toFilter = member => ({
|
|
483
|
+
member: member.member?.name || member.dimension?.name,
|
|
484
|
+
operator: member.operator,
|
|
485
|
+
values: member.values
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
const updateMethods = (memberType, toQuery = getName) => ({
|
|
489
|
+
add: member => {
|
|
490
|
+
const {
|
|
491
|
+
query
|
|
492
|
+
} = this.state;
|
|
493
|
+
this.updateQuery({
|
|
494
|
+
[memberType]: (query[memberType] || []).concat(toQuery(member))
|
|
767
495
|
});
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
496
|
+
},
|
|
497
|
+
remove: member => {
|
|
498
|
+
const {
|
|
499
|
+
query
|
|
500
|
+
} = this.state;
|
|
501
|
+
return this.updateQuery({
|
|
502
|
+
[memberType]: (query[memberType] || []).filter((_, index) => index !== member.index)
|
|
774
503
|
});
|
|
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
|
-
});
|
|
504
|
+
},
|
|
505
|
+
update: (member, updateWith) => {
|
|
506
|
+
const {
|
|
507
|
+
query
|
|
508
|
+
} = this.state;
|
|
509
|
+
const members = (query[memberType] || []).concat([]);
|
|
510
|
+
members.splice(member.index, 1, toQuery(updateWith));
|
|
511
|
+
return this.updateQuery({
|
|
512
|
+
[memberType]: members
|
|
811
513
|
});
|
|
812
514
|
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
const {
|
|
518
|
+
meta,
|
|
519
|
+
metaError,
|
|
520
|
+
richMetaError,
|
|
521
|
+
query,
|
|
522
|
+
queryError,
|
|
523
|
+
chartType,
|
|
524
|
+
pivotConfig,
|
|
525
|
+
validatedQuery,
|
|
526
|
+
missingMembers,
|
|
527
|
+
isFetchingMeta,
|
|
528
|
+
dryRunResponse,
|
|
529
|
+
metaErrorStack
|
|
530
|
+
} = this.state;
|
|
531
|
+
const flatFilters = uniqBy(filter => `${prop('member', filter)}${prop('operator', filter)}`, flattenFilters(meta && query.filters || []).map(filter => ({ ...filter,
|
|
532
|
+
member: filter.member || filter.dimension
|
|
533
|
+
})));
|
|
534
|
+
const filters = flatFilters.map((m, i) => ({ ...m,
|
|
535
|
+
dimension: meta.resolveMember(m.member || m.dimension, ['dimensions', 'measures']),
|
|
536
|
+
operators: meta.filterOperatorsForMember(m.member || m.dimension, ['dimensions', 'measures']),
|
|
537
|
+
index: i
|
|
538
|
+
}));
|
|
539
|
+
const measures = QueryBuilder.resolveMember('measures', this.state);
|
|
540
|
+
const dimensions = QueryBuilder.resolveMember('dimensions', this.state);
|
|
541
|
+
const timeDimensions = QueryBuilder.resolveMember('timeDimensions', this.state);
|
|
542
|
+
const segments = (meta && query.segments || []).map((m, i) => ({
|
|
543
|
+
index: i,
|
|
544
|
+
...meta.resolveMember(m, 'segments')
|
|
545
|
+
}));
|
|
546
|
+
let availableMeasures = [];
|
|
547
|
+
let availableDimensions = [];
|
|
548
|
+
let availableSegments = [];
|
|
549
|
+
let availableFilterMembers = [];
|
|
550
|
+
const availableMembers = meta?.membersGroupedByCube() || {
|
|
551
|
+
measures: [],
|
|
552
|
+
dimensions: [],
|
|
553
|
+
segments: [],
|
|
554
|
+
timeDimensions: []
|
|
555
|
+
};
|
|
813
556
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
order: (activeOrder === null || activeOrder === void 0 ? void 0 : activeOrder[name]) || 'none'
|
|
557
|
+
if (meta) {
|
|
558
|
+
availableMeasures = meta.membersForQuery(query, 'measures');
|
|
559
|
+
availableDimensions = meta.membersForQuery(query, 'dimensions');
|
|
560
|
+
availableSegments = meta.membersForQuery(query, 'segments');
|
|
561
|
+
const indexedMeasures = indexBy(prop('cubeName'), availableMembers.measures);
|
|
562
|
+
const indexedDimensions = indexBy(prop('cubeName'), availableMembers.dimensions);
|
|
563
|
+
const cubeNames = uniq([...Object.keys(indexedMeasures), ...Object.keys(indexedDimensions)]).sort();
|
|
564
|
+
availableFilterMembers = cubeNames.map(name => {
|
|
565
|
+
const cube = indexedMeasures[name] || indexedDimensions[name];
|
|
566
|
+
return { ...cube,
|
|
567
|
+
members: [...indexedMeasures[name]?.members, ...indexedDimensions[name]?.members].sort((a, b) => a.shortTitle > b.shortTitle ? 1 : -1)
|
|
826
568
|
};
|
|
827
|
-
})
|
|
569
|
+
});
|
|
570
|
+
}
|
|
828
571
|
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
572
|
+
const activeOrder = Array.isArray(query.order) ? Object.fromEntries(query.order) : query.order;
|
|
573
|
+
const members = [...measures, ...dimensions, ...timeDimensions.map(({
|
|
574
|
+
dimension
|
|
575
|
+
}) => dimension)];
|
|
576
|
+
let orderMembers = uniqBy(prop('id'), [// uniqBy prefers first, so these will only be added if not already in the query
|
|
577
|
+
...members.map(({
|
|
578
|
+
name,
|
|
579
|
+
title
|
|
580
|
+
}) => ({
|
|
581
|
+
id: name,
|
|
582
|
+
title,
|
|
583
|
+
order: activeOrder?.[name] || 'none'
|
|
584
|
+
}))]);
|
|
585
|
+
|
|
586
|
+
if (this.orderMembersOrderKeys.length !== orderMembers.length) {
|
|
587
|
+
this.orderMembersOrderKeys = orderMembers.map(({
|
|
588
|
+
id
|
|
589
|
+
}) => id);
|
|
590
|
+
}
|
|
835
591
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
return member.id === id;
|
|
842
|
-
});
|
|
843
|
-
});
|
|
844
|
-
}
|
|
592
|
+
if (this.orderMembersOrderKeys.length) {
|
|
593
|
+
// Preserve order until the members change or manually re-ordered
|
|
594
|
+
// This is needed so that when an order member becomes active, it doesn't jump to the top of the list
|
|
595
|
+
orderMembers = (this.orderMembersOrderKeys || []).map(id => orderMembers.find(member => member.id === id));
|
|
596
|
+
}
|
|
845
597
|
|
|
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
|
-
|
|
598
|
+
return {
|
|
599
|
+
meta,
|
|
600
|
+
metaError,
|
|
601
|
+
richMetaError,
|
|
602
|
+
metaErrorStack,
|
|
603
|
+
query,
|
|
604
|
+
error: queryError,
|
|
605
|
+
// Match same name as QueryRenderer prop
|
|
606
|
+
validatedQuery,
|
|
607
|
+
isQueryPresent: this.isQueryPresent(),
|
|
608
|
+
chartType,
|
|
609
|
+
measures,
|
|
610
|
+
dimensions,
|
|
611
|
+
timeDimensions,
|
|
612
|
+
segments,
|
|
613
|
+
filters,
|
|
614
|
+
orderMembers,
|
|
615
|
+
availableMeasures,
|
|
616
|
+
availableDimensions,
|
|
617
|
+
availableTimeDimensions: availableDimensions.filter(m => m.type === 'time'),
|
|
618
|
+
availableSegments,
|
|
619
|
+
availableMembers,
|
|
620
|
+
availableFilterMembers,
|
|
621
|
+
updateQuery: queryUpdate => this.updateQuery(queryUpdate),
|
|
622
|
+
updateMeasures: updateMethods('measures'),
|
|
623
|
+
updateDimensions: updateMethods('dimensions'),
|
|
624
|
+
updateSegments: updateMethods('segments'),
|
|
625
|
+
updateTimeDimensions: updateMethods('timeDimensions', toTimeDimension),
|
|
626
|
+
updateFilters: updateMethods('filters', toFilter),
|
|
627
|
+
updateChartType: newChartType => this.updateVizState({
|
|
628
|
+
chartType: newChartType
|
|
629
|
+
}),
|
|
630
|
+
updateOrder: {
|
|
631
|
+
set: (memberId, newOrder = 'asc') => {
|
|
632
|
+
this.updateQuery({
|
|
633
|
+
order: orderMembers.map(orderMember => ({ ...orderMember,
|
|
634
|
+
order: orderMember.id === memberId ? newOrder : orderMember.order
|
|
635
|
+
})).reduce((acc, {
|
|
636
|
+
id,
|
|
637
|
+
order
|
|
638
|
+
}) => order !== 'none' ? [...acc, [id, order]] : acc, [])
|
|
881
639
|
});
|
|
882
640
|
},
|
|
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
|
-
}
|
|
641
|
+
update: order => {
|
|
642
|
+
this.updateQuery({
|
|
643
|
+
order
|
|
644
|
+
});
|
|
923
645
|
},
|
|
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));
|
|
646
|
+
reorder: (sourceIndex, destinationIndex) => {
|
|
647
|
+
if (sourceIndex == null || destinationIndex == null) {
|
|
648
|
+
return;
|
|
946
649
|
}
|
|
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
650
|
|
|
984
|
-
|
|
985
|
-
|
|
651
|
+
const nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
|
|
652
|
+
this.orderMembersOrderKeys = nextArray.map(({
|
|
653
|
+
id
|
|
654
|
+
}) => id);
|
|
655
|
+
this.updateQuery({
|
|
656
|
+
order: nextArray.reduce((acc, {
|
|
657
|
+
id,
|
|
658
|
+
order
|
|
659
|
+
}) => order !== 'none' ? [...acc, [id, order]] : acc, [])
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
},
|
|
663
|
+
pivotConfig,
|
|
664
|
+
updatePivotConfig: {
|
|
665
|
+
moveItem: ({
|
|
666
|
+
sourceIndex,
|
|
667
|
+
destinationIndex,
|
|
668
|
+
sourceAxis,
|
|
669
|
+
destinationAxis
|
|
670
|
+
}) => {
|
|
671
|
+
this.updateVizState({
|
|
672
|
+
pivotConfig: movePivotItem(pivotConfig, sourceIndex, destinationIndex, sourceAxis, destinationAxis)
|
|
673
|
+
});
|
|
674
|
+
},
|
|
675
|
+
update: config => {
|
|
676
|
+
const {
|
|
677
|
+
limit
|
|
678
|
+
} = config;
|
|
679
|
+
this.updateVizState({
|
|
680
|
+
pivotConfig: { ...pivotConfig,
|
|
681
|
+
...config
|
|
682
|
+
},
|
|
683
|
+
...(limit ? {
|
|
684
|
+
query: { ...query,
|
|
685
|
+
limit
|
|
686
|
+
}
|
|
687
|
+
} : null)
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
},
|
|
691
|
+
missingMembers,
|
|
692
|
+
refresh: this.fetchMeta,
|
|
693
|
+
isFetchingMeta,
|
|
694
|
+
dryRunResponse,
|
|
695
|
+
...queryRendererProps
|
|
696
|
+
};
|
|
697
|
+
}
|
|
986
698
|
|
|
987
|
-
|
|
988
|
-
|
|
699
|
+
updateQuery(queryUpdate) {
|
|
700
|
+
const {
|
|
701
|
+
query
|
|
702
|
+
} = this.state;
|
|
703
|
+
this.updateVizState({
|
|
704
|
+
query: removeEmptyQueryFields({ ...query,
|
|
705
|
+
...queryUpdate
|
|
706
|
+
})
|
|
707
|
+
});
|
|
708
|
+
}
|
|
989
709
|
|
|
990
|
-
|
|
991
|
-
|
|
710
|
+
async updateVizState(state) {
|
|
711
|
+
const {
|
|
712
|
+
setQuery,
|
|
713
|
+
setVizState
|
|
714
|
+
} = this.props;
|
|
715
|
+
const {
|
|
716
|
+
query: stateQuery,
|
|
717
|
+
pivotConfig: statePivotConfig,
|
|
718
|
+
chartType,
|
|
719
|
+
meta
|
|
720
|
+
} = this.state;
|
|
721
|
+
const finalState = this.applyStateChangeHeuristics(state);
|
|
722
|
+
|
|
723
|
+
if (!finalState.query) {
|
|
724
|
+
finalState.query = { ...stateQuery
|
|
725
|
+
};
|
|
726
|
+
}
|
|
992
727
|
|
|
993
|
-
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}; // deprecated, setters replaced by onVizStateChanged
|
|
728
|
+
let vizStateSent = null;
|
|
997
729
|
|
|
730
|
+
const handleVizStateChange = currentState => {
|
|
731
|
+
const {
|
|
732
|
+
onVizStateChanged
|
|
733
|
+
} = this.props;
|
|
998
734
|
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
|
|
1002
|
-
}
|
|
735
|
+
if (onVizStateChanged) {
|
|
736
|
+
const newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState); // Don't run callbacks more than once unless the viz state has changed since last time
|
|
1003
737
|
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
}
|
|
1007
|
-
};
|
|
738
|
+
if (!vizStateSent || !equals(vizStateSent, newVizState)) {
|
|
739
|
+
onVizStateChanged(newVizState); // use clone to make sure we don't save object references
|
|
1008
740
|
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
741
|
+
vizStateSent = clone(newVizState);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}; // deprecated, setters replaced by onVizStateChanged
|
|
1012
745
|
|
|
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
746
|
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
747
|
+
const runSetters = currentState => {
|
|
748
|
+
if (setVizState) {
|
|
749
|
+
setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
|
|
750
|
+
}
|
|
1020
751
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
|
|
752
|
+
if (currentState.query && setQuery) {
|
|
753
|
+
setQuery(currentState.query);
|
|
754
|
+
}
|
|
755
|
+
};
|
|
1026
756
|
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
}
|
|
757
|
+
if (finalState.shouldApplyHeuristicOrder) {
|
|
758
|
+
finalState.query.order = defaultOrder(finalState.query);
|
|
759
|
+
}
|
|
1031
760
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
mutexObj: this.mutexObj
|
|
1036
|
-
});
|
|
761
|
+
finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
|
|
762
|
+
finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
|
|
763
|
+
finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
|
|
1037
764
|
|
|
1038
|
-
|
|
1039
|
-
|
|
765
|
+
runSetters({ ...state,
|
|
766
|
+
query: finalState.query
|
|
767
|
+
}); // Update optimistically so that UI does not stutter
|
|
1040
768
|
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
769
|
+
this.setState({ ...finalState,
|
|
770
|
+
queryError: null
|
|
771
|
+
});
|
|
772
|
+
handleVizStateChange(finalState);
|
|
773
|
+
const shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
|
|
1046
774
|
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
775
|
+
if (shouldFetchDryRun && isQueryPresent(finalState.query) && finalState.missingMembers.length === 0) {
|
|
776
|
+
try {
|
|
777
|
+
const response = await this.cubejsApi().dryRun(finalState.query, {
|
|
778
|
+
mutexObj: this.mutexObj
|
|
779
|
+
});
|
|
1050
780
|
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
781
|
+
if (finalState.shouldApplyHeuristicOrder) {
|
|
782
|
+
finalState.query.order = (response.queryOrder || []).reduce((memo, current) => ({ ...memo,
|
|
783
|
+
...current
|
|
784
|
+
}), {});
|
|
785
|
+
}
|
|
1054
786
|
|
|
1055
|
-
|
|
1056
|
-
|
|
787
|
+
finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(response.pivotQuery, finalState.pivotConfig);
|
|
788
|
+
finalState.validatedQuery = this.validatedQuery(finalState);
|
|
789
|
+
finalState.dryRunResponse = response; // deprecated
|
|
1057
790
|
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
791
|
+
if (isQueryPresent(stateQuery)) {
|
|
792
|
+
runSetters({ ...this.state,
|
|
793
|
+
...finalState
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
} catch (error) {
|
|
797
|
+
this.setState({
|
|
798
|
+
queryError: new Error(error.response?.plainError || error.message),
|
|
799
|
+
richQueryError: new Error(error.message || error.toString())
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
}
|
|
1064
803
|
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
return handleVizStateChange(_this4.state);
|
|
1068
|
-
});
|
|
804
|
+
this.setState(finalState, () => handleVizStateChange(this.state));
|
|
805
|
+
}
|
|
1069
806
|
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
}));
|
|
807
|
+
validatedQuery(state) {
|
|
808
|
+
const {
|
|
809
|
+
query
|
|
810
|
+
} = state || this.state;
|
|
811
|
+
return validateQuery(query);
|
|
812
|
+
}
|
|
1077
813
|
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
814
|
+
defaultHeuristics(newState) {
|
|
815
|
+
const {
|
|
816
|
+
query,
|
|
817
|
+
sessionGranularity,
|
|
818
|
+
meta
|
|
819
|
+
} = this.state;
|
|
820
|
+
return defaultHeuristics(newState, query, {
|
|
821
|
+
meta,
|
|
822
|
+
sessionGranularity: sessionGranularity || 'day'
|
|
823
|
+
});
|
|
824
|
+
}
|
|
1081
825
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
var _ref9 = state || this.state,
|
|
1088
|
-
query = _ref9.query;
|
|
826
|
+
applyStateChangeHeuristics(newState) {
|
|
827
|
+
const {
|
|
828
|
+
stateChangeHeuristics,
|
|
829
|
+
disableHeuristics
|
|
830
|
+
} = this.props;
|
|
1089
831
|
|
|
1090
|
-
|
|
832
|
+
if (disableHeuristics) {
|
|
833
|
+
return newState;
|
|
1091
834
|
}
|
|
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
835
|
|
|
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
|
-
}
|
|
836
|
+
return stateChangeHeuristics && stateChangeHeuristics(this.state, newState) || this.defaultHeuristics(newState);
|
|
837
|
+
}
|
|
1137
838
|
|
|
1138
|
-
|
|
839
|
+
render() {
|
|
840
|
+
const {
|
|
841
|
+
query
|
|
842
|
+
} = this.state;
|
|
843
|
+
const {
|
|
844
|
+
cubejsApi,
|
|
845
|
+
render,
|
|
846
|
+
wrapWithQueryRenderer
|
|
847
|
+
} = this.props;
|
|
848
|
+
|
|
849
|
+
if (wrapWithQueryRenderer) {
|
|
850
|
+
return /*#__PURE__*/React.createElement(QueryRenderer, {
|
|
851
|
+
query: query,
|
|
852
|
+
cubejsApi: cubejsApi,
|
|
853
|
+
resetResultSetOnChange: false,
|
|
854
|
+
render: queryRendererProps => {
|
|
855
|
+
if (render) {
|
|
856
|
+
return render(this.prepareRenderProps(queryRendererProps));
|
|
1139
857
|
}
|
|
1140
|
-
});
|
|
1141
|
-
} else {
|
|
1142
|
-
if (_render) {
|
|
1143
|
-
return _render(this.prepareRenderProps());
|
|
1144
|
-
}
|
|
1145
858
|
|
|
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.');
|
|
859
|
+
return null;
|
|
1159
860
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
861
|
+
});
|
|
862
|
+
} else {
|
|
863
|
+
if (render) {
|
|
864
|
+
return render(this.prepareRenderProps());
|
|
1164
865
|
}
|
|
1165
866
|
|
|
1166
867
|
return null;
|
|
1167
868
|
}
|
|
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
|
-
}
|
|
1186
|
-
|
|
1187
|
-
if (type === 'timeDimensions') {
|
|
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
|
-
}
|
|
1197
|
-
|
|
1198
|
-
return (query[type] || []).map(function (m, index) {
|
|
1199
|
-
return _objectSpread$4({
|
|
1200
|
-
index: index
|
|
1201
|
-
}, meta.resolveMember(m, type));
|
|
1202
|
-
});
|
|
1203
|
-
}
|
|
1204
|
-
}]);
|
|
1205
|
-
|
|
1206
|
-
return QueryBuilder;
|
|
1207
|
-
}(React.Component);
|
|
869
|
+
}
|
|
1208
870
|
|
|
1209
|
-
|
|
871
|
+
}
|
|
1210
872
|
QueryBuilder.defaultProps = {
|
|
1211
873
|
cubejsApi: null,
|
|
1212
874
|
stateChangeHeuristics: null,
|
|
@@ -1224,18 +886,19 @@ QueryBuilder.defaultProps = {
|
|
|
1224
886
|
setVizState: null
|
|
1225
887
|
};
|
|
1226
888
|
|
|
1227
|
-
function CubeProvider(
|
|
1228
|
-
|
|
1229
|
-
|
|
889
|
+
function CubeProvider({
|
|
890
|
+
cubejsApi,
|
|
891
|
+
children
|
|
892
|
+
}) {
|
|
1230
893
|
return /*#__PURE__*/React.createElement(CubeContext.Provider, {
|
|
1231
894
|
value: {
|
|
1232
|
-
cubejsApi
|
|
895
|
+
cubejsApi
|
|
1233
896
|
}
|
|
1234
897
|
}, children);
|
|
1235
898
|
}
|
|
1236
899
|
|
|
1237
900
|
function useDeepCompareMemoize(value) {
|
|
1238
|
-
|
|
901
|
+
const ref = useRef([]);
|
|
1239
902
|
|
|
1240
903
|
if (!equals(value, ref.current)) {
|
|
1241
904
|
ref.current = value;
|
|
@@ -1245,388 +908,218 @@ function useDeepCompareMemoize(value) {
|
|
|
1245
908
|
}
|
|
1246
909
|
|
|
1247
910
|
function useIsMounted() {
|
|
1248
|
-
|
|
1249
|
-
useEffect(
|
|
911
|
+
const isMounted = useRef(false);
|
|
912
|
+
useEffect(() => {
|
|
1250
913
|
isMounted.current = true;
|
|
1251
|
-
return
|
|
914
|
+
return () => {
|
|
1252
915
|
isMounted.current = false;
|
|
1253
916
|
};
|
|
1254
917
|
}, []);
|
|
1255
|
-
return
|
|
1256
|
-
return isMounted.current;
|
|
1257
|
-
};
|
|
918
|
+
return () => isMounted.current;
|
|
1258
919
|
}
|
|
1259
920
|
|
|
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({
|
|
921
|
+
function useCubeFetch(method, options = {}) {
|
|
922
|
+
const isMounted = useIsMounted();
|
|
923
|
+
const context = useContext(CubeContext);
|
|
924
|
+
const mutexRef = useRef({});
|
|
925
|
+
const [response, setResponse] = useState({
|
|
1272
926
|
isLoading: false,
|
|
1273
927
|
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);
|
|
928
|
+
});
|
|
929
|
+
const [error, setError] = useState(null);
|
|
930
|
+
const {
|
|
931
|
+
skip = false
|
|
932
|
+
} = options;
|
|
933
|
+
|
|
934
|
+
async function load(loadOptions = {}, ignoreSkip = false) {
|
|
935
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
936
|
+
const query = loadOptions.query || options.query;
|
|
937
|
+
const queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
|
|
938
|
+
|
|
939
|
+
if (cubejsApi && (ignoreSkip || !skip) && queryCondition) {
|
|
940
|
+
setError(null);
|
|
941
|
+
setResponse({
|
|
942
|
+
isLoading: true,
|
|
943
|
+
response: null
|
|
944
|
+
});
|
|
945
|
+
const coreOptions = {
|
|
946
|
+
mutexObj: mutexRef.current,
|
|
947
|
+
mutexKey: method
|
|
948
|
+
};
|
|
949
|
+
const args = method === 'meta' ? [coreOptions] : [query, coreOptions];
|
|
1348
950
|
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
setResponse({
|
|
1352
|
-
isLoading: false,
|
|
1353
|
-
response: null
|
|
1354
|
-
});
|
|
1355
|
-
}
|
|
951
|
+
try {
|
|
952
|
+
const response = await cubejsApi[method](...args);
|
|
1356
953
|
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
954
|
+
if (isMounted()) {
|
|
955
|
+
setResponse({
|
|
956
|
+
response,
|
|
957
|
+
isLoading: false
|
|
958
|
+
});
|
|
1361
959
|
}
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
|
|
960
|
+
} catch (error) {
|
|
961
|
+
if (isMounted()) {
|
|
962
|
+
setError(error);
|
|
963
|
+
setResponse({
|
|
964
|
+
isLoading: false,
|
|
965
|
+
response: null
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
}
|
|
1365
970
|
}
|
|
1366
971
|
|
|
1367
|
-
useEffect(
|
|
972
|
+
useEffect(() => {
|
|
1368
973
|
load();
|
|
1369
|
-
}, useDeepCompareMemoize([Object.keys(
|
|
1370
|
-
return
|
|
1371
|
-
error
|
|
1372
|
-
refetch:
|
|
1373
|
-
|
|
1374
|
-
}
|
|
1375
|
-
});
|
|
974
|
+
}, useDeepCompareMemoize([Object.keys(options.query?.order || {}), options, context]));
|
|
975
|
+
return { ...response,
|
|
976
|
+
error,
|
|
977
|
+
refetch: options => load(options, true)
|
|
978
|
+
};
|
|
1376
979
|
}
|
|
1377
980
|
|
|
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
|
-
}));
|
|
981
|
+
function useCubeSql(query, options = {}) {
|
|
982
|
+
return useCubeFetch('sql', { ...options,
|
|
983
|
+
query
|
|
984
|
+
});
|
|
1386
985
|
}
|
|
1387
986
|
|
|
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
|
-
}));
|
|
987
|
+
function useDryRun(query, options = {}) {
|
|
988
|
+
return useCubeFetch('dryRun', { ...options,
|
|
989
|
+
query
|
|
990
|
+
});
|
|
1396
991
|
}
|
|
1397
992
|
|
|
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,
|
|
993
|
+
function useLazyDryRun(query, options = {}) {
|
|
994
|
+
const {
|
|
995
|
+
refetch,
|
|
996
|
+
...result
|
|
997
|
+
} = useCubeFetch('dryRun', { ...options,
|
|
998
|
+
query,
|
|
1408
999
|
skip: true
|
|
1409
|
-
})
|
|
1410
|
-
refetch = _useCubeFetch.refetch,
|
|
1411
|
-
result = _objectWithoutProperties(_useCubeFetch, _excluded);
|
|
1412
|
-
|
|
1000
|
+
});
|
|
1413
1001
|
return [refetch, result];
|
|
1414
1002
|
}
|
|
1415
1003
|
|
|
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
|
-
});
|
|
1004
|
+
function useCubeQuery(query, options = {}) {
|
|
1005
|
+
const mutexRef = useRef({});
|
|
1006
|
+
const isMounted = useIsMounted();
|
|
1007
|
+
const [currentQuery, setCurrentQuery] = useState(null);
|
|
1008
|
+
const [isLoading, setLoading] = useState(false);
|
|
1009
|
+
const [resultSet, setResultSet] = useState(null);
|
|
1010
|
+
const [progress, setProgress] = useState(null);
|
|
1011
|
+
const [error, setError] = useState(null);
|
|
1012
|
+
const context = useContext(CubeContext);
|
|
1013
|
+
let subscribeRequest = null;
|
|
1014
|
+
|
|
1015
|
+
const progressCallback = ({
|
|
1016
|
+
progressResponse
|
|
1017
|
+
}) => setProgress(progressResponse);
|
|
1018
|
+
|
|
1019
|
+
async function fetch() {
|
|
1020
|
+
const {
|
|
1021
|
+
resetResultSetOnChange
|
|
1022
|
+
} = options;
|
|
1023
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
1489
1024
|
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
if (isMounted()) {
|
|
1494
|
-
setResultSet(response);
|
|
1495
|
-
setProgress(null);
|
|
1496
|
-
}
|
|
1025
|
+
if (!cubejsApi) {
|
|
1026
|
+
throw new Error('Cube.js API client is not provided');
|
|
1027
|
+
}
|
|
1497
1028
|
|
|
1498
|
-
|
|
1499
|
-
|
|
1029
|
+
if (resetResultSetOnChange) {
|
|
1030
|
+
setResultSet(null);
|
|
1031
|
+
}
|
|
1500
1032
|
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
_context2.t0 = _context2["catch"](7);
|
|
1033
|
+
setError(null);
|
|
1034
|
+
setLoading(true);
|
|
1504
1035
|
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1036
|
+
try {
|
|
1037
|
+
const response = await cubejsApi.load(query, {
|
|
1038
|
+
mutexObj: mutexRef.current,
|
|
1039
|
+
mutexKey: 'query',
|
|
1040
|
+
progressCallback
|
|
1041
|
+
});
|
|
1510
1042
|
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1043
|
+
if (isMounted()) {
|
|
1044
|
+
setResultSet(response);
|
|
1045
|
+
setProgress(null);
|
|
1046
|
+
}
|
|
1047
|
+
} catch (error) {
|
|
1048
|
+
if (isMounted()) {
|
|
1049
|
+
setError(error);
|
|
1050
|
+
setResultSet(null);
|
|
1051
|
+
setProgress(null);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1515
1054
|
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
}, _callee2, null, [[7, 14]]);
|
|
1522
|
-
}));
|
|
1523
|
-
return _fetch.apply(this, arguments);
|
|
1055
|
+
if (isMounted()) {
|
|
1056
|
+
setLoading(false);
|
|
1057
|
+
}
|
|
1524
1058
|
}
|
|
1525
1059
|
|
|
1526
|
-
useEffect(
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1060
|
+
useEffect(() => {
|
|
1061
|
+
const {
|
|
1062
|
+
skip = false,
|
|
1063
|
+
resetResultSetOnChange
|
|
1064
|
+
} = options;
|
|
1065
|
+
const cubejsApi = options.cubejsApi || context?.cubejsApi;
|
|
1531
1066
|
|
|
1532
1067
|
if (!cubejsApi) {
|
|
1533
1068
|
throw new Error('Cube.js API client is not provided');
|
|
1534
1069
|
}
|
|
1535
1070
|
|
|
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
|
-
}
|
|
1071
|
+
async function loadQuery() {
|
|
1072
|
+
if (!skip && isQueryPresent(query)) {
|
|
1073
|
+
if (!areQueriesEqual(currentQuery, query)) {
|
|
1074
|
+
if (resetResultSetOnChange == null || resetResultSetOnChange) {
|
|
1075
|
+
setResultSet(null);
|
|
1076
|
+
}
|
|
1567
1077
|
|
|
1568
|
-
|
|
1569
|
-
|
|
1078
|
+
setCurrentQuery(query);
|
|
1079
|
+
}
|
|
1570
1080
|
|
|
1571
|
-
|
|
1572
|
-
|
|
1081
|
+
setError(null);
|
|
1082
|
+
setLoading(true);
|
|
1573
1083
|
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1084
|
+
try {
|
|
1085
|
+
if (subscribeRequest) {
|
|
1086
|
+
await subscribeRequest.unsubscribe();
|
|
1087
|
+
subscribeRequest = null;
|
|
1088
|
+
}
|
|
1579
1089
|
|
|
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);
|
|
1090
|
+
if (options.subscribe) {
|
|
1091
|
+
subscribeRequest = cubejsApi.subscribe(query, {
|
|
1092
|
+
mutexObj: mutexRef.current,
|
|
1093
|
+
mutexKey: 'query',
|
|
1094
|
+
progressCallback
|
|
1095
|
+
}, (e, result) => {
|
|
1096
|
+
if (isMounted()) {
|
|
1097
|
+
if (e) {
|
|
1098
|
+
setError(e);
|
|
1099
|
+
} else {
|
|
1100
|
+
setResultSet(result);
|
|
1616
1101
|
}
|
|
1617
1102
|
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
}
|
|
1103
|
+
setLoading(false);
|
|
1104
|
+
setProgress(null);
|
|
1105
|
+
}
|
|
1106
|
+
});
|
|
1107
|
+
} else {
|
|
1108
|
+
await fetch();
|
|
1622
1109
|
}
|
|
1623
|
-
}
|
|
1624
|
-
|
|
1625
|
-
|
|
1110
|
+
} catch (e) {
|
|
1111
|
+
if (isMounted()) {
|
|
1112
|
+
setError(e);
|
|
1113
|
+
setResultSet(null);
|
|
1114
|
+
setLoading(false);
|
|
1115
|
+
setProgress(null);
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1626
1119
|
}
|
|
1627
1120
|
|
|
1628
1121
|
loadQuery();
|
|
1629
|
-
return
|
|
1122
|
+
return () => {
|
|
1630
1123
|
if (subscribeRequest) {
|
|
1631
1124
|
subscribeRequest.unsubscribe();
|
|
1632
1125
|
subscribeRequest = null;
|
|
@@ -1634,17 +1127,16 @@ function useCubeQuery(query) {
|
|
|
1634
1127
|
};
|
|
1635
1128
|
}, useDeepCompareMemoize([query, Object.keys(query && query.order || {}), options, context]));
|
|
1636
1129
|
return {
|
|
1637
|
-
isLoading
|
|
1638
|
-
resultSet
|
|
1639
|
-
error
|
|
1640
|
-
progress
|
|
1130
|
+
isLoading,
|
|
1131
|
+
resultSet,
|
|
1132
|
+
error,
|
|
1133
|
+
progress,
|
|
1641
1134
|
previousQuery: currentQuery,
|
|
1642
1135
|
refetch: fetch
|
|
1643
1136
|
};
|
|
1644
1137
|
}
|
|
1645
1138
|
|
|
1646
|
-
function useCubeMeta() {
|
|
1647
|
-
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1139
|
+
function useCubeMeta(options = {}) {
|
|
1648
1140
|
return useCubeFetch('meta', options);
|
|
1649
1141
|
}
|
|
1650
1142
|
|