dbgate-datalib 5.1.0 → 5.1.1
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/lib/PerspectiveConfig.d.ts +45 -23
- package/lib/PerspectiveConfig.js +35 -11
- package/lib/PerspectiveDataLoader.js +3 -0
- package/lib/PerspectiveDataProvider.js +2 -0
- package/lib/PerspectiveDisplay.d.ts +2 -2
- package/lib/PerspectiveDisplay.js +20 -14
- package/lib/PerspectiveTreeNode.d.ts +43 -15
- package/lib/PerspectiveTreeNode.js +308 -76
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/processPerspectiveDefaultColunns.d.ts +4 -0
- package/lib/processPerspectiveDefaultColunns.js +128 -0
- package/lib/tests/PerspectiveDisplay.test.js +57 -42
- package/package.json +5 -5
- package/lib/getPerspectiveDefaultColumns.d.ts +0 -2
- package/lib/getPerspectiveDefaultColumns.js +0 -30
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processPerspectiveDefaultColunns = exports.shouldProcessPerspectiveDefaultColunns = exports.perspectiveNodesHaveStructure = void 0;
|
|
4
|
+
const dbgate_tools_1 = require("dbgate-tools");
|
|
5
|
+
const PerspectiveTreeNode_1 = require("./PerspectiveTreeNode");
|
|
6
|
+
function getPerspectiveDefaultColumns(table, db, circularColumns) {
|
|
7
|
+
const columns = table.columns.map(x => x.columnName);
|
|
8
|
+
const predicates = [
|
|
9
|
+
x => x.toLowerCase() == 'name',
|
|
10
|
+
x => x.toLowerCase() == 'title',
|
|
11
|
+
x => x.toLowerCase().includes('name'),
|
|
12
|
+
x => x.toLowerCase().includes('title'),
|
|
13
|
+
x => x.toLowerCase().includes('subject'),
|
|
14
|
+
// x => x.toLowerCase().includes('text'),
|
|
15
|
+
// x => x.toLowerCase().includes('desc'),
|
|
16
|
+
x => {
|
|
17
|
+
var _a, _b, _c;
|
|
18
|
+
return (_c = (_b = (_a = table.columns
|
|
19
|
+
.find(y => y.columnName == x)) === null || _a === void 0 ? void 0 : _a.dataType) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === null || _c === void 0 ? void 0 : _c.includes('char');
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
for (const predicate of predicates) {
|
|
23
|
+
const col = columns.find(predicate);
|
|
24
|
+
if (col)
|
|
25
|
+
return [[col], null];
|
|
26
|
+
}
|
|
27
|
+
if (circularColumns) {
|
|
28
|
+
const keyPredicates = [
|
|
29
|
+
x => { var _a, _b; return ((_b = (_a = (0, dbgate_tools_1.findForeignKeyForColumn)(table, x)) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.length) == 1 && !circularColumns.includes(x); },
|
|
30
|
+
x => { var _a, _b; return ((_b = (_a = (0, dbgate_tools_1.findForeignKeyForColumn)(table, x)) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.length) == 1; },
|
|
31
|
+
];
|
|
32
|
+
for (const predicate of keyPredicates) {
|
|
33
|
+
const col = columns.find(predicate);
|
|
34
|
+
if (col)
|
|
35
|
+
return [null, [col]];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [[columns[0]], null];
|
|
39
|
+
}
|
|
40
|
+
function perspectiveNodesHaveStructure(config, dbInfos, conid, database) {
|
|
41
|
+
var _a;
|
|
42
|
+
for (const node of config.nodes) {
|
|
43
|
+
const db = (_a = dbInfos === null || dbInfos === void 0 ? void 0 : dbInfos[node.conid || conid]) === null || _a === void 0 ? void 0 : _a[node.database || database];
|
|
44
|
+
if (!db)
|
|
45
|
+
return false;
|
|
46
|
+
const table = db.tables.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName);
|
|
47
|
+
const view = db.views.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName);
|
|
48
|
+
if (!table && !view)
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
exports.perspectiveNodesHaveStructure = perspectiveNodesHaveStructure;
|
|
54
|
+
function shouldProcessPerspectiveDefaultColunns(config, dbInfos, conid, database) {
|
|
55
|
+
const nodesNotProcessed = config.nodes.filter(x => !x.defaultColumnsProcessed);
|
|
56
|
+
if (nodesNotProcessed.length == 0)
|
|
57
|
+
return false;
|
|
58
|
+
return perspectiveNodesHaveStructure(config, dbInfos, conid, database);
|
|
59
|
+
}
|
|
60
|
+
exports.shouldProcessPerspectiveDefaultColunns = shouldProcessPerspectiveDefaultColunns;
|
|
61
|
+
function processPerspectiveDefaultColunnsStep(config, dbInfos, conid, database) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
const rootNode = config.nodes.find(x => x.designerId == config.rootDesignerId);
|
|
64
|
+
if (!rootNode)
|
|
65
|
+
return null;
|
|
66
|
+
const rootDb = (_a = dbInfos === null || dbInfos === void 0 ? void 0 : dbInfos[rootNode.conid || conid]) === null || _a === void 0 ? void 0 : _a[rootNode.database || database];
|
|
67
|
+
if (!rootDb)
|
|
68
|
+
return null;
|
|
69
|
+
const rootTable = rootDb.tables.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName);
|
|
70
|
+
const rootView = rootDb.views.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName);
|
|
71
|
+
const root = new PerspectiveTreeNode_1.PerspectiveTableNode(rootTable || rootView, dbInfos, config, null, null, { conid, database }, null, config.rootDesignerId);
|
|
72
|
+
for (const node of config.nodes) {
|
|
73
|
+
if (node.defaultColumnsProcessed)
|
|
74
|
+
continue;
|
|
75
|
+
const db = (_b = dbInfos === null || dbInfos === void 0 ? void 0 : dbInfos[node.conid || conid]) === null || _b === void 0 ? void 0 : _b[node.database || database];
|
|
76
|
+
if (!db)
|
|
77
|
+
continue;
|
|
78
|
+
const table = db.tables.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName);
|
|
79
|
+
const view = db.views.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName);
|
|
80
|
+
if (table || view) {
|
|
81
|
+
const treeNode = root.findNodeByDesignerId(node.designerId);
|
|
82
|
+
if (!treeNode) {
|
|
83
|
+
const [defaultColumns] = getPerspectiveDefaultColumns(table || view, db, null);
|
|
84
|
+
return Object.assign(Object.assign({}, config), { nodes: config.nodes.map(n => n.designerId == node.designerId
|
|
85
|
+
? Object.assign(Object.assign({}, n), { defaultColumnsProcessed: true, checkedColumns: defaultColumns }) : n) });
|
|
86
|
+
}
|
|
87
|
+
const circularColumns = treeNode.childNodes.filter(x => x.isCircular).map(x => x.columnName);
|
|
88
|
+
const [defaultColumns, defaultRefs] = getPerspectiveDefaultColumns(table || view, db, circularColumns);
|
|
89
|
+
if (defaultRefs) {
|
|
90
|
+
const childNode = treeNode.childNodes.find(x => x.columnName == defaultRefs[0]);
|
|
91
|
+
if (childNode === null || childNode === void 0 ? void 0 : childNode.designerId) {
|
|
92
|
+
return Object.assign(Object.assign({}, config), { nodes: config.nodes.map(n => n.designerId == childNode.designerId
|
|
93
|
+
? Object.assign(Object.assign({}, n), { isNodeChecked: true }) : n.designerId == node.designerId
|
|
94
|
+
? Object.assign(Object.assign({}, n), { defaultColumnsProcessed: true }) : n) });
|
|
95
|
+
}
|
|
96
|
+
else if (childNode) {
|
|
97
|
+
const [newConfig, nodeConfig] = childNode.ensureNodeConfig(config);
|
|
98
|
+
nodeConfig.isNodeChecked = true;
|
|
99
|
+
return Object.assign(Object.assign({}, newConfig), { nodes: newConfig.nodes.map(n => n.designerId == node.designerId
|
|
100
|
+
? Object.assign(Object.assign({}, n), { defaultColumnsProcessed: true }) : n) });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
return Object.assign(Object.assign({}, config), { nodes: config.nodes.map(n => n.designerId == node.designerId
|
|
105
|
+
? Object.assign(Object.assign({}, n), { defaultColumnsProcessed: true, checkedColumns: defaultColumns }) : n) });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function markAllProcessed(config) {
|
|
112
|
+
return Object.assign(Object.assign({}, config), { nodes: config.nodes.map(x => (Object.assign(Object.assign({}, x), { defaultColumnsProcessed: true }))) });
|
|
113
|
+
}
|
|
114
|
+
function processPerspectiveDefaultColunns(config, dbInfos, conid, database) {
|
|
115
|
+
while (config.nodes.filter(x => !x.defaultColumnsProcessed).length > 0) {
|
|
116
|
+
const newConfig = processPerspectiveDefaultColunnsStep(config, dbInfos, conid, database);
|
|
117
|
+
if (!newConfig) {
|
|
118
|
+
return markAllProcessed(config);
|
|
119
|
+
}
|
|
120
|
+
if (newConfig.nodes.filter(x => x.defaultColumnsProcessed).length <=
|
|
121
|
+
config.nodes.filter(x => x.defaultColumnsProcessed).length) {
|
|
122
|
+
return markAllProcessed(config);
|
|
123
|
+
}
|
|
124
|
+
config = newConfig;
|
|
125
|
+
}
|
|
126
|
+
return markAllProcessed(config);
|
|
127
|
+
}
|
|
128
|
+
exports.processPerspectiveDefaultColunns = processPerspectiveDefaultColunns;
|
|
@@ -10,46 +10,47 @@ const PerspectiveConfig_1 = require("../PerspectiveConfig");
|
|
|
10
10
|
const artistDataFlat_1 = __importDefault(require("./artistDataFlat"));
|
|
11
11
|
const artistDataAlbum_1 = __importDefault(require("./artistDataAlbum"));
|
|
12
12
|
const artistDataAlbumTrack_1 = __importDefault(require("./artistDataAlbumTrack"));
|
|
13
|
+
const processPerspectiveDefaultColunns_1 = require("../processPerspectiveDefaultColunns");
|
|
13
14
|
test('test flat view', () => {
|
|
14
15
|
const artistTable = chinookDbInfo_1.chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
|
15
|
-
const
|
|
16
|
+
const configColumns = (0, processPerspectiveDefaultColunns_1.processPerspectiveDefaultColunns)((0, PerspectiveConfig_1.createPerspectiveConfig)({ pureName: 'Artist' }), { conid: { db: chinookDbInfo_1.chinookDbInfo } }, 'conid', 'db');
|
|
17
|
+
const root = new PerspectiveTreeNode_1.PerspectiveTableNode(artistTable, { conid: { db: chinookDbInfo_1.chinookDbInfo } }, configColumns, null, null, { conid: 'conid', database: 'db' }, null, configColumns.rootDesignerId);
|
|
16
18
|
const display = new PerspectiveDisplay_1.PerspectiveDisplay(root, artistDataFlat_1.default);
|
|
17
|
-
// console.log(display.loadIndicatorsCounts);
|
|
18
|
-
// console.log(display.rows);
|
|
19
19
|
expect(display.rows.length).toEqual(4);
|
|
20
|
-
expect(display.rows[0]).toEqual(
|
|
21
|
-
rowData: ['AC/DC'],
|
|
22
|
-
}));
|
|
20
|
+
expect(display.rows[0].rowData).toEqual(['AC/DC']);
|
|
23
21
|
expect(display.loadIndicatorsCounts).toEqual({
|
|
24
22
|
Artist: 4,
|
|
25
23
|
});
|
|
26
24
|
});
|
|
27
25
|
test('test one level nesting', () => {
|
|
28
26
|
const artistTable = chinookDbInfo_1.chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
|
29
|
-
const
|
|
27
|
+
const config = (0, PerspectiveConfig_1.createPerspectiveConfig)({ pureName: 'Artist' });
|
|
28
|
+
config.nodes.push((0, PerspectiveConfig_1.createPerspectiveNodeConfig)({ pureName: 'Album' }));
|
|
29
|
+
config.references.push({
|
|
30
|
+
sourceId: config.nodes[0].designerId,
|
|
31
|
+
targetId: config.nodes[1].designerId,
|
|
32
|
+
designerId: '1',
|
|
33
|
+
columns: [{ source: 'ArtistId', target: 'ArtistId' }],
|
|
34
|
+
});
|
|
35
|
+
const configColumns = (0, processPerspectiveDefaultColunns_1.processPerspectiveDefaultColunns)(config, { conid: { db: chinookDbInfo_1.chinookDbInfo } }, 'conid', 'db');
|
|
36
|
+
// const config = createPerspectiveConfig({ pureName: 'Artist' });
|
|
37
|
+
// config.nodes[0].checkedColumns = ['Album'];
|
|
38
|
+
const root = new PerspectiveTreeNode_1.PerspectiveTableNode(artistTable, { conid: { db: chinookDbInfo_1.chinookDbInfo } }, configColumns, null, null, { conid: 'conid', database: 'db' }, null, configColumns.nodes[0].designerId);
|
|
30
39
|
const display = new PerspectiveDisplay_1.PerspectiveDisplay(root, artistDataAlbum_1.default);
|
|
31
40
|
console.log(display.loadIndicatorsCounts);
|
|
32
41
|
// console.log(display.rows);
|
|
33
42
|
expect(display.rows.length).toEqual(6);
|
|
34
|
-
expect(display.rows[0]).toEqual(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
expect(display.rows[1]).toEqual(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
expect(display.rows[
|
|
45
|
-
rowData: ['Accept', 'Balls to the Wall'],
|
|
46
|
-
rowSpans: [2, 1],
|
|
47
|
-
rowCellSkips: [false, false],
|
|
48
|
-
}));
|
|
49
|
-
expect(display.rows[5]).toEqual(expect.objectContaining({
|
|
50
|
-
rowData: ['Alanis Morissette', 'Jagged Little Pill'],
|
|
51
|
-
rowSpans: [1, 1],
|
|
52
|
-
}));
|
|
43
|
+
expect(display.rows[0].rowData).toEqual(['AC/DC', 'For Those About To Rock We Salute You']);
|
|
44
|
+
expect(display.rows[0].rowSpans).toEqual([2, 1]);
|
|
45
|
+
expect(display.rows[0].rowCellSkips).toEqual([false, false]);
|
|
46
|
+
expect(display.rows[1].rowData).toEqual([undefined, 'Let There Be Rock']);
|
|
47
|
+
expect(display.rows[1].rowSpans).toEqual([1, 1]);
|
|
48
|
+
expect(display.rows[1].rowCellSkips).toEqual([true, false]);
|
|
49
|
+
expect(display.rows[2].rowData).toEqual(['Accept', 'Balls to the Wall']);
|
|
50
|
+
expect(display.rows[2].rowSpans).toEqual([2, 1]);
|
|
51
|
+
expect(display.rows[2].rowCellSkips).toEqual([false, false]);
|
|
52
|
+
expect(display.rows[5].rowData).toEqual(['Alanis Morissette', 'Jagged Little Pill']);
|
|
53
|
+
expect(display.rows[5].rowSpans).toEqual([1, 1]);
|
|
53
54
|
expect(display.loadIndicatorsCounts).toEqual({
|
|
54
55
|
Artist: 6,
|
|
55
56
|
'Artist.Album': 6,
|
|
@@ -57,23 +58,37 @@ test('test one level nesting', () => {
|
|
|
57
58
|
});
|
|
58
59
|
test('test two level nesting', () => {
|
|
59
60
|
const artistTable = chinookDbInfo_1.chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
|
60
|
-
const
|
|
61
|
+
const config = (0, PerspectiveConfig_1.createPerspectiveConfig)({ pureName: 'Artist' });
|
|
62
|
+
config.nodes.push((0, PerspectiveConfig_1.createPerspectiveNodeConfig)({ pureName: 'Album' }));
|
|
63
|
+
config.nodes.push((0, PerspectiveConfig_1.createPerspectiveNodeConfig)({ pureName: 'Track' }));
|
|
64
|
+
config.references.push({
|
|
65
|
+
sourceId: config.nodes[0].designerId,
|
|
66
|
+
targetId: config.nodes[1].designerId,
|
|
67
|
+
designerId: '1',
|
|
68
|
+
columns: [{ source: 'ArtistId', target: 'ArtistId' }],
|
|
69
|
+
});
|
|
70
|
+
config.references.push({
|
|
71
|
+
sourceId: config.nodes[1].designerId,
|
|
72
|
+
targetId: config.nodes[2].designerId,
|
|
73
|
+
designerId: '2',
|
|
74
|
+
columns: [{ source: 'AlbumId', target: 'AlbumId' }],
|
|
75
|
+
});
|
|
76
|
+
const configColumns = (0, processPerspectiveDefaultColunns_1.processPerspectiveDefaultColunns)(config, { conid: { db: chinookDbInfo_1.chinookDbInfo } }, 'conid', 'db');
|
|
77
|
+
const root = new PerspectiveTreeNode_1.PerspectiveTableNode(artistTable, { conid: { db: chinookDbInfo_1.chinookDbInfo } }, configColumns, null, null, { conid: 'conid', database: 'db' }, null, configColumns.nodes[0].designerId);
|
|
61
78
|
const display = new PerspectiveDisplay_1.PerspectiveDisplay(root, artistDataAlbumTrack_1.default);
|
|
62
79
|
console.log(display.rows);
|
|
63
80
|
expect(display.rows.length).toEqual(8);
|
|
64
|
-
expect(display.rows[0]).toEqual(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
expect(display.rows[
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
expect(display.rows[2]).toEqual(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
rowCellSkips: [true, false, false],
|
|
78
|
-
}));
|
|
81
|
+
expect(display.rows[0].rowData).toEqual([
|
|
82
|
+
'AC/DC',
|
|
83
|
+
'For Those About To Rock We Salute You',
|
|
84
|
+
'For Those About To Rock (We Salute You)',
|
|
85
|
+
]);
|
|
86
|
+
expect(display.rows[0].rowSpans).toEqual([4, 2, 1]);
|
|
87
|
+
expect(display.rows[0].rowCellSkips).toEqual([false, false, false]);
|
|
88
|
+
expect(display.rows[1].rowData).toEqual([undefined, undefined, 'Put The Finger On You']);
|
|
89
|
+
expect(display.rows[1].rowSpans).toEqual([1, 1, 1]);
|
|
90
|
+
expect(display.rows[1].rowCellSkips).toEqual([true, true, false]);
|
|
91
|
+
expect(display.rows[2].rowData).toEqual([undefined, 'Let There Be Rock', 'Go Down']);
|
|
92
|
+
expect(display.rows[2].rowSpans).toEqual([1, 2, 1]);
|
|
93
|
+
expect(display.rows[2].rowCellSkips).toEqual([true, false, false]);
|
|
79
94
|
});
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "5.1.
|
|
2
|
+
"version": "5.1.1",
|
|
3
3
|
"name": "dbgate-datalib",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"typings": "lib/index.d.ts",
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"lib"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"dbgate-sqltree": "^5.1.
|
|
17
|
-
"dbgate-tools": "^5.1.
|
|
18
|
-
"dbgate-filterparser": "^5.1.
|
|
16
|
+
"dbgate-sqltree": "^5.1.1",
|
|
17
|
+
"dbgate-tools": "^5.1.1",
|
|
18
|
+
"dbgate-filterparser": "^5.1.1"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"dbgate-types": "^5.1.
|
|
21
|
+
"dbgate-types": "^5.1.1",
|
|
22
22
|
"@types/node": "^13.7.0",
|
|
23
23
|
"jest": "^28.1.3",
|
|
24
24
|
"ts-jest": "^28.0.7",
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getPerspectiveDefaultColumns = void 0;
|
|
4
|
-
const dbgate_tools_1 = require("dbgate-tools");
|
|
5
|
-
function getPerspectiveDefaultColumns(table, db, circularColumns) {
|
|
6
|
-
const columns = table.columns.map(x => x.columnName);
|
|
7
|
-
const predicates = [
|
|
8
|
-
x => x.toLowerCase() == 'name',
|
|
9
|
-
x => x.toLowerCase() == 'title',
|
|
10
|
-
x => x.toLowerCase().includes('name'),
|
|
11
|
-
x => x.toLowerCase().includes('title'),
|
|
12
|
-
x => x.toLowerCase().includes('subject'),
|
|
13
|
-
// x => x.toLowerCase().includes('text'),
|
|
14
|
-
// x => x.toLowerCase().includes('desc'),
|
|
15
|
-
x => {
|
|
16
|
-
var _a, _b, _c;
|
|
17
|
-
return (_c = (_b = (_a = table.columns
|
|
18
|
-
.find(y => y.columnName == x)) === null || _a === void 0 ? void 0 : _a.dataType) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === null || _c === void 0 ? void 0 : _c.includes('char');
|
|
19
|
-
},
|
|
20
|
-
x => { var _a, _b; return ((_b = (_a = (0, dbgate_tools_1.findForeignKeyForColumn)(table, x)) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.length) == 1 && !circularColumns.includes(x); },
|
|
21
|
-
x => { var _a, _b; return ((_b = (_a = (0, dbgate_tools_1.findForeignKeyForColumn)(table, x)) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.length) == 1; },
|
|
22
|
-
];
|
|
23
|
-
for (const predicate of predicates) {
|
|
24
|
-
const col = columns.find(predicate);
|
|
25
|
-
if (col)
|
|
26
|
-
return [col];
|
|
27
|
-
}
|
|
28
|
-
return [columns[0]];
|
|
29
|
-
}
|
|
30
|
-
exports.getPerspectiveDefaultColumns = getPerspectiveDefaultColumns;
|