검색기능 수정
This commit is contained in:
@@ -88,16 +88,51 @@ export class EntityJoinService {
|
||||
orderBy: string = "",
|
||||
limit?: number,
|
||||
offset?: number
|
||||
): string {
|
||||
): { query: string; aliasMap: Map<string, string> } {
|
||||
try {
|
||||
// 기본 SELECT 컬럼들
|
||||
const baseColumns = selectColumns.map((col) => `main.${col}`).join(", ");
|
||||
|
||||
// Entity 조인 컬럼들 (COALESCE로 NULL을 빈 문자열로 처리)
|
||||
// 별칭 매핑 생성 (JOIN 절과 동일한 로직)
|
||||
const aliasMap = new Map<string, string>();
|
||||
const usedAliasesForColumns = new Set<string>();
|
||||
|
||||
// joinConfigs를 참조 테이블별로 중복 제거하여 별칭 생성
|
||||
const uniqueReferenceTableConfigs = joinConfigs.reduce((acc, config) => {
|
||||
if (
|
||||
!acc.some(
|
||||
(existingConfig) =>
|
||||
existingConfig.referenceTable === config.referenceTable
|
||||
)
|
||||
) {
|
||||
acc.push(config);
|
||||
}
|
||||
return acc;
|
||||
}, [] as EntityJoinConfig[]);
|
||||
|
||||
logger.info(
|
||||
`🔧 별칭 생성 시작: ${uniqueReferenceTableConfigs.length}개 고유 테이블`
|
||||
);
|
||||
|
||||
uniqueReferenceTableConfigs.forEach((config) => {
|
||||
let baseAlias = config.referenceTable.substring(0, 3);
|
||||
let alias = baseAlias;
|
||||
let counter = 1;
|
||||
|
||||
while (usedAliasesForColumns.has(alias)) {
|
||||
alias = `${baseAlias}${counter}`;
|
||||
counter++;
|
||||
}
|
||||
usedAliasesForColumns.add(alias);
|
||||
aliasMap.set(config.referenceTable, alias);
|
||||
logger.info(`🔧 별칭 생성: ${config.referenceTable} → ${alias}`);
|
||||
});
|
||||
|
||||
const joinColumns = joinConfigs
|
||||
.map(
|
||||
(config) =>
|
||||
`COALESCE(${config.referenceTable.substring(0, 3)}.${config.displayColumn}, '') AS ${config.aliasColumn}`
|
||||
`COALESCE(${aliasMap.get(config.referenceTable)}.${config.displayColumn}, '') AS ${config.aliasColumn}`
|
||||
)
|
||||
.join(", ");
|
||||
|
||||
@@ -109,10 +144,10 @@ export class EntityJoinService {
|
||||
// FROM 절 (메인 테이블)
|
||||
const fromClause = `FROM ${tableName} main`;
|
||||
|
||||
// LEFT JOIN 절들
|
||||
const joinClauses = joinConfigs
|
||||
.map((config, index) => {
|
||||
const alias = config.referenceTable.substring(0, 3); // user_info -> use, companies -> com
|
||||
// LEFT JOIN 절들 (위에서 생성한 별칭 매핑 사용, 중복 테이블 제거)
|
||||
const joinClauses = uniqueReferenceTableConfigs
|
||||
.map((config) => {
|
||||
const alias = aliasMap.get(config.referenceTable);
|
||||
return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn}`;
|
||||
})
|
||||
.join("\n");
|
||||
@@ -145,7 +180,10 @@ export class EntityJoinService {
|
||||
.join("\n");
|
||||
|
||||
logger.debug(`생성된 Entity 조인 쿼리:`, query);
|
||||
return query;
|
||||
return {
|
||||
query: query,
|
||||
aliasMap: aliasMap,
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error("Entity 조인 쿼리 생성 실패", error);
|
||||
throw error;
|
||||
@@ -238,10 +276,40 @@ export class EntityJoinService {
|
||||
whereClause: string = ""
|
||||
): string {
|
||||
try {
|
||||
// 별칭 매핑 생성 (buildJoinQuery와 동일한 로직)
|
||||
const aliasMap = new Map<string, string>();
|
||||
const usedAliases = new Set<string>();
|
||||
|
||||
// joinConfigs를 참조 테이블별로 중복 제거하여 별칭 생성
|
||||
const uniqueReferenceTableConfigs = joinConfigs.reduce((acc, config) => {
|
||||
if (
|
||||
!acc.some(
|
||||
(existingConfig) =>
|
||||
existingConfig.referenceTable === config.referenceTable
|
||||
)
|
||||
) {
|
||||
acc.push(config);
|
||||
}
|
||||
return acc;
|
||||
}, [] as EntityJoinConfig[]);
|
||||
|
||||
uniqueReferenceTableConfigs.forEach((config) => {
|
||||
let baseAlias = config.referenceTable.substring(0, 3);
|
||||
let alias = baseAlias;
|
||||
let counter = 1;
|
||||
|
||||
while (usedAliases.has(alias)) {
|
||||
alias = `${baseAlias}${counter}`;
|
||||
counter++;
|
||||
}
|
||||
usedAliases.add(alias);
|
||||
aliasMap.set(config.referenceTable, alias);
|
||||
});
|
||||
|
||||
// JOIN 절들 (COUNT에서는 SELECT 컬럼 불필요)
|
||||
const joinClauses = joinConfigs
|
||||
.map((config, index) => {
|
||||
const alias = config.referenceTable.substring(0, 3);
|
||||
const joinClauses = uniqueReferenceTableConfigs
|
||||
.map((config) => {
|
||||
const alias = aliasMap.get(config.referenceTable);
|
||||
return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn}`;
|
||||
})
|
||||
.join("\n");
|
||||
|
||||
Reference in New Issue
Block a user