blob: 1be85998870a9ca1fb85d18bf097e871ad5a00c0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dolphinscheduler.api.service.impl;
import static org.apache.dolphinscheduler.common.constants.Constants.CHANGE;
import static org.apache.dolphinscheduler.common.constants.Constants.SMALL;
import org.apache.dolphinscheduler.api.dto.RuleDefinition;
import org.apache.dolphinscheduler.api.enums.Status;
import org.apache.dolphinscheduler.api.exceptions.ServiceException;
import org.apache.dolphinscheduler.api.service.DqRuleService;
import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.common.utils.DateUtils;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.dao.entity.DataSource;
import org.apache.dolphinscheduler.dao.entity.DqComparisonType;
import org.apache.dolphinscheduler.dao.entity.DqRule;
import org.apache.dolphinscheduler.dao.entity.DqRuleExecuteSql;
import org.apache.dolphinscheduler.dao.entity.DqRuleInputEntry;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.DataSourceMapper;
import org.apache.dolphinscheduler.dao.mapper.DqComparisonTypeMapper;
import org.apache.dolphinscheduler.dao.mapper.DqRuleExecuteSqlMapper;
import org.apache.dolphinscheduler.dao.mapper.DqRuleInputEntryMapper;
import org.apache.dolphinscheduler.dao.mapper.DqRuleMapper;
import org.apache.dolphinscheduler.dao.utils.DqRuleUtils;
import org.apache.dolphinscheduler.plugin.task.api.enums.dp.OptionSourceType;
import org.apache.dolphinscheduler.spi.enums.DbType;
import org.apache.dolphinscheduler.spi.params.base.FormType;
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
import org.apache.dolphinscheduler.spi.params.base.PropsType;
import org.apache.dolphinscheduler.spi.params.base.Validate;
import org.apache.dolphinscheduler.spi.params.group.GroupParam;
import org.apache.dolphinscheduler.spi.params.group.GroupParamsProps;
import org.apache.dolphinscheduler.spi.params.input.InputParam;
import org.apache.dolphinscheduler.spi.params.input.InputParamProps;
import org.apache.dolphinscheduler.spi.params.select.SelectParam;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* DqRuleServiceImpl
*/
@Service
@Slf4j
public class DqRuleServiceImpl extends BaseServiceImpl implements DqRuleService {
@Autowired
private DqRuleMapper dqRuleMapper;
@Autowired
private DqRuleInputEntryMapper dqRuleInputEntryMapper;
@Autowired
private DqRuleExecuteSqlMapper dqRuleExecuteSqlMapper;
@Autowired
private DataSourceMapper dataSourceMapper;
@Autowired
private DqComparisonTypeMapper dqComparisonTypeMapper;
@Override
public String getRuleFormCreateJsonById(int id) {
List<DqRuleInputEntry> ruleInputEntryList = dqRuleInputEntryMapper.getRuleInputEntryList(id);
if (ruleInputEntryList == null || ruleInputEntryList.isEmpty()) {
throw new ServiceException(Status.QUERY_RULE_INPUT_ENTRY_LIST_ERROR);
}
return getRuleFormCreateJson(DqRuleUtils.transformInputEntry(ruleInputEntryList));
}
@Override
public List<DqRule> queryAllRuleList() {
return dqRuleMapper.selectList(new QueryWrapper<>());
}
@Override
public List<ParamsOptions> getDatasourceOptionsById(int datasourceId) {
List<DataSource> dataSourceList = dataSourceMapper.listAllDataSourceByType(datasourceId);
if (CollectionUtils.isEmpty(dataSourceList)) {
return Collections.emptyList();
}
List<ParamsOptions> options = new ArrayList<>();
for (DataSource dataSource : dataSourceList) {
ParamsOptions childrenOption = new ParamsOptions(dataSource.getName(), dataSource.getId(), false);
options.add(childrenOption);
}
return options;
}
@Override
public PageInfo<DqRule> queryRuleListPaging(User loginUser,
String searchVal,
Integer ruleType,
String startTime,
String endTime,
Integer pageNo,
Integer pageSize) {
Date start = null;
Date end = null;
try {
if (StringUtils.isNotEmpty(startTime)) {
start = DateUtils.stringToDate(startTime);
}
if (StringUtils.isNotEmpty(endTime)) {
end = DateUtils.stringToDate(endTime);
}
} catch (Exception e) {
throw new ServiceException(Status.REQUEST_PARAMS_NOT_VALID_ERROR, "startTime,endTime");
}
Page<DqRule> page = new Page<>(pageNo, pageSize);
PageInfo<DqRule> pageInfo = new PageInfo<>(pageNo, pageSize);
if (ruleType == null) {
ruleType = -1;
}
IPage<DqRule> dqRulePage =
dqRuleMapper.queryRuleListPaging(
page,
searchVal,
ruleType,
start,
end);
if (dqRulePage != null) {
List<DqRule> dataList = dqRulePage.getRecords();
dataList.forEach(dqRule -> {
List<DqRuleInputEntry> ruleInputEntryList =
DqRuleUtils.transformInputEntry(dqRuleInputEntryMapper.getRuleInputEntryList(dqRule.getId()));
List<DqRuleExecuteSql> ruleExecuteSqlList = dqRuleExecuteSqlMapper.getExecuteSqlList(dqRule.getId());
RuleDefinition ruleDefinition = new RuleDefinition(ruleInputEntryList, ruleExecuteSqlList);
dqRule.setRuleJson(JSONUtils.toJsonString(ruleDefinition));
});
pageInfo.setTotal((int) dqRulePage.getTotal());
pageInfo.setTotalList(dataList);
}
return pageInfo;
}
private String getRuleFormCreateJson(List<DqRuleInputEntry> ruleInputEntryList) {
List<PluginParams> params = new ArrayList<>();
for (DqRuleInputEntry inputEntry : ruleInputEntryList) {
if (Boolean.TRUE.equals(inputEntry.getIsShow())) {
switch (Objects.requireNonNull(FormType.of(inputEntry.getType()))) {
case INPUT:
params.add(getInputParam(inputEntry));
break;
case SELECT:
params.add(getSelectParam(inputEntry));
break;
case TEXTAREA:
params.add(getTextareaParam(inputEntry));
break;
case GROUP:
params.add(getGroupParam(inputEntry));
break;
default:
break;
}
}
}
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String result = null;
try {
result = mapper.writeValueAsString(params);
} catch (JsonProcessingException e) {
log.error("Json parse error.", e);
}
return result;
}
private InputParam getTextareaParam(DqRuleInputEntry inputEntry) {
InputParamProps paramProps =
new InputParamProps();
paramProps.setDisabled(!inputEntry.getCanEdit());
paramProps.setSize(SMALL);
paramProps.setType(PropsType.TEXTAREA.getPropsType());
paramProps.setRows(1);
return InputParam
.newBuilder(inputEntry.getField(), inputEntry.getTitle())
.addValidate(Validate.newBuilder()
.setRequired(inputEntry.getIsValidate())
.build())
.setProps(paramProps)
.setValue(inputEntry.getData())
.setPlaceholder(inputEntry.getPlaceholder())
.setEmit(Boolean.TRUE.equals(inputEntry.getIsEmit()) ? Collections.singletonList(CHANGE) : null)
.build();
}
private SelectParam getSelectParam(DqRuleInputEntry inputEntry) {
List<ParamsOptions> options = null;
switch (OptionSourceType.of(inputEntry.getOptionSourceType())) {
case DEFAULT:
String optionStr = inputEntry.getOptions();
if (StringUtils.isNotEmpty(optionStr)) {
options = JSONUtils.toList(optionStr, ParamsOptions.class);
}
break;
case DATASOURCE_TYPE:
options = new ArrayList<>();
ParamsOptions paramsOptions = null;
for (DbType dbtype : DbType.values()) {
paramsOptions = new ParamsOptions(dbtype.name(), dbtype.getCode(), false);
options.add(paramsOptions);
}
break;
case COMPARISON_TYPE:
options = new ArrayList<>();
ParamsOptions comparisonOptions = null;
List<DqComparisonType> list =
dqComparisonTypeMapper.selectList(new QueryWrapper<DqComparisonType>().orderByAsc("id"));
for (DqComparisonType type : list) {
comparisonOptions = new ParamsOptions(type.getType(), type.getId(), false);
options.add(comparisonOptions);
}
break;
default:
break;
}
return SelectParam
.newBuilder(inputEntry.getField(), inputEntry.getTitle())
.setOptions(options)
.setValue(inputEntry.getData())
.setSize(SMALL)
.setPlaceHolder(inputEntry.getPlaceholder())
.setEmit(Boolean.TRUE.equals(inputEntry.getIsEmit()) ? Collections.singletonList(CHANGE) : null)
.build();
}
private InputParam getInputParam(DqRuleInputEntry inputEntry) {
InputParamProps paramProps =
new InputParamProps();
paramProps.setDisabled(!inputEntry.getCanEdit());
paramProps.setSize(SMALL);
paramProps.setRows(2);
return InputParam
.newBuilder(inputEntry.getField(), inputEntry.getTitle())
.addValidate(Validate.newBuilder()
.setRequired(inputEntry.getIsValidate())
.build())
.setProps(paramProps)
.setValue(inputEntry.getData())
.setPlaceholder(inputEntry.getPlaceholder())
.setEmit(Boolean.TRUE.equals(inputEntry.getIsEmit()) ? Collections.singletonList(CHANGE) : null)
.build();
}
private GroupParam getGroupParam(DqRuleInputEntry inputEntry) {
return GroupParam
.newBuilder(inputEntry.getField(), inputEntry.getTitle())
.addValidate(Validate.newBuilder()
.setRequired(inputEntry.getIsValidate())
.build())
.setProps(new GroupParamsProps().setRules(JSONUtils.toList(inputEntry.getOptions(), PluginParams.class))
.setFontSize(20))
.setEmit(Boolean.TRUE.equals(inputEntry.getIsEmit()) ? Collections.singletonList(CHANGE) : null)
.build();
}
}