策略模式-实际应用案例二

策略接口类:DataSourceStrategy.java

package cn.getech.data.manager.service.strategy;

import cn.getech.data.manager.model.dto.QualityRuleFieldDto;
import cn.getech.data.manager.model.dto.QueryDto;
import cn.getech.data.manager.model.vo.RuleDataRowVO;
import cn.getech.data.manager.model.vo.RuleFieldVO;

import java.math.BigDecimal;
import java.util.List;

public interface DataSourceStrategy {


    /**
     * @Description 获取数据库名字
     * @Author  chengweiping
     * @Date   2020/10/19 17:46
     */
    List<String> getDbNameList(Integer connectId)throws Exception;


    /**
    * @Description 根据数据源与数据库名称获取表名列表
    * @Author  chengweiping
    * @Date   2020/10/10 14:11
    */
    public List<String>  getTableNameList(Integer connectId, String databaseName, String tableName) throws Exception;


    /**
     * @Description 获取规则字段列表
     * @Author  chengweiping
     * @Date   2020/10/13 17:46
     */
    public List<RuleFieldVO> getFieldList(QualityRuleFieldDto qualityRuleFieldDto)  throws  Exception;


    /**
     * @Description 获取表大小
     * @Author  chengweiping
     * @Date   2020/10/13 23:02
     */
    BigDecimal getTotalTableSize(QueryDto queryDto) throws Exception;


    /**
    * @Description 获取表行数
    * @Author  chengweiping
    * @Date   2020/10/10 16:15
     * @param query
    */
    public Long  getTableRowNum(QueryDto query) throws Exception;






    /**
    * @Description 获取字段的空值数据
    * @Author  chengweiping
    * @Date   2020/10/14 15:16
    */
    public Long getFieldNullNum(QueryDto queryDto) throws Exception;


