Example #1
0
        private static EsperEPL2GrammarParser.StartEventPropertyRuleContext HandleRecognitionEx(RecognitionException e, CommonTokenStream tokens, string propertyName, EsperEPL2GrammarParser g)
        {
            // Check for keywords and escape each, parse again
            var escapedPropertyName = EscapeKeywords(tokens);

            ICharStream inputEscaped;

            try
            {
                inputEscaped = new NoCaseSensitiveStream(escapedPropertyName);
            }
            catch (IOException ex)
            {
                throw new PropertyAccessException("IOException parsing property name '" + propertyName + '\'', ex);
            }

            var lexEscaped    = ParseHelper.NewLexer(inputEscaped);
            var tokensEscaped = new CommonTokenStream(lexEscaped);
            var gEscaped      = ParseHelper.NewParser(tokensEscaped);

            try
            {
                return(gEscaped.startEventPropertyRule());
            }
            catch
            {
            }

            throw ExceptionConvertor.ConvertProperty(e, propertyName, true, g);
        }
Example #2
0
        /// <summary>
        /// Parses a given property name returning an AST.
        /// </summary>
        /// <param name="propertyName">to parse</param>
        /// <returns>AST syntax tree</returns>
        public static EsperEPL2GrammarParser.StartEventPropertyRuleContext Parse(string propertyName)
        {
            ICharStream input;

            try
            {
                input = new NoCaseSensitiveStream(propertyName);
            }
            catch (IOException ex)
            {
                throw new PropertyAccessException("IOException parsing property name '" + propertyName + '\'', ex);
            }

            var lex    = ParseHelper.NewLexer(input);
            var tokens = new CommonTokenStream(lex);

            try
            {
                tokens.Fill();
            }
            catch (Exception e)
            {
                if (ParseHelper.HasControlCharacters(propertyName))
                {
                    throw new PropertyAccessException("Unrecognized control characters found in text");
                }
                throw new PropertyAccessException("Failed to parse text: " + e.Message);
            }

            var g = ParseHelper.NewParser(tokens);

            EsperEPL2GrammarParser.StartEventPropertyRuleContext r;

            try
            {
                r = g.startEventPropertyRule();
            }
            catch (RecognitionException e)
            {
                return(HandleRecognitionEx(e, tokens, propertyName, g));
            }
            catch (Exception e)
            {
                if (Log.IsDebugEnabled)
                {
                    Log.Debug("Error parsing property expression [" + propertyName + "]", e);
                }
                if (e.InnerException is RecognitionException)
                {
                    return(HandleRecognitionEx((RecognitionException)e.InnerException, tokens, propertyName, g));
                }
                else
                {
                    throw;
                }
            }

            return(r);
        }
Example #3
0
        public static Pair <ITree, CommonTokenStream> Parse(ParseRuleSelector parseRuleSelector, String text)
        {
            NoCaseSensitiveStream input;

            try
            {
                input = new NoCaseSensitiveStream(text);
            }
            catch (IOException ex)
            {
                throw new IOException("IOException parsing text '" + text + '\'', ex);
            }

            var lex    = ParseHelper.NewLexer(input);
            var tokens = new CommonTokenStream(lex);
            var g      = ParseHelper.NewParser(tokens);

            var ctx = parseRuleSelector.Invoke(g);

            return(new Pair <ITree, CommonTokenStream>(ctx, tokens));
        }
