Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose more information about path segments and selected items #2354

Open
wants to merge 7 commits into
base: release-7.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Microsoft.OData.Core/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1540,6 +1540,7 @@ Microsoft.OData.UriParser.ODataPath.GetEnumerator() -> System.Collections.Generi
Microsoft.OData.UriParser.ODataPath.LastSegment.get -> Microsoft.OData.UriParser.ODataPathSegment
Microsoft.OData.UriParser.ODataPath.ODataPath(params Microsoft.OData.UriParser.ODataPathSegment[] segments) -> void
Microsoft.OData.UriParser.ODataPath.ODataPath(System.Collections.Generic.IEnumerable<Microsoft.OData.UriParser.ODataPathSegment> segments) -> void
Microsoft.OData.UriParser.ODataPath.this[int i].get -> Microsoft.OData.UriParser.ODataPathSegment
Microsoft.OData.UriParser.ODataPath.WalkWith(Microsoft.OData.UriParser.PathSegmentHandler handler) -> void
Microsoft.OData.UriParser.ODataPath.WalkWith<T>(Microsoft.OData.UriParser.PathSegmentTranslator<T> translator) -> System.Collections.Generic.IEnumerable<T>
Microsoft.OData.UriParser.ODataPathSegment
Expand Down Expand Up @@ -1800,7 +1801,7 @@ Microsoft.OData.UriParser.SearchTermNode.SearchTermNode(string text) -> void
Microsoft.OData.UriParser.SearchTermNode.Text.get -> string
Microsoft.OData.UriParser.SelectExpandClause
Microsoft.OData.UriParser.SelectExpandClause.AllSelected.get -> bool
Microsoft.OData.UriParser.SelectExpandClause.SelectedItems.get -> System.Collections.Generic.IEnumerable<Microsoft.OData.UriParser.SelectItem>
Microsoft.OData.UriParser.SelectExpandClause.SelectedItems.get -> System.Collections.Generic.IList<Microsoft.OData.UriParser.SelectItem>
Microsoft.OData.UriParser.SelectExpandClause.SelectExpandClause(System.Collections.Generic.IEnumerable<Microsoft.OData.UriParser.SelectItem> selectedItems, bool allSelected) -> void
Microsoft.OData.UriParser.SelectExpandTermToken
Microsoft.OData.UriParser.SelectExpandTermToken.ComputeOption.get -> Microsoft.OData.UriParser.ComputeToken
Expand Down
67 changes: 37 additions & 30 deletions src/Microsoft.OData.Core/UriParser/SemanticAst/ODataPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,17 @@

namespace Microsoft.OData.UriParser
{
#region Namespaces

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

#endregion Namespaces

/// <summary>
/// A representation of the path portion of an OData URI which is made up of <see cref="ODataPathSegment"/>s.
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "ODataPathCollection just doesn't sound right")]
public class ODataPath : IEnumerable<ODataPathSegment>
public class ODataPath : IReadOnlyList<ODataPathSegment>
{
/// <summary>
/// The segments that make up this path.
Expand Down Expand Up @@ -52,6 +48,14 @@ public ODataPath(params ODataPathSegment[] segments)
{
}

/// <summary>
/// Get the number of segments in this path.
/// </summary>
public int Count
{
get { return this.segments.Count; }
}

/// <summary>
/// Gets the first segment in the path. Returns null if the path is empty.
/// </summary>
Expand All @@ -73,23 +77,26 @@ public ODataPathSegment LastSegment
return this.segments.LastOrDefault();
}
}

/// <summary>
/// Get the number of segments in this path.
/// Get the List of ODataPathSegments.
/// </summary>
public int Count
internal IList<ODataPathSegment> Segments
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{
get { return this.segments.Count; }
get { return this.segments; }
}

/// <summary>
/// Get the List of ODataPathSegments.
/// Get the segment in the path at the specified index.
/// </summary>
internal IList<ODataPathSegment> Segments
/// <param name="i">The index.</param>
/// <returns>The segment corresponding to the index.</returns>
public ODataPathSegment this[int i]
{
get { return this.segments; }
get
{
return this.segments[i];
}
}

/// <summary>
/// Get the segments enumerator
/// </summary>
Expand Down Expand Up @@ -135,23 +142,6 @@ public void WalkWith(PathSegmentHandler handler)
}
}

