mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-19 07:16:01 +00:00
perspective display test WIP
This commit is contained in:
@@ -7,9 +7,9 @@ import debug from 'debug';
|
||||
|
||||
const dbg = debug('dbgate:PerspectiveDisplay');
|
||||
|
||||
const SKIP_CELL = {
|
||||
__perspective_skip_cell__: true,
|
||||
};
|
||||
// const SKIP_CELL = {
|
||||
// __perspective_skip_cell__: true,
|
||||
// };
|
||||
|
||||
let lastJoinId = 0;
|
||||
function getJoinId(): number {
|
||||
@@ -74,6 +74,7 @@ export class PerspectiveDisplayRow {
|
||||
this.rowData = _fill(Array(display.columns.length), undefined);
|
||||
this.rowSpans = _fill(Array(display.columns.length), 1);
|
||||
this.rowJoinIds = _fill(Array(display.columns.length), 0);
|
||||
this.rowCellSkips = _fill(Array(display.columns.length), false);
|
||||
}
|
||||
|
||||
getRow(rowIndex): PerspectiveDisplayRow {
|
||||
@@ -95,6 +96,8 @@ export class PerspectiveDisplayRow {
|
||||
|
||||
rowData: any[] = [];
|
||||
rowSpans: number[] = null;
|
||||
rowCellSkips: boolean[] = null;
|
||||
|
||||
rowJoinIds: number[] = [];
|
||||
incompleteRowsIndicator: string[] = null;
|
||||
}
|
||||
@@ -113,19 +116,19 @@ export class PerspectiveDisplay {
|
||||
this.columnLevelCount = _max(this.columns.map(x => x.parentNodes.length)) + 1;
|
||||
const collectedRows = this.collectRows(rows, root.childNodes);
|
||||
// dbg('collected rows', collectedRows);
|
||||
// console.log('COLLECTED', collectedRows);
|
||||
// console.log('COLLECTED', JSON.stringify(collectedRows, null, 2));
|
||||
// this.mergeRows(collectedRows);
|
||||
this.mergeRows(collectedRows);
|
||||
// dbg('merged rows', this.rows);
|
||||
|
||||
// console.log(
|
||||
// 'MERGED',
|
||||
// this.rows.map(r =>
|
||||
// r.incompleteRowsIndicator
|
||||
// ? `************************************ ${r.incompleteRowsIndicator.join('|')}`
|
||||
// : r.rowData.join('|')
|
||||
// )
|
||||
// );
|
||||
console.log(
|
||||
'MERGED',
|
||||
this.rows.map(r =>
|
||||
r.incompleteRowsIndicator
|
||||
? `************************************ ${r.incompleteRowsIndicator.join('|')}`
|
||||
: r.rowData.join('|')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
fillColumns(children: PerspectiveTreeNode[], parentNodes: PerspectiveTreeNode[]) {
|
||||
@@ -212,7 +215,7 @@ export class PerspectiveDisplay {
|
||||
row.rowJoinIds[col] == this.rows[lastFilledRow].rowJoinIds[col] &&
|
||||
row.rowJoinIds[col]
|
||||
) {
|
||||
row.rowData[col] = SKIP_CELL;
|
||||
row.rowCellSkips[col] = true;
|
||||
this.rows[lastFilledRow].rowSpans[col] = rowIndex - lastFilledRow + 1;
|
||||
} else {
|
||||
lastFilledRow = rowIndex;
|
||||
@@ -229,6 +232,8 @@ export class PerspectiveDisplay {
|
||||
this.mergeRow(collectedRow, resultRow);
|
||||
rows.push(resultRow);
|
||||
}
|
||||
// console.log('MERGED NOT FLAT', rows);
|
||||
console.log('MERGED NOT FLAT SUBROWS 0', rows[0].subrows[0]);
|
||||
for (const row of rows) {
|
||||
this.flushFlatRows(row);
|
||||
}
|
||||
@@ -244,7 +249,7 @@ export class PerspectiveDisplay {
|
||||
}
|
||||
resultRow.incompleteRowsIndicator = collectedRow.incompleteRowsIndicator;
|
||||
|
||||
let subRowCount = 0;
|
||||
// let subRowCount = 0;
|
||||
for (const subrows of collectedRow.subRowCollections) {
|
||||
let rowIndex = 0;
|
||||
for (const subrow of subrows.rows) {
|
||||
@@ -252,9 +257,9 @@ export class PerspectiveDisplay {
|
||||
this.mergeRow(subrow, targetRow);
|
||||
rowIndex++;
|
||||
}
|
||||
if (rowIndex > subRowCount) {
|
||||
subRowCount = rowIndex;
|
||||
}
|
||||
// if (rowIndex > subRowCount) {
|
||||
// subRowCount = rowIndex;
|
||||
// }
|
||||
}
|
||||
|
||||
const joinId = getJoinId();
|
||||
|
||||
88
packages/datalib/src/tests/PerspectiveDisplay.test.ts
Normal file
88
packages/datalib/src/tests/PerspectiveDisplay.test.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { TableInfo } from 'dbgate-types';
|
||||
import { PerspectiveDisplay } from '../PerspectiveDisplay';
|
||||
import { PerspectiveTableNode } from '../PerspectiveTreeNode';
|
||||
import { chinookDbInfo } from './chinookDbInfo';
|
||||
import { createPerspectiveConfig } from '../PerspectiveConfig';
|
||||
import artistDataFlat from './artistDataFlat';
|
||||
import artistDataAlbum from './artistDataAlbum';
|
||||
import artistDataAlbumTrack from './artistDataAlbumTrack';
|
||||
|
||||
test('test flat view', () => {
|
||||
const artistTable = chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
||||
const root = new PerspectiveTableNode(artistTable, chinookDbInfo, createPerspectiveConfig(), null, null, null, null);
|
||||
const display = new PerspectiveDisplay(root, artistDataFlat);
|
||||
|
||||
console.log(display.rows);
|
||||
expect(display.rows.length).toEqual(5);
|
||||
expect(display.rows[0]).toEqual(
|
||||
expect.objectContaining({
|
||||
rowData: ['AC/DC'],
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
test('test one level nesting', () => {
|
||||
const artistTable = chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
||||
const root = new PerspectiveTableNode(
|
||||
artistTable,
|
||||
chinookDbInfo,
|
||||
{ ...createPerspectiveConfig(), checkedColumns: ['Artist.Album'] },
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
const display = new PerspectiveDisplay(root, artistDataAlbum);
|
||||
|
||||
console.log(display.rows);
|
||||
expect(display.rows.length).toEqual(7);
|
||||
expect(display.rows[0]).toEqual(
|
||||
expect.objectContaining({
|
||||
rowData: ['AC/DC', 'For Those About To Rock We Salute You'],
|
||||
rowSpans: [2, 1],
|
||||
rowCellSkips: [false, false],
|
||||
})
|
||||
);
|
||||
expect(display.rows[1]).toEqual(
|
||||
expect.objectContaining({
|
||||
rowData: [undefined, 'Let There Be Rock'],
|
||||
rowSpans: [1, 1],
|
||||
rowCellSkips: [true, false],
|
||||
})
|
||||
);
|
||||
expect(display.rows[5]).toEqual(
|
||||
expect.objectContaining({
|
||||
rowData: ['Alanis Morissette', 'Jagged Little Pill'],
|
||||
rowSpans: [1, 1],
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
test('test two level nesting', () => {
|
||||
const artistTable = chinookDbInfo.tables.find(x => x.pureName == 'Artist');
|
||||
const root = new PerspectiveTableNode(
|
||||
artistTable,
|
||||
chinookDbInfo,
|
||||
{ ...createPerspectiveConfig(), checkedColumns: ['Artist.Album', 'Artist.Album.Track'] },
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
const display = new PerspectiveDisplay(root, artistDataAlbumTrack);
|
||||
|
||||
console.log(display.rows);
|
||||
expect(display.rows.length).toEqual(9);
|
||||
// expect(display.rows[0]).toEqual(
|
||||
// expect.objectContaining({
|
||||
// rowData: ['AC/DC', 'For Those About To Rock We Salute You'],
|
||||
// rowSpans: [2, 1],
|
||||
// })
|
||||
// );
|
||||
// expect(display.rows[5]).toEqual(
|
||||
// expect.objectContaining({
|
||||
// rowData: ['Alanis Morissette', 'Jagged Little Pill'],
|
||||
// rowSpans: [1, 1],
|
||||
// })
|
||||
// );
|
||||
});
|
||||
55
packages/datalib/src/tests/artistDataAlbum.ts
Normal file
55
packages/datalib/src/tests/artistDataAlbum.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
export default [
|
||||
{
|
||||
"ArtistId": 1,
|
||||
"Name": "AC/DC",
|
||||
"Album": [
|
||||
{
|
||||
"Title": "For Those About To Rock We Salute You",
|
||||
"ArtistId": 1
|
||||
},
|
||||
{
|
||||
"Title": "Let There Be Rock",
|
||||
"ArtistId": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ArtistId": 2,
|
||||
"Name": "Accept",
|
||||
"Album": [
|
||||
{
|
||||
"Title": "Balls to the Wall",
|
||||
"ArtistId": 2
|
||||
},
|
||||
{
|
||||
"Title": "Restless and Wild",
|
||||
"ArtistId": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ArtistId": 3,
|
||||
"Name": "Aerosmith",
|
||||
"Album": [
|
||||
{
|
||||
"Title": "Big Ones",
|
||||
"ArtistId": 3
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ArtistId": 4,
|
||||
"Name": "Alanis Morissette",
|
||||
"Album": [
|
||||
{
|
||||
"Title": "Jagged Little Pill",
|
||||
"ArtistId": 4
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"incompleteRowsIndicator": [
|
||||
"Artist"
|
||||
]
|
||||
}
|
||||
]
|
||||
78
packages/datalib/src/tests/artistDataAlbumTrack.ts
Normal file
78
packages/datalib/src/tests/artistDataAlbumTrack.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
export default [
|
||||
{
|
||||
ArtistId: 1,
|
||||
Name: 'AC/DC',
|
||||
Album: [
|
||||
{
|
||||
Title: 'For Those About To Rock We Salute You',
|
||||
AlbumId: 1,
|
||||
ArtistId: 1,
|
||||
Track: [
|
||||
{
|
||||
Name: 'For Those About To Rock (We Salute You)',
|
||||
AlbumId: 1,
|
||||
},
|
||||
{
|
||||
Name: 'Put The Finger On You',
|
||||
AlbumId: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
Title: 'Let There Be Rock',
|
||||
AlbumId: 4,
|
||||
ArtistId: 1,
|
||||
Track: [
|
||||
{
|
||||
Name: 'Go Down',
|
||||
AlbumId: 4,
|
||||
},
|
||||
{
|
||||
Name: 'Dog Eat Dog',
|
||||
AlbumId: 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
ArtistId: 2,
|
||||
Name: 'Accept',
|
||||
Album: [
|
||||
{
|
||||
Title: 'Balls to the Wall',
|
||||
AlbumId: 2,
|
||||
ArtistId: 2,
|
||||
Track: [
|
||||
{
|
||||
Name: 'Balls to the Wall',
|
||||
AlbumId: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
Title: 'Restless and Wild',
|
||||
AlbumId: 3,
|
||||
ArtistId: 2,
|
||||
Track: [
|
||||
{
|
||||
Name: 'Fast As a Shark',
|
||||
AlbumId: 3,
|
||||
},
|
||||
{
|
||||
Name: 'Restless and Wild',
|
||||
AlbumId: 3,
|
||||
},
|
||||
{
|
||||
Name: 'Princess of the Dawn',
|
||||
AlbumId: 3,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
incompleteRowsIndicator: ['Artist'],
|
||||
},
|
||||
];
|
||||
21
packages/datalib/src/tests/artistDataFlat.ts
Normal file
21
packages/datalib/src/tests/artistDataFlat.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
export default [
|
||||
{
|
||||
ArtistId: 1,
|
||||
Name: 'AC/DC',
|
||||
},
|
||||
{
|
||||
ArtistId: 2,
|
||||
Name: 'Accept',
|
||||
},
|
||||
{
|
||||
ArtistId: 3,
|
||||
Name: 'Aerosmith',
|
||||
},
|
||||
{
|
||||
ArtistId: 4,
|
||||
Name: 'Alanis Morissette',
|
||||
},
|
||||
{
|
||||
incompleteRowsIndicator: ['Artist'],
|
||||
},
|
||||
];
|
||||
1777
packages/datalib/src/tests/chinookDbInfo.ts
Normal file
1777
packages/datalib/src/tests/chinookDbInfo.ts
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user