Skip to content

Commit 24520b0

Browse files
authored
Adds config setting for composable functions generation (#552)
* Generate nav. props of composable functions based on depth setting * Add config setting for controlling depth of composable fxns expansion * Update tests * Update release note * PR review suggestion
1 parent f504590 commit 24520b0

File tree

5 files changed

+46
-11
lines changed

5 files changed

+46
-11
lines changed

src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -888,11 +888,32 @@ private void RetrieveBoundOperationPaths(OpenApiConvertSettings convertSettings)
888888
continue;
889889
}
890890

891+
ODataSegment secondLastSeg = functionPath.ElementAt(functionPath.Count - 2);
892+
if (convertSettings.ComposableFunctionsExpansionDepth < 2 &&
893+
functionPath.LastSegment is ODataOperationSegment &&
894+
secondLastSeg is ODataOperationSegment)
895+
{
896+
// Only one level of composable functions expansion allowed
897+
continue;
898+
}
899+
891900
foreach (var navProperty in returnBindingEntityType.NavigationProperties())
892901
{
893-
ODataPath newNavigationPath = functionPath.Clone();
894-
newNavigationPath.Push(new ODataNavigationPropertySegment(navProperty));
895-
AppendPath(newNavigationPath);
902+
/* Get number of segments already appended after the first composable function segment
903+
*/
904+
int composableFuncSegIndex = functionPath.Segments.IndexOf(
905+
functionPath.Segments.FirstOrDefault(
906+
x => x is ODataOperationSegment operationSegment &&
907+
operationSegment.Operation is IEdmFunction edmFunction &&
908+
edmFunction.IsComposable));
909+
int currentDepth = functionPath.Count - composableFuncSegIndex - 1;
910+
911+
if (currentDepth < convertSettings.ComposableFunctionsExpansionDepth)
912+
{
913+
ODataPath newNavigationPath = functionPath.Clone();
914+
newNavigationPath.Push(new ODataNavigationPropertySegment(navProperty));
915+
AppendPath(newNavigationPath);
916+
}
896917
}
897918
}
898919
}
@@ -1171,6 +1192,12 @@ private void AppendBoundOperationOnOperationPath(IEdmOperation edmOperation, boo
11711192
continue;
11721193
}
11731194

1195+
var segName = path.LastSegment as ODataOperationSegment;
1196+
if (edmOperation.Name.Equals(segName?.Identifier))
1197+
{
1198+
continue;
1199+
}
1200+
11741201
ODataPath newOperationPath = path.Clone();
11751202
newOperationPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model));
11761203
AppendPath(newOperationPath);

src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
<TargetFrameworks>netstandard2.0</TargetFrameworks>
1616
<PackageId>Microsoft.OpenApi.OData</PackageId>
1717
<SignAssembly>true</SignAssembly>
18-
<Version>1.6.7</Version>
18+
<Version>1.6.8</Version>
1919
<Description>This package contains the codes you need to convert OData CSDL to Open API Document of Model.</Description>
2020
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
2121
<PackageTags>Microsoft OpenApi OData EDM</PackageTags>
2222
<RepositoryUrl>https://github.com/Microsoft/OpenAPI.NET.OData</RepositoryUrl>
2323
<PackageReleaseNotes>
24-
- Fixes empty response objects for OData type cast paths. #546
24+
- Adds support for configuring composable functions generations #551
2525
</PackageReleaseNotes>
2626
<AssemblyName>Microsoft.OpenApi.OData.Reader</AssemblyName>
2727
<AssemblyOriginatorKeyFile>..\..\tool\Microsoft.OpenApi.OData.snk</AssemblyOriginatorKeyFile>

src/Microsoft.OpenApi.OData.Reader/OpenApiConvertSettings.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ public bool ExpandDerivedTypesNavigationProperties
362362
/// </summary>
363363
public bool UseStringArrayForQueryOptionsSchema { get; set; } = true;
364364