    /**
    * @Description 获取重复值个数
    * @Author  chengweiping
    * @Date   2020/10/14 15:20
    */
    public Long getFieldRepeatNum(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取唯一值个数
    * @Author  chengweiping
    * @Date   2020/10/14 15:32
    */
    Long getFieldUniqueNum(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取字段汇总值
    * @Author  chengweiping
    * @Date   2020/10/14 15:58
    */
    BigDecimal getFieldSumNum(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取字段的最小值
    * @Author  chengweiping
    * @Date   2020/10/14 16:05
    */
    BigDecimal getFieldMinNum(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取字段的最大值
    * @Author  chengweiping
    * @Date   2020/10/14 16:05
    */
    BigDecimal getFieldMaxNum(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取字段平均值
    * @Author  chengweiping
    * @Date   2020/10/14 16:07
    */
    BigDecimal getFieldAvgNum(QueryDto queryDto) throws Exception;


   /**
   * @Description 获取自定义sql结果
   * @Author  chengweiping
   * @Date   2020/10/19 23:03
   */
    BigDecimal getCustomeSqlResult(Integer connectId, String dbName, String tableName, String sql) throws Exception;

    /**
     * @Description 获取自定义sql结果
     * @Author  chengweiping
     * @Date   2020/10/19 23:03
     */
    String getCustomeSqlField(Integer connectId, String dbName, String tableName, String sql) throws Exception;


    /**
    * @Description 获取表规则行数
    * @Author  chengweiping
    * @Date   2020/10/20 15:42
    */
    List<RuleDataRowVO> getTableNullRowList(QueryDto queryDto) throws Exception;

    /**
    * @Description 获取唯一值行数
    * @Author  chengweiping
    * @Date   2020/10/20 18:11
    */
    List<RuleDataRowVO> getTableUniqueRowList(QueryDto query)throws Exception;

    /**
    * @Description 获取重复值得数据行
    * @Author  chengweiping
    * @Date   2020/10/20 18:15
    */
    List<RuleDataRowVO> getTableRepeatRowList(QueryDto query) throws Exception;


    /**
    * @Description  获取表的分区字段列表
    * @Author  chengweiping
    * @Date   2020/10/22 10:33
    */
    List<String> getTablePartitionList(QueryDto query) throws Exception;


}

 

策略工厂类:

DataSourceStrategyFactory.java
package cn.getech.data.manager.service.factory;

import cn.getech.data.manager.service.strategy.DataSourceStrategy;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @ClassName DataSourceStrategyFactory
 * @Description   表明服务工厂
 * @Author Getech
 * @Date 2020/10/10 14:06
 */
public class DataSourceStrategyFactory {

    private static ConcurrentHashMap<Integer, DataSourceStrategy>  serviceMap=new ConcurrentHashMap<>();




    public static DataSourceStrategy getServiceByType(Integer typeId){
        return serviceMap.get(typeId);
    }

    public static void setService(Integer typeId, DataSourceStrategy tableNameStrategy){
            serviceMap.put(typeId, tableNameStrategy);
    }
}

 

枚举类:DataSourceTypeEnum.java

package cn.getech.data.manager.constant;

/**
 * @ClassName DataSourceTypeEnum
 * @Description TODO
 * @Author Getech
 * @Date 2020/10/10 14:22
 */
public enum  DataSourceTypeEnum {


    HIVE(0,"hive"),

    MYSQL(1,"mysql"),

    ORACLE(2,"oracle"),

    SQLSERVER(3,"sqlserver"),

    POSTGRESQL(4,"postgresql");


    private Integer typeId;

    private String name;


    DataSourceTypeEnum(Integer typeId, String name) {
        this.typeId = typeId;
        this.name = name;
    }

    public Integer getTypeId() {
        return typeId;
    }

    public void setTypeId(Integer typeId) {
        this.typeId = typeId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

策略实现类:DataSourceMysqlStrategy.java

package cn.getech.data.manager.service.strategy.impl;

import cn.getech.data.development.entity.ConfConnect;
import cn.getech.data.development.service.ConfConnectService;
import cn.getech.data.development.utils.MysqlTableUtil;
import cn.getech.data.manager.constant.DataSourceTypeEnum;
import cn.getech.data.manager.model.dto.QualityRuleFieldDto;
import cn.getech.data.manager.model.dto.QueryDto;
import cn.getech.data.manager.model.vo.RuleDataRowVO;
import cn.getech.data.manager.model.vo.RuleFieldVO;
import cn.getech.data.manager.service.factory.DataSourceStrategyFactory;
import cn.getech.data.manager.service.strategy.DataSourceStrategy;
import cn.getech.data.manager.service.strategy.MySqlTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName TableNameHiveService
 * @Description 获取表名hive 实现
 * @Author Getech
 * @Date 2020/10/10 14:16
 */
@Service
@Slf4j
public class DataSourceMysqlStrategy implements DataSourceStrategy, InitializingBean {



    @Autowired
    private ConfConnectService  confConnectService;

    @Autowired
    private MySqlTemplate mysqlTemplate;


    @Override
    public List<String> getTableNameList(Integer connectId, String database,String tableName) throws Exception {
        String sql="SELECT table_name FROM information_schema.tables WHERE table_schema='%s' AND table_type='base table'";
        String tableNameSql=String.format(sql,database);
        List<String> tableNameList=new ArrayList<>();
        MysqlTableUtil mysqlTableUtil =null;
        try{
            QueryDto query=new QueryDto();
            query.setConnectId(connectId);
            query.setDbName(database);
            query.setTableName(tableName);
          //创建jdbc连接
            mysqlTableUtil = mysqlTemplate.getMySqlTableUtil(query);
        }catch (Exception e){
            e.printStackTrace();
            throw new Exception("数据库连接失败");
        }
        ResultSet result=null;
        try{
            //执行统计sql,进行汇总
            result=mysqlTableUtil.getResultSet(tableNameSql);
            while (result.next()) {
                if (result != null) {
                    Object object= result.getObject(1);
                    if(object!=null){
                        String tableNameDB=result.getString(1);
                        tableNameList.add(tableNameDB);
                    }

                }
            }

        }catch (Exception e){
            e.printStackTrace();
            throw new Exception(e.getMessage());
        }finally {
            if(result!=null){
                result.close();
            }
            if(mysqlTableUtil!=null){
                mysqlTableUtil.close();
            }
        }

        return tableNameList;
    }

    @Override
    public List<String> getDbNameList(Integer connectId) throws Exception {
        ConfConnect confConnect= confConnectService.getById(connectId);
        List<String> dbNameList=new ArrayList<>();
        if(confConnect!=null){
            dbNameList.add(confConnect.getDbname());
        }
        return dbNameList;
    }


    /**
    * @Description 获取表行数
    * @Author  chengweiping
    * @Date   2020/10/13 22:58
    */
    @Override
    public Long getTableRowNum(QueryDto query) throws Exception {
        //统计表总数的sql
        String sql = "select count(1) as totalCount  from %s ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql="select count(1) as totalCount  from %s where 1=1 and  " + query.getSqlWhere();
        }
        //统计表总数的sql
        String formatSql = String.format(sql, query.getTableName());
        query.setSql(formatSql);
        Long value= mysqlTemplate.getLongValue(query);
        return value;
    }


    /**
    * @Description  获取表字段列表
    * @Author  chengweiping
    * @Date   2020/10/13 22:58
    */
    @Override
    public List<RuleFieldVO> getFieldList(QualityRuleFieldDto qualityRuleFieldDto) throws  Exception {
        Integer connectId= qualityRuleFieldDto.getConnectId();
        String sql= "select column_name as columnName,data_type as dataType from information_schema.columns where   table_schema='%s' and table_name='%s' ";

        List<RuleFieldVO>  ruleFieldVOList =new ArrayList<>();
        MysqlTableUtil mysqlTableUtil =null;
        String tableFieldNameSql=null;
        try{

            String database=qualityRuleFieldDto.getDatabaseName();
            String tableName=qualityRuleFieldDto.getTableName();
            tableFieldNameSql=String.format(sql,database,tableName);
            System.out.println("获取表字段的sql:"+tableFieldNameSql);
            QueryDto queryDto=new QueryDto();
            queryDto.setConnectId(connectId);
            queryDto.setDbName(database);
            mysqlTableUtil = mysqlTemplate.getMySqlTableUtil(queryDto);
        }catch (Exception e){
            e.printStackTrace();
            throw new Exception("数据库连接失败");
        }
        ResultSet result=null;
        try{
            //执行统计sql,进行汇总
            result=mysqlTableUtil.getResultSet(tableFieldNameSql);
            while (result.next()) {
                if (result != null) {
                    Object fieldNameObject=result.getObject(1);
                    if(fieldNameObject!=null){
                        String fieldName=result.getString(1);
                        String fieldType=result.getString(2);
                        RuleFieldVO ruleFieldVO=new RuleFieldVO();
                        ruleFieldVO.setFieldName(fieldName);
                        ruleFieldVO.setFieldType(fieldType.toLowerCase());
                        ruleFieldVOList.add(ruleFieldVO);
                    }

                }
            }

        }catch (Exception e){
            e.printStackTrace();
            throw new Exception(e.getMessage());
        }finally {
            if(result!=null){
                result.close();
            }
            if(mysqlTableUtil!=null){
                mysqlTableUtil.close();
            }
        }

        return ruleFieldVOList;
    }


    /**
    * @Description 获取表大小
    * @Author  chengweiping
    * @Date   2020/10/13 22:59
    */
    @Override
    public BigDecimal getTotalTableSize(QueryDto query) throws Exception {
        String sql=" SELECT TRUNCATE(data_length,0) AS dataSize FROM information_schema.tables WHERE table_schema='%s' AND table_name='%s' ";
        String formatSql = String.format(sql, query.getDbName(),query.getTableName());
        query.setSql(formatSql);
        BigDecimal value= mysqlTemplate.getBigDecimalValue(query);
        return value;

    }

    @Override
    public Long getFieldNullNum(QueryDto query) throws Exception {
        String sql=" select count(1) as totalCount  from %s where  %s is null or %s='' ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=sql+"  and  "+ query.getSqlWhere();
        }
        String formatSql = String.format(sql, query.getTableName(),query.getFieldName(),query.getFieldName());
        query.setSql(formatSql);
        Long value= mysqlTemplate.getLongValue(query);
        return value;

    }

    @Override
    public Long getFieldRepeatNum(QueryDto query) throws Exception {
        String sql="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null and %s!=''  group by  %s having toatlCountTemp > 1) t ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null and %s!='' and  " + query.getSqlWhere()+ " group by  %s having toatlCountTemp > 1) t  ";
        }
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName,fieldName,fieldName);
        query.setSql(formatSql);
        Long value= mysqlTemplate.getLongValue(query);
        return value;
    }


    @Override
    public Long getFieldUniqueNum(QueryDto query) throws Exception {
        String sql="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null and %s!='' group by  %s having toatlCountTemp =1) t ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null and %s!='' and " + query.getSqlWhere()+ " group by  %s having toatlCountTemp =1) t  ";
        }
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName,fieldName,fieldName);
        query.setSql(formatSql);
        Long value= mysqlTemplate.getLongValue(query);
        return value;
    }


    @Override
    public BigDecimal getFieldSumNum(QueryDto query) throws Exception {
        String sql=" select sum(%s) as totalCount  from %s  ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql="select sum(%s) as totalCount  from %s where  " + query.getSqlWhere();
        }
        //统计表sum值sql
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName);
        query.setSql(formatSql);
        BigDecimal result= mysqlTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;
    }


    @Override
    public BigDecimal getFieldMinNum(QueryDto query) throws Exception {
        String sql=" select min(%s) as minValue  from %s  ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select min(%s) as minValue  from %s  where " + query.getSqlWhere();
        }
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName);
        query.setSql(formatSql);
        BigDecimal result= mysqlTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;
    }

    @Override
    public BigDecimal getFieldMaxNum(QueryDto query) throws Exception {
        String sql=" select max(%s) as maxValue  from %s  ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select max(%s) as maxValue  from %s   where " + query.getSqlWhere();
        }
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName);
        query.setSql(formatSql);
        BigDecimal result= mysqlTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;
    }


    @Override
    public BigDecimal getFieldAvgNum(QueryDto query) throws Exception {
        String sql=" select avg(%s) as avgCount  from %s  ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select avg(%s) as avgCount  from %s where " + query.getSqlWhere();
        }
        //计算sql
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName);
        query.setSql(formatSql);
        BigDecimal result= mysqlTemplate.getBigDecimalValue(query);
        BigDecimal value=new BigDecimal(0);
        if(result!=null){
            value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        }

        return value;
    }




    @Override
    public BigDecimal getCustomeSqlResult(Integer connectId, String dbName, String tableName, String sql) throws Exception {
        QueryDto query=new QueryDto();
        query.setConnectId(connectId);
        query.setDbName(dbName);
        query.setTableName(tableName);
        query.setSql(sql);
        BigDecimal result= mysqlTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("自定义统计sql值:"+value);
        return value;
    }

    @Override
    public String getCustomeSqlField(Integer connectId, String dbName, String tableName, String sql) throws Exception {
        QueryDto query=new QueryDto();
        query.setConnectId(connectId);
        query.setDbName(dbName);
        query.setTableName(tableName);
        query.setSql(sql);
        String result= mysqlTemplate.getFirstFieldMetaValue(query);
        System.out.println("mysql自定义统计sql字段:"+result);
        return result;
    }

    @Override
    public List<RuleDataRowVO> getTableNullRowList(QueryDto query) throws Exception {
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql=" select *  from %s where  %s is null or %s='' ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select *  from %s where  %s is null or %s=''  and  " + query.getSqlWhere();
        }
        String field=query.getFieldName();
        String tableName=query.getTableName();
        //空值sql
        String  formatSql=String.format(sql,tableName,field,field);
        query.setSql(formatSql);
        rowList=mysqlTemplate.getRuleRowList(query);

        return rowList;
    }



    @Override
    public List<RuleDataRowVO> getTableUniqueRowList(QueryDto query) throws Exception {
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql="select *  from  %s where %s in ( select %s from %s  where  %s is not null and %s!='' group by  %s having count(%s) =1) ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select *  from  %s where %s in ( select %s from %s  where  %s is not null and %s!='' and " + query.getSqlWhere() +"  group by  %s having count(%s) =1) ";
        }
        String field=query.getFieldName();
        String tableName=query.getTableName();
        //统计表唯一值sql
        String  formatSql=String.format(sql,tableName,field,field,tableName,field,field,field,field);
        query.setSql(formatSql);
        rowList=mysqlTemplate.getRuleRowList(query);
        return rowList;
    }

    @Override
    public List<RuleDataRowVO> getTableRepeatRowList(QueryDto query) throws Exception {
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql="select *  from  %s where %s in ( select %s from %s  where  %s is not null and %s!=''  group by  %s having count(%s) > 1) ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=" select *  from  %s where %s in ( select %s from %s  where  %s is not null and %s!=''   and  " + query.getSqlWhere() +" group by  %s having count(%s) > 1  ";
        }
        String field=query.getFieldName();
        String tableName=query.getTableName();
        //统计表唯一值sql
        String  formatSql=String.format(sql,tableName,field,field,tableName,field,field,field,field);
        query.setSql(formatSql);
        rowList=mysqlTemplate.getRuleRowList(query);
        return rowList;
    }

    @Override
    public List<String> getTablePartitionList(QueryDto query) throws Exception {
        return null;
    }





    @Override
    public void afterPropertiesSet() throws Exception {
        DataSourceStrategyFactory.setService(DataSourceTypeEnum.MYSQL.getTypeId(),this);
    }
}

 

