use of com.webank.wedatasphere.qualitis.entity.RuleMetric in project Qualitis by WeBankFinTech.
the class RuleTemplateServiceImpl method addCustomTemplate.
@Override
@Transactional(rollbackFor = { RuntimeException.class, UnExpectedRequestException.class })
public Template addCustomTemplate(AddCustomRuleRequest request) {
Template newTemplate = new Template();
newTemplate.setName(request.getProjectId() + "_" + request.getRuleName() + "_template");
newTemplate.setSaveMidTable(request.getSaveMidTable());
String sqlCheckArea = request.getSqlCheckArea();
if (StringUtils.isNotBlank(sqlCheckArea)) {
newTemplate.setMidTableAction(sqlCheckArea);
newTemplate.setTemplateType(RuleTemplateTypeEnum.CUSTOM.getCode());
newTemplate.setActionType(TemplateActionTypeEnum.SQL.getCode());
Template savedTemplate = ruleTemplateDao.saveTemplate(newTemplate);
LOGGER.info("Succeed to save custom template, template_id: {}", savedTemplate.getId());
// Generate statistics input meta by rule metric
Set<String> ruleMetricCodeSet = request.getAlarmVariable().stream().map(CustomAlarmConfigRequest::getRuleMetricEnCode).collect(Collectors.toSet());
Set<TemplateStatisticsInputMeta> templateStatisticsInputMetas = new HashSet<>(ruleMetricCodeSet.size());
Set<TemplateOutputMeta> templateOutputMetas = new HashSet<>(ruleMetricCodeSet.size());
for (String enCode : ruleMetricCodeSet) {
// xx_xx_xx_encode, index is 3.
RuleMetric ruleMetricInDb = ruleMetricDao.findByEnCode(enCode);
templateStatisticsInputMetas.addAll(templateStatisticsInputMetaService.getAndSaveTemplateStatisticsInputMeta(ruleMetricInDb.getName(), FunctionTypeEnum.MAX_FUNCTION.getCode(), ruleMetricInDb.getName(), true, savedTemplate));
templateOutputMetas.addAll(templateOutputMetaService.getAndSaveTemplateOutputMeta(ruleMetricInDb.getName(), FunctionTypeEnum.MAX_FUNCTION.getCode(), true, savedTemplate));
}
savedTemplate.setStatisticAction(templateStatisticsInputMetas);
savedTemplate.setTemplateOutputMetas(templateOutputMetas);
savedTemplate.setTemplateOutputMetas(templateOutputMetas);
return savedTemplate;
} else {
newTemplate.setMidTableAction(getMidTableAction(request));
newTemplate.setTemplateType(RuleTemplateTypeEnum.CUSTOM.getCode());
newTemplate.setActionType(TemplateActionTypeEnum.SQL.getCode());
Template savedTemplate = ruleTemplateDao.saveTemplate(newTemplate);
LOGGER.info("Succeed to save custom template, template_id: {}", savedTemplate.getId());
Set<TemplateStatisticsInputMeta> templateStatisticsInputMetas = templateStatisticsInputMetaService.getAndSaveTemplateStatisticsInputMeta(request.getOutputName(), request.getFunctionType(), request.getFunctionContent(), request.getSaveMidTable(), savedTemplate);
savedTemplate.setStatisticAction(templateStatisticsInputMetas);
Set<TemplateOutputMeta> templateOutputMetas = templateOutputMetaService.getAndSaveTemplateOutputMeta(request.getOutputName(), request.getFunctionType(), request.getSaveMidTable(), savedTemplate);
savedTemplate.setTemplateOutputMetas(templateOutputMetas);
return savedTemplate;
}
}
use of com.webank.wedatasphere.qualitis.entity.RuleMetric in project Qualitis by WeBankFinTech.
the class OuterExecutionServiceImpl method customReSaveDateSource.
private void customReSaveDateSource(Rule currentRule, Map<String, String> execParams, String clusterName, Date date) throws UnExpectedRequestException, SemanticException, ParseException {
String midTableAction = currentRule.getTemplate().getMidTableAction();
if (StringUtils.isNotBlank(currentRule.getWhereContent())) {
midTableAction = midTableAction.replace("${filter}", currentRule.getWhereContent());
}
// Replace placeholder with key and value for sql parse check.
for (String key : execParams.keySet()) {
midTableAction = midTableAction.replace("${" + key + "}", execParams.get(key));
}
midTableAction = DateExprReplaceUtil.replaceRunDate(date, midTableAction);
// Save datasource in first execution(Only possible data sources related to fps).
boolean firstExecution = CollectionUtils.isEmpty(currentRule.getRuleDataSources().stream().filter(ruleDataSource -> !ORIGINAL_INDEX.equals(ruleDataSource.getDatasourceIndex())).collect(Collectors.toSet()));
if (!firstExecution) {
return;
}
RuleDataSource originalRuleDataSource = currentRule.getRuleDataSources().stream().filter(ruleDataSource -> ORIGINAL_INDEX.equals(ruleDataSource.getDatasourceIndex())).iterator().next();
if (StringUtils.isEmpty(clusterName)) {
clusterName = originalRuleDataSource.getClusterName();
}
Map<String, List<String>> dbAndTables = new HashMap<>(2);
// 0.16.0 for mysql oracle, hive parse, use druid.
LOGGER.info("Parse sql: " + midTableAction);
List<RuleMetric> ruleMetrics = currentRule.getAlarmConfigs().stream().map(AlarmConfig::getRuleMetric).distinct().collect(Collectors.toList());
Set<String> ruleMetricNames = ruleMetrics.stream().map(RuleMetric::getName).collect(Collectors.toSet());
for (String ruleMetricName : ruleMetricNames) {
String cleanRuleMetricName = ruleMetricName.replace("-", "_");
midTableAction = midTableAction.replace(ruleMetricName, cleanRuleMetricName);
}
LOGGER.info("Parse sql after replace rule metric names: " + midTableAction);
if (originalRuleDataSource.getLinkisDataSourceId() != null) {
DbType dbType = JdbcConstants.MYSQL;
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
List<SQLStatement> stmtList = SQLUtils.parseStatements(midTableAction, dbType);
for (int i = 0; i < stmtList.size(); i++) {
SQLStatement stmt = stmtList.get(i);
stmt.accept(visitor);
Map<Name, TableStat> tableStatMap = visitor.getTables();
dbAndTables = toDbAndTables(dbAndTables, tableStatMap);
}
} else {
HiveSqlParser hiveSqlParser = new HiveSqlParser();
dbAndTables = hiveSqlParser.checkSelectSqlAndGetDbAndTable(midTableAction);
}
LOGGER.info("Db and tables: " + dbAndTables.toString());
for (String db : dbAndTables.keySet()) {
List<RuleDataSource> ruleDataSources = new ArrayList<>();
for (String table : dbAndTables.get(db)) {
RuleDataSource ruleDataSource = new RuleDataSource();
ruleDataSource.setClusterName(clusterName);
ruleDataSource.setProjectId(currentRule.getProject().getId());
ruleDataSource.setDbName(db.toLowerCase());
ruleDataSource.setRule(currentRule);
ruleDataSource.setTableName(table);
ruleDataSource.setProxyUser(originalRuleDataSource.getProxyUser());
ruleDataSource.setLinkisDataSourceId(originalRuleDataSource.getLinkisDataSourceId());
ruleDataSource.setLinkisDataSourceName(originalRuleDataSource.getLinkisDataSourceName());
ruleDataSource.setLinkisDataSourceVersionId(originalRuleDataSource.getLinkisDataSourceVersionId());
ruleDataSources.add(ruleDataSource);
}
Set<RuleDataSource> ruleDataSourcesExist = currentRule.getRuleDataSources();
ruleDataSourcesExist.addAll(ruleDataSourceDao.saveAllRuleDataSource(ruleDataSources).stream().collect(Collectors.toSet()));
currentRule.setRuleDataSources(ruleDataSourcesExist);
ruleDao.saveRule(currentRule);
}
}
use of com.webank.wedatasphere.qualitis.entity.RuleMetric in project Qualitis by WeBankFinTech.
the class RuleMetricServiceImpl method modifyRuleMetricReal.
private GeneralResponse<RuleMetricResponse> modifyRuleMetricReal(ModifyRuleMetricRequest request, String userName) throws UnExpectedRequestException, PermissionDeniedRequestException {
if (request == null) {
throw new UnExpectedRequestException("{&REQUEST_CAN_NOT_BE_NULL}");
}
// Check rule metric existence.
RuleMetric ruleMetricInDb = ruleMetricDao.findById(request.getId());
if (ruleMetricInDb == null) {
throw new UnExpectedRequestException("Rule Metric [ID=" + request.getId() + "] {&DOES_NOT_EXIST}");
}
LOGGER.info("Start to modify rule metric, modify request: [{}], user: [{}]", request.toString(), userName);
if (!ruleMetricInDb.getName().equals(request.getName())) {
checkDuplicateName(request.getName());
}
if (!ruleMetricInDb.getEnCode().equals(request.getEnCode())) {
checkDuplicateCode(request.getEnCode());
}
User loginUser = userDao.findByUsername(userName);
List<UserRole> userRoles = userRoleDao.findByUser(loginUser);
Integer roleType = roleService.getRoleType(userRoles);
if (roleType.equals(RoleDefaultTypeEnum.ADMIN.getCode())) {
LOGGER.info("First level(created by SYS_ADMIN) indicator will be modified soon.");
} else if (roleType.equals(RoleDefaultTypeEnum.DEPARTMENT_ADMIN.getCode())) {
LOGGER.info("Second level(created by DEPARTMENT_ADMIN) indicator will be modified soon.");
if (ruleMetricInDb.getLevel().equals(RuleMetricLevelEnum.DEFAULT_METRIC.getCode())) {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
List<Department> managedDepartment = new ArrayList<>();
for (UserRole userRole : userRoles) {
Department department = userRole.getRole().getDepartment();
if (department != null) {
managedDepartment.add(department);
}
}
RuleMetricDepartmentUser ruleMetricDepartmentUser = ruleMetricDepartmentUserDao.findByRuleMetric(ruleMetricInDb);
if (ruleMetricDepartmentUser != null && managedDepartment.contains(ruleMetricDepartmentUser.getDepartment())) {
LOGGER.info("Rule metric[{}]", ruleMetricInDb.toString());
} else {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
} else {
LOGGER.info("Third level(created by PROJECTOR) indicator will be modified soon.");
if (!ruleMetricInDb.getLevel().equals(RuleMetricLevelEnum.PERSONAL_METRIC.getCode()) || !ruleMetricInDb.getCreateUser().equals(loginUser.getUserName())) {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
}
Integer bussCode = request.getBussCode();
ruleMetricInDb.setName(request.getName());
ruleMetricInDb.setCnName(request.getCnName());
ruleMetricInDb.setMetricDesc(request.getDesc());
ruleMetricInDb.setBussCode(bussCode);
if (RuleMetricBussCodeEnum.SUBSYSTEM.getCode().equals(bussCode)) {
ruleMetricInDb.setSubSystemName(request.getSubSystemName());
ruleMetricInDb.setFullCnName(request.getFullCnName());
// Empty them
ruleMetricInDb.setBussCustom("");
ruleMetricInDb.setProductName("");
} else if (RuleMetricBussCodeEnum.PRODUCT.getCode().equals(bussCode)) {
ruleMetricInDb.setProductName(request.getProductName());
ruleMetricInDb.setSubSystemName("");
ruleMetricInDb.setFullCnName("");
ruleMetricInDb.setBussCustom("");
} else if (RuleMetricBussCodeEnum.CUSTOM.getCode().equals(bussCode)) {
ruleMetricInDb.setBussCustom(request.getBussCustom());
ruleMetricInDb.setProductName("");
ruleMetricInDb.setSubSystemName("");
ruleMetricInDb.setFullCnName("");
}
ruleMetricInDb.setModifyUser(userName);
ruleMetricInDb.setModifyTime(ExecutionManagerImpl.PRINT_TIME_FORMAT.format(new Date()));
ruleMetricInDb.setType(request.getType());
ruleMetricInDb.setEnCode(request.getEnCode());
ruleMetricInDb.setFrequency(request.getFrequency());
ruleMetricInDb.setDepartmentName(request.getDepartmentName());
ruleMetricInDb.setDevDepartmentName(request.getDevDepartmentName());
ruleMetricInDb.setOpsDepartmentName(request.getOpsDepartmentName());
ruleMetricInDb.setAvailable(request.getAvailable());
RuleMetricResponse response = new RuleMetricResponse(ruleMetricDao.add(ruleMetricInDb));
return new GeneralResponse<>("200", "{&MODIFY_RULE_METRIC_SUCCESSFULLY}", response);
}
use of com.webank.wedatasphere.qualitis.entity.RuleMetric in project Qualitis by WeBankFinTech.
the class RuleMetricServiceImpl method addRuleMetricReal.
private GeneralResponse<RuleMetricResponse> addRuleMetricReal(AddRuleMetricRequest request, String userName) throws UnExpectedRequestException {
checkDuplicateName(request.getName());
checkDuplicateCode(request.getEnCode());
LOGGER.info("Start to add rule metric, add request: [{}], user: [{}]", request.toString(), userName);
User loginUser = userDao.findByUsername(userName);
List<UserRole> userRoles = userRoleDao.findByUser(loginUser);
Integer roleType = roleService.getRoleType(userRoles);
RuleMetric newRuleMetric = new RuleMetric(request.getName(), request.getCnName(), request.getDesc(), request.getSubSystemName(), request.getFullCnName(), request.getProductName(), request.getDepartmentName(), request.getDevDepartmentName(), request.getOpsDepartmentName(), request.getType(), request.getEnCode(), request.getFrequency(), request.getAvailable(), request.getBussCode(), request.getBussCustom());
newRuleMetric.setCreateUser(userName);
newRuleMetric.setCreateTime(ExecutionManagerImpl.PRINT_TIME_FORMAT.format(new Date()));
RuleMetric savedRuleMetric = ruleMetricDao.add(newRuleMetric);
if (roleType.equals(RoleDefaultTypeEnum.ADMIN.getCode())) {
LOGGER.info("First level(created by SYS_ADMIN) indicator will be created soon.");
savedRuleMetric.setLevel(RuleMetricLevelEnum.DEFAULT_METRIC.getCode());
} else if (roleType.equals(RoleDefaultTypeEnum.DEPARTMENT_ADMIN.getCode())) {
LOGGER.info("Second level(created by DEPARTMENT_ADMIN) indicator will be created soon.");
savedRuleMetric.setLevel(RuleMetricLevelEnum.DEPARTMENT_METRIC.getCode());
for (UserRole temp : userRoles) {
Department department = temp.getRole().getDepartment();
if (department != null) {
RuleMetricDepartmentUser ruleMetricDepartmentUser = new RuleMetricDepartmentUser();
ruleMetricDepartmentUser.setDepartment(department);
ruleMetricDepartmentUser.setRuleMetric(savedRuleMetric);
ruleMetricDepartmentUserDao.add(ruleMetricDepartmentUser);
LOGGER.info("Succeed to save rule metric department user.");
}
}
} else {
LOGGER.info("Third level(created by PROJECTOR) indicator will be created soon.");
savedRuleMetric.setLevel(RuleMetricLevelEnum.PERSONAL_METRIC.getCode());
RuleMetricDepartmentUser ruleMetricDepartmentUser = new RuleMetricDepartmentUser();
ruleMetricDepartmentUser.setDepartment(loginUser.getDepartment());
ruleMetricDepartmentUser.setUser(loginUser);
ruleMetricDepartmentUser.setRuleMetric(savedRuleMetric);
ruleMetricDepartmentUserDao.add(ruleMetricDepartmentUser);
LOGGER.info("Succeed to save rule metric department user.");
}
RuleMetricResponse response = new RuleMetricResponse(ruleMetricDao.add(savedRuleMetric));
return new GeneralResponse<>("200", "{&ADD_RULE_METRIC_SUCCESSFULLY}", response);
}
use of com.webank.wedatasphere.qualitis.entity.RuleMetric in project Qualitis by WeBankFinTech.
the class RuleMetricServiceImpl method getRuleMetricDetail.
@Override
public GeneralResponse<RuleMetricResponse> getRuleMetricDetail(long id) throws UnExpectedRequestException, PermissionDeniedRequestException {
if (id <= 0) {
throw new UnExpectedRequestException("{&REQUEST_CAN_NOT_BE_NULL}");
}
// Check rule metric existence.
RuleMetric ruleMetricInDb = ruleMetricDao.findById(id);
if (ruleMetricInDb == null) {
throw new UnExpectedRequestException("Rule Metric ID [" + id + "] {&DOES_NOT_EXIST}");
}
String userName = HttpUtils.getUserName(httpServletRequest);
LOGGER.info("Start to get rule metric, rule metric ID: [{}], user: [{}]", id, userName);
User loginUser = userDao.findByUsername(userName);
List<UserRole> userRoles = userRoleDao.findByUser(loginUser);
Integer roleType = roleService.getRoleType(userRoles);
RuleMetricDepartmentUser ruleMetricDepartmentUser = ruleMetricDepartmentUserDao.findByRuleMetric(ruleMetricInDb);
if (roleType.equals(RoleDefaultTypeEnum.ADMIN.getCode())) {
LOGGER.info("SYS_ADMIN will get rule metric.");
} else if (roleType.equals(RoleDefaultTypeEnum.DEPARTMENT_ADMIN.getCode())) {
LOGGER.info("DEPARTMENT_ADMIN will get rule metric.");
List<Department> managedDepartment = new ArrayList<>();
for (UserRole userRole : userRoles) {
Department department = userRole.getRole().getDepartment();
if (department != null) {
managedDepartment.add(department);
}
}
if (ruleMetricDepartmentUser.getDepartment() != null) {
List<Department> res = managedDepartment.stream().filter(department -> department.getId() == ruleMetricDepartmentUser.getDepartment().getId()).collect(Collectors.toList());
if (res.size() > 0) {
LOGGER.info("Rule metric[{}] comes from department: {}", ruleMetricInDb.toString(), ruleMetricDepartmentUser.getDepartment().getName());
} else {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
} else if (ruleMetricInDb.getLevel().equals(RuleMetricLevelEnum.DEFAULT_METRIC.getCode())) {
LOGGER.info("DEPARTMENT_ADMIN will get first level rule metric.");
} else {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
} else {
LOGGER.info("PROJECTOR will get rule metric.");
Department department = loginUser.getDepartment();
if (ruleMetricInDb.getLevel().equals(RuleMetricLevelEnum.DEPARTMENT_METRIC) && !department.equals(ruleMetricDepartmentUser.getDepartment())) {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
if (ruleMetricInDb.getLevel().equals(RuleMetricLevelEnum.PERSONAL_METRIC) && !loginUser.equals(ruleMetricDepartmentUser.getUser())) {
throw new PermissionDeniedRequestException("User {&HAS_NO_PERMISSION_TO_ACCESS}", 403);
}
}
RuleMetricResponse ruleMetricResponse = new RuleMetricResponse(ruleMetricInDb);
return new GeneralResponse<>("200", "{&GET_RULE_METRIC_SUCCESSFULLY}", ruleMetricResponse);
}
Aggregations