以透视分析新增一个筛选器操作符【为空串】为例,【为空串】实际代表含义为 为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;
}
}
|