Search in sources :

Example 1 with ParseResult

use of com.dtstack.taier.develop.sql.ParseResult in project Taier by DTStack.

the class LibraUglySqlHandler method parserUglySql.

public ParseResult parserUglySql() {
    ParseResult parseResult = new ParseResult();
    String parsedSql = parseUglySql();
    parseResult.setStandardSql(parsedSql);
    // 针对comment_on特殊处理
    if ((sqlMode & COMMENT_ON_TABLE) == COMMENT_ON_TABLE) {
        parseResult.setSqlType(SqlType.COMMENT_ON);
        Matcher matcher = COMMENT_ON_TABLE_PATTERN.matcher(sql);
        if (matcher.find()) {
            String db = matcher.group("db");
            if (StringUtils.isNotEmpty(db)) {
                parseResult.setCurrentDb(db);
            }
            String table = matcher.group("table");
            if (StringUtils.isNotEmpty(table)) {
                Table table1 = new Table();
                table1.setName(table);
                parseResult.setMainTable(table1);
            }
        }
    } else if ((sqlMode & COMMENT_ON_COLUMN) == COMMENT_ON_COLUMN) {
        parseResult.setSqlType(SqlType.COMMENT_ON);
        Matcher matcher = COMMENT_ON_COLUMN_PATTERN.matcher(sql);
        if (matcher.find()) {
            String columnStr = matcher.group("column");
            String[] split = columnStr.split("\\.");
            if (split.length == 3) {
                parseResult.setCurrentDb(split[0]);
                Table table = new Table();
                table.setName(split[1]);
                parseResult.setMainTable(table);
            } else if (split.length == 2) {
                Table table = new Table();
                table.setName(split[0]);
                parseResult.setMainTable(table);
            }
        }
    }
    return parseResult;
}
Also used : Table(com.dtstack.taier.develop.sql.Table) ParseResult(com.dtstack.taier.develop.sql.ParseResult) Matcher(java.util.regex.Matcher)

Example 2 with ParseResult

use of com.dtstack.taier.develop.sql.ParseResult in project Taier by DTStack.

the class AstNodeParser method parseSql.

/**
 * 解析sql
 */
@Override
public ParseResult parseSql(String originSql, String currentDb, Map<String, List<Column>> tableColumnsMap) throws Exception {
    ParseResult parseResult = new ParseResult();
    parseResult.setCurrentDb(currentDb);
    parseResult.setOriginSql(originSql);
    parseResult.setMainTable(new Table());
    ASTNode root;
    originSql = SqlFormatUtil.formatSql(originSql);
    // 解析和去掉sql中的生命周期和类目信息
    parseLifecycleAndCatalogue(parseResult);
    SqlFormatUtil.checkSql(parseResult.getStandardSql());
    if (isNotParse(originSql, parseResult)) {
        return parseResult;
    }
    if (SqlRegexUtil.isCreateTemp(parseResult.getStandardSql())) {
        parseResult.setStandardSql(SqlRegexUtil.removeTempKey(parseResult.getStandardSql()));
        parseResult.setExtraSqlType(SqlType.CREATE_TEMP);
    }
    String formattedSql = this.uglySqlHandler.parseUglySql(originSql);
    if (StringUtils.isEmpty(formattedSql)) {
        return parseResult;
    }
    try {
        root = parseDriver.parse(formattedSql);
    } catch (ParseException e) {
        LOG.error("sql解析异常========>>>>:{}", e.getMessage());
        // 用正则匹配一下
        ParseResult p = SqlTypeRegexUtil.getParseResultByRegexSql(parseResult);
        return p;
    }
    return getParseResult(originSql, currentDb, tableColumnsMap, parseResult, root);
}
Also used : Table(com.dtstack.taier.develop.sql.Table) ParseResult(com.dtstack.taier.develop.sql.ParseResult) ASTNode(org.apache.hadoop.hive.ql.parse.ASTNode) ParseException(org.apache.hadoop.hive.ql.parse.ParseException)

Example 3 with ParseResult

use of com.dtstack.taier.develop.sql.ParseResult in project Taier by DTStack.

the class AstNodeParser method parseTableLineage.

