feat: 搜索框(全文搜索,缺搜索历史)
This commit is contained in:
@@ -87,7 +87,7 @@
|
||||
<script>
|
||||
import Meta, { connection, condition, columnType } from './meta/meta'
|
||||
import _ from 'lodash'
|
||||
import SqlParser, { stringInQuot } from '@/utils/sql-parser'
|
||||
import SqlParser, { stringInQuot } from '@/components/advancedSearch/meta/sql-parser'
|
||||
export default {
|
||||
name: 'TagMode',
|
||||
props: {
|
||||
@@ -183,6 +183,7 @@ export default {
|
||||
},
|
||||
columnBlur (meta, index) {
|
||||
setTimeout(() => {
|
||||
meta.column.name = meta.column.name.replace(/"/g, '')
|
||||
meta.column.isEditing = false
|
||||
if (meta.isEmpty()) {
|
||||
if (this.metaList.length > 1) {
|
||||
@@ -211,6 +212,7 @@ export default {
|
||||
meta.operator.isEditing = true
|
||||
},
|
||||
valueBlur (meta) {
|
||||
meta.value.value = meta.value.value.replace(/"/g, "'")
|
||||
meta.value.label = meta.value.value // label是显示,value是实际值;目前的需求label和value是相等的,
|
||||
meta.value.isEditing = !meta.isCompleteCondition()
|
||||
},
|
||||
@@ -235,7 +237,6 @@ export default {
|
||||
changeMode () {
|
||||
const parser = new SqlParser(this.metaList, this.columnList)
|
||||
const { metaList, formatSql } = parser.formatMetaList()
|
||||
console.info(formatSql)
|
||||
this.metaList = metaList
|
||||
this.$emit('changeMode', 'text', formatSql)
|
||||
},
|
||||
|
||||
@@ -18,7 +18,7 @@ import 'codemirror/addon/hint/show-hint'
|
||||
import 'codemirror/addon/hint/show-hint.css'
|
||||
import 'codemirror/addon/display/placeholder'
|
||||
import 'codemirror/mode/sql/sql'
|
||||
import SqlParser, { stringInQuot } from '@/utils/sql-parser'
|
||||
import SqlParser, { stringInQuot } from '@/components/advancedSearch/meta/sql-parser'
|
||||
import CodeMirror from 'codemirror'
|
||||
import { toRaw } from 'vue'
|
||||
import { columnType } from '@/components/advancedSearch/meta/meta'
|
||||
@@ -43,15 +43,27 @@ export default {
|
||||
placeholder: 'Enter...',
|
||||
lineNumbers: false
|
||||
})
|
||||
this.codeMirror.setOption('extraKeys', {
|
||||
Enter: (cm) => {
|
||||
this.search()
|
||||
}
|
||||
})
|
||||
},
|
||||
search () {
|
||||
const originalSql = this.codeMirror.getValue()
|
||||
let originalSql = this.codeMirror.getValue()
|
||||
if (originalSql) {
|
||||
originalSql = originalSql.replace(/"/g, '')
|
||||
const parser = new SqlParser(originalSql, this.columnList)
|
||||
const errorList = parser.validate()
|
||||
if (this.$_.isEmpty(errorList)) {
|
||||
const { metaList, formatSql } = parser.formatSql()
|
||||
toRaw(this.codeMirror).setValue(formatSql)
|
||||
this.$emit('search', metaList, formatSql)
|
||||
} else {
|
||||
console.info(errorList)
|
||||
}
|
||||
} else {
|
||||
this.$emit('search')
|
||||
}
|
||||
},
|
||||
changeMode () {
|
||||
|
||||
@@ -32,7 +32,6 @@ export default class SqlParser extends SqlParserVisitor {
|
||||
this.visit(tree)
|
||||
if (this.metaList.length === 0 && this.tempMeta.column.name) {
|
||||
this.tempMeta.column.type = columnType.fullText
|
||||
this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name)
|
||||
this.tempMeta.column.label = this.tempMeta.column.name
|
||||
this.metaList.push(cloneMeta(this.tempMeta))
|
||||
}
|
||||
@@ -50,7 +49,7 @@ export default class SqlParser extends SqlParserVisitor {
|
||||
if (meta.meta === condition) {
|
||||
if (meta.column.type === columnType.fullText) {
|
||||
const m = cloneMeta(meta)
|
||||
m.column.name = stringInQuot(meta.column.name)
|
||||
m.column.name = meta.column.name
|
||||
m.column.label = m.column.name
|
||||
this.metaList.push(m)
|
||||
} else if (meta.column.type === columnType.string) {
|
||||
@@ -82,9 +81,22 @@ export default class SqlParser extends SqlParserVisitor {
|
||||
}
|
||||
}
|
||||
|
||||
parseMetaToSql (metaList) {
|
||||
parseMetaToSql (metaList, isFullText) {
|
||||
let sql = ''
|
||||
metaList.forEach(meta => {
|
||||
if (isFullText) {
|
||||
if (meta.meta === condition) {
|
||||
if (meta.column.type !== columnType.fullText) {
|
||||
sql += `${meta.column.name}${meta.operator.value}${meta.value.value} `
|
||||
} else {
|
||||
sql += "QUERY('"
|
||||
this.columnList.forEach(column => {
|
||||
sql += `${column.name}:${meta.column.name.replace(/'/g, '')} `
|
||||
})
|
||||
sql += "') "
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (meta.meta === condition) {
|
||||
sql += (meta.column.name)
|
||||
if (meta.column.type !== columnType.fullText) {
|
||||
@@ -93,6 +105,7 @@ export default class SqlParser extends SqlParserVisitor {
|
||||
sql += ' '
|
||||
}
|
||||
}
|
||||
}
|
||||
if (meta.meta === connection) {
|
||||
sql += `${meta.value} `
|
||||
}
|
||||
@@ -163,7 +176,6 @@ export default class SqlParser extends SqlParserVisitor {
|
||||
// tempMeta的value为空,则上个条件是全文搜索
|
||||
if (!this.tempMeta.column.type && !this.tempMeta.value.value) {
|
||||
this.tempMeta.column.type = columnType.fullText
|
||||
this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name)
|
||||
this.tempMeta.column.label = this.tempMeta.column.name
|
||||
this.metaList.push(cloneMeta(this.tempMeta))
|
||||
this.tempMeta = null
|
||||
@@ -448,8 +448,9 @@ export default {
|
||||
}
|
||||
// 带参数时,只查询对应类型的entity;不带参数时,3种entity都查
|
||||
if (formatSql) {
|
||||
// entity_type处理,不查其他两种entity_type对应的左侧筛选
|
||||
const entityTypeMeta = metaList.find(meta => {
|
||||
return meta.column && meta.column === 'entity_type'
|
||||
return meta.column && meta.column.name === 'entity_type'
|
||||
})
|
||||
if (entityTypeMeta) {
|
||||
let entityType = ''
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<span>{{$t('search.searchHistory')}}</span>
|
||||
</div>
|
||||
<div class="foot__item">
|
||||
<span @click="search({})">{{$t('overall.explore')}}</span>
|
||||
<span @click="search">{{$t('overall.explore')}}</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span>{{$t('overall.help')}}</span>
|
||||
</div>
|
||||
@@ -33,6 +33,8 @@
|
||||
|
||||
<script>
|
||||
import AdvancedSearch from '@/components/advancedSearch/Index'
|
||||
import { columnType } from '@/components/advancedSearch/meta/meta'
|
||||
import SqlParser from '@/components/advancedSearch/meta/sql-parser'
|
||||
export default {
|
||||
name: 'CnSearch',
|
||||
components: {
|
||||
@@ -178,7 +180,18 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
search (metaList, formatSql) {
|
||||
this.$emit('search', metaList, formatSql)
|
||||
let sql = formatSql
|
||||
if (metaList) {
|
||||
// 全文搜索处理
|
||||
const hasFullText = metaList.some(meta => {
|
||||
return meta.column && meta.column.type === columnType.fullText
|
||||
})
|
||||
if (hasFullText) {
|
||||
const parser = new SqlParser(metaList, this.columnList)
|
||||
sql = parser.parseMetaToSql(metaList, true)
|
||||
}
|
||||
}
|
||||
this.$emit('search', metaList, sql)
|
||||
},
|
||||
addParams (params) {
|
||||
this.$refs.search.addParams(params)
|
||||
|
||||
Reference in New Issue
Block a user