365+
/// <summary>
366+
/// Gets/Sets a value indicating the depth to expand composable functions.
367+
/// </summary>
368+
public int ComposableFunctionsExpansionDepth { get; set; } = 1;
369+
365370
internal OpenApiConvertSettings Clone()
366371
{
367372
var newSettings = new OpenApiConvertSettings
@@ -416,7 +421,8 @@ internal OpenApiConvertSettings Clone()
416421
EnableAliasForTypeCastSegments = this.EnableAliasForTypeCastSegments,
417422
SemVerVersion = this.SemVerVersion,
418423
EnableAliasForOperationSegments = this.EnableAliasForOperationSegments,
419-
UseStringArrayForQueryOptionsSchema = this.UseStringArrayForQueryOptionsSchema
424+
UseStringArrayForQueryOptionsSchema = this.UseStringArrayForQueryOptionsSchema,
425+
ComposableFunctionsExpansionDepth = this.ComposableFunctionsExpansionDepth
420426
};
421427

422428
return newSettings;

src/Microsoft.OpenApi.OData.Reader/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Microsoft.OpenApi.OData.OpenApiConvertSettings.AddEnumFlagsExtension.get -> bool
2121
Microsoft.OpenApi.OData.OpenApiConvertSettings.AddEnumFlagsExtension.set -> void
2222
Microsoft.OpenApi.OData.OpenApiConvertSettings.AppendBoundOperationsOnDerivedTypeCastSegments.get -> bool
2323
Microsoft.OpenApi.OData.OpenApiConvertSettings.AppendBoundOperationsOnDerivedTypeCastSegments.set -> void
24+
Microsoft.OpenApi.OData.OpenApiConvertSettings.ComposableFunctionsExpansionDepth.get -> int
25+
Microsoft.OpenApi.OData.OpenApiConvertSettings.ComposableFunctionsExpansionDepth.set -> void
2426
Microsoft.OpenApi.OData.OpenApiConvertSettings.CustomHttpMethodLinkRelMapping.get -> System.Collections.Generic.Dictionary<Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey, string>
2527
Microsoft.OpenApi.OData.OpenApiConvertSettings.CustomHttpMethodLinkRelMapping.set -> void
2628
Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableAliasForOperationSegments.get -> bool

test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void GetPathsForGraphBetaModelReturnsAllPaths()
5252

5353
// Assert
5454
Assert.NotNull(paths);
55-
Assert.Equal(16980, paths.Count());
55+
Assert.Equal(15210, paths.Count());
5656
AssertGraphBetaModelPaths(paths);
5757
}
5858

@@ -117,7 +117,7 @@ public void GetPathsForGraphBetaModelWithDerivedTypesConstraintReturnsAllPaths()
117117

118118
// Assert
119119
Assert.NotNull(paths);
120-
Assert.Equal(17631, paths.Count());
120+
Assert.Equal(15861, paths.Count());
121121
}
122122

123123
[Theory]
@@ -208,9 +208,9 @@ public void GetPathsForComposableFunctionsReturnsAllPaths()
208208

209209
// Assert
210210
Assert.NotNull(paths);
211-
Assert.Equal(38, paths.Count());
212-
Assert.Equal(20, paths.Where(p => p.LastSegment is ODataOperationSegment).Count());
213-
Assert.Equal(12, paths.Where(p => p.Segments.Count > 1 && p.LastSegment is ODataNavigationPropertySegment && p.Segments[p.Segments.Count - 2] is ODataOperationSegment).Count());
211+
Assert.Equal(26, paths.Count());
212+
Assert.Equal(17, paths.Where(p => p.LastSegment is ODataOperationSegment).Count());
213+
Assert.Equal(3, paths.Where(p => p.Segments.Count > 1 && p.LastSegment is ODataNavigationPropertySegment && p.Segments[p.Segments.Count - 2] is ODataOperationSegment).Count());
214214
}
215215

216216
[Fact]

0 commit comments

Comments
 (0)