@Override
public ParseResult parseTableLineage(String originSql, String currentDb) throws Exception {
    ParseResult parseResult = new ParseResult();
    parseResult.setCurrentDb(currentDb);
    parseResult.setOriginSql(originSql);
    parseResult.setMainTable(new Table());
    ASTNode root;
    originSql = SqlFormatUtil.formatSql(originSql);
    String standardSql = SqlFormatUtil.getStandardSql(originSql);
    SqlFormatUtil.checkSql(standardSql);
    parseResult.setStandardSql(standardSql);
    // 解析和去掉sql中的生命周期和类目信息
    parseLifecycleAndCatalogue(parseResult);
    String formattedSql = this.uglySqlHandler.parseUglySql(originSql);
    if (StringUtils.isEmpty(formattedSql)) {
        return parseResult;
    }
    parseResult.setStandardSql(formattedSql);
    try {
        root = parseDriver.parse(parseResult.getStandardSql());
    } catch (ParseException e) {
        LOG.error("sql解析异常========>>>>:{}", e.getMessage());
        // 用正则匹配一下
        ParseResult p = SqlTypeRegexUtil.getParseResultByRegexSql(parseResult);
        return p;
    }
    NodeParser nodeParser = ASTNodeLineageParser.ParserProxy.getParser((ASTNode) root.getChild(0), originSql);
    com.dtstack.taier.develop.sql.node.Node node = nodeParser.parseSql((ASTNode) root.getChild(0), currentDb, new HashMap<>(), new HashMap<>());
    LineageParser lineageParser = LineageParser.HiveParserProxy.getParser(node, currentDb, new HashMap<>());
    if (lineageParser != null) {
        List<TableLineage> tableLineages = getTableLineages(node, lineageParser);
        parseResult.setTableLineages(tableLineages);
    }
    getMainTable(node, parseResult, root);
    return parseResult;
}
Also used : Table(com.dtstack.taier.develop.sql.Table) ParseResult(com.dtstack.taier.develop.sql.ParseResult) OtherNodeParser(com.dtstack.taier.develop.sql.hive.node.OtherNodeParser) NodeParser(com.dtstack.taier.develop.sql.hive.node.NodeParser) LineageParser(com.dtstack.taier.develop.sql.calcite.LineageParser) TableLineage(com.dtstack.taier.develop.sql.TableLineage) ASTNode(org.apache.hadoop.hive.ql.parse.ASTNode) ParseException(org.apache.hadoop.hive.ql.parse.ParseException)

Example 4 with ParseResult

use of com.dtstack.taier.develop.sql.ParseResult in project Taier by DTStack.

the class ImpalaUglySqlHandler method parserUglySql.

public ParseResult parserUglySql() {
    ParseResult parseResult = new ParseResult();
    String parsedSql = this.parseUglySql(this.sql);
    parseResult.setStandardSql(parsedSql);
    // 针对comment_on特殊处理
    if ((sqlMode & COMMENT_ON_TABLE) == COMMENT_ON_TABLE) {
        parseResult.setSqlType(SqlType.COMMENT_ON);
        Matcher matcher = COMMENT_ON_TABLE_PATTERN.matcher(sql);
        if (matcher.find()) {
            String db = matcher.group("db");
            if (StringUtils.isNotEmpty(db)) {
                parseResult.setCurrentDb(db);
            }
            String table = matcher.group("table");
            if (StringUtils.isNotEmpty(table)) {
                Table table1 = new Table();
                table1.setName(table);
                parseResult.setMainTable(table1);
            }
        }
    } else if ((sqlMode & COMMENT_ON_COLUMN) == COMMENT_ON_COLUMN) {
        parseResult.setSqlType(SqlType.COMMENT_ON);
        Matcher matcher = COMMENT_ON_COLUMN_PATTERN.matcher(sql);
        if (matcher.find()) {
            String columnStr = matcher.group("column");
            String[] split = columnStr.split("\\.");
            if (split.length == 3) {
                parseResult.setCurrentDb(split[0]);
                Table table = new Table();
                table.setName(split[1]);
                parseResult.setMainTable(table);
            } else if (split.length == 2) {
                Table table = new Table();
                table.setName(split[0]);
                parseResult.setMainTable(table);
            }
        }
    }
    return parseResult;
}
Also used : Table(com.dtstack.taier.develop.sql.Table) ParseResult(com.dtstack.taier.develop.sql.ParseResult) Matcher(java.util.regex.Matcher)

Example 5 with ParseResult

use of com.dtstack.taier.develop.sql.ParseResult in project Taier by DTStack.

the class BatchSparkHiveSqlExeService method executeSql.

/**
 * 执行sql
 *
 * @param executeContent
 * @param scheduleJobType
 * @return
 */
