forked from github/dataease
Merge pull request #6678 from dataease/pr@dev@_perf_filter_selector_options
perf: 下拉过滤器使用后台模糊搜索
This commit is contained in:
commit
7a774d29be
@ -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
|
||||
|
@ -13,4 +13,6 @@ public class MultFieldValuesRequest {
|
||||
|
||||
private DeSortDTO sort;
|
||||
|
||||
private String keyword;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<>();
|
||||
|
||||
|
@ -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`
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user