Merge pull request #6678 from dataease/pr@dev@_perf_filter_selector_options

perf: 下拉过滤器使用后台模糊搜索
This commit is contained in:
fit2cloud-chenyw 2023-11-14 16:05:46 +08:00 committed by GitHub
commit 7a774d29be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 97 additions and 19 deletions

View File

@ -214,7 +214,7 @@ public class DataSetTableFieldController {
public List<Object> multFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception {
List<Object> results = new ArrayList<>();
for (String fieldId : multFieldValuesRequest.getFieldIds()) {
List<Object> fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false);
List<Object> fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false, multFieldValuesRequest.getKeyword());
if (CollectionUtil.isNotEmpty(fieldValues)) {
results.addAll(fieldValues);
}
@ -233,13 +233,13 @@ public class DataSetTableFieldController {
DecodedJWT jwt = JWT.decode(linkToken);
Long userId = jwt.getClaim("userId").asLong();
multFieldValuesRequest.setUserId(userId);
return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false);
return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword());
}
@ApiIgnore
@PostMapping("mappingFieldValues")
public List<Object> mappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception {
return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false);
return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword());
}
@ApiIgnore

View File

@ -13,4 +13,6 @@ public class MultFieldValuesRequest {
private DeSortDTO sort;
private String keyword;
}

View File

@ -9,9 +9,9 @@ public interface DataSetFieldService {
List<Object> fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception;
List<Object> fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception;
List<Object> fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception;
List<Object> fieldValues(List<String> fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception;
List<Object> fieldValues(List<String> fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception;
List<Object> chineseSort(List<Object> list, DeSortDTO sortDTO) throws Exception;
}

View File

@ -58,14 +58,14 @@ public class DirectFieldService implements DataSetFieldService {
public List<Object> fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception {
List<String> fieldIds = new ArrayList<>();
fieldIds.add(fieldId);
return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm);
return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm, null);
}
@Override
public List<Object> fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception {
public List<Object> fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception {
List<String> fieldIds = new ArrayList<>();
fieldIds.add(fieldId);
return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm);
return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm, keyword);
}
public List<DeSortField> buildSorts(List<DatasetTableField> allFields, DeSortDTO sortDTO) {
@ -98,8 +98,15 @@ public class DirectFieldService implements DataSetFieldService {
return result;
}
private String formatTableByKeyword(String keyword, String originTable, List<DatasetTableField> fields) {
if (StringUtils.isBlank(keyword)) return originTable;
List<String> fieldNames = fields.stream().map(DatasetTableField::getOriginName).collect(Collectors.toList());
String whereSql = fieldNames.stream().map(fieldName -> " " + fieldName + " like '%" + keyword + "%'").collect(Collectors.joining(" or "));
return "( select * from " + originTable + " where (" + whereSql + ") )";
}
@Override
public List<Object> fieldValues(List<String> fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception {
public List<Object> fieldValues(List<String> fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception {
String fieldId = fieldIds.get(0);
DatasetTableField field = dataSetTableFieldsService.selectByPrimaryKey(fieldId);
if (field == null || StringUtils.isEmpty(field.getTableId())) return null;
@ -112,7 +119,7 @@ public class DirectFieldService implements DataSetFieldService {
List<DeSortField> deSortFields = buildSorts(fields, sortDTO);
Boolean needSort = CollectionUtils.isNotEmpty(deSortFields);
boolean needSort = CollectionUtils.isNotEmpty(deSortFields);
final List<String> allTableFieldIds = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList());
boolean multi = fieldIds.stream().anyMatch(item -> !allTableFieldIds.contains(item));
@ -165,22 +172,32 @@ public class DirectFieldService implements DataSetFieldService {
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.toString())) {
datasourceRequest.setTable(dataTableInfoDTO.getTable());
createSQL = qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields);
String formatSql = formatTableByKeyword(keyword, dataTableInfoDTO.getTable(), permissionFields);
createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields);
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) {
String sql = dataTableInfoDTO.getSql();
if (dataTableInfoDTO.isBase64Encryption()) {
sql = new String(java.util.Base64.getDecoder().decode(sql));
}
sql = dataSetTableService.handleVariableDefaultValue(sql, null, ds.getType(), false);
if (StringUtils.isNotBlank(keyword)) {
sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields);
}
createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields);
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) {
DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class);
List<DataSetTableUnionDTO> listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId());
String sql = dataSetTableService.getCustomSQLDatasource(dt, listUnion, ds);
if (StringUtils.isNotBlank(keyword)) {
sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields);
}
createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields);
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.toString())) {
DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class);
String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql");
if (StringUtils.isNotBlank(keyword)) {
sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields);
}
createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields);
}
datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null));
@ -193,15 +210,16 @@ public class DirectFieldService implements DataSetFieldService {
String tableName = "ds_" + datasetTable.getId().replaceAll("-", "_");
datasourceRequest.setTable(tableName);
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
createSQL = qp.createQuerySQL(tableName, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields);
String formatSql = formatTableByKeyword(keyword, tableName, permissionFields);
createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields);
datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null));
}
LogUtil.info(datasourceRequest.getQuery());
datasourceRequest.setPermissionFields(permissionFields);
assert datasourceProvider != null;
List<String[]> rows = datasourceProvider.getData(datasourceRequest);
if (!needMapping) {
List<Object> results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList());
return results;
return rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList());
}
Set<String> pkSet = new HashSet<>();

