diff --git a/src/components/advancedSearch/TagMode.vue b/src/components/advancedSearch/TagMode.vue index 2b879b8c..f9db90c4 100644 --- a/src/components/advancedSearch/TagMode.vue +++ b/src/components/advancedSearch/TagMode.vue @@ -115,7 +115,6 @@ import { handleErrorTip } from '@/components/advancedSearch/meta/error' import Parser, { handleMetaListToStr, stringInQuot } from '@/components/advancedSearch/meta/parser' import { comparedEntityKey, - getEntityTypeByValue, handleEntityTypeByStr, overwriteUrl, urlParamsHandler @@ -245,16 +244,6 @@ export default { // 根据所选label在columnList中匹配label来确定操作符,一般为=,IN,tags操作符为has const obj = this.columnList.find(t => t.label === meta.column.label) this.operatorList = obj ? obj.doc.constraints.operator_functions.split(',') : ['=', 'IN'] - - // 用户模糊搜索,则自动匹配实体类型和结构 - if (meta.column.type === columnType.fullText) { - meta.operator.value = '=' - meta.operator.show = true - meta.value.value = `'${meta.column.label}'` - meta.value.label = `'${meta.column.label}'` - meta.column.label = getEntityTypeByValue(meta.column.label) - meta.column.type = 'string' - } }, 200) }, connectionClick (meta) { diff --git a/src/components/advancedSearch/meta/parser.js b/src/components/advancedSearch/meta/parser.js index 3a4b9658..5ae10afc 100644 --- a/src/components/advancedSearch/meta/parser.js +++ b/src/components/advancedSearch/meta/parser.js @@ -95,7 +95,13 @@ export default class Parser { str += ') ' } else if (meta.column.type === columnType.string) { if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) { - str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' ` + const isWrapped = isSingleQuoteWrapping(meta.value.value) + if (isWrapped || meta.value.value.indexOf("''") > -1) { + // 如xi''an这种情况,不需要再添加单引号 + str += `${meta.column.label} ${meta.operator.value} ${meta.value.value} ` + } else { + str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' ` + } } else if (meta.operator.value.toLowerCase().indexOf('has') > -1) { const isWrapped = isSingleQuoteWrapping(meta.value.value) // 如果值被单引号包裹,则不需要再添加单引号包裹,true为单引号包裹 @@ -157,7 +163,13 @@ export default class Parser { str += ') ' } else if (meta.column.type === columnType.string) { if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) { - str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' ` + const isWrapped = isSingleQuoteWrapping(meta.value.value) + if (isWrapped || meta.value.value.indexOf("''") > -1) { + // 如xi''an这种情况,不需要再添加单引号 + str += `${meta.column.label} ${meta.operator.value} ${meta.value.value} ` + } else { + str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' ` + } } else if (meta.operator.value.toLowerCase().indexOf('has') > -1) { const isWrapped = isSingleQuoteWrapping(meta.value.value) if (isWrapped) { @@ -848,7 +860,14 @@ export function handleMetaListToStr (metaList) { const result = arr.some(item => newStr.includes(item)) if (result) { if (metaList[0].operator.value.toLowerCase() === 'has') { - return `${metaList[0].operator.value}(${metaList[0].column.label},'${metaList[0].value.label}')` + const isWrapped = isSingleQuoteWrapping(metaList[0].value.label) + // 如果值被单引号包裹,则不需要再添加单引号包裹,true为单引号包裹 + if (isWrapped) { + // 操作符为has时,has函数需要提前,格式为has(label,value) + return `${metaList[0].operator.value}(${metaList[0].column.label},${metaList[0].value.label})` + } else { + return `${metaList[0].operator.value}(${metaList[0].column.label},'${metaList[0].value.label}')` + } } else if (metaList[0].value.label.indexOf('(') > -1) { // 避免如IN后面带()的,不添加单引号 return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}` diff --git a/src/utils/tools.js b/src/utils/tools.js index 3a9ae468..fca63979 100644 --- a/src/utils/tools.js +++ b/src/utils/tools.js @@ -1503,7 +1503,7 @@ export const handleEntityTypeByStr = (str) => { newStr = newStr.replace(new RegExp(arr[i], 'g'), arr[i]) } // 检查str字段在arr中是否出现,true为出现过 - const result = arr.some(item => newStr.includes(item)) + const result = arr.some(item => newStr.toLowerCase().includes(item)) if (newStr.indexOf(' and ') > -1) { // 将单引号包裹的and拿出来放到数组tempList里,原来的单引号包裹内容用temp即'it is test keyword{键值}'代替 // 再将字符串用and转换为数组,遍历数组,发现值为temp的,获取键值,根据键值获取tempList的值组合起来, @@ -1547,6 +1547,12 @@ export const handleEntityTypeByStr = (str) => { newStr = newArr.join(' AND ') return newStr } else if (result) { + // 不区分大小写,用columnList里的label + arr.forEach(item => { + if (str.toLowerCase().indexOf(item.toLowerCase()) > -1) { + str = str.replace(new RegExp(item, 'gi'), item) + } + }) return str } else if (!result) { const regex = /^["']|["']$/