62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
|
|
import { QueryResult, ChartConfig, ChartData, ChartDataset } from "../types";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 쿼리 결과를 차트 데이터로 변환
|
||
|
|
*/
|
||
|
|
export function transformQueryResultToChartData(queryResult: QueryResult, config: ChartConfig): ChartData | null {
|
||
|
|
if (!queryResult || !queryResult.rows.length || !config.xAxis) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
// X축 라벨 추출
|
||
|
|
const labels = queryResult.rows.map((row) => String(row[config.xAxis!] || ""));
|
||
|
|
|
||
|
|
// Y축 데이터 추출
|
||
|
|
const yAxisFields = Array.isArray(config.yAxis) ? config.yAxis : config.yAxis ? [config.yAxis] : [];
|
||
|
|
|
||
|
|
if (yAxisFields.length === 0) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 각 Y축 필드에 대해 데이터셋 생성
|
||
|
|
const datasets: ChartDataset[] = yAxisFields.map((field, index) => {
|
||
|
|
const data = queryResult.rows.map((row) => {
|
||
|
|
const value = row[field];
|
||
|
|
return typeof value === "number" ? value : parseFloat(String(value)) || 0;
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
label: field,
|
||
|
|
data,
|
||
|
|
color: config.colors?.[index],
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
labels,
|
||
|
|
datasets,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* API 응답을 차트 데이터로 변환
|
||
|
|
*/
|
||
|
|
export function transformApiResponseToChartData(
|
||
|
|
apiData: Record<string, unknown>[],
|
||
|
|
config: ChartConfig,
|
||
|
|
): ChartData | null {
|
||
|
|
// API 응답을 QueryResult 형식으로 변환
|
||
|
|
if (!apiData || apiData.length === 0 || !config.xAxis) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
const queryResult: QueryResult = {
|
||
|
|
columns: Object.keys(apiData[0]),
|
||
|
|
rows: apiData,
|
||
|
|
totalRows: apiData.length,
|
||
|
|
executionTime: 0,
|
||
|
|
};
|
||
|
|
|
||
|
|
return transformQueryResultToChartData(queryResult, config);
|
||
|
|
}
|