CN-1238: 实体查询语法逻辑
This commit is contained in:
@@ -54,22 +54,22 @@
|
||||
<!-- 条件连接符 -->
|
||||
<template v-else-if="meta.meta === connection">
|
||||
<div class="connection__value">
|
||||
<div v-show="meta.isEditing">
|
||||
<el-select
|
||||
:placeholder="meta.value"
|
||||
v-model="meta.value"
|
||||
size="mini"
|
||||
@change="(value) => selectConnection(value, meta)"
|
||||
>
|
||||
<el-option
|
||||
v-for="(connection, index) in connectionList"
|
||||
:key="index"
|
||||
:label="connection.label"
|
||||
:value="connection.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<span v-show="!meta.isEditing" @click="connectionClick(meta)">{{meta.value}}</span>
|
||||
<!-- <div v-show="meta.isEditing">-->
|
||||
<!-- <el-select-->
|
||||
<!-- :placeholder="meta.value"-->
|
||||
<!-- v-model="meta.value"-->
|
||||
<!-- size="mini"-->
|
||||
<!-- @change="(value) => selectConnection(value, meta)"-->
|
||||
<!-- >-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="(connection, index) in connectionList"-->
|
||||
<!-- :key="index"-->
|
||||
<!-- :label="connection.label"-->
|
||||
<!-- :value="connection.value"-->
|
||||
<!-- ></el-option>-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </div>-->
|
||||
<span v-show="!meta.isEditing">{{meta.value}}</span>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
@@ -79,7 +79,6 @@
|
||||
<el-popover
|
||||
popper-class="my-popper-class"
|
||||
placement="top"
|
||||
:popper-style="{border: '1px red solid'}"
|
||||
trigger="hover"
|
||||
:content="$t('entity.switchToBasicSearch')"
|
||||
>
|
||||
@@ -88,6 +87,9 @@
|
||||
</template>
|
||||
</el-popover>
|
||||
</div>
|
||||
<div v-show="metaList.length>0" class="search__suffix-close" @click="cleanMetaList">
|
||||
<i class="el-icon-error"></i>
|
||||
</div>
|
||||
<div class="search__suffix" :class="showList ? 'new-search__suffix' : 'entity-explorer-search'" @click="search">
|
||||
<i class="el-icon-search"></i>
|
||||
</div>
|
||||
@@ -99,8 +101,8 @@
|
||||
import Meta, { connection, condition, columnType } from './meta/meta'
|
||||
import _ from 'lodash'
|
||||
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
||||
import Parser, { stringInQuot } from '@/components/advancedSearch/meta/parser'
|
||||
import { comparedEntityKey, overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
||||
import Parser, { handleMetaListToStr, stringInQuot } from '@/components/advancedSearch/meta/parser'
|
||||
import { comparedEntityKey, handleEntityTypeByStr, overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
||||
export default {
|
||||
name: 'TagMode',
|
||||
props: {
|
||||
@@ -329,7 +331,9 @@ export default {
|
||||
const parser = new Parser(this.columnList)
|
||||
const errorList = parser.validateMeta(this.metaList)
|
||||
if (_.isEmpty(errorList)) {
|
||||
this.$emit('search', parser.parseMeta(this.metaList))
|
||||
const str = handleMetaListToStr(this.metaList)
|
||||
const keyInfo = comparedEntityKey(handleEntityTypeByStr(str))
|
||||
this.$emit('search', { ...parser.parseStr(keyInfo.key), str: str })
|
||||
} else {
|
||||
this.$message.error(handleErrorTip(errorList[0]))
|
||||
}
|
||||
@@ -431,6 +435,9 @@ export default {
|
||||
newUrl = urlParamsHandler(window.location.href, query, newParam, clean)
|
||||
}
|
||||
overwriteUrl(newUrl)
|
||||
},
|
||||
cleanMetaList () {
|
||||
this.metaList = []
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
|
||||
@@ -36,7 +36,7 @@ import { toRaw } from 'vue'
|
||||
import _ from 'lodash'
|
||||
import { columnType } from '@/components/advancedSearch/meta/meta'
|
||||
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
||||
import { comparedEntityKey, overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
||||
import { comparedEntityKey, handleEntityTypeByStr, overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
||||
|
||||
export default {
|
||||
name: 'TextMode',
|
||||
@@ -57,6 +57,8 @@ export default {
|
||||
methods: {
|
||||
cleanParams () {
|
||||
toRaw(this.codeMirror).setValue('')
|
||||
this.isEdit = false
|
||||
this.isCloseIcon = false
|
||||
const routeQuery = this.$route.query
|
||||
delete routeQuery.q
|
||||
this.reloadUrl(routeQuery, 'cleanOldParams')
|
||||
@@ -72,9 +74,8 @@ export default {
|
||||
this.codeMirror.setOption('extraKeys', {
|
||||
Enter: (cm) => {}
|
||||
})
|
||||
const str = this.codeMirror.getValue().trim()
|
||||
this.codeMirror.on('focus', () => {
|
||||
if (str !== '') {
|
||||
if (this.codeMirror.getValue().trim() !== '') {
|
||||
this.isEdit = true
|
||||
this.isCloseIcon = true
|
||||
}
|
||||
@@ -95,7 +96,7 @@ export default {
|
||||
const str = this.codeMirror.getValue().trim()
|
||||
if (str) {
|
||||
const parser = new Parser(this.columnList)
|
||||
const keyInfo = comparedEntityKey(str)
|
||||
const keyInfo = comparedEntityKey(handleEntityTypeByStr(str))
|
||||
if (keyInfo.isKey) {
|
||||
const errorList = parser.validateStr(keyInfo.key)
|
||||
if (_.isEmpty(errorList)) {
|
||||
@@ -104,7 +105,7 @@ export default {
|
||||
this.$message.error(handleErrorTip(errorList[0]))
|
||||
}
|
||||
} else {
|
||||
this.$message.error(this.$t('tip.invalidQueryField') + keyInfo.key)
|
||||
this.$message.error(this.$t('tip.invalidQueryField') + ' ' + keyInfo.key)
|
||||
}
|
||||
} else {
|
||||
this.$emit('search', { q: '', str: '', metaList: [] })
|
||||
|
||||
@@ -13,11 +13,11 @@ export const defaultConnectionList = [
|
||||
{
|
||||
value: 'AND',
|
||||
label: 'AND'
|
||||
},
|
||||
{
|
||||
value: 'OR',
|
||||
label: 'OR'
|
||||
}
|
||||
// {
|
||||
// value: 'OR',
|
||||
// label: 'OR'
|
||||
// }
|
||||
]
|
||||
export default class Meta {
|
||||
// meta元数据有两种,一是condition,表示字段、操作符、值的组合,二是connection,是condition之间的连接符,AND | OR
|
||||
|
||||
@@ -348,8 +348,10 @@ export default class Parser {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (['o', 'a'].indexOf(s.toLowerCase()) > -1) {
|
||||
// } else if (['o', 'a'].indexOf(s.toLowerCase()) > -1) {
|
||||
} else if (['a'].indexOf(s.toLowerCase()) > -1) {
|
||||
// 前一位是否是空格,否则视为普通字符串
|
||||
// 处理连接符为or的情况
|
||||
if (s.toLowerCase() === 'o') {
|
||||
if (strArr[i + 1] && strArr[i + 1].toLowerCase() === 'r' && strArr[i + 2] && strArr[i + 2] === ' ') {
|
||||
token = new Token(types.connection, 'OR')
|
||||
@@ -763,3 +765,65 @@ export function stringInQuot (value) {
|
||||
export function handleOperatorSpace (operator) {
|
||||
return ['IN', 'NOT IN', 'LIKE', 'NOT LIKE'].indexOf(operator) > -1 ? ` ${operator} ` : operator
|
||||
}
|
||||
|
||||
/**
|
||||
* 将metaList转为字符串
|
||||
* @param metaList
|
||||
* @returns {string|*}
|
||||
*/
|
||||
export function handleMetaListToStr (metaList) {
|
||||
// 长度为1时,即模糊搜索,例如搜索框值为1.1.1.1,则直接返回1.1.1.1
|
||||
if (metaList && metaList.length === 1) {
|
||||
return metaList[0].column.label
|
||||
} else if (metaList && metaList.length > 1) {
|
||||
// 此为按语法搜索,将metaList转为字符串
|
||||
const newMetaList = []
|
||||
// 去除metaList的AND项
|
||||
metaList.forEach(item => {
|
||||
if (item.value !== 'AND') {
|
||||
newMetaList.push(item)
|
||||
}
|
||||
})
|
||||
|
||||
const newObj = combineLabel(newMetaList)
|
||||
const lastObj = {}
|
||||
for (const i in newObj) {
|
||||
if (newObj[i].indexOf('(') > -1) {
|
||||
// 原来为IN ()格式的直接保留
|
||||
lastObj[i] = `${i} IN ${newObj[i]}`
|
||||
} else if (newObj[i].indexOf(',') > -1) {
|
||||
// 格式为IP: '1.1.1.1,2.2.2.2'的,改成IP: "'1.1.1.1','2.2.2.2'",然后再()括号包裹
|
||||
let str = newObj[i]
|
||||
str = str.replace(/(\d+\.\d+\.\d+\.\d+),(\d+\.\d+\.\d+\.\d+)/g, "'$1','$2'")
|
||||
lastObj[i] = `${i} IN (${str})`
|
||||
} else {
|
||||
// 单独存在的,直接保留
|
||||
lastObj[i] = `${i} = ${newObj[i]}`
|
||||
}
|
||||
}
|
||||
|
||||
let str = ''
|
||||
for (const i in lastObj) {
|
||||
str += lastObj[i] + ' AND '
|
||||
}
|
||||
str = str.slice(0, -5)
|
||||
|
||||
return str
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将相同属性的label组合到一起,即IP='1.1.1.1' AND IP='2.2.2.2'组合成IP: '1.1.1.1,2.2.2.2'
|
||||
* @param list
|
||||
* @returns {*}
|
||||
*/
|
||||
const combineLabel = (list) => {
|
||||
return list.reduce((acc, cur) => {
|
||||
if (acc[cur.column.label]) {
|
||||
acc[cur.column.label] += `,${cur.value.label}`
|
||||
} else {
|
||||
acc[cur.column.label] = cur.value.label
|
||||
}
|
||||
return acc
|
||||
}, {})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user