@lightdash/common 0.1468.0 → 0.1469.0
Sign up to get free protection for your applications and to get access to all the features.
@@ -303,7 +303,11 @@ const convertTable = (adapterType, model, dbtMetrics, spotlightConfig, startOfWe
|
|
303
303
|
]));
|
304
304
|
const convertedDbtMetrics = Object.fromEntries(dbtMetrics.map((metric) => [
|
305
305
|
metric.name,
|
306
|
-
convertDbtMetricToLightdashMetric(metric, model.name, tableLabel,
|
306
|
+
convertDbtMetricToLightdashMetric(metric, model.name, tableLabel, {
|
307
|
+
...spotlightConfig,
|
308
|
+
default_visibility: model.meta.spotlight?.visibility ??
|
309
|
+
spotlightConfig.default_visibility,
|
310
|
+
}, model.meta.spotlight?.categories),
|
307
311
|
]));
|
308
312
|
const allMetrics = Object.values({
|
309
313
|
...convertedDbtMetrics,
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { type DbtMetric, type DbtModelNode, type V9MetricRef } from '../types/dbt';
|
2
2
|
import { type Table } from '../types/explore';
|
3
3
|
import { DimensionType } from '../types/field';
|
4
|
+
import type { LightdashProjectConfig } from '../types/lightdashProjectConfig';
|
4
5
|
type WarehouseCatalog = {
|
5
6
|
[database: string]: {
|
6
7
|
[schema: string]: {
|
@@ -82,4 +83,11 @@ export declare const MODEL_WITH_ADDITIONAL_DIMENSIONS: DbtModelNode & {
|
|
82
83
|
relation_name: string;
|
83
84
|
};
|
84
85
|
export declare const LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS: Omit<Table, 'lineageGraph'>;
|
86
|
+
export declare const SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE: LightdashProjectConfig;
|
87
|
+
export declare const MODEL_WITH_NO_CATEGORIES: DbtModelNode;
|
88
|
+
export declare const LIGHTDASH_TABLE_WITH_NO_CATEGORIES: Omit<Table, 'lineageGraph'>;
|
89
|
+
export declare const MODEL_WITH_MODEL_LEVEL_CATEGORIES: DbtModelNode;
|
90
|
+
export declare const LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES: Omit<Table, 'lineageGraph'>;
|
91
|
+
export declare const MODEL_WITH_METRIC_LEVEL_CATEGORIES: DbtModelNode;
|
92
|
+
export declare const LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES: Omit<Table, 'lineageGraph'>;
|
85
93
|
export {};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = exports.MODEL_WITH_ADDITIONAL_DIMENSIONS = exports.LIGHTDASH_TABLE_SQL_WHERE = exports.expectedModelWithType = exports.warehouseSchemaWithUpperCaseColumn = exports.warehouseSchemaWithMissingColumn = exports.warehouseSchemaWithMissingTable = exports.warehouseSchema = exports.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY = exports.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_METRICS = exports.MODEL_WITH_WRONG_METRICS = exports.MODEL_WITH_WRONG_METRIC = exports.MODEL_WITH_METRIC = exports.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS = exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = exports.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS = exports.MODEL_WITH_NO_METRICS = exports.MODEL_WITH_SQL_FILTER = exports.MODEL_WITH_SQL_WHERE = exports.LIGHTDASH_TABLE_WITH_GROUP_BLOCK = exports.LIGHTDASH_TABLE_WITH_GROUP_LABEL = exports.MODEL_WITH_GROUPS_BLOCK = exports.MODEL_WITH_GROUP_LABEL = exports.BASE_LIGHTDASH_TABLE = exports.model = exports.DBT_V9_METRIC = exports.DBT_METRIC_DERIVED = exports.DBT_METRIC_WITH_CUSTOM_SQL = exports.DBT_METRIC_WITH_SQL_FIELD = exports.DBT_METRIC_WITH_FILTER = exports.DBT_METRIC = exports.INVALID_ID_COLUMN_NAMES = exports.VALID_ID_COLUMN_NAMES = void 0;
|
3
|
+
exports.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES = exports.MODEL_WITH_METRIC_LEVEL_CATEGORIES = exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES = exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES = exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES = exports.MODEL_WITH_NO_CATEGORIES = exports.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE = exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = exports.MODEL_WITH_ADDITIONAL_DIMENSIONS = exports.LIGHTDASH_TABLE_SQL_WHERE = exports.expectedModelWithType = exports.warehouseSchemaWithUpperCaseColumn = exports.warehouseSchemaWithMissingColumn = exports.warehouseSchemaWithMissingTable = exports.warehouseSchema = exports.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY = exports.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_METRICS = exports.MODEL_WITH_WRONG_METRICS = exports.MODEL_WITH_WRONG_METRIC = exports.MODEL_WITH_METRIC = exports.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS = exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = exports.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS = exports.MODEL_WITH_NO_METRICS = exports.MODEL_WITH_SQL_FILTER = exports.MODEL_WITH_SQL_WHERE = exports.LIGHTDASH_TABLE_WITH_GROUP_BLOCK = exports.LIGHTDASH_TABLE_WITH_GROUP_LABEL = exports.MODEL_WITH_GROUPS_BLOCK = exports.MODEL_WITH_GROUP_LABEL = exports.BASE_LIGHTDASH_TABLE = exports.model = exports.DBT_V9_METRIC = exports.DBT_METRIC_DERIVED = exports.DBT_METRIC_WITH_CUSTOM_SQL = exports.DBT_METRIC_WITH_SQL_FIELD = exports.DBT_METRIC_WITH_FILTER = exports.DBT_METRIC = exports.INVALID_ID_COLUMN_NAMES = exports.VALID_ID_COLUMN_NAMES = void 0;
|
4
4
|
const field_1 = require("../types/field");
|
5
5
|
const table_1 = require("../types/table");
|
6
6
|
const timeFrames_1 = require("../types/timeFrames");
|
@@ -1377,3 +1377,116 @@ exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = {
|
|
1377
1377
|
},
|
1378
1378
|
},
|
1379
1379
|
};
|
1380
|
+
exports.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE = {
|
1381
|
+
spotlight: {
|
1382
|
+
default_visibility: 'show',
|
1383
|
+
categories: {
|
1384
|
+
category_1: { label: 'Category 1' },
|
1385
|
+
category_2: { label: 'Category 2', color: 'red' },
|
1386
|
+
},
|
1387
|
+
},
|
1388
|
+
};
|
1389
|
+
exports.MODEL_WITH_NO_CATEGORIES = {
|
1390
|
+
...exports.MODEL_WITH_METRIC,
|
1391
|
+
meta: {
|
1392
|
+
spotlight: {
|
1393
|
+
visibility: 'hide',
|
1394
|
+
},
|
1395
|
+
},
|
1396
|
+
};
|
1397
|
+
exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES = {
|
1398
|
+
...exports.LIGHTDASH_TABLE_WITH_METRICS,
|
1399
|
+
metrics: {
|
1400
|
+
...{
|
1401
|
+
dbt_metric_1: {
|
1402
|
+
...exports.LIGHTDASH_TABLE_WITH_DBT_METRICS.metrics.dbt_metric_1,
|
1403
|
+
spotlight: {
|
1404
|
+
...exports.LIGHTDASH_TABLE_WITH_DBT_METRICS.metrics.dbt_metric_1
|
1405
|
+
.spotlight,
|
1406
|
+
visibility: 'hide',
|
1407
|
+
},
|
1408
|
+
},
|
1409
|
+
},
|
1410
|
+
...Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_METRICS.metrics).map(([key, metric]) => [
|
1411
|
+
key,
|
1412
|
+
{
|
1413
|
+
...metric,
|
1414
|
+
spotlight: { ...metric.spotlight, visibility: 'hide' },
|
1415
|
+
index: (metric.index ?? 0) + 1,
|
1416
|
+
},
|
1417
|
+
])),
|
1418
|
+
},
|
1419
|
+
dimensions: exports.LIGHTDASH_TABLE_WITH_METRICS.dimensions,
|
1420
|
+
};
|
1421
|
+
exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES = {
|
1422
|
+
...exports.MODEL_WITH_METRIC,
|
1423
|
+
meta: {
|
1424
|
+
spotlight: {
|
1425
|
+
visibility: 'hide',
|
1426
|
+
categories: ['category_1'],
|
1427
|
+
},
|
1428
|
+
},
|
1429
|
+
};
|
1430
|
+
exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES = {
|
1431
|
+
...exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES,
|
1432
|
+
metrics: Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES.metrics).map(([key, metric]) => [
|
1433
|
+
key,
|
1434
|
+
{
|
1435
|
+
...metric,
|
1436
|
+
spotlight: {
|
1437
|
+
visibility: 'hide',
|
1438
|
+
categories: ['category_1'],
|
1439
|
+
},
|
1440
|
+
},
|
1441
|
+
])),
|
1442
|
+
};
|
1443
|
+
exports.MODEL_WITH_METRIC_LEVEL_CATEGORIES = {
|
1444
|
+
...exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES,
|
1445
|
+
columns: {
|
1446
|
+
user_id: {
|
1447
|
+
name: 'user_id',
|
1448
|
+
data_type: field_1.DimensionType.STRING,
|
1449
|
+
meta: {
|
1450
|
+
metrics: {
|
1451
|
+
user_count: {
|
1452
|
+
type: field_1.MetricType.COUNT_DISTINCT,
|
1453
|
+
spotlight: {
|
1454
|
+
visibility: 'hide',
|
1455
|
+
categories: ['category_2'],
|
1456
|
+
},
|
1457
|
+
},
|
1458
|
+
},
|
1459
|
+
},
|
1460
|
+
},
|
1461
|
+
num_participating_athletes: {
|
1462
|
+
name: 'num_participating_athletes',
|
1463
|
+
data_type: field_1.DimensionType.NUMBER,
|
1464
|
+
meta: {
|
1465
|
+
dimension: {
|
1466
|
+
sql: 'num_participating_men + num_participating_women',
|
1467
|
+
},
|
1468
|
+
metrics: {
|
1469
|
+
total_num_participating_athletes: {
|
1470
|
+
type: field_1.MetricType.SUM,
|
1471
|
+
},
|
1472
|
+
},
|
1473
|
+
},
|
1474
|
+
},
|
1475
|
+
},
|
1476
|
+
};
|
1477
|
+
exports.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES = {
|
1478
|
+
...exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES,
|
1479
|
+
metrics: Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES.metrics).map(([key, metric]) => [
|
1480
|
+
key,
|
1481
|
+
{
|
1482
|
+
...metric,
|
1483
|
+
spotlight: {
|
1484
|
+
visibility: 'hide',
|
1485
|
+
categories: [
|
1486
|
+
'category_1',
|
1487
|
+
...(key === 'user_count' ? ['category_2'] : []),
|
1488
|
+
],
|
1489
|
+
},
|
1490
|
+
},
|
1491
|
+
])),
|
1492
|
+
};
|
@@ -87,3 +87,17 @@ describe('convert tables from dbt models', () => {
|
|
87
87
|
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_GROUPS_BLOCK, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_GROUP_BLOCK);
|
88
88
|
});
|
89
89
|
});
|
90
|
+
describe('spotlight config', () => {
|
91
|
+
it('should convert dbt model with metrics when no categories are defined', () => {
|
92
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_NO_CATEGORIES);
|
93
|
+
});
|
94
|
+
it('should convert dbt model with metrics when categories are defined', () => {
|
95
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_MODEL_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES);
|
96
|
+
});
|
97
|
+
it('should convert dbt model with metrics when categories are defined and there is metric level assignment', () => {
|
98
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES);
|
99
|
+
});
|
100
|
+
it('should error when categories are assigned but not defined in the spotlight config', () => {
|
101
|
+
expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toThrowError(`Invalid spotlight categories found in metric 'user_count': category_1, category_2. Categories must be defined in project config.`);
|
102
|
+
});
|
103
|
+
});
|