Example #4
0
        /// <summary>
        /// Lexes the sample SQL and inserts a "where 1=0" where-clause.
        /// </summary>
        /// <param name="querySQL">to inspect using lexer</param>
        /// <returns>sample SQL with where-clause inserted</returns>
        /// <exception cref="ExprValidationException">indicates a lexer problem</exception>
        public static String LexSampleSQL(String querySQL)
        {
            querySQL = Regex.Replace(querySQL, "\\s\\s+|\\n|\\r", m => " ");

            ICharStream input;

            try
            {
                input = new NoCaseSensitiveStream(querySQL);
            }
            catch (IOException ex)
            {
                throw new ExprValidationException("IOException lexing query SQL '" + querySQL + '\'', ex);
            }

            var whereIndex   = -1;
            var groupbyIndex = -1;
            var havingIndex  = -1;
            var orderByIndex = -1;
            var unionIndexes = new List <int>();

            var lex    = ParseHelper.NewLexer(input);
            var tokens = new CommonTokenStream(lex);

            tokens.Fill();

            IList <IToken> tokenList = tokens.GetTokens();

            for (var i = 0; i < tokenList.Count; i++)
            {
                var token = (IToken)tokenList[i];
                if ((token == null) || token.Text == null)
                {
                    break;
                }
                var text = token.Text.ToLower().Trim();
                if (text == "")
                {
                    continue;
                }

                switch (text)
                {
                case "where":
                    whereIndex = token.Column + 1;
                    break;

                case "group":
                    groupbyIndex = token.Column + 1;
                    break;

                case "having":
                    havingIndex = token.Column + 1;
                    break;

                case "order":
                    orderByIndex = token.Column + 1;
                    break;

                case "union":
                    unionIndexes.Add(token.Column + 1);
                    break;
                }
            }

            // If we have a union, break string into subselects and process each
            if (unionIndexes.Count != 0)
            {
                String fragment;
                String lexedFragment;
                var    changedSQL = new StringBuilder();
                var    lastIndex  = 0;
                for (var i = 0; i < unionIndexes.Count; i++)
                {
                    var index = unionIndexes[i];
                    if (i > 0)
                    {
                        fragment = querySQL.Substring(lastIndex + 5, index - 6 - lastIndex);
                    }
                    else
                    {
                        fragment = querySQL.Substring(lastIndex, index - 1 - lastIndex);
                    }

                    lexedFragment = LexSampleSQL(fragment);

                    if (i > 0)
                    {
                        changedSQL.Append("union ");
                    }
                    changedSQL.Append(lexedFragment);
                    lastIndex = index - 1;
                }

                // last part after last union
                fragment      = querySQL.Substring(lastIndex + 5);
                lexedFragment = LexSampleSQL(fragment);
                changedSQL.Append("union ");
                changedSQL.Append(lexedFragment);

                return(changedSQL.ToString());
            }

            // Found a where clause, simplest cases
            if (whereIndex != -1)
            {
                var changedSQL = new StringBuilder();
                var prefix     = querySQL.Substring(0, whereIndex + 5);
                var suffix     = querySQL.Substring(whereIndex + 5);
                changedSQL.Append(prefix);
                changedSQL.Append("1=0 and ");
                changedSQL.Append(suffix);
                return(changedSQL.ToString());
            }

            // No where clause, find group-by
            int insertIndex;

            if (groupbyIndex != -1)
            {
                insertIndex = groupbyIndex;
            }
            else if (havingIndex != -1)
            {
                insertIndex = havingIndex;
            }
            else if (orderByIndex != -1)
            {
                insertIndex = orderByIndex;
            }
            else
            {
                var changedSQL = new StringBuilder();
                changedSQL.Append(querySQL);
                changedSQL.Append(" where 1=0 ");
                return(changedSQL.ToString());
            }

            try
            {
                var changedSQL = new StringBuilder();
                var prefix     = querySQL.Substring(0, insertIndex - 1);
                changedSQL.Append(prefix);
                changedSQL.Append("where 1=0 ");
                var suffix = querySQL.Substring(insertIndex - 1);
                changedSQL.Append(suffix);
                return(changedSQL.ToString());
            }
            catch (Exception ex)
            {
                const string text =
                    "Error constructing sample SQL to retrieve metadata for JDBC-drivers that don't support metadata, consider using the " +
                    SAMPLE_WHERECLAUSE_PLACEHOLDER + " placeholder or providing a sample SQL";
                Log.Error(text, ex);
                throw new ExprValidationException(text, ex);
            }
        }