View File

@ -85,6 +85,10 @@ export default {
clearable: {
type: Boolean,
default: true
},
flag: {
type: String,
require: true
}
},
data() {
@ -124,14 +128,14 @@ export default {
},
list() {
this.resetList()
this.show = false
this.$nextTick(() => {
this.show = true
this.$nextTick(() => {
this.init()
})
})
},
}
/*
模糊搜索改为后端检索暂注释前端
keyWord(val, old) {
if (val === old) return
const results = val ? this.vagueFilter(val, this.list) : null
@ -141,6 +145,7 @@ export default {
this.callback()
})
}
*/
},
mounted() {
this.resetList()
@ -174,8 +179,10 @@ export default {
this.$emit('handleShowNumber')
},
addScrollDiv(selectDom) {
const baseClass = `${this.classId}-creator`
this.maxHeightDom = document.createElement('div')
this.maxHeightDom.className = 'el-select-height'
this.maxHeightDom.classList.add(baseClass)
selectDom.insertBefore(this.maxHeightDom, this.domList)
},
reCacularHeight() {
@ -206,6 +213,12 @@ export default {
this.customInputStyle()
return
}
const baseClass = `.${this.classId}-creator`
if (document.querySelector(baseClass)) {
this.customInputStyle()
this.reCacularHeight()
return
}
const selectDom = document.querySelector(
`.${this.classId} .el-select-dropdown .el-select-dropdown__wrap`

View File

@ -18,6 +18,7 @@
popper-class="coustom-de-select"
:class="{'disabled-close': !inDraw && selectFirst && element.options.attrs.multiple}"
:list="data"
:flag="flag"
:is-config="isConfig"
:custom-style="customStyle"
@resetKeyWords="filterMethod"
@ -52,7 +53,7 @@ import { isSameVueObj, mergeCustomSortOption } from '@/utils'
import { getLinkToken, getToken } from '@/utils/auth'
import customInput from '@/components/widget/deWidget/customInput'
import { textSelectWidget } from '@/components/widget/deWidget/serviceNameFn.js'
import { uuid } from 'vue-uuid'
export default {
components: { ElVisualSelect },
mixins: [customInput],
@ -94,7 +95,10 @@ export default {
data: [],
onFocus: false,
keyWord: '',
separator: ','
separator: ',',
timeMachine: null,
changeIndex: 0,
flag: uuid.v1()
}
},
computed: {
@ -292,8 +296,49 @@ export default {
this.value = this.element.options.attrs.multiple ? [] : null
this.$refs.deSelect && this.$refs.deSelect.resetSelectAll && this.$refs.deSelect.resetSelectAll()
},
searchWithKey(index) {
this.timeMachine = setTimeout(() => {
if (index === this.changeIndex) {
this.refreshOptions()
}
this.destroyTimeMachine()
}, 1500)
},
destroyTimeMachine() {
this.timeMachine && clearTimeout(this.timeMachine)
this.timeMachine = null
},
filterMethod(key) {
if (key === this.keyWord) {
return
}
this.keyWord = key
this.destroyTimeMachine()
this.changeIndex++
this.searchWithKey(this.changeIndex)
},
refreshOptions() {
// this.data = []
let method = multFieldValues
const token = this.$store.getters.token || getToken()
const linkToken = this.$store.getters.linkToken || getLinkToken()
if (!token && linkToken) {
method = linkMultFieldValues
}
if (!this.element.options.attrs.fieldId) {
return
}
const param = { fieldIds: this.element.options.attrs.fieldId.split(this.separator), sort: this.element.options.attrs.sort, keyword: this.keyWord }
if (this.panelInfo.proxy) {
param.userId = this.panelInfo.proxy
}
this.element.options.attrs.fieldId &&
this.element.options.attrs.fieldId.length > 0 &&
method(param).then(res => {
this.data = this.optionData(res.data)
this.flag = uuid.v1()
})
},
onScroll() {
if (this.onFocus) {