/// <summary> /// Appends the specified <see cref="MdxRange"/> and returns the updated current instance of <see cref="MdxSet"/>. /// If there are any <see cref="MdxTuple"/>s in <see cref="Children"/> then specified <see cref="MdxRange"/> /// is appended to the last <see cref="MdxTuple"/>. /// </summary> /// <param name="range">Specified <see cref="MdxRange"/>.</param> /// <returns>Returns the updated current instance of <see cref="MdxSet"/>.</returns> public MdxSet With(MdxRange range) { var lastTuple = _children.OfType<MdxTuple>().LastOrDefault(); if (lastTuple == null) { _children.Add(range); return this; } lastTuple.With(range); return this; }
/// <summary> /// Appends the specified <see cref="MdxRange"/> and returns the updated current instance of <see cref="MdxTuple"/>. /// If there are any <see cref="MdxSet"/>s in <see cref="Children"/> then specified <see cref="MdxRange"/> /// is appended to the last <see cref="MdxSet"/>. /// </summary> /// <param name="range">Specified <see cref="MdxRange"/>.</param> /// <returns>Returns the updated current instance of <see cref="MdxTuple"/>.</returns> public MdxTuple With(MdxRange range) { var lastSet = _children.OfType <MdxSet>().LastOrDefault(); if (lastSet == null) { _children.Add(range); return(this); } lastSet.With(range); return(this); }
/// <summary> /// Performs range syntactical analysis over collection of <see cref="Token"/> objects using <see cref="IStatedTwoWayEnumerator{T}"/>. /// </summary> /// <param name="enumerator">Extended enumerator of collection of <see cref="Token"/> objects.</param> /// <param name="expression">Output parsed range if syntactic analysis was succeeded.</param> /// <returns><value>True</value> if succeeded. <value>False</value> if failed.</returns> internal static bool TryParseRange(IStatedTwoWayEnumerator <Token> enumerator, out MdxExpressionBase expression) { enumerator.SavePosition(); expression = null; var range = new MdxRange(); MdxExpressionBase fromMember; if (!TryParseMember(enumerator, out fromMember)) { enumerator.RestoreLastSavedPosition(); return(false); } if (!IsNextTokenValid(enumerator, TokenType.RangeSeparator)) { enumerator.RestoreLastSavedPosition(); return(false); } range.From((MdxMember)fromMember); MdxExpressionBase toMember; if (!TryParseMember(enumerator, out toMember)) { enumerator.RestoreLastSavedPosition(); return(false); } range.To((MdxMember)toMember); expression = range; enumerator.RemoveLastSavedState(); return(true); }
/// <summary> /// Performs range syntactical analysis over collection of <see cref="Token"/> objects using <see cref="IStatedTwoWayEnumerator{T}"/>. /// </summary> /// <param name="enumerator">Extended enumerator of collection of <see cref="Token"/> objects.</param> /// <param name="expression">Output parsed range if syntactic analysis was succeeded.</param> /// <returns><value>True</value> if succeeded. <value>False</value> if failed.</returns> internal static bool TryParseRange(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression) { enumerator.SavePosition(); expression = null; var range = new MdxRange(); MdxExpressionBase fromMember; if (!TryParseMember(enumerator, out fromMember)) { enumerator.RestoreLastSavedPosition(); return false; } if (!IsNextTokenValid(enumerator, TokenType.RangeSeparator)) { enumerator.RestoreLastSavedPosition(); return false; } range.From((MdxMember)fromMember); MdxExpressionBase toMember; if (!TryParseMember(enumerator, out toMember)) { enumerator.RestoreLastSavedPosition(); return false; } range.To((MdxMember) toMember); expression = range; enumerator.RemoveLastSavedState(); return true; }