protected ExecuteResultVO executeSql(ExecuteContent executeContent, EScheduleJobType scheduleJobType) {
    // 判断血缘解析结果,防止空指针
    if (null == executeContent.getParseResult()) {
        throw new RdosDefineException("SQL解析异常,结果为空");
    }
    Long tenantId = executeContent.getTenantId();
    Long userId = executeContent.getUserId();
    Long taskId = executeContent.getTaskId();
    String preJobId = executeContent.getPreJobId();
    String currDb = executeContent.getParseResult().getCurrentDb();
    ParseResult parseResult = executeContent.getParseResult();
    boolean useSelfFunction = batchFunctionService.validContainSelfFunction(executeContent.getSql(), tenantId, null, scheduleJobType.getType());
    ExecuteResultVO<List<Object>> result = new ExecuteResultVO<>();
    if (Objects.nonNull(parseResult) && Objects.nonNull(parseResult.getStandardSql()) && isSimpleQuery(parseResult.getStandardSql()) && !useSelfFunction) {
        result = simpleQuery(tenantId, parseResult, currDb, userId, scheduleJobType);
        if (!result.getContinue()) {
            return result;
        }
    }
    DataSourceType dataSourceType = scheduleJobType == EScheduleJobType.SPARK_SQL ? DataSourceType.SPARKTHRIFT2_1 : null;
    if (SqlType.CREATE_AS.equals(parseResult.getSqlType())) {
        String jobId = batchHadoopSelectSqlService.runSqlByTask(tenantId, parseResult, userId, currDb.toLowerCase(), true, taskId, scheduleJobType.getType(), preJobId);
        result.setJobId(jobId);
        result.setContinue(false);
        return result;
    } else if (SqlType.INSERT.equals(parseResult.getSqlType()) || SqlType.INSERT_OVERWRITE.equals(parseResult.getSqlType()) || SqlType.QUERY.equals(parseResult.getSqlType()) || useSelfFunction) {
        String jobId = batchHadoopSelectSqlService.runSqlByTask(tenantId, parseResult, userId, currDb.toLowerCase(), taskId, scheduleJobType.getType(), preJobId);
        result.setJobId(jobId);
    } else {
        if (!executeContent.isExecuteSqlLater()) {
            TenantComponent tenantEngine = developTenantComponentService.getByTenantAndEngineType(executeContent.getTenantId(), executeContent.getTaskType());
            Preconditions.checkNotNull(tenantEngine, "引擎不能为空");
            if (SqlType.CREATE.equals(parseResult.getSqlType()) || SqlType.CREATE_LIKE.equals(parseResult.getSqlType())) {
                executeCreateTableSql(parseResult, tenantId, tenantEngine.getComponentIdentity().toLowerCase(), scheduleJobType);
            } else {
                this.exeSqlDirect(executeContent, tenantId, parseResult, result, tenantEngine, dataSourceType);
            }
        }
    }
    result.setContinue(true);
    return result;
}
Also used : ParseResult(com.dtstack.taier.develop.sql.ParseResult) RdosDefineException(com.dtstack.taier.common.exception.RdosDefineException) DataSourceType(com.dtstack.taier.common.enums.DataSourceType) ExecuteResultVO(com.dtstack.taier.develop.dto.devlop.ExecuteResultVO) List(java.util.List) TenantComponent(com.dtstack.taier.dao.domain.TenantComponent)

Aggregations

ParseResult (com.dtstack.taier.develop.sql.ParseResult)8 Table (com.dtstack.taier.develop.sql.Table)4 TenantComponent (com.dtstack.taier.dao.domain.TenantComponent)3 RdosDefineException (com.dtstack.taier.common.exception.RdosDefineException)2 ExecuteResultVO (com.dtstack.taier.develop.dto.devlop.ExecuteResultVO)2 List (java.util.List)2 Matcher (java.util.regex.Matcher)2 ASTNode (org.apache.hadoop.hive.ql.parse.ASTNode)2 ParseException (org.apache.hadoop.hive.ql.parse.ParseException)2 DataSourceType (com.dtstack.taier.common.enums.DataSourceType)1 BatchTask (com.dtstack.taier.dao.domain.BatchTask)1 BuildSqlVO (com.dtstack.taier.develop.dto.devlop.BuildSqlVO)1 ExecuteSqlParseVO (com.dtstack.taier.develop.dto.devlop.ExecuteSqlParseVO)1 SqlResultVO (com.dtstack.taier.develop.dto.devlop.SqlResultVO)1 ISqlExeService (com.dtstack.taier.develop.service.develop.ISqlExeService)1 SqlParserImpl (com.dtstack.taier.develop.sql.SqlParserImpl)1 TableLineage (com.dtstack.taier.develop.sql.TableLineage)1 LineageParser (com.dtstack.taier.develop.sql.calcite.LineageParser)1 NodeParser (com.dtstack.taier.develop.sql.hive.node.NodeParser)1 OtherNodeParser (com.dtstack.taier.develop.sql.hive.node.OtherNodeParser)1