BalticAmadeus.FluentMdx.MdxParser.TryParseQuery C# (CSharp) Method

TryParseQuery() static private method

Performs query syntactical analysis over collection of Token objects using IStatedTwoWayEnumerator{T}.
static private TryParseQuery ( IStatedTwoWayEnumerator enumerator, MdxExpressionBase &expression ) : bool
enumerator IStatedTwoWayEnumerator Extended enumerator of collection of objects.
expression MdxExpressionBase Output parsed query if syntactic analysis was succeeded.
return bool
        internal static bool TryParseQuery(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
        {
            enumerator.SavePosition();
            expression = null;

            var query = Mdx.Query();

            if (IsNextTokenValid(enumerator, TokenType.With))
            {
                MdxExpressionBase declaration;
                if (!TryParseWithDeclaration(enumerator, out declaration))
                {
                    enumerator.RestoreLastSavedPosition();
                    return false;
                }

                query.With((MdxDeclaration)declaration);

                while (TryParseWithDeclaration(enumerator, out declaration))
                {
                    query.With((MdxDeclaration)declaration);
                }
            }

            if (!IsNextTokenValid(enumerator, TokenType.Select))
            {
                enumerator.RestoreLastSavedPosition();
                return false;
            }

            do
            {
                MdxExpressionBase childExpression;
                if (!TryParseAxis(enumerator, out childExpression))
                {
                    enumerator.RestoreLastSavedPosition();
                    return false;
                }

                query.On((MdxAxis)childExpression);
            } while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));

            if (!IsNextTokenValid(enumerator, TokenType.From))
            {
                enumerator.RestoreLastSavedPosition();
                return false;
            }

            if (IsNextTokenValid(enumerator, TokenType.LeftRoundBracket))
            {
                MdxExpressionBase innerQuery;
                if (!TryParseQuery(enumerator, out innerQuery))
                {
                    enumerator.RestoreLastSavedPosition();
                    return false;
                }

                query.From((MdxQuery) innerQuery);

                if (!IsNextTokenValid(enumerator, TokenType.RightRoundBracket))
                {
                    enumerator.RestoreLastSavedPosition();
                    return false;
                }
            }
            else
            {
                do
                {
                    MdxExpressionBase childExpression;
                    if (!TryParseCube(enumerator, out childExpression))
                    {
                        enumerator.RestoreLastSavedPosition();
                        return false;
                    }

                    query.From((MdxCube)childExpression);
                } while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));
            }

            if (!IsNextTokenValid(enumerator, TokenType.Where))
            {
                expression = query;
                enumerator.RemoveLastSavedState();
                return true;
            }

            MdxExpressionBase slicer;
            if (TryParseRange(enumerator, out slicer))
            {
                query.Where(Mdx.Tuple().With((MdxRange)slicer));
            }
            else if (TryParseMember(enumerator, out slicer))
            {
                query.Where(Mdx.Tuple().With((MdxMember)slicer));
            }
            else if (TryParseSet(enumerator, out slicer))
            {
                query.Where(Mdx.Tuple().With((MdxSet)slicer));
            }
            else if (TryParseTuple(enumerator, out slicer))
            {
                query.Where((MdxTuple)slicer);
            }
            else if (TryParseFunction(enumerator, out slicer))
            {
                query.Where((MdxTuple) slicer);

            }
            else
            {
                enumerator.RestoreLastSavedPosition();
                return false;
            }

            expression = query;
            enumerator.RemoveLastSavedState();
            return true;
        }