以透视分析新增一个筛选器操作符【为空串】为例,【为空串】实际代表含义为 为NULL 或者是 等于空字符串(is null or = '')
二开扩展接口
前端接口定义
新透视,时机:AD_HOC_DEFINE_ON_LOADED,调用对象IAdHocAnalysisQuery
新即席,时机:D_QUERY_DEFINE_ON_LOADED,调用对象IDetailedQuery
setCustomOperators
作用: 自定义筛选器操作符
名称 | 类型 | 说明 | |
输入参数 | customOperators | Array | 自定义筛选器操作符对象列表 ] |
返回值 | - | - | - |
后端接口
IBeforeQueryHandler
名称: 查询前处理器
作用: 在查询执行前, 处理查询请求. 比如修改条件值.
接口方法
before(context: QueryContext): void
作用: 组件取数前, 对查询请求进行自定义处理, 如修改条件值.
名称 | 类型 | 说明 | |
输入参数 | context | QueryContext | 查询上下文, 包含查询ID, 报表ID, 报表类型, 查询请求. |
返回值 | 无 |
使用示例
// 以透视分析为例 // 前端扩展新增操作符 this.on(AD_HOC_DEFINE_ON_LOADED, (iAdHocAnalysis) => { console.log('AD_HOC_DEFINE_ON_LOADED') // 自定义操作符定义 const customOperators = [ { id: 'EMPTY_STRING', label_cn: '为空串', label_tw: '為空串', label_en: 'Empty String', noValue:true, supportedDataTypes: ['STRING'], // 只支持字符串数据类型 supportedComponents: ['SELECT', 'MULTI_SELECT', 'LIST', 'MULTI_LIST'] // 支持下拉筛选器类型 }, { id: 'NOT_EMPTY_STRING', label_cn: '不为空串', label_tw: '不為空串', label_en: 'Not Empty String', noValue:true, supportedDataTypes: ['STRING'], // 只支持字符串数据类型 supportedComponents: ['SELECT', 'MULTI_SELECT', 'LIST', 'MULTI_LIST'] // 支持下拉筛选器类型 } ] iAdHocAnalysis.setCustomOperators(customOperators) }) // 后端实现IBeforeQueryHandler根据自定义操作符修改查询条件 public class BeforeQueryHandler implements IBeforeQueryHandler { @Override public void before(QueryContext context) { IQueryCondition ret = QueryConditionUtil.handleCondition(context.getQueryOption().getQueryCondition(), (condition) -> { if (condition instanceof IQueryFieldConditionNode) { IQueryFieldConditionNode node = (IQueryFieldConditionNode) condition; String originalOperator = node.getOriginalOperator(); // 处理 EMPTY_STRING 操作符 if ("EMPTY_STRING".equals(originalOperator)) { IQueryRelationConditionNode co = createEmptyStringCondition(node.getField()); return co; } } return condition; }); } /** * 创建空字符串条件:字段为 NULL 或者是等于空字符串 * @param field 字段 * @return 复合条件 */ private IQueryRelationConditionNode createEmptyStringCondition(IQueryField field) { IQueryRelationConditionNode relationCondition = new QueryRelationConditionNode(); relationCondition.setRelation(LogicOperatorType.OR); relationCondition.setChildNodes(new ArrayList<>()); // 条件1:字段为 NULL IQueryFieldConditionNode nullCondition = new IQueryFieldConditionNode() { @Override public FilterOperationType getOperator() { return FilterOperationType.NULL; } @Override public void setOperator(FilterOperationType operator) { // 不允许修改 } @Override public List<Object> getValues() { return new ArrayList<>(); } @Override public void setValues(List<Object> values) { // 不允许修改 } @Override public IQueryField getField() { return field; } @Override public void setField(IQueryField field) { // 不允许修改 } @Override public String getOriginalOperator() { return "NULL"; } @Override public void setOriginalOperator(String originalOperator) { // 不允许修改 } }; // 条件2:字段等于空字符串 IQueryFieldConditionNode emptyStringCondition = new IQueryFieldConditionNode() { @Override public FilterOperationType getOperator() { return FilterOperationType.EQUALS; } @Override public void setOperator(FilterOperationType operator) { // 不允许修改 } @Override public List<Object> getValues() { List<Object> values = new ArrayList<>(); values.add(""); return values; } @Override public void setValues(List<Object> values) { // 不允许修改 } @Override public IQueryField getField() { return field; } @Override public void setField(IQueryField field) { // 不允许修改 } @Override public String getOriginalOperator() { return "EQUAL"; } @Override public void setOriginalOperator(String originalOperator) { // 不允许修改 } }; // 添加两个子条件 relationCondition.getChildNodes().add(nullCondition); relationCondition.getChildNodes().add(emptyStringCondition); return relationCondition; } }