示例#1
0
        private static TResult CompileCommon <TResult>(string commandText,
                                                       Perspective perspective,
                                                       ParserOptions parserOptions,
                                                       Func <AST.Node, ParserOptions, TResult> compilationFunction)
            where TResult : class
        {
            TResult result = null;

            //
            // Validate arguments
            //
            EntityUtil.CheckArgumentNull(perspective, "commandText");
            EntityUtil.CheckArgumentNull(perspective, "perspective");

            //
            // Validate parser options - if null, give default options
            //
            parserOptions = parserOptions ?? new ParserOptions();

            //
            // Invoke Parser
            //
            AST.Node astCommand = Parse(commandText, parserOptions);

            //
            // Perform Semantic Analysis/Conversion
            //
            result = compilationFunction(astCommand, parserOptions);

            return(result);
        }
示例#2
0
        /// <summary>
        /// Parse eSQL command string into an AST
        /// </summary>
        /// <param name="commandText">eSQL command</param>
        /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param>
        /// <returns>Ast</returns>
        /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted</exception>
        /// <remarks>
        /// This method is not thread safe.
        /// </remarks>
        /// <seealso cref="ParserOptions"/>
        private static AST.Node Parse(string commandText, ParserOptions parserOptions)
        {
            AST.Node astExpr = null;

            //
            // commandText and parserOptions are validated inside of CqlParser
            //

            //
            // Create Parser
            //
            CqlParser cqlParser = new CqlParser(parserOptions, true);

            //
            // Invoke parser
            //
            astExpr = cqlParser.Parse(commandText);

            if (null == astExpr)
            {
                throw EntityUtil.EntitySqlError(commandText, System.Data.Entity.Strings.InvalidEmptyQuery, 0);
            }

            return(astExpr);
        }
示例#3
0
        /// <summary>
        /// Performs semantic conversion, validation on a command AST and creates a <see cref="DbCommandTree"/>
        /// </summary>
        /// <param name="astExpr">Abstract Syntax Tree of the command</param>
        /// <param name="perspective">perspective</param>
        /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param>
        /// <param name="parameters">ordinary command parameters</param>
        /// <returns>a parse result with a valid command tree</returns>
        /// <remarks>Parameters name/types must be bound before invoking this method</remarks>
        /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted.</exception>
        /// <exception cref="System.Data.MetadataException">Thrown as inner exception of a EntityException when metadata related service requests fail.</exception>
        /// <exception cref="System.Data.MappingException">Thrown as inner exception of a EntityException when mapping related service requests fail.</exception>
        /// <remarks>
        /// This method is not thread safe.
        /// </remarks>
        /// <seealso cref="ParserOptions"/>
        /// <seealso cref="DbCommandTree"/>
        private static ParseResult AnalyzeCommandSemantics(AST.Node astExpr,
                                                           Perspective perspective,
                                                           ParserOptions parserOptions,
                                                           IEnumerable <DbParameterReferenceExpression> parameters)
        {
            ParseResult result = AnalyzeSemanticsCommon(astExpr, perspective, parserOptions, parameters, null /*variables*/,
                                                        (analyzer, astExpression) =>
            {
                var parseResultInternal = analyzer.AnalyzeCommand(astExpression);

                Debug.Assert(parseResultInternal != null, "parseResultInternal != null post-condition FAILED");
                Debug.Assert(parseResultInternal.CommandTree != null, "parseResultInternal.CommandTree != null post-condition FAILED");

                return(parseResultInternal);
            });

            return(result);
        }
示例#4
0
 /// <summary>
 /// Performs semantic conversion, validation on a query command AST and creates a <see cref="DbLambda"/>
 /// </summary>
 /// <param name="astQueryCommand">Abstract Syntax Tree of the query command</param>
 /// <param name="perspective">perspective</param>
 /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param>
 /// <param name="parameters">ordinary command parameters</param>
 /// <param name="variables">command free variables</param>
 /// <remarks>Parameters name/types must be bound before invoking this method</remarks>
 /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted.</exception>
 /// <exception cref="System.Data.MetadataException">Thrown as inner exception of a EntityException when metadata related service requests fail.</exception>
 /// <exception cref="System.Data.MappingException">Thrown as inner exception of a EntityException when mapping related service requests fail.</exception>
 /// <remarks>
 /// This method is not thread safe.
 /// </remarks>
 /// <seealso cref="ParserOptions"/>
 /// <seealso cref="DbExpression"/>
 private static DbLambda AnalyzeQueryExpressionSemantics(AST.Node astQueryCommand,
                                                         Perspective perspective,
                                                         ParserOptions parserOptions,
                                                         IEnumerable <DbParameterReferenceExpression> parameters,
                                                         IEnumerable <DbVariableReferenceExpression> variables)
 {
     return(AnalyzeSemanticsCommon(
                astQueryCommand,
                perspective,
                parserOptions,
                parameters,
                variables,
                (analyzer, astExpr) =>
     {
         DbLambda lambda = analyzer.AnalyzeQueryCommand(astExpr);
         Debug.Assert(null != lambda, "null != lambda post-condition FAILED");
         return lambda;
     }));
 }
示例#5
0
        private static TResult AnalyzeSemanticsCommon <TResult>(AST.Node astExpr,
                                                                Perspective perspective,
                                                                ParserOptions parserOptions,
                                                                IEnumerable <DbParameterReferenceExpression> parameters,
                                                                IEnumerable <DbVariableReferenceExpression> variables,
                                                                Func <SemanticAnalyzer, AST.Node, TResult> analysisFunction)
            where TResult : class
        {
            TResult result = null;

            try
            {
                //
                // Validate arguments
                //
                EntityUtil.CheckArgumentNull(astExpr, "astExpr");
                EntityUtil.CheckArgumentNull(perspective, "perspective");

                //
                // Invoke semantic analysis
                //
                SemanticAnalyzer analyzer = (new SemanticAnalyzer(SemanticResolver.Create(perspective, parserOptions, parameters, variables)));
                result = analysisFunction(analyzer, astExpr);
            }
            //
            // Wrap MetadataException as EntityException inner exception
            //
            catch (System.Data.MetadataException metadataException)
            {
                throw EntityUtil.EntitySqlError(System.Data.Entity.Strings.GeneralExceptionAsQueryInnerException("Metadata"), metadataException);
            }
            //
            // Wrap MappingException as EntityException inner exception
            //
            catch (System.Data.MappingException mappingException)
            {
                throw EntityUtil.EntitySqlError(System.Data.Entity.Strings.GeneralExceptionAsQueryInnerException("Mapping"), mappingException);
            }

            return(result);
        }
 internal Token(short tokenId, AST.Node tokenValue)
 {
     _tokenId    = tokenId;
     _tokenValue = tokenValue;
 }
 /// <summary>
 /// Creates a new token.
 /// </summary>
 /// <param name="tokenId">tokenid</param>
 /// <param name="tokenvalue">ast node</param>
 /// <returns></returns>
 static internal Token NewToken(short tokenId, AST.Node tokenvalue)
 {
     return(new Token(tokenId, tokenvalue));
 }