@cubejs-client/core 0.36.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,11 +51,16 @@ require('core-js/modules/es.set.js');
51
51
  require('core-js/modules/es.array.index-of.js');
52
52
  require('core-js/modules/es.string.trim.js');
53
53
  var dayjs = require('dayjs');
54
- var quarterOfYear = require('dayjs/plugin/quarterOfYear');
55
- var en = require('dayjs/locale/en');
56
54
  var ramda = require('ramda');
57
55
  require('core-js/modules/es.array.every.js');
58
56
  require('core-js/modules/es.array.splice.js');
57
+ require('core-js/modules/es.parse-int.js');
58
+ require('core-js/modules/es.string.ends-with.js');
59
+ require('core-js/modules/es.array.slice.js');
60
+ var quarterOfYear = require('dayjs/plugin/quarterOfYear');
61
+ var duration = require('dayjs/plugin/duration');
62
+ var isoWeek = require('dayjs/plugin/isoWeek');
63
+ var en = require('dayjs/locale/en');
59
64
  require('core-js/modules/es.function.name.js');
60
65
  require('core-js/modules/es.array.sort.js');
61
66
  require('core-js/modules/web.url-search-params.js');
@@ -80,6 +85,8 @@ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_obje
80
85
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
81
86
  var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
82
87
  var quarterOfYear__default = /*#__PURE__*/_interopDefaultLegacy(quarterOfYear);
88
+ var duration__default = /*#__PURE__*/_interopDefaultLegacy(duration);
89
+ var isoWeek__default = /*#__PURE__*/_interopDefaultLegacy(isoWeek);
83
90
  var en__default = /*#__PURE__*/_interopDefaultLegacy(en);
84
91
  var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
85
92
  var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
@@ -87,10 +94,11 @@ var _possibleConstructorReturn__default = /*#__PURE__*/_interopDefaultLegacy(_po
87
94
  var _getPrototypeOf__default = /*#__PURE__*/_interopDefaultLegacy(_getPrototypeOf);
88
95
  var _wrapNativeSuper__default = /*#__PURE__*/_interopDefaultLegacy(_wrapNativeSuper);
89
96
 
90
- var _excluded$2 = ["query"];
91
- function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
92
- function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), !0).forEach(function (r) { _defineProperty__default['default'](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
93
- var DEFAULT_GRANULARITY = 'day';
97
+ function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
98
+ function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), !0).forEach(function (r) { _defineProperty__default['default'](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
99
+ dayjs__default['default'].extend(quarterOfYear__default['default']);
100
+ dayjs__default['default'].extend(duration__default['default']);
101
+ dayjs__default['default'].extend(isoWeek__default['default']);
94
102
  var GRANULARITIES = [{
95
103
  name: undefined,
96
104
  title: 'w/o grouping'
@@ -119,6 +127,267 @@ var GRANULARITIES = [{
119
127
  name: 'year',
120
128
  title: 'Year'
121
129
  }];
130
+ var DEFAULT_GRANULARITY = 'day';
131
+
132
+ // When granularity is week, weekStart Value must be 1. However, since the client can change it globally
133
+ // (https://day.js.org/docs/en/i18n/changing-locale) So the function below has been added.
134
+ var internalDayjs = function internalDayjs() {
135
+ return dayjs__default['default'].apply(void 0, arguments).locale(_objectSpread$4(_objectSpread$4({}, en__default['default']), {}, {
136
+ weekStart: 1
137
+ }));
138
+ };
139
+ var TIME_SERIES = {
140
+ day: function day(range) {
141
+ return range.by('d').map(function (d) {
142
+ return d.format('YYYY-MM-DDT00:00:00.000');
143
+ });
144
+ },
145
+ month: function month(range) {
146
+ return range.snapTo('month').by('M').map(function (d) {
147
+ return d.format('YYYY-MM-01T00:00:00.000');
148
+ });
149
+ },
150
+ year: function year(range) {
151
+ return range.snapTo('year').by('y').map(function (d) {
152
+ return d.format('YYYY-01-01T00:00:00.000');
153
+ });
154
+ },
155
+ hour: function hour(range) {
156
+ return range.by('h').map(function (d) {
157
+ return d.format('YYYY-MM-DDTHH:00:00.000');
158
+ });
159
+ },
160
+ minute: function minute(range) {
161
+ return range.by('m').map(function (d) {
162
+ return d.format('YYYY-MM-DDTHH:mm:00.000');
163
+ });
164
+ },
165
+ second: function second(range) {
166
+ return range.by('s').map(function (d) {
167
+ return d.format('YYYY-MM-DDTHH:mm:ss.000');
168
+ });
169
+ },
170
+ week: function week(range) {
171
+ return range.snapTo('week').by('w').map(function (d) {
172
+ return d.startOf('week').format('YYYY-MM-DDT00:00:00.000');
173
+ });
174
+ },
175
+ quarter: function quarter(range) {
176
+ return range.snapTo('quarter').by('quarter').map(function (d) {
177
+ return d.startOf('quarter').format('YYYY-MM-DDT00:00:00.000');
178
+ });
179
+ }
180
+ };
181
+ var isPredefinedGranularity = function isPredefinedGranularity(granularity) {
182
+ return !!TIME_SERIES[granularity];
183
+ };
184
+ var DateRegex = /^\d\d\d\d-\d\d-\d\d$/;
185
+ var LocalDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z?$/;
186
+ var dayRange = function dayRange(from, to) {
187
+ return {
188
+ by: function by(value) {
189
+ var results = [];
190
+ var start = internalDayjs(from);
191
+ var end = internalDayjs(to);
192
+ while (start.isBefore(end) || start.isSame(end)) {
193
+ results.push(start);
194
+ start = start.add(1, value);
195
+ }
196
+ return results;
197
+ },
198
+ snapTo: function snapTo(value) {
199
+ return dayRange(internalDayjs(from).startOf(value), internalDayjs(to).endOf(value));
200
+ },
201
+ start: internalDayjs(from),
202
+ end: internalDayjs(to)
203
+ };
204
+ };
205
+
206
+ /**
207
+ * Parse PostgreSQL-like interval string into object
208
+ * E.g. '2 years 15 months 100 weeks 99 hours 15 seconds'
209
+ * Negative units are also supported
210
+ * E.g. '-2 months 5 days -10 hours'
211
+ *
212
+ * TODO: It's copy/paste of parseSqlInterval from @cubejs-backend/shared [time.ts]
213
+ * It's not referenced to omit imports of moment.js staff.
214
+ * Probably one day we should choose one implementation and reuse it in other places.
215
+ */
216
+ function parseSqlInterval(intervalStr) {
217
+ var interval = {};
218
+ var parts = intervalStr.split(/\s+/);
219
+ for (var i = 0; i < parts.length; i += 2) {
220
+ var value = parseInt(parts[i], 10);
221
+ var unit = parts[i + 1];
222
+
223
+ // Remove ending 's' (e.g., 'days' -> 'day')
224
+ var singularUnit = unit.endsWith('s') ? unit.slice(0, -1) : unit;
225
+ interval[singularUnit] = value;
226
+ }
227
+ return interval;
228
+ }
229
+
230
+ /**
231
+ * Adds interval to provided date.
232
+ * TODO: It's copy/paste of addInterval from @cubejs-backend/shared [time.ts]
233
+ * but operates with dayjs instead of moment.js
234
+ * @param {dayjs} date
235
+ * @param interval
236
+ * @returns {dayjs}
237
+ */
238
+ function addInterval(date, interval) {
239
+ var res = date.clone();
240
+ Object.entries(interval).forEach(function (_ref) {
241
+ var _ref2 = _slicedToArray__default['default'](_ref, 2),
242
+ key = _ref2[0],
243
+ value = _ref2[1];
244
+ res = res.add(value, key);
245
+ });
246
+ return res;
247
+ }
248
+
249
+ /**
250
+ * Adds interval to provided date.
251
+ * TODO: It's copy/paste of subtractInterval from @cubejs-backend/shared [time.ts]
252
+ * but operates with dayjs instead of moment.js
253
+ * @param {dayjs} date
254
+ * @param interval
255
+ * @returns {dayjs}
256
+ */
257
+ function subtractInterval(date, interval) {
258
+ var res = date.clone();
259
+ Object.entries(interval).forEach(function (_ref3) {
260
+ var _ref4 = _slicedToArray__default['default'](_ref3, 2),
261
+ key = _ref4[0],
262
+ value = _ref4[1];
263
+ res = res.subtract(value, key);
264
+ });
265
+ return res;
266
+ }
267
+
268
+ /**
269
+ * Returns the closest date prior to date parameter aligned with the origin point
270
+ * TODO: It's copy/paste of alignToOrigin from @cubejs-backend/shared [time.ts]
271
+ * but operates with dayjs instead of moment.js
272
+ */
273
+ function alignToOrigin(startDate, interval, origin) {
274
+ var alignedDate = startDate.clone();
275
+ var intervalOp;
276
+ var isIntervalNegative = false;
277
+ var offsetDate = addInterval(origin, interval);
278
+
279
+ // The easiest way to check the interval sign
280
+ if (offsetDate.isBefore(origin)) {
281
+ isIntervalNegative = true;
282
+ }
283
+ offsetDate = origin.clone();
284
+ if (startDate.isBefore(origin)) {
285
+ intervalOp = isIntervalNegative ? addInterval : subtractInterval;
286
+ while (offsetDate.isAfter(startDate)) {
287
+ offsetDate = intervalOp(offsetDate, interval);
288
+ }
289
+ alignedDate = offsetDate;
290
+ } else {
291
+ intervalOp = isIntervalNegative ? subtractInterval : addInterval;
292
+ while (offsetDate.isBefore(startDate)) {
293
+ alignedDate = offsetDate.clone();
294
+ offsetDate = intervalOp(offsetDate, interval);
295
+ }
296
+ if (offsetDate.isSame(startDate)) {
297
+ alignedDate = offsetDate;
298
+ }
299
+ }
300
+ return alignedDate;
301
+ }
302
+
303
+ /**
304
+ * Returns the time series points for the custom interval
305
+ * TODO: It's almost a copy/paste of timeSeriesFromCustomInterval from
306
+ * @cubejs-backend/shared [time.ts] but operates with dayjs instead of moment.js
307
+ */
308
+ var timeSeriesFromCustomInterval = function timeSeriesFromCustomInterval(from, to, granularity) {
309
+ var intervalParsed = parseSqlInterval(granularity.interval);
310
+ var start = internalDayjs(from);
311
+ var end = internalDayjs(to);
312
+ var origin = granularity.origin ? internalDayjs(granularity.origin) : internalDayjs().startOf('year');
313
+ if (granularity.offset) {
314
+ origin = addInterval(origin, parseSqlInterval(granularity.offset));
315
+ }
316
+ var alignedStart = alignToOrigin(start, intervalParsed, origin);
317
+ var dates = [];
318
+ while (alignedStart.isBefore(end) || alignedStart.isSame(end)) {
319
+ dates.push(alignedStart.format('YYYY-MM-DDTHH:mm:ss.000'));
320
+ alignedStart = addInterval(alignedStart, intervalParsed);
321
+ }
322
+ return dates;
323
+ };
324
+
325
+ /**
326
+ * Returns the lowest time unit for the interval
327
+ * @protected
328
+ * @param {string} interval
329
+ * @returns {string}
330
+ */
331
+ var diffTimeUnitForInterval = function diffTimeUnitForInterval(interval) {
332
+ if (/second/i.test(interval)) {
333
+ return 'second';
334
+ } else if (/minute/i.test(interval)) {
335
+ return 'minute';
336
+ } else if (/hour/i.test(interval)) {
337
+ return 'hour';
338
+ } else if (/day/i.test(interval)) {
339
+ return 'day';
340
+ } else if (/week/i.test(interval)) {
341
+ return 'day';
342
+ } else if (/month/i.test(interval)) {
343
+ return 'month';
344
+ } else if (/quarter/i.test(interval)) {
345
+ return 'month';
346
+ } else /* if (/year/i.test(interval)) */{
347
+ return 'year';
348
+ }
349
+ };
350
+ var granularityOrder = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'];
351
+ var minGranularityForIntervals = function minGranularityForIntervals(i1, i2) {
352
+ var g1 = diffTimeUnitForInterval(i1);
353
+ var g2 = diffTimeUnitForInterval(i2);
354
+ var g1pos = granularityOrder.indexOf(g1);
355
+ var g2pos = granularityOrder.indexOf(g2);
356
+ if (g1pos > g2pos) {
357
+ return g1;
358
+ }
359
+ return g2;
360
+ };
361
+ var granularityFor = function granularityFor(dateStr) {
362
+ var dayjsDate = internalDayjs(dateStr);
363
+ var month = dayjsDate.month();
364
+ var date = dayjsDate.date();
365
+ var hours = dayjsDate.hour();
366
+ var minutes = dayjsDate.minute();
367
+ var seconds = dayjsDate.second();
368
+ var milliseconds = dayjsDate.millisecond();
369
+ var weekDay = dayjsDate.isoWeekday();
370
+ if (month === 0 && date === 1 && hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {
371
+ return 'year';
372
+ } else if (date === 1 && hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {
373
+ return 'month';
374
+ } else if (weekDay === 1 && hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {
375
+ return 'week';
376
+ } else if (hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {
377
+ return 'day';
378
+ } else if (minutes === 0 && seconds === 0 && milliseconds === 0) {
379
+ return 'hour';
380
+ } else if (seconds === 0 && milliseconds === 0) {
381
+ return 'minute';
382
+ } else if (milliseconds === 0) {
383
+ return 'second';
384
+ }
385
+ return 'second'; // TODO return 'millisecond';
386
+ };
387
+
388
+ var _excluded$2 = ["query"];
389
+ function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
390
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), !0).forEach(function (r) { _defineProperty__default['default'](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
122
391
  function removeEmptyQueryFields(_query) {
123
392
  var query = _query || {};
124
393
  return ramda.fromPairs(ramda.toPairs(query).map(function (_ref) {
@@ -389,59 +658,6 @@ var _excluded$1 = ["x"],
389
658
  _excluded3 = ["title", "shortTitle"];
390
659
  function ownKeys$2(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
391
660
  function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), !0).forEach(function (r) { _defineProperty__default['default'](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
392
- dayjs__default['default'].extend(quarterOfYear__default['default']);
393
-
394
- // When granularity is week, weekStart Value must be 1. However, since the client can change it globally (https://day.js.org/docs/en/i18n/changing-locale)
395
- // So the function below has been added.
396
- var internalDayjs = function internalDayjs() {
397
- return dayjs__default['default'].apply(void 0, arguments).locale(_objectSpread$2(_objectSpread$2({}, en__default['default']), {}, {
398
- weekStart: 1
399
- }));
400
- };
401
- var TIME_SERIES = {
402
- day: function day(range) {
403
- return range.by('d').map(function (d) {
404
- return d.format('YYYY-MM-DDT00:00:00.000');
405
- });
406
- },
407
- month: function month(range) {
408
- return range.snapTo('month').by('M').map(function (d) {
409
- return d.format('YYYY-MM-01T00:00:00.000');
410
- });
411
- },
412
- year: function year(range) {
413
- return range.snapTo('year').by('y').map(function (d) {
414
- return d.format('YYYY-01-01T00:00:00.000');
415
- });
416
- },
417
- hour: function hour(range) {
418
- return range.by('h').map(function (d) {
419
- return d.format('YYYY-MM-DDTHH:00:00.000');
420
- });
421
- },
422
- minute: function minute(range) {
423
- return range.by('m').map(function (d) {
424
- return d.format('YYYY-MM-DDTHH:mm:00.000');
425
- });
426
- },
427
- second: function second(range) {
428
- return range.by('s').map(function (d) {
429
- return d.format('YYYY-MM-DDTHH:mm:ss.000');
430
- });
431
- },
432
- week: function week(range) {
433
- return range.snapTo('week').by('w').map(function (d) {
434
- return d.startOf('week').format('YYYY-MM-DDT00:00:00.000');
435
- });
436
- },
437
- quarter: function quarter(range) {
438
- return range.snapTo('quarter').by('quarter').map(function (d) {
439
- return d.startOf('quarter').format('YYYY-MM-DDT00:00:00.000');
440
- });
441
- }
442
- };
443
- var DateRegex = /^\d\d\d\d-\d\d-\d\d$/;
444
- var LocalDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z?$/;
445
661
  var groupByToPairs = function groupByToPairs(keyFn) {
446
662
  var acc = new Map();
447
663
  return function (data) {
@@ -464,25 +680,6 @@ var unnest = function unnest(arr) {
464
680
  });
465
681
  return res;
466
682
  };
467
- var dayRange = function dayRange(from, to) {
468
- return {
469
- by: function by(value) {
470
- var results = [];
471
- var start = internalDayjs(from);
472
- var end = internalDayjs(to);
473
- while (start.isBefore(end) || start.isSame(end)) {
474
- results.push(start);
475
- start = start.add(1, value);
476
- }
477
- return results;
478
- },
479
- snapTo: function snapTo(value) {
480
- return dayRange(internalDayjs(from).startOf(value), internalDayjs(to).endOf(value));
481
- },
482
- start: internalDayjs(from),
483
- end: internalDayjs(to)
484
- };
485
- };
486
683
  var QUERY_TYPE = {
487
684
  REGULAR_QUERY: 'regularQuery',
488
685
  COMPARE_DATE_RANGE_QUERY: 'compareDateRangeQuery',
@@ -680,7 +877,7 @@ var ResultSet = /*#__PURE__*/function () {
680
877
  }
681
878
  }, {
682
879
  key: "timeSeries",
683
- value: function timeSeries(timeDimension, resultIndex) {
880
+ value: function timeSeries(timeDimension, resultIndex, annotations) {
684
881
  if (!timeDimension.granularity) {
685
882
  return null;
686
883
  }
@@ -707,10 +904,13 @@ var ResultSet = /*#__PURE__*/function () {
707
904
  start = _dateRange2[0],
708
905
  end = _dateRange2[1];
709
906
  var range = dayRange(start, end);
710
- if (!TIME_SERIES[timeDimension.granularity]) {
711
- throw new Error("Unsupported time granularity: ".concat(timeDimension.granularity));
907
+ if (isPredefinedGranularity(timeDimension.granularity)) {
908
+ return TIME_SERIES[timeDimension.granularity](padToDay ? range.snapTo('d') : range);
909
+ }
910
+ if (!annotations["".concat(timeDimension.dimension, ".").concat(timeDimension.granularity)]) {
911
+ throw new Error("Granularity \"".concat(timeDimension.granularity, "\" not found in time dimension \"").concat(timeDimension.dimension, "\""));
712
912
  }
713
- return TIME_SERIES[timeDimension.granularity](padToDay ? range.snapTo('d') : range);
913
+ return timeSeriesFromCustomInterval(start, end, annotations["".concat(timeDimension.dimension, ".").concat(timeDimension.granularity)].granularity);
714
914
  }
715
915
  }, {
716
916
  key: "pivot",
@@ -733,7 +933,7 @@ var ResultSet = /*#__PURE__*/function () {
733
933
  return ResultSet.timeDimensionMember(td);
734
934
  }))) {
735
935
  var series = _this2.loadResponses.map(function (loadResponse) {
736
- return _this2.timeSeries(loadResponse.query.timeDimensions[0], resultIndex);
936
+ return _this2.timeSeries(loadResponse.query.timeDimensions[0], resultIndex, loadResponse.annotation.timeDimensions);
737
937
  });
738
938
  if (series[0]) {
739
939
  groupByXAxis = function groupByXAxis(rows) {
@@ -2155,22 +2355,35 @@ var index = (function (apiToken, options) {
2155
2355
 
2156
2356
  exports.CubeApi = CubeApi;
2157
2357
  exports.DEFAULT_GRANULARITY = DEFAULT_GRANULARITY;
2358
+ exports.DateRegex = DateRegex;
2158
2359
  exports.GRANULARITIES = GRANULARITIES;
2159
2360
  exports.HttpTransport = HttpTransport;
2361
+ exports.LocalDateRegex = LocalDateRegex;
2160
2362
  exports.Meta = Meta;
2161
2363
  exports.RequestError = RequestError;
2162
2364
  exports.ResultSet = ResultSet;
2365
+ exports.TIME_SERIES = TIME_SERIES;
2366
+ exports.addInterval = addInterval;
2163
2367
  exports.aliasSeries = aliasSeries;
2164
2368
  exports.areQueriesEqual = areQueriesEqual;
2369
+ exports.dayRange = dayRange;
2165
2370
  exports.default = index;
2166
2371
  exports.defaultHeuristics = defaultHeuristics;
2167
2372
  exports.defaultOrder = defaultOrder;
2373
+ exports.diffTimeUnitForInterval = diffTimeUnitForInterval;
2168
2374
  exports.flattenFilters = flattenFilters;
2169
2375
  exports.getOrderMembersFromOrder = getOrderMembersFromOrder;
2170
2376
  exports.getQueryMembers = getQueryMembers;
2377
+ exports.granularityFor = granularityFor;
2378
+ exports.internalDayjs = internalDayjs;
2379
+ exports.isPredefinedGranularity = isPredefinedGranularity;
2171
2380
  exports.isQueryPresent = isQueryPresent;
2381
+ exports.minGranularityForIntervals = minGranularityForIntervals;
2172
2382
  exports.moveItemInArray = moveItemInArray;
2173
2383
  exports.movePivotItem = movePivotItem;
2384
+ exports.parseSqlInterval = parseSqlInterval;
2174
2385
  exports.removeEmptyQueryFields = removeEmptyQueryFields;
2386
+ exports.subtractInterval = subtractInterval;
2387
+ exports.timeSeriesFromCustomInterval = timeSeriesFromCustomInterval;
2175
2388
  exports.validateQuery = validateQuery;
2176
2389
  //# sourceMappingURL=cubejs-client-core.js.map