CN-1265 fix: 修复实体模糊搜索时值被两个单引号包裹的问题
This commit is contained in:
@@ -115,7 +115,6 @@ import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
|||||||
import Parser, { handleMetaListToStr, stringInQuot } from '@/components/advancedSearch/meta/parser'
|
import Parser, { handleMetaListToStr, stringInQuot } from '@/components/advancedSearch/meta/parser'
|
||||||
import {
|
import {
|
||||||
comparedEntityKey,
|
comparedEntityKey,
|
||||||
getEntityTypeByValue,
|
|
||||||
handleEntityTypeByStr,
|
handleEntityTypeByStr,
|
||||||
overwriteUrl,
|
overwriteUrl,
|
||||||
urlParamsHandler
|
urlParamsHandler
|
||||||
@@ -245,16 +244,6 @@ export default {
|
|||||||
// 根据所选label在columnList中匹配label来确定操作符,一般为=,IN,tags操作符为has
|
// 根据所选label在columnList中匹配label来确定操作符,一般为=,IN,tags操作符为has
|
||||||
const obj = this.columnList.find(t => t.label === meta.column.label)
|
const obj = this.columnList.find(t => t.label === meta.column.label)
|
||||||
this.operatorList = obj ? obj.doc.constraints.operator_functions.split(',') : ['=', 'IN']
|
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)
|
}, 200)
|
||||||
},
|
},
|
||||||
connectionClick (meta) {
|
connectionClick (meta) {
|
||||||
|
|||||||
@@ -95,7 +95,13 @@ export default class Parser {
|
|||||||
str += ') '
|
str += ') '
|
||||||
} else if (meta.column.type === columnType.string) {
|
} else if (meta.column.type === columnType.string) {
|
||||||
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
|
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
|
||||||
|
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}' `
|
str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' `
|
||||||
|
}
|
||||||
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
|
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
|
||||||
const isWrapped = isSingleQuoteWrapping(meta.value.value)
|
const isWrapped = isSingleQuoteWrapping(meta.value.value)
|
||||||
// 如果值被单引号包裹,则不需要再添加单引号包裹,true为单引号包裹
|
// 如果值被单引号包裹,则不需要再添加单引号包裹,true为单引号包裹
|
||||||
@@ -157,7 +163,13 @@ export default class Parser {
|
|||||||
str += ') '
|
str += ') '
|
||||||
} else if (meta.column.type === columnType.string) {
|
} else if (meta.column.type === columnType.string) {
|
||||||
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
|
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
|
||||||
|
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}' `
|
str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' `
|
||||||
|
}
|
||||||
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
|
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
|
||||||
const isWrapped = isSingleQuoteWrapping(meta.value.value)
|
const isWrapped = isSingleQuoteWrapping(meta.value.value)
|
||||||
if (isWrapped) {
|
if (isWrapped) {
|
||||||
@@ -848,7 +860,14 @@ export function handleMetaListToStr (metaList) {
|
|||||||
const result = arr.some(item => newStr.includes(item))
|
const result = arr.some(item => newStr.includes(item))
|
||||||
if (result) {
|
if (result) {
|
||||||
if (metaList[0].operator.value.toLowerCase() === 'has') {
|
if (metaList[0].operator.value.toLowerCase() === 'has') {
|
||||||
|
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}')`
|
return `${metaList[0].operator.value}(${metaList[0].column.label},'${metaList[0].value.label}')`
|
||||||
|
}
|
||||||
} else if (metaList[0].value.label.indexOf('(') > -1) {
|
} else if (metaList[0].value.label.indexOf('(') > -1) {
|
||||||
// 避免如IN后面带()的,不添加单引号
|
// 避免如IN后面带()的,不添加单引号
|
||||||
return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}`
|
return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}`
|
||||||
|
|||||||
@@ -1503,7 +1503,7 @@ export const handleEntityTypeByStr = (str) => {
|
|||||||
newStr = newStr.replace(new RegExp(arr[i], 'g'), arr[i])
|
newStr = newStr.replace(new RegExp(arr[i], 'g'), arr[i])
|
||||||
}
|
}
|
||||||
// 检查str字段在arr中是否出现,true为出现过
|
// 检查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) {
|
if (newStr.indexOf(' and ') > -1) {
|
||||||
// 将单引号包裹的and拿出来放到数组tempList里,原来的单引号包裹内容用temp即'it is test keyword{键值}'代替
|
// 将单引号包裹的and拿出来放到数组tempList里,原来的单引号包裹内容用temp即'it is test keyword{键值}'代替
|
||||||
// 再将字符串用and转换为数组,遍历数组,发现值为temp的,获取键值,根据键值获取tempList的值组合起来,
|
// 再将字符串用and转换为数组,遍历数组,发现值为temp的,获取键值,根据键值获取tempList的值组合起来,
|
||||||
@@ -1547,6 +1547,12 @@ export const handleEntityTypeByStr = (str) => {
|
|||||||
newStr = newArr.join(' AND ')
|
newStr = newArr.join(' AND ')
|
||||||
return newStr
|
return newStr
|
||||||
} else if (result) {
|
} 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
|
return str
|
||||||
} else if (!result) {
|
} else if (!result) {
|
||||||
const regex = /^["']|["']$/
|
const regex = /^["']|["']$/
|
||||||
|
|||||||
Reference in New Issue
Block a user