@lightdash/common 0.1382.0 → 0.1383.0

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ import { type ValidationResponse } from './types/validation';
39
39
  import { type ApiCatalogAnalyticsResults, type ApiCatalogMetadataResults, type ApiMetricsCatalog } from './types/catalog';
40
40
  import { type ApiChartContentResponse, type ApiContentResponse } from './types/content';
41
41
  import type { ApiGroupListResponse } from './types/groups';
42
+ import type { ApiMetricsExplorerQueryResults } from './types/metricsExplorer';
42
43
  import { type ApiPromotionChangesResponse } from './types/promotion';
43
44
  import { type ApiSemanticLayerClientInfo, type ApiSemanticViewerChartCreate, type ApiSemanticViewerChartGet, type ApiSemanticViewerChartUpdate } from './types/semanticLayer';
44
45
  import { type ApiCreateSqlChart, type ApiCreateVirtualView, type ApiGithubDbtWritePreview, type ApiSqlChart, type ApiSqlRunnerJobStatusResponse, type ApiUpdateSqlChart } from './types/sqlRunner';
@@ -84,6 +85,7 @@ export * from './types/groups';
84
85
  export * from './types/job';
85
86
  export * from './types/knex-paginate';
86
87
  export * from './types/metricQuery';
88
+ export * from './types/metricsExplorer';
87
89
  export * from './types/notifications';
88
90
  export * from './types/openIdIdentity';
89
91
  export * from './types/organization';
@@ -129,6 +131,7 @@ export * from './utils/filters';
129
131
  export * from './utils/formatting';
130
132
  export * from './utils/github';
131
133
  export * from './utils/item';
134
+ export * from './utils/metricsExplorer';
132
135
  export * from './utils/projectMemberRole';
133
136
  export * from './utils/sanitizeHtml';
134
137
  export * from './utils/scheduler';
@@ -376,7 +379,7 @@ export type ApiAiGetDashboardSummaryResponse = {
376
379
  status: 'ok';
377
380
  results: DashboardSummary;
378
381
  };
