@cubejs-backend/schema-compiler 0.34.30 → 0.34.32

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.
Files changed (83) hide show
  1. package/dist/src/adapter/AWSElasticSearchQuery.d.ts +1 -6
  2. package/dist/src/adapter/AWSElasticSearchQuery.d.ts.map +1 -1
  3. package/dist/src/adapter/BaseDimension.d.ts +17 -15
  4. package/dist/src/adapter/BaseDimension.d.ts.map +1 -1
  5. package/dist/src/adapter/BaseDimension.js +3 -2
  6. package/dist/src/adapter/BaseDimension.js.map +1 -1
  7. package/dist/src/adapter/BaseFilter.d.ts +33 -26
  8. package/dist/src/adapter/BaseFilter.d.ts.map +1 -1
  9. package/dist/src/adapter/BaseFilter.js +1 -2
  10. package/dist/src/adapter/BaseFilter.js.map +1 -1
  11. package/dist/src/adapter/BaseGroupFilter.d.ts +5 -5
  12. package/dist/src/adapter/BaseGroupFilter.d.ts.map +1 -1
  13. package/dist/src/adapter/BaseGroupFilter.js.map +1 -1
  14. package/dist/src/adapter/BaseMeasure.d.ts +19 -15
  15. package/dist/src/adapter/BaseMeasure.d.ts.map +1 -1
  16. package/dist/src/adapter/BaseMeasure.js +2 -1
  17. package/dist/src/adapter/BaseMeasure.js.map +1 -1
  18. package/dist/src/adapter/BaseQuery.d.ts +11 -11
  19. package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
  20. package/dist/src/adapter/BaseQuery.js +7 -7
  21. package/dist/src/adapter/BaseQuery.js.map +1 -1
  22. package/dist/src/adapter/BaseSegment.d.ts +8 -7
  23. package/dist/src/adapter/BaseSegment.d.ts.map +1 -1
  24. package/dist/src/adapter/BaseSegment.js.map +1 -1
  25. package/dist/src/adapter/BaseTimeDimension.d.ts +27 -20
  26. package/dist/src/adapter/BaseTimeDimension.d.ts.map +1 -1
  27. package/dist/src/adapter/BaseTimeDimension.js +7 -2
  28. package/dist/src/adapter/BaseTimeDimension.js.map +1 -1
  29. package/dist/src/adapter/BigqueryQuery.d.ts +1 -8
  30. package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
  31. package/dist/src/adapter/ClickHouseQuery.d.ts +1 -7
  32. package/dist/src/adapter/ClickHouseQuery.d.ts.map +1 -1
  33. package/dist/src/adapter/CubeStoreQuery.d.ts +1 -5
  34. package/dist/src/adapter/CubeStoreQuery.d.ts.map +1 -1
  35. package/dist/src/adapter/ElasticSearchQuery.d.ts +1 -6
  36. package/dist/src/adapter/ElasticSearchQuery.d.ts.map +1 -1
  37. package/dist/src/adapter/HiveQuery.d.ts +1 -6
  38. package/dist/src/adapter/HiveQuery.d.ts.map +1 -1
  39. package/dist/src/adapter/MssqlQuery.d.ts +1 -6
  40. package/dist/src/adapter/MssqlQuery.d.ts.map +1 -1
  41. package/dist/src/adapter/MysqlQuery.d.ts +1 -6
  42. package/dist/src/adapter/MysqlQuery.d.ts.map +1 -1
  43. package/dist/src/adapter/OracleQuery.d.ts +1 -10
  44. package/dist/src/adapter/OracleQuery.d.ts.map +1 -1
  45. package/dist/src/adapter/ParamAllocator.d.ts +1 -0
  46. package/dist/src/adapter/ParamAllocator.d.ts.map +1 -1
  47. package/dist/src/adapter/ParamAllocator.js +3 -0
  48. package/dist/src/adapter/ParamAllocator.js.map +1 -1
  49. package/dist/src/adapter/PostgresQuery.d.ts.map +1 -1
  50. package/dist/src/adapter/PostgresQuery.js +2 -0
  51. package/dist/src/adapter/PostgresQuery.js.map +1 -1
  52. package/dist/src/adapter/PrestodbQuery.d.ts +1 -7
  53. package/dist/src/adapter/PrestodbQuery.d.ts.map +1 -1
  54. package/dist/src/adapter/SnowflakeQuery.d.ts.map +1 -1
  55. package/dist/src/adapter/SnowflakeQuery.js +2 -0
  56. package/dist/src/adapter/SnowflakeQuery.js.map +1 -1
  57. package/dist/src/adapter/SqliteQuery.d.ts +1 -6
  58. package/dist/src/adapter/SqliteQuery.d.ts.map +1 -1
  59. package/dist/src/compiler/ContextEvaluator.d.ts +5 -2
  60. package/dist/src/compiler/ContextEvaluator.d.ts.map +1 -1
  61. package/dist/src/compiler/ContextEvaluator.js +3 -0
  62. package/dist/src/compiler/ContextEvaluator.js.map +1 -1
  63. package/dist/src/compiler/CubeEvaluator.d.ts +90 -62
  64. package/dist/src/compiler/CubeEvaluator.d.ts.map +1 -1
  65. package/dist/src/compiler/CubeEvaluator.js +21 -37
  66. package/dist/src/compiler/CubeEvaluator.js.map +1 -1
  67. package/dist/src/compiler/CubeToMetaTransformer.d.ts +16 -9
  68. package/dist/src/compiler/CubeToMetaTransformer.d.ts.map +1 -1
  69. package/dist/src/compiler/CubeToMetaTransformer.js +7 -0
  70. package/dist/src/compiler/CubeToMetaTransformer.js.map +1 -1
  71. package/dist/src/compiler/CubeValidator.d.ts +11 -9
  72. package/dist/src/compiler/CubeValidator.d.ts.map +1 -1
  73. package/dist/src/compiler/CubeValidator.js +237 -226
  74. package/dist/src/compiler/CubeValidator.js.map +1 -1
  75. package/dist/src/compiler/JoinGraph.d.ts +7 -3
  76. package/dist/src/compiler/JoinGraph.d.ts.map +1 -1
  77. package/dist/src/compiler/JoinGraph.js +4 -0
  78. package/dist/src/compiler/JoinGraph.js.map +1 -1
  79. package/package.json +7 -7
  80. package/dist/src/compiler/ErrorHandler.d.ts +0 -2
  81. package/dist/src/compiler/ErrorHandler.d.ts.map +0 -1
  82. package/dist/src/compiler/ErrorHandler.js +0 -23
  83. package/dist/src/compiler/ErrorHandler.js.map +0 -1
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.CubeValidator = exports.functionFieldsPatterns = exports.nonStringFields = void 0;
4
- const Joi = require('joi');
5
- const cronParser = require('cron-parser');
7
+ const joi_1 = __importDefault(require("joi"));
8
+ const cron_parser_1 = __importDefault(require("cron-parser"));
6
9
  /* *****************************
7
10
  * ATTENTION:
8
11
  * In case of adding/removing/changing any Joi.func() field that needs to be transpiled,
@@ -26,99 +29,107 @@ exports.nonStringFields = new Set([
26
29
  'prefix'
27
30
  ]);
28
31
  const identifierRegex = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
29
- const identifier = Joi.string().regex(identifierRegex, 'identifier');
30
- const regexTimeInterval = Joi.string().custom((value, helper) => {
32
+ const identifier = joi_1.default.string().regex(identifierRegex, 'identifier');
33
+ function formatStatePath(state) {
34
+ if (state.path) {
35
+ // TODO: Remove cast after upgrade of Joi. It show it as string, while it's array
36
+ const path = state.path;
37
+ return path.join('.');
38
+ }
39
+ return '<unknown path>';
40
+ }
41
+ const regexTimeInterval = joi_1.default.string().custom((value, helper) => {
31
42
  if (value.match(/^(-?\d+) (minute|hour|day|week|month|quarter|year)$/)) {
32
43
  return value;
33
44
  }
34
45
  else {
35
- return helper.message({ custom: `(${helper.state.path.join('.')} = ${value}) does not match regexp: /^(-?\\d+) (minute|hour|day|week|month|quarter|year)$/` });
46
+ return helper.message({ custom: `(${formatStatePath(helper.state)} = ${value}) does not match regexp: /^(-?\\d+) (minute|hour|day|week|month|quarter|year)$/` });
36
47
  }
37
48
  });
38
- const timeInterval = Joi.alternatives([
49
+ const timeInterval = joi_1.default.alternatives([
39
50
  regexTimeInterval,
40
- Joi.any().valid('unbounded')
51
+ joi_1.default.any().valid('unbounded')
41
52
  ]);
42
- const everyInterval = Joi.string().custom((value, helper) => {
53
+ const everyInterval = joi_1.default.string().custom((value, helper) => {
43
54
  if (value.match(/^(\d+) (second|minute|hour|day|week)s?$/)) {
44
55
  return value;
45
56
  }
46
57
  else {
47
- return helper.message({ custom: `(${helper.state.path.join('.')} = ${value}) does not match regexp: /^(\\d+) (second|minute|hour|day|week)s?$/` });
58
+ return helper.message({ custom: `(${formatStatePath(helper.state)} = ${value}) does not match regexp: /^(\\d+) (second|minute|hour|day|week)s?$/` });
48
59
  }
49
60
  });
50
- const everyCronInterval = Joi.string().custom((value, helper) => {
61
+ const everyCronInterval = joi_1.default.string().custom((value, helper) => {
51
62
  try {
52
- cronParser.parseExpression(value);
63
+ cron_parser_1.default.parseExpression(value);
53
64
  return value;
54
65
  }
55
66
  catch (e) {
56
- return helper.message({ custom: `(${helper.state.path.join('.')} = ${value}) CronParser: ${e.toString()}` });
67
+ return helper.message({ custom: `(${formatStatePath(helper.state)} = ${value}) CronParser: ${e.toString()}` });
57
68
  }
58
69
  });
59
- const everyCronTimeZone = Joi.string().custom((value, helper) => {
70
+ const everyCronTimeZone = joi_1.default.string().custom((value, helper) => {
60
71
  try {
61
- cronParser.parseExpression('0 * * * *', { currentDate: '2020-01-01 00:00:01', tz: value });
72
+ cron_parser_1.default.parseExpression('0 * * * *', { currentDate: '2020-01-01 00:00:01', tz: value });
62
73
  return value;
63
74
  }
64
75
  catch (e) {
65
- return helper.message({ custom: `(${helper.state.path.join('.')} = ${value}) unknown timezone. Take a look here https://cube.dev/docs/schema/reference/cube#supported-timezones to get available time zones` });
76
+ return helper.message({ custom: `(${formatStatePath(helper.state)} = ${value}) unknown timezone. Take a look here https://cube.dev/docs/schema/reference/cube#supported-timezones to get available time zones` });
66
77
  }
67
78
  });
68
79
  const BaseDimensionWithoutSubQuery = {
69
- aliases: Joi.array().items(Joi.string()),
70
- type: Joi.any().valid('string', 'number', 'boolean', 'time', 'geo').required(),
71
- fieldType: Joi.any().valid('string'),
72
- valuesAsSegments: Joi.boolean().strict(),
73
- primaryKey: Joi.boolean().strict(),
74
- shown: Joi.boolean().strict(),
75
- public: Joi.boolean().strict(),
76
- title: Joi.string(),
77
- description: Joi.string(),
78
- suggestFilterValues: Joi.boolean().strict(),
79
- enableSuggestions: Joi.boolean().strict(),
80
- format: Joi.alternatives([
81
- Joi.string().valid('imageUrl', 'link', 'currency', 'percent', 'number', 'id'),
82
- Joi.object().keys({
83
- type: Joi.string().valid('link'),
84
- label: Joi.string().required()
80
+ aliases: joi_1.default.array().items(joi_1.default.string()),
81
+ type: joi_1.default.any().valid('string', 'number', 'boolean', 'time', 'geo').required(),
82
+ fieldType: joi_1.default.any().valid('string'),
83
+ valuesAsSegments: joi_1.default.boolean().strict(),
84
+ primaryKey: joi_1.default.boolean().strict(),
85
+ shown: joi_1.default.boolean().strict(),
86
+ public: joi_1.default.boolean().strict(),
87
+ title: joi_1.default.string(),
88
+ description: joi_1.default.string(),
89
+ suggestFilterValues: joi_1.default.boolean().strict(),
90
+ enableSuggestions: joi_1.default.boolean().strict(),
91
+ format: joi_1.default.alternatives([
92
+ joi_1.default.string().valid('imageUrl', 'link', 'currency', 'percent', 'number', 'id'),
93
+ joi_1.default.object().keys({
94
+ type: joi_1.default.string().valid('link'),
95
+ label: joi_1.default.string().required()
85
96
  })
86
97
  ]),
87
- meta: Joi.any()
98
+ meta: joi_1.default.any()
88
99
  };
89
100
  const BaseDimension = Object.assign({
90
- subQuery: Joi.boolean().strict(),
91
- propagateFiltersToSubQuery: Joi.boolean().strict()
101
+ subQuery: joi_1.default.boolean().strict(),
102
+ propagateFiltersToSubQuery: joi_1.default.boolean().strict()
92
103
  }, BaseDimensionWithoutSubQuery);
93
104
  const BaseMeasure = {
94
- aliases: Joi.array().items(Joi.string()),
95
- format: Joi.any().valid('percent', 'currency', 'number'),
96
- public: Joi.boolean().strict(),
105
+ aliases: joi_1.default.array().items(joi_1.default.string()),
106
+ format: joi_1.default.any().valid('percent', 'currency', 'number'),
107
+ public: joi_1.default.boolean().strict(),
97
108
  // TODO: Deprecate and remove, please use public
98
- visible: Joi.boolean().strict(),
109
+ visible: joi_1.default.boolean().strict(),
99
110
  // TODO: Deprecate and remove, please use public
100
- shown: Joi.boolean().strict(),
101
- cumulative: Joi.boolean().strict(),
102
- filters: Joi.array().items(Joi.object().keys({
103
- sql: Joi.func().required()
111
+ shown: joi_1.default.boolean().strict(),
112
+ cumulative: joi_1.default.boolean().strict(),
113
+ filters: joi_1.default.array().items(joi_1.default.object().keys({
114
+ sql: joi_1.default.func().required()
104
115
  })),
105
- title: Joi.string(),
106
- description: Joi.string(),
107
- rollingWindow: Joi.object().keys({
116
+ title: joi_1.default.string(),
117
+ description: joi_1.default.string(),
118
+ rollingWindow: joi_1.default.object().keys({
108
119
  trailing: timeInterval,
109
120
  leading: timeInterval,
110
- offset: Joi.any().valid('start', 'end')
121
+ offset: joi_1.default.any().valid('start', 'end')
111
122
  }),
112
- drillMemberReferences: Joi.func(),
113
- drillMembers: Joi.func(),
114
- drillFilters: Joi.array().items(Joi.object().keys({
115
- sql: Joi.func().required()
123
+ drillMemberReferences: joi_1.default.func(),
124
+ drillMembers: joi_1.default.func(),
125
+ drillFilters: joi_1.default.array().items(joi_1.default.object().keys({
126
+ sql: joi_1.default.func().required()
116
127
  })),
117
- meta: Joi.any()
128
+ meta: joi_1.default.any()
118
129
  };
119
130
  function condition(fun, then, otherwise) {
120
- return Joi.alternatives().conditional(Joi.ref('.'), {
121
- is: Joi.custom((value, helper) => (fun(value) ? value : helper.message({}))),
131
+ return joi_1.default.alternatives().conditional(joi_1.default.ref('.'), {
132
+ is: joi_1.default.custom((value, helper) => (fun(value) ? value : helper.message({}))),
122
133
  then,
123
134
  otherwise
124
135
  });
@@ -127,223 +138,223 @@ function defined(a) {
127
138
  return typeof a !== 'undefined';
128
139
  }
129
140
  function inherit(a, b) {
130
- return Joi.object().keys(Object.assign({}, a, b));
141
+ return joi_1.default.object().keys(Object.assign({}, a, b));
131
142
  }
132
143
  function requireOneOf(...keys) {
133
- return Joi.alternatives().try(...(keys.map((k) => Joi.object().keys({ [k]: Joi.exist().required() }))));
144
+ return joi_1.default.alternatives().try(...(keys.map((k) => joi_1.default.object().keys({ [k]: joi_1.default.exist().required() }))));
134
145
  }
135
- const PreAggregationRefreshKeySchema = condition((s) => defined(s.sql), Joi.object().keys({
136
- sql: Joi.func().required(),
146
+ const PreAggregationRefreshKeySchema = condition((s) => defined(s.sql), joi_1.default.object().keys({
147
+ sql: joi_1.default.func().required(),
137
148
  // We dont support timezone for this, because it's useless
138
149
  // We cannot support cron interval
139
150
  every: everyInterval,
140
- }), condition((s) => defined(s.every), Joi.object().keys({
141
- every: Joi.alternatives().try(everyInterval, everyCronInterval),
151
+ }), condition((s) => defined(s.every), joi_1.default.object().keys({
152
+ every: joi_1.default.alternatives().try(everyInterval, everyCronInterval),
142
153
  timezone: everyCronTimeZone,
143
- incremental: Joi.boolean().strict(),
154
+ incremental: joi_1.default.boolean().strict(),
144
155
  updateWindow: everyInterval
145
156
  }), requireOneOf('sql', 'every')));
146
157
  const BasePreAggregationWithoutPartitionGranularity = {
147
158
  refreshKey: PreAggregationRefreshKeySchema,
148
- sqlAlias: Joi.string().optional(),
149
- useOriginalSqlPreAggregations: Joi.boolean().strict(),
150
- external: Joi.boolean().strict(),
151
- scheduledRefresh: Joi.boolean().strict(),
152
- indexes: Joi.object().pattern(identifierRegex, Joi.alternatives().try(Joi.object().keys({
153
- sql: Joi.func().required()
154
- }), Joi.object().keys({
155
- columns: Joi.func().required(),
156
- type: Joi.any().valid('regular', 'aggregate'),
159
+ sqlAlias: joi_1.default.string().optional(),
160
+ useOriginalSqlPreAggregations: joi_1.default.boolean().strict(),
161
+ external: joi_1.default.boolean().strict(),
162
+ scheduledRefresh: joi_1.default.boolean().strict(),
163
+ indexes: joi_1.default.object().pattern(identifierRegex, joi_1.default.alternatives().try(joi_1.default.object().keys({
164
+ sql: joi_1.default.func().required()
165
+ }), joi_1.default.object().keys({
166
+ columns: joi_1.default.func().required(),
167
+ type: joi_1.default.any().valid('regular', 'aggregate'),
157
168
  }))),
158
169
  // refreshRange was deprecated
159
170
  refreshRangeStart: {
160
- sql: Joi.func().required()
171
+ sql: joi_1.default.func().required()
161
172
  },
162
173
  refreshRangeEnd: {
163
- sql: Joi.func().required()
174
+ sql: joi_1.default.func().required()
164
175
  },
165
176
  // new api
166
177
  buildRangeStart: {
167
- sql: Joi.func().required()
178
+ sql: joi_1.default.func().required()
168
179
  },
169
180
  buildRangeEnd: {
170
- sql: Joi.func().required()
181
+ sql: joi_1.default.func().required()
171
182
  },
172
- readOnly: Joi.boolean().strict(),
173
- streamOffset: Joi.any().valid('earliest', 'latest'),
183
+ readOnly: joi_1.default.boolean().strict(),
184
+ streamOffset: joi_1.default.any().valid('earliest', 'latest'),
174
185
  };
175
186
  const BasePreAggregation = {
176
187
  ...BasePreAggregationWithoutPartitionGranularity,
177
- partitionGranularity: Joi.any().valid('hour', 'day', 'week', 'month', 'quarter', 'year'),
188
+ partitionGranularity: joi_1.default.any().valid('hour', 'day', 'week', 'month', 'quarter', 'year'),
178
189
  };
179
190
  const AutoRollupSchema = inherit(BasePreAggregation, {
180
- type: Joi.any().valid('autoRollup').required(),
181
- maxPreAggregations: Joi.number(),
191
+ type: joi_1.default.any().valid('autoRollup').required(),
192
+ maxPreAggregations: joi_1.default.number(),
182
193
  });
183
194
  const OriginalSqlSchema = condition((s) => defined(s.partitionGranularity) || defined(s.timeDimension) || defined(s.timeDimensionReference), condition((s) => defined(s.timeDimensionReference), inherit(BasePreAggregation, {
184
- type: Joi.any().valid('originalSql').required(),
185
- uniqueKeyColumns: Joi.array().items(Joi.string()),
195
+ type: joi_1.default.any().valid('originalSql').required(),
196
+ uniqueKeyColumns: joi_1.default.array().items(joi_1.default.string()),
186
197
  partitionGranularity: BasePreAggregation.partitionGranularity.required(),
187
- timeDimensionReference: Joi.func().required(),
188
- allowNonStrictDateRangeMatch: Joi.bool(),
198
+ timeDimensionReference: joi_1.default.func().required(),
199
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
189
200
  }), inherit(BasePreAggregation, {
190
- type: Joi.any().valid('originalSql').required(),
191
- uniqueKeyColumns: Joi.array().items(Joi.string()),
201
+ type: joi_1.default.any().valid('originalSql').required(),
202
+ uniqueKeyColumns: joi_1.default.array().items(joi_1.default.string()),
192
203
  partitionGranularity: BasePreAggregation.partitionGranularity.required(),
193
- timeDimension: Joi.func().required(),
194
- allowNonStrictDateRangeMatch: Joi.bool(),
204
+ timeDimension: joi_1.default.func().required(),
205
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
195
206
  })), inherit(BasePreAggregationWithoutPartitionGranularity, {
196
- type: Joi.any().valid('originalSql').required(),
197
- uniqueKeyColumns: Joi.array().items(Joi.string())
207
+ type: joi_1.default.any().valid('originalSql').required(),
208
+ uniqueKeyColumns: joi_1.default.array().items(joi_1.default.string())
198
209
  }));
199
- const GranularitySchema = Joi.string().valid('second', 'minute', 'hour', 'day', 'week', 'month', 'quarter', 'year').required();
210
+ const GranularitySchema = joi_1.default.string().valid('second', 'minute', 'hour', 'day', 'week', 'month', 'quarter', 'year').required();
200
211
  const ReferencesFields = ['timeDimensionReference', 'rollupReferences', 'measureReferences', 'dimensionReferences', 'segmentReferences'];
201
212
  const NonReferencesFields = ['timeDimension', 'rollups', 'measures', 'dimensions', 'segments'];
202
213
  function hasAnyField(fields, s) {
203
214
  return !fields.every((f) => !defined(s[f]));
204
215
  }
205
216
  function errorOnMixing(schema) {
206
- return condition((s) => hasAnyField(ReferencesFields, s) && hasAnyField(NonReferencesFields, s), Joi.any().forbidden().error(new Error(`[${ReferencesFields.join(', ')}] are deprecated, please, use [${NonReferencesFields.join(', ')}] instead`)), schema);
217
+ return condition((s) => hasAnyField(ReferencesFields, s) && hasAnyField(NonReferencesFields, s), joi_1.default.any().forbidden().error(new Error(`[${ReferencesFields.join(', ')}] are deprecated, please, use [${NonReferencesFields.join(', ')}] instead`)), schema);
207
218
  }
208
219
  const RollUpJoinSchema = condition((s) => defined(s.granularity) || defined(s.timeDimension) || defined(s.timeDimensionReference), condition((s) => defined(s.rollupReferences) || defined(s.timeDimensionReference), inherit(BasePreAggregation, {
209
- type: Joi.any().valid('rollupJoin').required(),
210
- scheduledRefresh: Joi.boolean().valid(false),
220
+ type: joi_1.default.any().valid('rollupJoin').required(),
221
+ scheduledRefresh: joi_1.default.boolean().valid(false),
211
222
  granularity: GranularitySchema,
212
- allowNonStrictDateRangeMatch: Joi.bool(),
213
- timeDimensionReference: Joi.func().required(),
214
- rollupReferences: Joi.func().required(),
215
- measureReferences: Joi.func(),
216
- dimensionReferences: Joi.func(),
217
- segmentReferences: Joi.func(),
223
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
224
+ timeDimensionReference: joi_1.default.func().required(),
225
+ rollupReferences: joi_1.default.func().required(),
226
+ measureReferences: joi_1.default.func(),
227
+ dimensionReferences: joi_1.default.func(),
228
+ segmentReferences: joi_1.default.func(),
218
229
  }),
219
230
  // RollupJoin without references
220
231
  inherit(BasePreAggregation, {
221
- type: Joi.any().valid('rollupJoin').required(),
222
- scheduledRefresh: Joi.boolean().valid(false),
232
+ type: joi_1.default.any().valid('rollupJoin').required(),
233
+ scheduledRefresh: joi_1.default.boolean().valid(false),
223
234
  granularity: GranularitySchema,
224
- timeDimension: Joi.func().required(),
225
- allowNonStrictDateRangeMatch: Joi.bool(),
226
- rollups: Joi.func().required(),
227
- measures: Joi.func(),
228
- dimensions: Joi.func(),
229
- segments: Joi.func(),
235
+ timeDimension: joi_1.default.func().required(),
236
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
237
+ rollups: joi_1.default.func().required(),
238
+ measures: joi_1.default.func(),
239
+ dimensions: joi_1.default.func(),
240
+ segments: joi_1.default.func(),
230
241
  })), condition((s) => defined(s.rollupReferences), inherit(BasePreAggregation, {
231
- type: Joi.any().valid('rollupJoin').required(),
232
- scheduledRefresh: Joi.boolean().valid(false),
233
- rollupReferences: Joi.func().required(),
234
- measureReferences: Joi.func(),
235
- dimensionReferences: Joi.func(),
236
- segmentReferences: Joi.func(),
242
+ type: joi_1.default.any().valid('rollupJoin').required(),
243
+ scheduledRefresh: joi_1.default.boolean().valid(false),
244
+ rollupReferences: joi_1.default.func().required(),
245
+ measureReferences: joi_1.default.func(),
246
+ dimensionReferences: joi_1.default.func(),
247
+ segmentReferences: joi_1.default.func(),
237
248
  }),
238
249
  // RollupJoin without references
239
250
  condition((s) => defined(s.rollups), inherit(BasePreAggregation, {
240
- type: Joi.any().valid('rollupJoin').required(),
241
- scheduledRefresh: Joi.boolean().valid(false),
242
- rollups: Joi.func().required(),
243
- measures: Joi.func(),
244
- dimensions: Joi.func(),
245
- segments: Joi.func(),
251
+ type: joi_1.default.any().valid('rollupJoin').required(),
252
+ scheduledRefresh: joi_1.default.boolean().valid(false),
253
+ rollups: joi_1.default.func().required(),
254
+ measures: joi_1.default.func(),
255
+ dimensions: joi_1.default.func(),
256
+ segments: joi_1.default.func(),
246
257
  }), requireOneOf('granularity', 'rollups', 'timeDimension'))));
247
258
  const RollupLambdaSchema = condition((s) => defined(s.granularity) || defined(s.timeDimension), {
248
- type: Joi.any().valid('rollupLambda').required(),
259
+ type: joi_1.default.any().valid('rollupLambda').required(),
249
260
  granularity: GranularitySchema,
250
- timeDimension: Joi.func().required(),
251
- rollups: Joi.func().required(),
252
- measures: Joi.func(),
253
- dimensions: Joi.func(),
254
- segments: Joi.func(),
255
- unionWithSourceData: Joi.boolean().strict(),
261
+ timeDimension: joi_1.default.func().required(),
262
+ rollups: joi_1.default.func().required(),
263
+ measures: joi_1.default.func(),
264
+ dimensions: joi_1.default.func(),
265
+ segments: joi_1.default.func(),
266
+ unionWithSourceData: joi_1.default.boolean().strict(),
256
267
  }, {
257
- type: Joi.any().valid('rollupLambda').required(),
258
- rollups: Joi.func().required(),
259
- measures: Joi.func(),
260
- dimensions: Joi.func(),
261
- segments: Joi.func(),
262
- unionWithSourceData: Joi.boolean().strict(),
268
+ type: joi_1.default.any().valid('rollupLambda').required(),
269
+ rollups: joi_1.default.func().required(),
270
+ measures: joi_1.default.func(),
271
+ dimensions: joi_1.default.func(),
272
+ segments: joi_1.default.func(),
273
+ unionWithSourceData: joi_1.default.boolean().strict(),
263
274
  });
264
275
  const RollUpSchema = condition((s) => defined(s.granularity) || defined(s.timeDimension) || defined(s.timeDimensionReference), condition((s) => defined(s.timeDimensionReference), inherit(BasePreAggregation, {
265
- type: Joi.any().valid('rollup').required(),
266
- timeDimensionReference: Joi.func().required(),
276
+ type: joi_1.default.any().valid('rollup').required(),
277
+ timeDimensionReference: joi_1.default.func().required(),
267
278
  granularity: GranularitySchema,
268
- allowNonStrictDateRangeMatch: Joi.bool(),
269
- measureReferences: Joi.func(),
270
- dimensionReferences: Joi.func(),
271
- segmentReferences: Joi.func(),
279
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
280
+ measureReferences: joi_1.default.func(),
281
+ dimensionReferences: joi_1.default.func(),
282
+ segmentReferences: joi_1.default.func(),
272
283
  }),
273
284
  // Rollup without References postfix
274
285
  inherit(BasePreAggregation, {
275
- type: Joi.any().valid('rollup').required(),
276
- timeDimension: Joi.func().required(),
277
- allowNonStrictDateRangeMatch: Joi.bool(),
286
+ type: joi_1.default.any().valid('rollup').required(),
287
+ timeDimension: joi_1.default.func().required(),
288
+ allowNonStrictDateRangeMatch: joi_1.default.bool(),
278
289
  granularity: GranularitySchema,
279
- measures: Joi.func(),
280
- dimensions: Joi.func(),
281
- segments: Joi.func(),
282
- })), Joi.alternatives().try(inherit(BasePreAggregation, {
283
- type: Joi.any().valid('rollup').required(),
284
- measureReferences: Joi.func(),
285
- dimensionReferences: Joi.func(),
286
- segmentReferences: Joi.func()
290
+ measures: joi_1.default.func(),
291
+ dimensions: joi_1.default.func(),
292
+ segments: joi_1.default.func(),
293
+ })), joi_1.default.alternatives().try(inherit(BasePreAggregation, {
294
+ type: joi_1.default.any().valid('rollup').required(),
295
+ measureReferences: joi_1.default.func(),
296
+ dimensionReferences: joi_1.default.func(),
297
+ segmentReferences: joi_1.default.func()
287
298
  }),
288
299
  // Rollup without References postfix
289
300
  inherit(BasePreAggregation, {
290
- type: Joi.any().valid('rollup').required(),
291
- measures: Joi.func(),
292
- dimensions: Joi.func(),
293
- segments: Joi.func()
301
+ type: joi_1.default.any().valid('rollup').required(),
302
+ measures: joi_1.default.func(),
303
+ dimensions: joi_1.default.func(),
304
+ segments: joi_1.default.func()
294
305
  })));
295
- const PreAggregationsAlternatives = Joi.object().pattern(identifierRegex, errorOnMixing(Joi.alternatives().conditional(Joi.ref('.type'), [
306
+ const PreAggregationsAlternatives = joi_1.default.object().pattern(identifierRegex, errorOnMixing(joi_1.default.alternatives().conditional(joi_1.default.ref('.type'), [
296
307
  { is: 'autoRollup', then: AutoRollupSchema },
297
308
  { is: 'originalSql', then: OriginalSqlSchema },
298
309
  { is: 'rollupJoin', then: RollUpJoinSchema },
299
310
  { is: 'rollupLambda', then: RollupLambdaSchema },
300
311
  { is: 'rollup',
301
312
  then: RollUpSchema,
302
- otherwise: Joi.object().keys({
303
- type: Joi.string().valid('autoRollup', 'originalSql', 'rollupJoin', 'rollup').required()
313
+ otherwise: joi_1.default.object().keys({
314
+ type: joi_1.default.string().valid('autoRollup', 'originalSql', 'rollupJoin', 'rollup').required()
304
315
  })
305
316
  }
306
317
  ])));
307
- const CubeRefreshKeySchema = condition((s) => defined(s.every), condition((s) => defined(s.sql), Joi.object().keys({
308
- sql: Joi.func().required(),
318
+ const CubeRefreshKeySchema = condition((s) => defined(s.every), condition((s) => defined(s.sql), joi_1.default.object().keys({
319
+ sql: joi_1.default.func().required(),
309
320
  // We dont support timezone for this, because it's useless
310
321
  // We cannot support cron interval
311
322
  every: everyInterval,
312
- }), Joi.object().keys({
313
- every: Joi.alternatives().try(everyInterval, everyCronInterval).required(),
323
+ }), joi_1.default.object().keys({
324
+ every: joi_1.default.alternatives().try(everyInterval, everyCronInterval).required(),
314
325
  timezone: everyCronTimeZone,
315
- })), condition((s) => defined(s.immutable), Joi.object().keys({
316
- immutable: Joi.boolean().strict().required()
326
+ })), condition((s) => defined(s.immutable), joi_1.default.object().keys({
327
+ immutable: joi_1.default.boolean().strict().required()
317
328
  }), requireOneOf('every', 'sql', 'immutable')));
318
- const measureType = Joi.string().valid('number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox');
319
- const measureTypeWithCount = Joi.string().valid('count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox');
320
- const MeasuresSchema = Joi.object().pattern(identifierRegex, Joi.alternatives().conditional(Joi.ref('.type'), [
329
+ const measureType = joi_1.default.string().valid('number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox');
330
+ const measureTypeWithCount = joi_1.default.string().valid('count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox');
331
+ const MeasuresSchema = joi_1.default.object().pattern(identifierRegex, joi_1.default.alternatives().conditional(joi_1.default.ref('.type'), [
321
332
  {
322
333
  is: 'count',
323
334
  then: inherit(BaseMeasure, {
324
- type: Joi.any().valid('count').required(),
325
- sql: Joi.func(),
335
+ type: joi_1.default.any().valid('count').required(),
336
+ sql: joi_1.default.func(),
326
337
  })
327
338
  },
328
339
  {
329
340
  is: measureType,
330
341
  then: inherit(BaseMeasure, {
331
- sql: Joi.func().required(),
342
+ sql: joi_1.default.func().required(),
332
343
  type: measureType.required()
333
344
  }),
334
- otherwise: Joi.object().keys({
345
+ otherwise: joi_1.default.object().keys({
335
346
  type: measureTypeWithCount.required()
336
347
  })
337
348
  }
338
349
  ]));
339
- const SegmentsSchema = Joi.object().pattern(identifierRegex, Joi.object().keys({
340
- aliases: Joi.array().items(Joi.string()),
341
- sql: Joi.func().required(),
342
- title: Joi.string(),
343
- description: Joi.string(),
344
- meta: Joi.any(),
345
- shown: Joi.boolean().strict(),
346
- public: Joi.boolean().strict(),
350
+ const SegmentsSchema = joi_1.default.object().pattern(identifierRegex, joi_1.default.object().keys({
351
+ aliases: joi_1.default.array().items(joi_1.default.string()),
352
+ sql: joi_1.default.func().required(),
353
+ title: joi_1.default.string(),
354
+ description: joi_1.default.string(),
355
+ meta: joi_1.default.any(),
356
+ shown: joi_1.default.boolean().strict(),
357
+ public: joi_1.default.boolean().strict(),
347
358
  }));
348
359
  /* *****************************
349
360
  * ATTENTION:
@@ -354,80 +365,80 @@ const SegmentsSchema = Joi.object().pattern(identifierRegex, Joi.object().keys({
354
365
  const baseSchema = {
355
366
  name: identifier,
356
367
  refreshKey: CubeRefreshKeySchema,
357
- fileName: Joi.string().required(),
358
- extends: Joi.func(),
359
- allDefinitions: Joi.func(),
360
- title: Joi.string(),
361
- sqlAlias: Joi.string(),
362
- dataSource: Joi.string(),
363
- description: Joi.string(),
364
- rewriteQueries: Joi.boolean().strict(),
365
- shown: Joi.boolean().strict(),
366
- public: Joi.boolean().strict(),
367
- joins: Joi.object().pattern(identifierRegex, Joi.object().keys({
368
- sql: Joi.func().required(),
369
- relationship: Joi.any().valid('belongsTo', 'belongs_to', 'many_to_one', 'manyToOne', 'hasMany', 'has_many', 'one_to_many', 'oneToMany', 'hasOne', 'has_one', 'one_to_one', 'oneToOne').required()
368
+ fileName: joi_1.default.string().required(),
369
+ extends: joi_1.default.func(),
370
+ allDefinitions: joi_1.default.func(),
371
+ title: joi_1.default.string(),
372
+ sqlAlias: joi_1.default.string(),
373
+ dataSource: joi_1.default.string(),
374
+ description: joi_1.default.string(),
375
+ rewriteQueries: joi_1.default.boolean().strict(),
376
+ shown: joi_1.default.boolean().strict(),
377
+ public: joi_1.default.boolean().strict(),
378
+ joins: joi_1.default.object().pattern(identifierRegex, joi_1.default.object().keys({
379
+ sql: joi_1.default.func().required(),
380
+ relationship: joi_1.default.any().valid('belongsTo', 'belongs_to', 'many_to_one', 'manyToOne', 'hasMany', 'has_many', 'one_to_many', 'oneToMany', 'hasOne', 'has_one', 'one_to_one', 'oneToOne').required()
370
381
  })),
371
382
  measures: MeasuresSchema,
372
- dimensions: Joi.object().pattern(identifierRegex, Joi.alternatives().try(inherit(BaseDimensionWithoutSubQuery, {
373
- case: Joi.object().keys({
374
- when: Joi.array().items(Joi.object().keys({
375
- sql: Joi.func().required(),
376
- label: Joi.alternatives([
377
- Joi.string(),
378
- Joi.object().keys({
379
- sql: Joi.func().required()
383
+ dimensions: joi_1.default.object().pattern(identifierRegex, joi_1.default.alternatives().try(inherit(BaseDimensionWithoutSubQuery, {
384
+ case: joi_1.default.object().keys({
385
+ when: joi_1.default.array().items(joi_1.default.object().keys({
386
+ sql: joi_1.default.func().required(),
387
+ label: joi_1.default.alternatives([
388
+ joi_1.default.string(),
389
+ joi_1.default.object().keys({
390
+ sql: joi_1.default.func().required()
380
391
  })
381
392
  ])
382
393
  })),
383
- else: Joi.object().keys({
384
- label: Joi.alternatives([
385
- Joi.string(),
386
- Joi.object().keys({
387
- sql: Joi.func().required()
394
+ else: joi_1.default.object().keys({
395
+ label: joi_1.default.alternatives([
396
+ joi_1.default.string(),
397
+ joi_1.default.object().keys({
398
+ sql: joi_1.default.func().required()
388
399
  })
389
400
  ])
390
401
  })
391
402
  }).required()
392
403
  }), inherit(BaseDimensionWithoutSubQuery, {
393
- latitude: Joi.object().keys({
394
- sql: Joi.func().required()
404
+ latitude: joi_1.default.object().keys({
405
+ sql: joi_1.default.func().required()
395
406
  }).required(),
396
- longitude: Joi.object().keys({
397
- sql: Joi.func().required()
407
+ longitude: joi_1.default.object().keys({
408
+ sql: joi_1.default.func().required()
398
409
  }).required()
399
410
  }), inherit(BaseDimension, {
400
- sql: Joi.func().required()
411
+ sql: joi_1.default.func().required()
401
412
  }))),
402
413
  segments: SegmentsSchema,
403
414
  preAggregations: PreAggregationsAlternatives,
404
415
  };
405
416
  const cubeSchema = inherit(baseSchema, {
406
- sql: Joi.func(),
407
- sqlTable: Joi.func(),
417
+ sql: joi_1.default.func(),
418
+ sqlTable: joi_1.default.func(),
408
419
  }).xor('sql', 'sqlTable').messages({
409
420
  'object.xor': 'You must use either sql or sqlTable within a model, but not both'
410
421
  });
411
422
  const viewSchema = inherit(baseSchema, {
412
- isView: Joi.boolean().strict(),
413
- includes: Joi.func(),
414
- excludes: Joi.func(),
415
- cubes: Joi.array().items(Joi.object().keys({
416
- joinPath: Joi.func().required(),
417
- prefix: Joi.boolean(),
418
- split: Joi.boolean(),
419
- alias: Joi.string(),
420
- includes: Joi.alternatives([
421
- Joi.string().valid('*'),
422
- Joi.array().items(Joi.alternatives([
423
- Joi.string().required(),
424
- Joi.object().keys({
425
- name: Joi.string().required(),
426
- alias: Joi.string()
423
+ isView: joi_1.default.boolean().strict(),
424
+ includes: joi_1.default.func(),
425
+ excludes: joi_1.default.func(),
426
+ cubes: joi_1.default.array().items(joi_1.default.object().keys({
427
+ joinPath: joi_1.default.func().required(),
428
+ prefix: joi_1.default.boolean(),
429
+ split: joi_1.default.boolean(),
430
+ alias: joi_1.default.string(),
431
+ includes: joi_1.default.alternatives([
432
+ joi_1.default.string().valid('*'),
433
+ joi_1.default.array().items(joi_1.default.alternatives([
434
+ joi_1.default.string().required(),
435
+ joi_1.default.object().keys({
436
+ name: joi_1.default.string().required(),
437
+ alias: joi_1.default.string()
427
438
  })
428
439
  ]))
429
440
  ]).required(),
430
- excludes: Joi.array().items(Joi.string().required()),
441
+ excludes: joi_1.default.array().items(joi_1.default.string().required()),
431
442
  }).oxor('split', 'prefix').messages({
432
443
  'object.oxor': 'Using split together with prefix is not supported'
433
444
  })),
@@ -487,7 +498,7 @@ exports.functionFieldsPatterns = functionFieldsPatterns;
487
498
  class CubeValidator {
488
499
  constructor(cubeSymbols) {
489
500
  this.cubeSymbols = cubeSymbols;
490
- this.validCubes = {};
501
+ this.validCubes = new Map();
491
502
  }
492
503
  compile(cubes, errorReporter) {
493
504
  return this.cubeSymbols.cubeList.map((v) => this.validate(this.cubeSymbols.getCubeDefinition(v.name), errorReporter.inContext(`${v.name} cube`)));