策略实现类:DataSourceHiveStrategy.java

package cn.getech.data.manager.service.strategy.impl;

import cn.getech.data.development.config.properties.BdpJobConfig;
import cn.getech.data.development.config.properties.DataDevelopmentConfig;
import cn.getech.data.development.constant.PermissionTypeEnum;
import cn.getech.data.development.entity.TableFieldInfo;
import cn.getech.data.development.entity.TableInfo;
import cn.getech.data.development.mapper.TableInfoMapper;
import cn.getech.data.development.service.TableFieldInfoService;
import cn.getech.data.development.service.TableInfoService;
import cn.getech.data.development.utils.DataPermissionUtil;
import cn.getech.data.development.utils.HdfsUtil;
import cn.getech.data.intelligence.common.utils.Query;
import cn.getech.data.manager.constant.DBTypeEnum;
import cn.getech.data.manager.constant.DataSourceTypeEnum;
import cn.getech.data.manager.entity.DataQualityRulePartitionField;
import cn.getech.data.manager.model.dto.QualityRuleFieldDto;
import cn.getech.data.manager.model.dto.QueryDto;
import cn.getech.data.manager.model.vo.RuleDataRowVO;
import cn.getech.data.manager.model.vo.RuleFieldVO;
import cn.getech.data.manager.service.factory.DataSourceStrategyFactory;
import cn.getech.data.manager.service.strategy.DataSourceStrategy;
import cn.getech.data.manager.service.strategy.ManagerHiveTemplate;
import cn.getech.system.center.utils.ShiroUtils;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

import static org.codehaus.groovy.runtime.DefaultGroovyMethods.collect;

/**
 * @ClassName TableNameHiveService
 * @Description 获取表名hive 实现
 * @Author Getech
 * @Date 2020/10/10 14:16
 */
@Service
@Slf4j
public class DataSourceHiveStrategy implements DataSourceStrategy, InitializingBean {

    @Autowired
    private TableInfoService tableInfoService;


    @Autowired
    private TableFieldInfoService tableFieldInfoService;


    @Autowired
    private ManagerHiveTemplate managerHiveTemplate;


    @Autowired
    private BdpJobConfig bdpJobConfig;

    @Autowired
    private TableInfoMapper tableInfoMapper;


    @Autowired
    private DataDevelopmentConfig developmentConfig;



    @Override
    public List<String> getTableNameList(Integer connectId, String databaseName,String tableName)throws Exception {
        Map<String, Object> params=new HashMap<>();
        params.put("db_name",databaseName);
        params.put("table_name",tableName);
        Long userId = ShiroUtils.getUserId();
        params.put("create_per", userId);
        params.put("appUser", userId);
        params.put("sidx", "id");
        params.put("order", "desc");
        params.put("page", "1");
        params.put("limit", "3000");
        DataPermissionUtil.putDataFilter(params,
                PermissionTypeEnum.STORE.getType(),PermissionTypeEnum.QUERY.getType());
        IPage<TableInfo> page = this.tableInfoMapper.listNoRelation((Page<TableInfo>) new Query<TableInfo>().getPage(params), params);
        List<TableInfo> tableInfoList= page.getRecords()!=null? page.getRecords():new ArrayList<>();
        return tableInfoList.stream().map(e->e.getTableName()).collect(Collectors.toList());
    }