Example #5
0
        public static IList <EPLModuleParseItem> Parse(String module)
        {
            ICharStream input;

            try
            {
                input = new NoCaseSensitiveStream(module);
            }
            catch (IOException ex)
            {
                Log.Error("Exception reading module expression: " + ex.Message, ex);
                return(null);
            }

            var lex    = ParseHelper.NewLexer(input);
            var tokens = new CommonTokenStream(lex);

            try
            {
                tokens.Fill();
            }
            catch (Exception ex)
            {
                String message = "Unexpected exception recognizing module text";
                if (ex is LexerNoViableAltException)
                {
                    if (ParseHelper.HasControlCharacters(module))
                    {
                        message = "Unrecognized control characters found in text, failed to parse text";
                    }
                    else
                    {
                        message += ", recognition failed for " + ex;
                    }
                }
                else if (ex is RecognitionException)
                {
                    var recog = (RecognitionException)ex;
                    message += ", recognition failed for " + recog;
                }
                else if (!string.IsNullOrWhiteSpace(ex.Message))
                {
                    message += ": " + ex.Message;
                }
                message += " [" + module + "]";
                Log.Error(message, ex);
                throw new ParseException(message);
            }

            var statements              = new List <EPLModuleParseItem>();
            var current                 = new StringWriter();
            int?lineNum                 = null;
            int charPosStart            = 0;
            int charPos                 = 0;
            var tokenList               = tokens.GetTokens();
            var skippedSemicolonIndexes = GetSkippedSemicolons(tokenList);
            int index = -1;

            foreach (var token in tokenList.TakeWhile(t => t.Type != EsperEPL2GrammarParser.Eof))
            {
                index++;
                var  t    = token;
                bool semi = t.Type == EsperEPL2GrammarParser.SEMI && !skippedSemicolonIndexes.Contains(index);
                if (semi)
                {
                    if (current.ToString().Trim().Length > 0)
                    {
                        statements.Add(
                            new EPLModuleParseItem(
                                current.ToString().Trim(), lineNum ?? 0, charPosStart, charPos));
                        lineNum = null;
                    }
                    current = new StringWriter();
                }
                else
                {
                    if ((lineNum == null) && (t.Type != EsperEPL2GrammarParser.WS))
                    {
                        lineNum      = t.Line;
                        charPosStart = charPos;
                    }
                    if (t.Type != EsperEPL2GrammarLexer.Eof)
                    {
                        current.Write(t.Text);
                        charPos += t.Text.Length;
                    }
                }
            }

            if (!string.IsNullOrWhiteSpace(current.ToString()))
            {
                statements.Add(new EPLModuleParseItem(current.ToString().Trim(), lineNum ?? 0, 0, 0));
            }
            return(statements);
        }
Example #6
0
        public static ParseNode GetModule(EPLModuleParseItem item, String resourceName)
        {
            var input = new NoCaseSensitiveStream(item.Expression);

            var lex         = ParseHelper.NewLexer(input);
            var tokenStream = new CommonTokenStream(lex);

            tokenStream.Fill();

            var tokens       = tokenStream.GetTokens();
            var beginIndex   = 0;
            var isMeta       = false;
            var isModule     = false;
            var isUses       = false;
            var isExpression = false;

            while (beginIndex < tokens.Count)
            {
                var t = tokens[beginIndex];
                if (t.Type == EsperEPL2GrammarParser.Eof)
                {
                    break;
                }

                if ((t.Type == EsperEPL2GrammarParser.WS) ||
                    (t.Type == EsperEPL2GrammarParser.SL_COMMENT) ||
                    (t.Type == EsperEPL2GrammarParser.ML_COMMENT))
                {
                    beginIndex++;
                    continue;
                }
                var tokenText = t.Text.Trim().ToLower();
                switch (tokenText)
                {
                case "module":
                    isModule = true;
                    isMeta   = true;
                    break;

                case "uses":
                    isUses = true;
                    isMeta = true;
                    break;

                case "import":
                    isMeta = true;
                    break;

                default:
                    isExpression = true;
                    break;
                }
                beginIndex++;
                beginIndex++; // skip space
                break;
            }

            if (isExpression)
            {
                return(new ParseNodeExpression(item));
            }
            if (!isMeta)
            {
                return(new ParseNodeComment(item));
            }

            // check meta tag (module, uses, import)
            var buffer = new StringWriter();

            for (int i = beginIndex; i < tokens.Count; i++)
            {
                var t = tokens[i];
                if (t.Type == EsperEPL2GrammarParser.Eof)
                {
                    break;
                }

                if ((t.Type != EsperEPL2GrammarParser.IDENT) &&
                    (t.Type != EsperEPL2GrammarParser.DOT) &&
                    (t.Type != EsperEPL2GrammarParser.STAR) &&
                    (!t.Text.Matches("[a-zA-Z]*")))
                {
                    throw GetMessage(isModule, isUses, resourceName, t.Type);
                }
                buffer.Write(t.Text.Trim());
            }

            String result = buffer.ToString().Trim();

            if (result.Length == 0)
            {
                throw GetMessage(isModule, isUses, resourceName, -1);
            }

            if (isModule)
            {
                return(new ParseNodeModule(item, result));
            }
            else if (isUses)
            {
                return(new ParseNodeUses(item, result));
            }
            return(new ParseNodeImport(item, result));
        }