379
- type ApiResults = ApiQueryResults | ApiSqlQueryResults | ApiCompiledQueryResults | ApiExploresResults | ApiExploreResults | ApiStatusResults | ApiRefreshResults | ApiHealthResults | Organization | LightdashUser | LoginOptions | SavedChart | SavedChart[] | Space[] | InviteLink | OrganizationProject[] | Project | WarehouseCredentials | OrganizationMemberProfile[] | ProjectCatalog | TablesConfiguration | Dashboard | DashboardBasicDetails[] | OnboardingStatus | Dashboard[] | DeleteOpenIdentity | ApiFlashResults | Record<OpenIdIdentitySummary['issuerType'], OpenIdIdentitySummary[]> | FilterableField[] | DashboardAvailableFilters | ProjectSavedChartStatus | null | Array<unknown> | ApiJobStartedResults | ApiCreateUserTokenResults | CreatePersonalAccessToken | PersonalAccessToken | ProjectMemberProfile[] | ProjectGroupAccess | SearchResults | Space | ShareUrl | SlackSettings | ApiSlackChannelsResponse['results'] | UserActivity | SchedulerAndTargets | SchedulerAndTargets[] | FieldValueSearchResult | ApiDownloadCsv | AllowedEmailDomains | UpdateAllowedEmailDomains | UserAllowedOrganization[] | EmailStatusExpiring | ApiScheduledDownloadCsv | PinnedItems | ViewStatistics | SchedulerWithLogs | ValidationResponse[] | ChartHistory | ChartVersion | Array<GitRepo> | PullRequestCreated | GitIntegrationConfiguration | UserWarehouseCredentials | ApiJobStatusResponse['results'] | ApiJobScheduledResponse['results'] | ApiSshKeyPairResponse['results'] | MostPopularAndRecentlyUpdated | ApiCalculateTotalResponse['results'] | Record<string, DbtExposure> | ApiCreateComment['results'] | ApiGetComments['results'] | ApiDeleteComment | ApiSuccessEmpty | ApiCreateProjectResults | ApiAiDashboardSummaryResponse['results'] | ApiAiGetDashboardSummaryResponse['results'] | ApiCatalogMetadataResults | ApiCatalogAnalyticsResults | ApiPromotionChangesResponse['results'] | ApiWarehouseTableFields['results'] | ApiTogglePinnedItem['results'] | ApiOrganizationMemberProfiles['results'] | ApiSqlChart['results'] | ApiCreateSqlChart['results'] | ApiUpdateSqlChart['results'] | ApiContentResponse['results'] | ApiChartContentResponse['results'] | ApiSqlRunnerJobStatusResponse['results'] | ApiSemanticLayerClientInfo['results'] | ApiSemanticViewerChartCreate['results'] | ApiSemanticViewerChartGet['results'] | ApiSemanticViewerChartUpdate['results'] | ApiCreateVirtualView['results'] | ApiGithubDbtWritePreview['results'] | ApiMetricsCatalog['results'] | ApiGroupListResponse['results'] | ApiCreateTagResponse['results'];
382
+ type ApiResults = ApiQueryResults | ApiSqlQueryResults | ApiCompiledQueryResults | ApiExploresResults | ApiExploreResults | ApiStatusResults | ApiRefreshResults | ApiHealthResults | Organization | LightdashUser | LoginOptions | SavedChart | SavedChart[] | Space[] | InviteLink | OrganizationProject[] | Project | WarehouseCredentials | OrganizationMemberProfile[] | ProjectCatalog | TablesConfiguration | Dashboard | DashboardBasicDetails[] | OnboardingStatus | Dashboard[] | DeleteOpenIdentity | ApiFlashResults | Record<OpenIdIdentitySummary['issuerType'], OpenIdIdentitySummary[]> | FilterableField[] | DashboardAvailableFilters | ProjectSavedChartStatus | null | Array<unknown> | ApiJobStartedResults | ApiCreateUserTokenResults | CreatePersonalAccessToken | PersonalAccessToken | ProjectMemberProfile[] | ProjectGroupAccess | SearchResults | Space | ShareUrl | SlackSettings | ApiSlackChannelsResponse['results'] | UserActivity | SchedulerAndTargets | SchedulerAndTargets[] | FieldValueSearchResult | ApiDownloadCsv | AllowedEmailDomains | UpdateAllowedEmailDomains | UserAllowedOrganization[] | EmailStatusExpiring | ApiScheduledDownloadCsv | PinnedItems | ViewStatistics | SchedulerWithLogs | ValidationResponse[] | ChartHistory | ChartVersion | Array<GitRepo> | PullRequestCreated | GitIntegrationConfiguration | UserWarehouseCredentials | ApiJobStatusResponse['results'] | ApiJobScheduledResponse['results'] | ApiSshKeyPairResponse['results'] | MostPopularAndRecentlyUpdated | ApiCalculateTotalResponse['results'] | Record<string, DbtExposure> | ApiCreateComment['results'] | ApiGetComments['results'] | ApiDeleteComment | ApiSuccessEmpty | ApiCreateProjectResults | ApiAiDashboardSummaryResponse['results'] | ApiAiGetDashboardSummaryResponse['results'] | ApiCatalogMetadataResults | ApiCatalogAnalyticsResults | ApiPromotionChangesResponse['results'] | ApiWarehouseTableFields['results'] | ApiTogglePinnedItem['results'] | ApiOrganizationMemberProfiles['results'] | ApiSqlChart['results'] | ApiCreateSqlChart['results'] | ApiUpdateSqlChart['results'] | ApiContentResponse['results'] | ApiChartContentResponse['results'] | ApiSqlRunnerJobStatusResponse['results'] | ApiSemanticLayerClientInfo['results'] | ApiSemanticViewerChartCreate['results'] | ApiSemanticViewerChartGet['results'] | ApiSemanticViewerChartUpdate['results'] | ApiCreateVirtualView['results'] | ApiGithubDbtWritePreview['results'] | ApiMetricsCatalog['results'] | ApiMetricsExplorerQueryResults['results'] | ApiGroupListResponse['results'] | ApiCreateTagResponse['results'];
380
383
  export type ApiResponse<T extends ApiResults = ApiResults> = {
381
384
  status: 'ok';
382
385
  results: T;
package/dist/index.js CHANGED
@@ -55,6 +55,7 @@ tslib_1.__exportStar(require("./types/groups"), exports);
55
55
  tslib_1.__exportStar(require("./types/job"), exports);
56
56
  tslib_1.__exportStar(require("./types/knex-paginate"), exports);
57
57
  tslib_1.__exportStar(require("./types/metricQuery"), exports);
58
+ tslib_1.__exportStar(require("./types/metricsExplorer"), exports);
58
59
  tslib_1.__exportStar(require("./types/notifications"), exports);
59
60
  tslib_1.__exportStar(require("./types/openIdIdentity"), exports);
60
61
  tslib_1.__exportStar(require("./types/organization"), exports);
@@ -101,6 +102,7 @@ tslib_1.__exportStar(require("./utils/filters"), exports);
101
102
  tslib_1.__exportStar(require("./utils/formatting"), exports);
102
103
  tslib_1.__exportStar(require("./utils/github"), exports);
103
104
  tslib_1.__exportStar(require("./utils/item"), exports);
105
+ tslib_1.__exportStar(require("./utils/metricsExplorer"), exports);
104
106
  tslib_1.__exportStar(require("./utils/projectMemberRole"), exports);
105
107
  tslib_1.__exportStar(require("./utils/sanitizeHtml"), exports);
106
108
  tslib_1.__exportStar(require("./utils/scheduler"), exports);
@@ -0,0 +1,19 @@
1
+ import type { ResultRow } from './results';
2
+ export declare enum MetricExplorerComparison {
3
+ PREVIOUS_PERIOD = "previous_period",
4
+ DIFFERENT_METRIC = "different_metric"
5
+ }
6
+ export type MetricExplorerComparisonType = {
7
+ type: MetricExplorerComparison.PREVIOUS_PERIOD;
8
+ } | {
9
+ type: MetricExplorerComparison.DIFFERENT_METRIC;
10
+ metricName: string;
11
+ };
12
+ export type MetricsExplorerQueryResults = {
13
+ rows: ResultRow[];
14
+ comparisonRows: ResultRow[] | undefined;
15
+ };
16
+ export type ApiMetricsExplorerQueryResults = {
17
+ status: 'ok';
18
+ results: MetricsExplorerQueryResults;
19
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetricExplorerComparison = void 0;
4
+ var MetricExplorerComparison;
5
+ (function (MetricExplorerComparison) {
6
+ MetricExplorerComparison["PREVIOUS_PERIOD"] = "previous_period";
7
+ MetricExplorerComparison["DIFFERENT_METRIC"] = "different_metric";
8
+ })(MetricExplorerComparison = exports.MetricExplorerComparison || (exports.MetricExplorerComparison = {}));
@@ -0,0 +1,8 @@
1
+ import { ConditionalOperator } from '../types/conditionalRule';
2
+ import { type DateFilterSettings, type FieldTarget, type FilterRule } from '../types/filter';
3
+ import { TimeFrames } from '../types/timeFrames';
4
+ type DateFilter = FilterRule<ConditionalOperator, FieldTarget, unknown, DateFilterSettings>;
5
+ export declare const getMetricExplorerDimensionCurrentFilters: (exploreName: string, dimensionName: string, timeInterval: TimeFrames | undefined) => DateFilter[];
6
+ export declare const getMetricExplorerDimensionPreviousFilters: (exploreName: string, dimensionName: string, timeInterval: TimeFrames | undefined) => DateFilter[];
7
+ export declare const getFieldIdForDateDimension: (fieldId: string, timeframe: TimeFrames) => string;
8
+ export {};
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFieldIdForDateDimension = exports.getMetricExplorerDimensionPreviousFilters = exports.getMetricExplorerDimensionCurrentFilters = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const uuid_1 = require("uuid");
6
+ const conditionalRule_1 = require("../types/conditionalRule");
7
+ const filter_1 = require("../types/filter");
8
+ const timeFrames_1 = require("../types/timeFrames");
9
+ const assertUnreachable_1 = tslib_1.__importDefault(require("./assertUnreachable"));
10
+ const item_1 = require("./item");
11
+ const assertUnimplementedTimeframe = (timeframe) => {
12
+ switch (timeframe) {
13
+ case timeFrames_1.TimeFrames.RAW:
14
+ case timeFrames_1.TimeFrames.QUARTER:
15
+ case timeFrames_1.TimeFrames.HOUR:
16
+ case timeFrames_1.TimeFrames.MINUTE:
17
+ case timeFrames_1.TimeFrames.SECOND:
18
+ case timeFrames_1.TimeFrames.MILLISECOND:
19
+ case timeFrames_1.TimeFrames.DAY_OF_WEEK_INDEX:
20
+ case timeFrames_1.TimeFrames.DAY_OF_MONTH_NUM:
21
+ case timeFrames_1.TimeFrames.DAY_OF_YEAR_NUM:
22
+ case timeFrames_1.TimeFrames.WEEK_NUM:
23
+ case timeFrames_1.TimeFrames.MONTH_NUM:
24
+ case timeFrames_1.TimeFrames.QUARTER_NUM:
25
+ case timeFrames_1.TimeFrames.YEAR_NUM:
26
+ case timeFrames_1.TimeFrames.DAY_OF_WEEK_NAME:
27
+ case timeFrames_1.TimeFrames.MONTH_NAME:
28
+ case timeFrames_1.TimeFrames.QUARTER_NAME:
29
+ case timeFrames_1.TimeFrames.HOUR_OF_DAY_NUM:
30
+ case timeFrames_1.TimeFrames.MINUTE_OF_HOUR_NUM:
31
+ throw new Error(`Timeframe "${timeframe}" is not supported for default time interval`);
32
+ default:
33
+ return (0, assertUnreachable_1.default)(timeframe, `Unknown time interval: "${timeframe}"`);
34
+ }
35
+ };
36
+ // Time grain Year: -> past 5 years (i.e. 5 completed years + this uncompleted year)
37
+ // Time grain Month -> past 12 months (i.e. 12 completed months + this uncompleted month)
38
+ // Time grain Week -> past 12 weeks (i.e. 12 completed weeks + this uncompleted week)
39
+ // Time grain Day -> past 30 days (i.e. 30 completed days + this uncompleted day)
40
+ const getMetricExplorerDimensionCurrentFilters = (exploreName, dimensionName, timeInterval) => {
41
+ const targetFieldId = (0, item_1.getItemId)({
42
+ table: exploreName,
43
+ name: dimensionName,
44
+ });
45
+ if (!timeInterval) {
46
+ throw new Error('Time interval is required to get relevant filter');
47
+ }
48
+ switch (timeInterval) {
49
+ case timeFrames_1.TimeFrames.DAY:
50
+ return [
51
+ {
52
+ id: (0, uuid_1.v4)(),
53
+ target: { fieldId: targetFieldId },
54
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
55
+ values: [29],
56
+ settings: {
57
+ unitOfTime: filter_1.UnitOfTime.days,
58
+ completed: true,
59
+ },
60
+ },
61
+ {
62
+ id: (0, uuid_1.v4)(),
63
+ target: { fieldId: targetFieldId },
64
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_CURRENT,
65
+ values: [],
66
+ settings: { unitOfTime: filter_1.UnitOfTime.days },
67
+ },
68
+ ];
69
+ case timeFrames_1.TimeFrames.WEEK:
70
+ return [
71
+ {
72
+ id: (0, uuid_1.v4)(),
73
+ target: { fieldId: targetFieldId },
74
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
75
+ values: [11],
76
+ settings: {
77
+ unitOfTime: filter_1.UnitOfTime.weeks,
78
+ completed: true,
79
+ },
80
+ },
81
+ {
82
+ id: (0, uuid_1.v4)(),
83
+ target: { fieldId: targetFieldId },
84
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_CURRENT,
85
+ values: [],
86
+ settings: { unitOfTime: filter_1.UnitOfTime.weeks },
87
+ },
88
+ ];
89
+ case timeFrames_1.TimeFrames.MONTH:
90
+ return [
91
+ {
92
+ id: (0, uuid_1.v4)(),
93
+ target: { fieldId: targetFieldId },
94
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
95
+ values: [11],
96
+ settings: {
97
+ unitOfTime: filter_1.UnitOfTime.months,
98
+ completed: true,
99
+ },
100
+ },
101
+ {
102
+ id: (0, uuid_1.v4)(),
103
+ target: { fieldId: targetFieldId },
104
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_CURRENT,
105
+ values: [],
106
+ settings: { unitOfTime: filter_1.UnitOfTime.months },
107
+ },
108
+ ];
109
+ case timeFrames_1.TimeFrames.YEAR:
110
+ return [
111
+ {
112
+ id: (0, uuid_1.v4)(),
113
+ target: { fieldId: targetFieldId },
114
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
115
+ values: [4],
116
+ settings: { unitOfTime: filter_1.UnitOfTime.years, completed: true },
117
+ },
118
+ {
119
+ id: (0, uuid_1.v4)(),
120
+ target: { fieldId: targetFieldId },
121
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_CURRENT,
122
+ values: [],
123
+ settings: { unitOfTime: filter_1.UnitOfTime.years },
124
+ },
125
+ ];
126
+ default:
127
+ return assertUnimplementedTimeframe(timeInterval);
128
+ }
129
+ };
130
+ exports.getMetricExplorerDimensionCurrentFilters = getMetricExplorerDimensionCurrentFilters;
131
+ // Time grain Year: -> 10 years ago - 5 years ago
132
+ // Time grain Month -> 24 months ago - 12 months ago
133
+ // Time grain Week -> 24 weeks ago - 12 weeks ago
134
+ // Time grain Day -> 60 days ago - 30 days ago
135
+ const getMetricExplorerDimensionPreviousFilters = (exploreName, dimensionName, timeInterval) => {
136
+ const targetFieldId = (0, item_1.getItemId)({
137
+ table: exploreName,
138
+ name: dimensionName,
139
+ });
140
+ if (!timeInterval) {
141
+ throw new Error('Time interval is required to get relevant filter');
142
+ }
143
+ switch (timeInterval) {
144
+ case timeFrames_1.TimeFrames.DAY:
145
+ // 60 days ago - 30 days ago
146
+ return [
147
+ {
148
+ id: (0, uuid_1.v4)(),
149
+ target: { fieldId: targetFieldId },
150
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
151
+ values: [60],
152
+ settings: {
153
+ unitOfTime: filter_1.UnitOfTime.days,
154
+ completed: true,
155
+ },
156
+ },
157
+ {
158
+ id: (0, uuid_1.v4)(),
159
+ target: { fieldId: targetFieldId },
160
+ operator: conditionalRule_1.ConditionalOperator.NOT_IN_THE_PAST,
161
+ values: [30],
162
+ settings: {
163
+ unitOfTime: filter_1.UnitOfTime.days,
164
+ completed: true,
165
+ },
166
+ },
167
+ ];
168
+ case timeFrames_1.TimeFrames.WEEK:
169
+ // 24 weeks ago - 12 weeks ago
170
+ return [
171
+ {
172
+ id: (0, uuid_1.v4)(),
173
+ target: { fieldId: targetFieldId },
174
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
175
+ values: [24],
176
+ settings: {
177
+ unitOfTime: filter_1.UnitOfTime.weeks,
178
+ completed: true,
179
+ },
180
+ },
181
+ {
182
+ id: (0, uuid_1.v4)(),
183
+ target: { fieldId: targetFieldId },
184
+ operator: conditionalRule_1.ConditionalOperator.NOT_IN_THE_PAST,
185
+ values: [12],
186
+ settings: {
187
+ unitOfTime: filter_1.UnitOfTime.weeks,
188
+ completed: true,
189
+ },
190
+ },
191
+ ];
192
+ case timeFrames_1.TimeFrames.MONTH:
193
+ // 24 months ago - 12 months ago
194
+ return [
195
+ {
196
+ id: (0, uuid_1.v4)(),
197
+ target: { fieldId: targetFieldId },
198
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
199
+ values: [24],
200
+ settings: {
201
+ unitOfTime: filter_1.UnitOfTime.months,
202
+ completed: true,
203
+ },
204
+ },
205
+ {
206
+ id: (0, uuid_1.v4)(),
207
+ target: { fieldId: targetFieldId },
208
+ operator: conditionalRule_1.ConditionalOperator.NOT_IN_THE_PAST,
209
+ values: [12],
210
+ settings: {
211
+ unitOfTime: filter_1.UnitOfTime.months,
212
+ completed: true,
213
+ },
214
+ },
215
+ ];
216
+ case timeFrames_1.TimeFrames.YEAR:
217
+ // 10 years ago - 5 years ago
218
+ return [
219
+ {
220
+ id: (0, uuid_1.v4)(),
221
+ target: { fieldId: targetFieldId },
222
+ operator: conditionalRule_1.ConditionalOperator.IN_THE_PAST,
223
+ values: [10],
224
+ settings: {
225
+ unitOfTime: filter_1.UnitOfTime.years,
226
+ completed: true,
227
+ },
228
+ },
229
+ {
230
+ id: (0, uuid_1.v4)(),
231
+ target: { fieldId: targetFieldId },
232
+ operator: conditionalRule_1.ConditionalOperator.NOT_IN_THE_PAST,
233
+ values: [5],
234
+ settings: {
235
+ unitOfTime: filter_1.UnitOfTime.years,
236
+ completed: true,
237
+ },
238
+ },
239
+ ];
240
+ default:
241
+ return assertUnimplementedTimeframe(timeInterval);
242
+ }
243
+ };
244
+ exports.getMetricExplorerDimensionPreviousFilters = getMetricExplorerDimensionPreviousFilters;
245
+ const getFieldIdForDateDimension = (fieldId, timeframe) => {
246
+ switch (timeframe) {
247
+ case timeFrames_1.TimeFrames.DAY:
248
+ return `${fieldId}_day`;
249
+ case timeFrames_1.TimeFrames.WEEK:
250
+ return `${fieldId}_week`;
251
+ case timeFrames_1.TimeFrames.MONTH:
252
+ return `${fieldId}_month`;
253
+ case timeFrames_1.TimeFrames.YEAR:
254
+ return `${fieldId}_year`;
255
+ default:
256
+ return assertUnimplementedTimeframe(timeframe);
257
+ }
258
+ };
259
+ exports.getFieldIdForDateDimension = getFieldIdForDateDimension;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightdash/common",
3
- "version": "0.1382.0",
3
+ "version": "0.1383.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [