mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-30 10:23:57 +00:00
designer - aggregate, group by, order by
This commit is contained in:
@@ -29,7 +29,8 @@ export function dumpSqlExpression(dmp: SqlDumper, expr: Expression) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'call':
|
case 'call':
|
||||||
dmp.put('%s(%s', expr.func, expr.argsPrefix);
|
dmp.put('%s(', expr.func);
|
||||||
|
if (expr.argsPrefix) dmp.put('%s ', expr.argsPrefix);
|
||||||
dmp.putCollection(',', expr.args, (x) => dumpSqlExpression(dmp, x));
|
dmp.putCollection(',', expr.args, (x) => dumpSqlExpression(dmp, x));
|
||||||
dmp.put(')');
|
dmp.put(')');
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -88,14 +88,62 @@ export class DesignerQueryDumper {
|
|||||||
const topLevelColumns = this.designer.columns.filter((col) =>
|
const topLevelColumns = this.designer.columns.filter((col) =>
|
||||||
topLevelTables.find((tbl) => tbl.designerId == col.designerId)
|
topLevelTables.find((tbl) => tbl.designerId == col.designerId)
|
||||||
);
|
);
|
||||||
|
const selectIsGrouped = !!topLevelColumns.find((x) => x.isGrouped || (x.aggregate && x.aggregate != '---'));
|
||||||
const outputColumns = topLevelColumns.filter((x) => x.isOutput);
|
const outputColumns = topLevelColumns.filter((x) => x.isOutput);
|
||||||
if (outputColumns.length == 0) {
|
if (outputColumns.length == 0) {
|
||||||
res.selectAll = true;
|
res.selectAll = true;
|
||||||
} else {
|
} else {
|
||||||
res.columns = outputColumns.map((col) => ({
|
res.columns = outputColumns.map((col) => {
|
||||||
|
const source = findQuerySource(this.designer, col.designerId);
|
||||||
|
const { columnName } = col;
|
||||||
|
let { alias } = col;
|
||||||
|
if (selectIsGrouped && !col.isGrouped) {
|
||||||
|
// use aggregate
|
||||||
|
const aggregate = col.aggregate == null || col.aggregate == '---' ? 'MAX' : col.aggregate;
|
||||||
|
if (!alias) alias = `${aggregate}(${columnName})`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
exprType: 'call',
|
||||||
|
func: aggregate == 'COUNT DISTINCT' ? 'COUNT' : aggregate,
|
||||||
|
argsPrefix: aggregate == 'COUNT DISTINCT' ? 'DISTINCT' : null,
|
||||||
|
alias,
|
||||||
|
args: [
|
||||||
|
{
|
||||||
|
exprType: 'column',
|
||||||
|
columnName,
|
||||||
|
source,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
exprType: 'column',
|
||||||
|
columnName,
|
||||||
|
alias,
|
||||||
|
source,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupedColumns = topLevelColumns.filter((x) => x.isGrouped);
|
||||||
|
if (groupedColumns.length > 0) {
|
||||||
|
res.groupBy = groupedColumns.map((col) => ({
|
||||||
exprType: 'column',
|
exprType: 'column',
|
||||||
columnName: col.columnName,
|
columnName: col.columnName,
|
||||||
alias: col.alias,
|
source: findQuerySource(this.designer, col.designerId),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const orderColumns = _.sortBy(
|
||||||
|
topLevelColumns.filter((x) => x.sortOrder),
|
||||||
|
(x) => Math.abs(x.sortOrder)
|
||||||
|
);
|
||||||
|
if (orderColumns.length > 0) {
|
||||||
|
res.orderBy = orderColumns.map((col) => ({
|
||||||
|
exprType: 'column',
|
||||||
|
direction: col.sortOrder < 0 ? 'DESC' : 'ASC',
|
||||||
|
columnName: col.columnName,
|
||||||
source: findQuerySource(this.designer, col.designerId),
|
source: findQuerySource(this.designer, col.designerId),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ export default function QueryDesignColumns({ value, onChange }) {
|
|||||||
<TableColumn
|
<TableColumn
|
||||||
fieldName="aggregate"
|
fieldName="aggregate"
|
||||||
header="Aggregate"
|
header="Aggregate"
|
||||||
formatter={(row) => (
|
formatter={(row) =>
|
||||||
|
!row.isGrouped && (
|
||||||
<SelectField
|
<SelectField
|
||||||
value={row.aggregate}
|
value={row.aggregate}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
@@ -86,7 +87,8 @@ export default function QueryDesignColumns({ value, onChange }) {
|
|||||||
<option value="SUM">SUM</option>
|
<option value="SUM">SUM</option>
|
||||||
<option value="AVG">AVG</option>
|
<option value="AVG">AVG</option>
|
||||||
</SelectField>
|
</SelectField>
|
||||||
)}
|
)
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<TableColumn
|
<TableColumn
|
||||||
fieldName="sortOrder"
|
fieldName="sortOrder"
|
||||||
@@ -95,7 +97,7 @@ export default function QueryDesignColumns({ value, onChange }) {
|
|||||||
<SelectField
|
<SelectField
|
||||||
value={row.sortOrder}
|
value={row.sortOrder}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
changeColumn({ ...row, sortOrder: e.target.value });
|
changeColumn({ ...row, sortOrder: parseInt(e.target.value) });
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<option value="0">---</option>
|
<option value="0">---</option>
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ export type DesignerColumnInfo = {
|
|||||||
columnName: string;
|
columnName: string;
|
||||||
alias?: string;
|
alias?: string;
|
||||||
isGrouped?: boolean;
|
isGrouped?: boolean;
|
||||||
|
aggregate?: string;
|
||||||
isOutput?: boolean;
|
isOutput?: boolean;
|
||||||
|
sortOrder?: number;
|
||||||
filter: string;
|
filter: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user