import { EnumValue, enumValueObj } from '@/api/dataset'
let filterEnumMap = {}
const filterIdNameEnumMap = {}
const findFilterEnum = async (val: EnumValue) => {
const queryId = val.queryId
const displayId = val.displayId
const arr = await enumValueObj({ queryId: queryId, displayId: displayId, searchText: '' })
return arr?.reduce((acc, item) => {
acc[item[displayId]] = item[queryId]
return acc
}, {})
}
export const filterEnumParams = (queryParams, fieldId: string) => {
const resultMap = filterEnumMap[fieldId]
if (resultMap) {
const resultParams = []
queryParams.forEach(param => {
resultParams.push(resultMap[param] || param)
})
return resultParams
} else {
return queryParams
}
}
export const filterEnumParamsReduce = (queryParams, fieldId: string) => {
const resultMap = filterEnumMap[fieldId]
if (resultMap) {
const resultMapReduce = Object.fromEntries(
Object.entries(resultMap).map(([key, value]) => [value, key])
)
const resultParams = []
queryParams.forEach(param => {
resultParams.push(resultMapReduce[param] || param)
})
return resultParams
} else {
return queryParams
}
}
export const filterEnumMapSync = async componentData => {
filterEnumMap = {}
for (const element of componentData) {
if (element.component === 'VQuery') {
for (const filterItem of element.propValue) {
const { optionValueSource, field, displayId } = filterItem
if (optionValueSource === 1 && field.id) {
filterEnumMap[field.id] = await findFilterEnum({
queryId: field.id,
displayId,
searchText: ''
})
}
}
}
}
}
export function filterParamsOptions(params, paramsOption) {
if (!params || (Array.isArray(params) && params.length === 0)) {
return null
}
if (!paramsOption || paramsOption.length === 0) {
return null
}
const optionSet = new Set(paramsOption)
const prefixSet = new Set()
paramsOption.forEach(option => {
if (option.includes('-de-')) {
const parts = option.split('-de-')
for (let i = 1; i < parts.length; i++) {
const prefix = parts.slice(0, i).join('-de-')
prefixSet.add(prefix)
}
}
})
function checkValueExists(value) {
if (optionSet.has(value)) {
return true
}
if (value.includes('-de-')) {
const parts = value.split('-de-')
for (let i = 1; i < parts.length; i++) {
const prefix = parts.slice(0, i).join('-de-')
if (optionSet.has(prefix)) {
return true
}
}
}
if (
Array.from(optionSet).some(option => option.startsWith(value + '-de-') || option === value)
) {
return true
}
if (prefixSet.has(value)) {
return true
}
return false
}
if (typeof params === 'string') {
return checkValueExists(params) ? params : null
}
if (Array.isArray(params)) {
const filtered = params.filter(value => typeof value === 'string' && checkValueExists(value))
return filtered.length > 0 ? filtered : null
}
return null
}