    /**
    * @Description 获取数据库名字
    * @Author  chengweiping
    * @Date   2020/10/19 17:46
    */
    @Override
    public List<String> getDbNameList(Integer connectId)throws Exception {
        List<String> dbNameList=new ArrayList<>();
        for(DBTypeEnum dbTypeEnum: DBTypeEnum.values()){
            dbNameList.add(dbTypeEnum.getName());
        }
      return dbNameList;
    }



    /**
    * @Description 获取表行数
    * @Author  chengweiping
    * @Date   2020/10/13 22:58
     * @param query
    */
    @Override
    public Long getTableRowNum(QueryDto query) throws Exception {
        //统计表总数的sql
        String sql = "select count(1) as totalCount  from %s ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql="select count(1) as totalCount  from %s where 1=1 and  " + query.getSqlWhere();
        }
        //统计表总数的sql
        String formatSql = String.format(sql, query.getTableName());
        query.setSql(formatSql);
        Long value= managerHiveTemplate.getLongValue(query);
        return value;
    }



    /**
    * @Description  获取表字段列表
    * @Author  chengweiping
    * @Date   2020/10/13 22:58
    */
    @Override
    public List<RuleFieldVO> getFieldList(QualityRuleFieldDto qualityRuleFieldDto) throws  Exception {

        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("db_name",qualityRuleFieldDto.getDatabaseName());
        queryWrapper.eq("table_name",qualityRuleFieldDto.getTableName());
        TableInfo tableInfo=tableInfoService.getOne(queryWrapper);
        List<RuleFieldVO> list=new ArrayList<>();
        if(tableInfo!=null){

            QueryWrapper queryWrapper2=new QueryWrapper();
            queryWrapper2.eq("table_id",tableInfo.getId());
            List<TableFieldInfo> tableFieldInfoList= tableFieldInfoService.list(queryWrapper2);
            list= tableFieldInfoList.stream().map(e-> {
                RuleFieldVO ruleFieldVO=new RuleFieldVO();
                ruleFieldVO.setFieldName(e.getFieldName());
                ruleFieldVO.setFieldType(e.getFieldType()!=null?e.getFieldType().toLowerCase():"");
                ruleFieldVO.setIsPartition(e.getIsPartition());
                return ruleFieldVO;
            }).collect(Collectors.toList());
        }
        return list;
    }


    /**
    * @Description 获取表大小
    * @Author  chengweiping
    * @Date   2020/10/13 22:59
    */
    @Override
    public BigDecimal getTotalTableSize(QueryDto query) throws Exception {
       // String dirHome = "/user/hive/warehouse_ranger/";
        String dirHome= developmentConfig.getWarehouseDir();
        if(org.apache.commons.lang.StringUtils.isNotBlank(dirHome)){
            //去除前后空格
            dirHome=dirHome.trim();
        }
        HdfsUtil hdfsUtil = null;
        BigDecimal tableSize=new BigDecimal(0);
        try {
            hdfsUtil = new HdfsUtil(bdpJobConfig);
            String dbUrl = dirHome + query.getDbName() + ".db";
            Long tableSizeLong = hdfsUtil.getTableOrDbSize(dbUrl + "/" + query.getTableName());
            if(tableSizeLong!=null){
                //转换为MB
                tableSize=new BigDecimal(tableSizeLong);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return tableSize;

    }

    @Override
    public Long getFieldNullNum(QueryDto query) throws Exception {
            String sql1=" select count(1) as totalCount  from %s where  ( %s is null  or  %s=''  ) ";
            String sql2="  ";
            String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
            String formatSql = String.format(sql, query.getTableName(),query.getFieldName(),query.getFieldName());
            query.setSql(formatSql);
            Long value= managerHiveTemplate.getLongValue(query);
            return value;
    }

    @Override
    public Long getFieldRepeatNum(QueryDto query) throws Exception {
        String sql1="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null  ";
        String sql2="  group by  %s having toatlCountTemp > 1) t ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName,fieldName);
        query.setSql(formatSql);
        Long value= managerHiveTemplate.getLongValue(query);
        return value;
    }


    @Override
    public Long getFieldUniqueNum(QueryDto query) throws Exception {
        String sql1="select count(1) as totalCount from ( select %s,count(*) as  toatlCountTemp from %s where  %s is not null  ";
        String sql2="  group by  %s having toatlCountTemp =1) t ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName,fieldName);
        query.setSql(formatSql);
        Long value= managerHiveTemplate.getLongValue(query);
        return value;
    }



    @Override
    public BigDecimal getFieldSumNum(QueryDto query) throws Exception {

        String sql1=" select sum(%s) as totalCount  from %s  where  %s is not null  ";
        String sql2="    ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        //统计表sum值sql
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName);
        query.setSql(formatSql);
        BigDecimal result= managerHiveTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;

    }


    @Override
    public BigDecimal getFieldMinNum(QueryDto query) throws Exception {

        String sql1=" select min(%s) as minValue  from %s  where  %s is not null  ";
        String sql2="    ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName);
        query.setSql(formatSql);
        BigDecimal result= managerHiveTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;
    }

    @Override
    public BigDecimal getFieldMaxNum(QueryDto query) throws Exception {
        String sql1="  select max(%s) as maxValue  from %s  where  %s is not null  ";
        String sql2="    ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName);
        query.setSql(formatSql);
        BigDecimal result= managerHiveTemplate.getBigDecimalValue(query);
        BigDecimal value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        return value;

    }


    @Override
    public BigDecimal getFieldAvgNum(QueryDto query) throws Exception {
        String sql1="  select avg(%s) as avgCount  from  %s  where  %s is not null  ";
        String sql2="    ";
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        //计算sql
        String tableName=query.getTableName();
        String fieldName=query.getFieldName();
        String formatSql= String.format(sql, fieldName,tableName,fieldName);
        query.setSql(formatSql);
        BigDecimal result= managerHiveTemplate.getBigDecimalValue(query);
        BigDecimal value=new BigDecimal(0);
        if(result!=null){
            value=result.setScale(2, BigDecimal.ROUND_HALF_UP);
        }

        return value;
    }


    @Override
    public BigDecimal getCustomeSqlResult(Integer connectId,String dbName,String tableName,String sql) throws Exception {
        QueryDto query=new QueryDto();
        query.setConnectId(connectId);
        query.setDbName(dbName);
        query.setTableName(tableName);
        String newSql=sql.toLowerCase().replace(";","").trim();
        query.setSql(newSql);
        BigDecimal result= managerHiveTemplate.getBigDecimalValue(query);
        System.out.println("自定义统计sql值:"+result);
        return result;
    }

    @Override
    public String getCustomeSqlField(Integer connectId, String dbName, String tableName, String sql) throws Exception {
        QueryDto query=new QueryDto();
        query.setConnectId(connectId);
        query.setDbName(dbName);
        query.setTableName(tableName);
        query.setSql(sql);
        String result= managerHiveTemplate.getFirstFieldMetaValue(query);
        System.out.println("自定义统计sql字段:"+result);
        return result;
    }

    @Override
    public List<RuleDataRowVO> getTableNullRowList(QueryDto query)throws Exception {
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql1="  select *  from  %s where  %s is null  ";
        String sql2="    ";
        List<DataQualityRulePartitionField> partitionFieldList= query.getPartitionFieldList();
        String partitionFieldStr= parsePartitionStr(partitionFieldList);
        if(StringUtils.isNotBlank(partitionFieldStr)){
            sql2=sql2+ " and   "+ "( "+partitionFieldStr+" ) ";
        }
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String field=query.getFieldName();
        String tableName=query.getTableName();
        //空值sql
        String  formatSql=String.format(sql,tableName,field);
        query.setSql(formatSql);
        rowList=managerHiveTemplate.getRuleRowList(query);

        return rowList;
    }

    /**
    * @Description 获取唯一行数据
    * @Author  chengweiping
    * @Date   2020/10/20 17:35
    */
    @Override
    public List<RuleDataRowVO> getTableUniqueRowList(QueryDto query)throws Exception {
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql1=" select *  from  %s t  where %s in ( select %s from %s where  %s is not null   ";
        String sql2="   group by  %s having count(%s) =1)   ";
        List<DataQualityRulePartitionField> partitionFieldList= query.getPartitionFieldList();
        String partitionFieldStr= parsePartitionStr(partitionFieldList);
        if(StringUtils.isNotBlank(partitionFieldStr)){
            sql2=sql2+ " and   "+ "( "+partitionFieldStr+" ) ";
        }
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String field=query.getFieldName();
        String tableName=query.getTableName();
        //统计表唯一值sql
        String  formatSql=String.format(sql,tableName,field,field,tableName,field,field,field);
        query.setSql(formatSql);
        rowList=managerHiveTemplate.getRuleRowList(query);
        return rowList;
    }




    @Override
    public List<RuleDataRowVO> getTableRepeatRowList(QueryDto query) throws Exception{
        List<RuleDataRowVO> rowList=new ArrayList<>();
        String sql1=" select *  from  %s t where %s in ( select %s from %s where  %s is not null     ";
        String sql2="  group by  %s having count(%s) > 1)   ";
        List<DataQualityRulePartitionField> partitionFieldList= query.getPartitionFieldList();
        String partitionFieldStr= parsePartitionStr(partitionFieldList);
        if(StringUtils.isNotBlank(partitionFieldStr)){
             sql2=sql2+ " and   "+ "( "+partitionFieldStr+" ) ";
        }
        String sql=parseSqlForWhereAndPartition(query,sql1,sql2);
        String field=query.getFieldName();
        String tableName=query.getTableName();
       //统计表唯一值sql
        String  formatSql=String.format(sql,tableName,field,field,tableName,field,field,field);
        query.setSql(formatSql);
        rowList=managerHiveTemplate.getRuleRowList(query);
        return rowList;
    }


    /**
    * @Description
    * @Author  chengweiping
    * @Date   2020/10/22 10:47
    */
    @Override
    public List<String> getTablePartitionList(QueryDto query) throws Exception {
        String sql=" show partitions %s  ";
        //计算sql
        String tableName=query.getTableName();
        String formatSql= String.format(sql, tableName);
        query.setSql(formatSql);
        List<String> list= managerHiveTemplate.getFieldValueList(query);
        return list;
    }

    /**
     * @Description 解析sql,拼接where与partition条件
     * @Author  chengweiping
     * @Date   2020/10/29 12:43
     */
    private String  parseSqlForWhereAndPartition(QueryDto query,String sql1,String sql2){
        List<DataQualityRulePartitionField> partitionFieldList= query.getPartitionFieldList();
        //有分区字段时,加上分区字段限定值
        String sqlPartitionCondition="";
        if(CollectionUtil.isNotEmpty(partitionFieldList)){
            sqlPartitionCondition=parsePartitionStr(partitionFieldList);
        }

        String sql=sql1+sql2;
        String sqlAnd=" and ";
        if(StringUtils.isNotBlank(query.getSqlWhere())){
            sql=sql1 +sqlAnd + query.getSqlWhere()+ sql2;
            if(StringUtils.isNotBlank(sqlPartitionCondition)){
                sql=sql1 +sqlAnd + query.getSqlWhere()+  sqlAnd+  " ( " + sqlPartitionCondition+ "  ) " + sql2;
            }
        }else{
            if(StringUtils.isNotBlank(sqlPartitionCondition)){
                sql=sql1 +sqlAnd + " ( " + sqlPartitionCondition+ " ) "+sql2;
            }
        }
        return sql;
    }


    /**
    * @Description 解析分区条件
    * @Author  chengweiping
    * @Date   2020/10/30 11:50
    */
    public String parsePartitionStr(List<DataQualityRulePartitionField> partitionFieldList){
        if(CollectionUtil.isEmpty(partitionFieldList)){
            return "";
        }else{
            String sqlPartitionCondition="";
            sqlPartitionCondition= partitionFieldList.stream()
                    .filter(e->e.getFieldName()!=null)
                    .map(e->e.getFieldName()+"="+"'"+ (e.getFieldValue()!=null?e.getFieldValue():"")+"'")
                    .collect(Collectors.joining("  or  "));
            return sqlPartitionCondition;
        }


    }


    @Override
    public void afterPropertiesSet() throws Exception {
        DataSourceStrategyFactory.setService(DataSourceTypeEnum.HIVE.getTypeId(),this);
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成伟平2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值