비즈니스로그 멀티 조건 조회 가능하게 수정

This commit is contained in:
2025-04-14 18:06:16 +09:00
parent d5f28d9dba
commit eed02de94e

View File

@@ -1,5 +1,6 @@
package com.caliverse.admin.logs.logservice.businesslogservice;
import com.caliverse.admin.domain.entity.EInputType;
import com.caliverse.admin.domain.entity.common.SearchUserType;
import com.caliverse.admin.domain.request.LogGenericRequest;
import com.caliverse.admin.global.common.constants.AdminConstants;
@@ -145,35 +146,73 @@ public class BusinessLogGenericService extends BusinessLogServiceBase {
filter.getValue() != null) {
Object convertedValue = null;
String valueStr = filter.getValue();
// 필드 타입에 따른 값 변환만 수행
switch (filter.getFieldType()) {
case Number:
try {
if (filter.getValue().contains(".")) {
convertedValue = Double.parseDouble(filter.getValue());
} else {
convertedValue = Long.parseLong(filter.getValue());
// OR 조건 패턴 확인 (괄호와 파이프 문자 포함)
boolean isOrPattern = valueStr.startsWith("(") && valueStr.endsWith(")") && valueStr.contains("|");
if (isOrPattern) {
// OR 패턴은 문자열 그대로 사용
convertedValue = valueStr;
} else {
// 일반 값 변환
switch (filter.getFieldType()) {
case Number:
try {
if (valueStr.contains(".")) {
convertedValue = Double.parseDouble(valueStr);
} else {
convertedValue = Long.parseLong(valueStr);
}
} catch (NumberFormatException e) {
log.warn("Failed to convert value to number: {}", valueStr, e);
convertedValue = valueStr;
}
} catch (NumberFormatException e) {
log.warn("Failed to convert value to number: {}", filter.getValue(), e);
convertedValue = filter.getValue();
}
break;
break;
case Boolean:
convertedValue = Boolean.parseBoolean(filter.getValue());
break;
case Boolean:
convertedValue = Boolean.parseBoolean(valueStr);
break;
case String:
case None:
default:
convertedValue = filter.getValue();
break;
case String:
case None:
default:
convertedValue = valueStr;
break;
}
}
// 중첩된 JSON 구조에 맞게 $regex를 사용한 패턴 매칭
String regexPattern = "\"" + filter.getFieldName() + "\":" + CommonUtils.formatValueForRegex(convertedValue);
String regexPattern;
if (isOrPattern) {
// OR 패턴 처리
String innerValues = valueStr.substring(1, valueStr.length() - 1);
String[] parts = innerValues.split("\\|");
// 필드 이름과 함께 각 값에 대한 정규식 패턴 구성
StringBuilder orPatternBuilder = new StringBuilder();
orPatternBuilder.append("\"").append(filter.getFieldName()).append("\":(");
for (int i = 0; i < parts.length; i++) {
if (i > 0) orPatternBuilder.append("|");
String part = parts[i].trim();
// 필드 타입에 맞게 값 형식화
if (filter.getFieldType() == EInputType.String) {
orPatternBuilder.append("\"").append(part.replace("\"", "\\\"")).append("\"");
} else {
orPatternBuilder.append(part);
}
}
orPatternBuilder.append(")");
regexPattern = orPatternBuilder.toString();
} else {
// 단일 값 처리
regexPattern = "\"" + filter.getFieldName() + "\":" + CommonUtils.formatValueForRegex(convertedValue);
}
Document filterDoc = new Document("message", new Document("$regex", regexPattern));
filterConditions.add(filterDoc);
}