public QuerySqlParseResult parse()

in src/main/java/com/uber/uberscriptquery/antlr4/parsing/QuerySqlParser.java [62:212]


    public QuerySqlParseResult parse(String text, Map<String, Object> variableOverwrite) {
        QueryTemplateParser templateMixTextParser = new QueryTemplateParser();
        QueryTemplateParseResult UberScriptQueryTemplateParseResult = templateMixTextParser.parse(text, variableOverwrite);

        for (Map.Entry<String, Object> entry : UberScriptQueryTemplateParseResult.getVariableMap().entrySet()) {
            logger.info(String.format("Found variable: %s = %s", entry.getKey(), entry.getValue()));
        }

        String templateBody = UberScriptQueryTemplateParseResult.getTemplateBody();
        logger.info("Found transformed template body: " + templateBody);

        logger.info("Parsing query after template transformaion: " + templateBody);

        final char[] charArray = templateBody.toCharArray();

        final char[] charArrayUpperCase = templateBody.toUpperCase().toCharArray();

        final RootStatement rootStatement = new RootStatement();

        UberScriptQuerySqlLexer l = new UberScriptQuerySqlLexer(new ANTLRInputStream(charArrayUpperCase, charArrayUpperCase.length));
        com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser p = new com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser(new CommonTokenStream(l));
        p.addErrorListener(new BaseErrorListener() {
            @Override
            public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
                throw new IllegalStateException(
                        String.format("Failed to parse at line %s char %s due to %s", line, charPositionInLine, msg),
                        e);
            }
        });

        p.addParseListener(
                new UberScriptQuerySqlBaseListener() {
                    @Override
                    public void enterFileAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.FileAssignmentContext ctx) {
                        FileAssignment fileAssignment = new FileAssignment();
                        rootStatement.getFileAssignments().add(fileAssignment);
                    }

                    @Override
                    public void exitFileAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.FileAssignmentContext ctx) {
                        FileAssignment fileStatement = rootStatement.getFileAssignments().get(rootStatement.getFileAssignments().size() - 1);
                        String tableAlias = getMatchedString(ctx.fileAssignment_tableAlias(), charArray);
                        String fileType = getMatchedString(ctx.fileAssignment_fileType(), charArray);
                        String fileLocation = getMatchedString(ctx.fileAssignment_fileLocation(), charArray);
                        fileStatement.setTableAlias(tableAlias);
                        fileStatement.setFileType(fileType);
                        fileStatement.setFileLocation(fileLocation);
                    }

                    @Override
                    public void enterStatementAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.StatementAssignmentContext ctx) {
                        StatementAssignment statementAssignment = new StatementAssignment();
                        rootStatement.getStatementAssignments().add(statementAssignment);
                    }

                    @Override
                    public void exitStatementAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.StatementAssignmentContext ctx) {
                        StatementAssignment inputStatement = rootStatement.getStatementAssignments().get(rootStatement.getStatementAssignments().size() - 1);
                        String tableAlias = getMatchedString(ctx.statementAssignment_tableAlias(), charArray);
                        String queryType = getMatchedString(ctx.statementAssignment_queryType(), charArray);
                        String queryEngine = getMatchedString(ctx.statementAssignment_queryEngine(), charArray);
                        String queryText = getMatchedString(ctx.statementAssignment_query(), charArray);

                        inputStatement.setTableAlias(tableAlias);
                        inputStatement.setQueryType(queryType);
                        inputStatement.setQueryEngine(queryEngine);
                        inputStatement.setQueryText(queryText);

                        if (ctx.statementAssignment_query().configSetting() != null) {
                            for (com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.ConfigSettingContext configSettingContext : ctx.statementAssignment_query().configSetting()) {
                                String settingName = getMatchedString(configSettingContext.qualifiedName(), charArray);
                                String settingValue = getMatchedString(configSettingContext.constant(), charArray);
                                settingValue = ParserUtils.getStringStatementInnerValue(settingValue);
                                inputStatement.getQueryConfig().put(settingName, settingValue);
                            }
                        }

                        inputStatement.setQueryStatement(getMatchedString(ctx.statementAssignment_query().statement(), charArray));
                    }

                    @Override
                    public void exitTableIdentifier(com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.TableIdentifierContext ctx) {
                        String str = getMatchedString(ctx.table, charArray);
                        rootStatement.getTableReferenceCount().increase(str);
                    }
                });

        com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.RootContext rootContext = p.root();

        if (rootContext.jsonQueryStatementAssignment() != null) {
            for (com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.JsonQueryStatementAssignmentContext jsonQueryStatementAssignmentContext : rootContext.jsonQueryStatementAssignment()) {
                StatementAssignment jsonQueryStatementAssignment = new StatementAssignment();

                String tableAlias = getMatchedString(jsonQueryStatementAssignmentContext.statementAssignment_tableAlias(), charArray);
                String queryType = "JSON";
                String queryEngine = getMatchedString(jsonQueryStatementAssignmentContext.statementAssignment_queryEngine(), charArray);
                String queryText = getMatchedString(jsonQueryStatementAssignmentContext.jsonQueryStatementAssignment_query(), charArray);
                String queryStatement = getMatchedString(jsonQueryStatementAssignmentContext.jsonQueryStatementAssignment_query().jsonObject(), charArray);

                jsonQueryStatementAssignment.setTableAlias(tableAlias);
                jsonQueryStatementAssignment.setQueryType(queryType);
                jsonQueryStatementAssignment.setQueryEngine(queryEngine);
                jsonQueryStatementAssignment.setQueryText(queryText);
                jsonQueryStatementAssignment.setQueryStatement(queryStatement);

                if (jsonQueryStatementAssignmentContext.jsonQueryStatementAssignment_query().configSetting() != null) {
                    for (com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.ConfigSettingContext configSettingContext : jsonQueryStatementAssignmentContext.jsonQueryStatementAssignment_query().configSetting()) {
                        String settingName = getMatchedString(configSettingContext.qualifiedName(), charArray);
                        String settingValue = getMatchedString(configSettingContext.constant(), charArray);
                        settingValue = ParserUtils.getStringStatementInnerValue(settingValue);
                        jsonQueryStatementAssignment.getQueryConfig().put(settingName, settingValue);
                    }
                }

                rootStatement.getJsonQueryStatementAssignments().add(jsonQueryStatementAssignment);
            }
        }

        if (rootContext.actionStatement() != null) {
            for (com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.ActionStatementContext actionStatementContext : rootContext.actionStatement()) {
                String name = getMatchedString(actionStatementContext.qualifiedName(), charArray);

                ActionStatement actionStatement = new ActionStatement();
                actionStatement.setFunctionName(name);

                if (actionStatementContext.actionStatement_param() != null) {
                    for (com.uber.uberscriptquery.antlr4.generated.UberScriptQuerySqlParser.ActionStatement_paramContext paramContext : actionStatementContext.actionStatement_param()) {
                        if (paramContext.STRING() != null) {
                            ValueType valueType = ValueType.String;
                            String value = getMatchedString(paramContext.STRING().getSymbol(), charArray);
                            value = ParserUtils.getStringStatementInnerValue(value);
                            actionStatement.getParamValues().add(new ActionParamValue(valueType, value));
                        } else if (paramContext.IDENTIFIER() != null) {
                            ValueType valueType = ValueType.Table;
                            String value = getMatchedString(paramContext.IDENTIFIER().getSymbol(), charArray);
                            actionStatement.getParamValues().add(new ActionParamValue(valueType, value));

                            rootStatement.getTableReferenceCount().increase(value);
                        }
                    }
                }

                rootStatement.getActionStatements().add(actionStatement);
            }
        }

        QuerySqlParseResult result = new QuerySqlParseResult();
        result.setRootStatement(rootStatement);

        return result;
    }