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;
}