/// <summary>
/// Checks if this path is equal to another path.
/// </summary>
/// <param name="other">The other path to compare it to</param>
/// <returns>True if the two paths are equal</returns>
/// <exception cref="System.ArgumentNullException">Throws if the input other is null.</exception>
internal bool Equals(ODataPath other)
{
ExceptionUtils.CheckArgumentNotNull(other, "other");
if (this.segments.Count != other.segments.Count)
{
return false;
}

return !this.segments.Where((t, i) => !t.Equals(other.segments[i])).Any();
}

/// <summary>
/// Add a segment to this path.
/// </summary>
Expand All @@ -171,5 +161,22 @@ internal void AddRange(ODataPath oDataPath)
{
this.segments.AddRange(oDataPath.segments);
}

/// <summary>
/// Checks if this path is equal to another path.
/// </summary>
/// <param name="other">The other path to compare it to</param>
/// <returns>True if the two paths are equal</returns>
/// <exception cref="System.ArgumentNullException">Throws if the input other is null.</exception>
internal bool Equals(ODataPath other)
{
ExceptionUtils.CheckArgumentNotNull(other, "other");
if (this.segments.Count != other.segments.Count)
{
return false;
}

return !this.segments.Where((t, i) => !t.Equals(other.segments[i])).Any();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,29 +41,28 @@ public SelectExpandClause(IEnumerable<SelectItem> selectedItems, bool allSelecte
}

/// <summary>
/// Gets the selected properties and operations.
/// Gets a flag indicating that everything at this level has been selected.
/// </summary>
/// <remarks>This list includes expanded navigations properties, which may have additional nested selections and expansions.</remarks>
public IEnumerable<SelectItem> SelectedItems
/// <remarks>
/// If true, then all structural properties, bound actions and functions, and all navigations in the SelectedItems list have been selected.
/// </remarks>
public bool AllSelected
{
get
{
////Debug.Assert(!this.usedInternalLegacyConstructor || this.selectedItems != null, "You cannot get the list of selected items until processing is complete.");
return new ReadOnlyCollection<SelectItem>(this.selectedItems).AsEnumerable();
return this.allSelected.Value;
}
}

/// <summary>
/// Gets a flag indicating that everything at this level has been selected.
/// Gets the selected properties and operations.
/// </summary>
/// <remarks>
/// If true, then all structural properties, bound actions and functions, and all navigations in the SelectedItems list have been selected.
/// </remarks>
public bool AllSelected
/// <remarks>This list includes expanded navigations properties, which may have additional nested selections and expansions.</remarks>
public IList<SelectItem> SelectedItems
{
get
{
return this.allSelected.Value;
return new ReadOnlyCollection<SelectItem>(this.selectedItems);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ Microsoft.OData.Edm.EdmComplexType.SchemaElementKind.get -> Microsoft.OData.Edm.
Microsoft.OData.Edm.EdmComplexTypeReference
Microsoft.OData.Edm.EdmComplexTypeReference.EdmComplexTypeReference(Microsoft.OData.Edm.IEdmComplexType complexType, bool isNullable) -> void
Microsoft.OData.Edm.EdmConstants
Microsoft.OData.Edm.EdmContainedEntitySet
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression navigationPath) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.NavigationProperty.get -> Microsoft.OData.Edm.IEdmNavigationProperty
Microsoft.OData.Edm.EdmContainedEntitySet.ParentNavigationSource.get -> Microsoft.OData.Edm.IEdmNavigationSource
Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.ActionImport = 2 -> Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.EntitySet = 1 -> Microsoft.OData.Edm.EdmContainerElementKind
Expand Down Expand Up @@ -1373,6 +1378,10 @@ override Microsoft.OData.Edm.EdmActionImport.ContainerElementKind.get -> Microso
override Microsoft.OData.Edm.EdmActionImport.OperationArgumentNullParameterName() -> string
override Microsoft.OData.Edm.EdmCollectionType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmComplexType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationPropertyBindings(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> System.Collections.Generic.IEnumerable<Microsoft.OData.Edm.IEdmNavigationPropertyBinding>
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression bindingPath) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntityReferenceType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntitySet.Type.get -> Microsoft.OData.Edm.IEdmType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ Microsoft.OData.Edm.EdmComplexType.SchemaElementKind.get -> Microsoft.OData.Edm.
Microsoft.OData.Edm.EdmComplexTypeReference
Microsoft.OData.Edm.EdmComplexTypeReference.EdmComplexTypeReference(Microsoft.OData.Edm.IEdmComplexType complexType, bool isNullable) -> void
Microsoft.OData.Edm.EdmConstants
Microsoft.OData.Edm.EdmContainedEntitySet
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression navigationPath) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.NavigationProperty.get -> Microsoft.OData.Edm.IEdmNavigationProperty
Microsoft.OData.Edm.EdmContainedEntitySet.ParentNavigationSource.get -> Microsoft.OData.Edm.IEdmNavigationSource
Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.ActionImport = 2 -> Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.EntitySet = 1 -> Microsoft.OData.Edm.EdmContainerElementKind
Expand Down Expand Up @@ -1373,6 +1378,10 @@ override Microsoft.OData.Edm.EdmActionImport.ContainerElementKind.get -> Microso
override Microsoft.OData.Edm.EdmActionImport.OperationArgumentNullParameterName() -> string
override Microsoft.OData.Edm.EdmCollectionType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmComplexType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationPropertyBindings(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> System.Collections.Generic.IEnumerable<Microsoft.OData.Edm.IEdmNavigationPropertyBinding>
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression bindingPath) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntityReferenceType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntitySet.Type.get -> Microsoft.OData.Edm.IEdmType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ Microsoft.OData.Edm.EdmComplexType.SchemaElementKind.get -> Microsoft.OData.Edm.
Microsoft.OData.Edm.EdmComplexTypeReference
Microsoft.OData.Edm.EdmComplexTypeReference.EdmComplexTypeReference(Microsoft.OData.Edm.IEdmComplexType complexType, bool isNullable) -> void
Microsoft.OData.Edm.EdmConstants
Microsoft.OData.Edm.EdmContainedEntitySet
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.EdmContainedEntitySet(Microsoft.OData.Edm.IEdmNavigationSource parentNavigationSource, Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression navigationPath) -> void
Microsoft.OData.Edm.EdmContainedEntitySet.NavigationProperty.get -> Microsoft.OData.Edm.IEdmNavigationProperty
Microsoft.OData.Edm.EdmContainedEntitySet.ParentNavigationSource.get -> Microsoft.OData.Edm.IEdmNavigationSource
Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.ActionImport = 2 -> Microsoft.OData.Edm.EdmContainerElementKind
Microsoft.OData.Edm.EdmContainerElementKind.EntitySet = 1 -> Microsoft.OData.Edm.EdmContainerElementKind
Expand Down Expand Up @@ -1390,6 +1395,10 @@ override Microsoft.OData.Edm.EdmActionImport.ContainerElementKind.get -> Microso
override Microsoft.OData.Edm.EdmActionImport.OperationArgumentNullParameterName() -> string
override Microsoft.OData.Edm.EdmCollectionType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmComplexType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationPropertyBindings(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> System.Collections.Generic.IEnumerable<Microsoft.OData.Edm.IEdmNavigationPropertyBinding>
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.FindNavigationTarget(Microsoft.OData.Edm.IEdmNavigationProperty navigationProperty, Microsoft.OData.Edm.IEdmPathExpression bindingPath) -> Microsoft.OData.Edm.IEdmNavigationSource
override Microsoft.OData.Edm.EdmContainedEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntityReferenceType.TypeKind.get -> Microsoft.OData.Edm.EdmTypeKind
override Microsoft.OData.Edm.EdmEntitySet.Path.get -> Microsoft.OData.Edm.IEdmPathExpression
override Microsoft.OData.Edm.EdmEntitySet.Type.get -> Microsoft.OData.Edm.IEdmType
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OData.Edm/Schema/EdmContainedEntitySet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Microsoft.OData.Edm
/// <summary>
/// Represents an EDM contained entity set.
/// </summary>
internal class EdmContainedEntitySet : EdmEntitySetBase, IEdmContainedEntitySet
public class EdmContainedEntitySet : EdmEntitySetBase, IEdmContainedEntitySet
{
private readonly IEdmPathExpression navigationPath;
private readonly IEdmNavigationSource parentNavigationSource;
Expand Down
Loading