기존 useEffect 내부 코드
// targetRulesId 변화에 따른 진단 대상 테이블, 컬럼, 규칙 개수 count
React.useEffect(() => {
if (targetRulesId) {
let selectedRules = []
for (let i = 0; i < targetRulesId.length; i++) {
selectedRules.push(
diagRules.filter(rules => rules.id == targetRulesId[i])[0]
)
}
if (selectedRules[0]) {
const tableCount = {}
const tables = selectedRules.map(rules => {
return rules['tableName']
})
tables.forEach(function (x) {
tableCount[x] = (tableCount[x] || 0) + 1
})
const columnCount = {}
const columns = selectedRules.map(rules => {
return rules['columnId']
})
columns.forEach(function (x) {
columnCount[x] = (columnCount[x] || 0) + 1
})
setDiagTarget({
tableCount: Object.keys(tableCount).length,
columnCount: Object.keys(columnCount).length,
rulesCount: selectedRules.length,
})
} else {
setDiagTarget(null)
}
}
}, [targetRulesId])
진단 대상 테이블, 컬럼, 규칙 을 checked 된 개수 만큼 count 하고 있는 코드이다.
현재는 정직하게 각각의 테이블/ 컬럼/ 규칙의 개수 만큼 count 하고 있는데,
문제는 최근 코드에서 스키마 도 기준에 포함된 상황이라
스키마 또한 필터링 조건에 들어가야 각 개수를 제대로 체크할 수 있도록 바꾸어야 한다.
스키마를 따로 쪼개서 count 하는 조건을 넣어야 하나 고민했는데
생각해보니, 같은 스키마 안의 같은 테이블이 아니라면 개수가 count 되는 것이 맞는 것 같아
단순한 concat 으로도 구별이 가능할 것으로 판단해서 로직을 조금만 변경하였다.
const schemaCount = {}
const schema = selectedRules.map(rules => {
return rules['schemaName']
})
schema.forEach(function (x) {
schemaCount[x] = (schemaCount[x] || 0) + 1
})
const tableCount = {}
const tables = selectedRules.map(rules => {
return rules['schemaName'].concat(rules['tableName'])
})
tables.forEach(function (x) {
tableCount[x] = (tableCount[x] || 0) + 1
})
const columnCount = {}
const columns = selectedRules.map(rules => {
return rules['schemaName'].concat(rules['tableName']).concat(rules['columnId'])
})
columns.forEach(function (x) {
columnCount[x] = (columnCount[x] || 0) + 1
})
스키마 - 테이블 - 컬럼 자체가 중복이 되지 않으면 count 하는 로직으로 원하는 결과물이 출력된다.
(스키마를 count 하는 부분은 새로 추가)
진단 규칙 개수는 rules count length 로 출력된다.
결과물은 완성 되었고,
코드 내용 자체가 중복 되는 내용이 많은 것 같아서 다듬어서 커밋하려고 한다.
코드를 간소화 하다 보니,
count 가 되는 부분에서는 Object.keys() 를 사용하고 있는 것을 다시 한 번 보게 되었다.
위에서 쓰던 코드가 비효율적인 것이 확실해져서
아래와 같이 selectedRules 를 직접 forEach 시킨 후, 각 object 에 담아서 count 하는 방식으로 변경하였다.
// targetRulesId 변화에 따른 진단 대상 테이블, 컬럼, 규칙 개수 count
React.useEffect(() => {
if (targetRulesId) {
let selectedRules = []
for (let i = 0; i < targetRulesId.length; i++) {
selectedRules.push(
diagRules.filter(rules => rules.id == targetRulesId[i])[0]
)
}
if (selectedRules[0]) {
const schemaCount = {}
const tableCount = {}
const columnCount = {}
selectedRules.forEach(data => {
schemaCount[data['schemaName']] = (schemaCount[data['schemaName']] || 0) + 1;
tableCount[data['schemaName'].concat(data['tableName'])] = (data['tableName'] || 0) + 1;
columnCount[data['schemaName'].concat(data['tableName'].concat(data['columnId']))] = (data['columnId'] || 0) + 1;
})
setDiagTarget({
schemaCount: Object.keys(schemaCount).length,
tableCount: Object.keys(tableCount).length,
columnCount: Object.keys(columnCount).length,
rulesCount: selectedRules.length,
})
} else {
setDiagTarget(null)
}
}
}, [targetRulesId])
** 코드 수정 하였습니다. 이쪽에서도 concat 이 필요하네요
** 더 간단명료하게 수정하는 방식이 있을 것 같은데 혹시 아이디어 있으신 분 코멘트 주시면 정말x2 감사하겠습니다! (_ _)
처음 위와 같은 중복 count 방식이 특이하다고 생각됐었는데,
내 입장으로서는 생각 못 해 볼만한 집계 방식이라 굉장히 유용한 것 같다.
위의 코드는 뜯어보기에는 불편할 것 같고
아래와 같은 구분 방식 & Object.keys() length count 라면 중복 카운팅에 활용하기 좋을 것 같다.
const tableCount = {}
const tables = selectedRules.map(rules => {
return rules['schemaName'].concat(rules['tableName'])
})
tables.forEach(function (x) {
tableCount[x] = (tableCount[x] || 0) + 1
})
setDiagTarget({
schemaCount: Object.keys(schemaCount).length,
tableCount: Object.keys(tableCount).length,
columnCount: Object.keys(columnCount).length,
rulesCount: selectedRules.length,
})