Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.OData.Extensions;
internal static class GetNextPageHelper
{
[SuppressMessage("Globalization", "CA1308:Normalize strings to uppercase", Justification = "<Pending>")]
internal static Uri GetNextPageLink(Uri requestUri, IEnumerable<KeyValuePair<string, string>> queryParameters, int pageSize, object instance = null, Func<object, string> objectToSkipTokenValue = null)
internal static Uri GetNextPageLink(Uri requestUri, IEnumerable<KeyValuePair<string, string>> queryParameters, int pageSize, object instance = null, Func<object, string> objectToSkipTokenValue = null, bool isNoDollarQueryOptionsEnabled = true)
{
Contract.Assert(requestUri != null);
Contract.Assert(queryParameters != null);
Expand All @@ -44,6 +44,7 @@ internal static Uri GetNextPageLink(Uri requestUri, IEnumerable<KeyValuePair<str
switch (key)
{
case "$top":
case "top" when isNoDollarQueryOptionsEnabled:
int top;
if (Int32.TryParse(value, out top))
{
Expand All @@ -60,6 +61,7 @@ internal static Uri GetNextPageLink(Uri requestUri, IEnumerable<KeyValuePair<str
}
break;
case "$skip":
case "skip" when isNoDollarQueryOptionsEnabled:
if (useDefaultSkip)
{
//Need to increment skip only if we are not using skiptoken
Expand Down Expand Up @@ -114,14 +116,14 @@ internal static Uri GetNextPageLink(Uri requestUri, IEnumerable<KeyValuePair<str
}

/// <remarks>This signature uses types that are AspNetCore-specific.</remarks>
internal static Uri GetNextPageLink(Uri requestUri, int pageSize, object instance = null, Func<object, String> objectToSkipTokenValue = null)
internal static Uri GetNextPageLink(Uri requestUri, int pageSize, object instance = null, Func<object, string> objectToSkipTokenValue = null, bool isNoDollarQueryOptionsEnabled = true)
{
Contract.Assert(requestUri != null);

Dictionary<string, StringValues> queryValues = QueryHelpers.ParseQuery(requestUri.Query);
IEnumerable<KeyValuePair<string, string>> queryParameters = queryValues.SelectMany(
kvp => kvp.Value, (kvp, value) => new KeyValuePair<string, string>(kvp.Key, value));

return GetNextPageLink(requestUri, queryParameters, pageSize, instance, objectToSkipTokenValue);
return GetNextPageLink(requestUri, queryParameters, pageSize, instance, objectToSkipTokenValue, isNoDollarQueryOptionsEnabled);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,9 @@ public static Uri GetNextPageLink(this HttpRequest request, int pageSize, object
uriBuilder.Port = request.Host.Port.Value;
}

bool isNoDollarQueryEnable = request.IsNoDollarQueryEnable();
IEnumerable<KeyValuePair<string, string>> queryParameters = request.Query.SelectMany(kvp => kvp.Value, (kvp, value) => new KeyValuePair<string, string>(kvp.Key, value));
return GetNextPageHelper.GetNextPageLink(uriBuilder.Uri, queryParameters, pageSize, instance, objectToSkipTokenValue);
return GetNextPageHelper.GetNextPageLink(uriBuilder.Uri, queryParameters, pageSize, instance, objectToSkipTokenValue, isNoDollarQueryEnable);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,8 @@ private static Uri GetNestedNextPageLink(ODataSerializerContext writeContext, IT
return nextLinkGenerator.GenerateNextPageLink(nestedNextLink, truncatedCollection.PageSize, obj, writeContext);
}

return GetNextPageHelper.GetNextPageLink(nestedNextLink, truncatedCollection.PageSize);
bool isNoDollarQueryEnable = writeContext.Request.IsNoDollarQueryEnable();
return GetNextPageHelper.GetNextPageLink(nestedNextLink, truncatedCollection.PageSize, null, null, isNoDollarQueryEnable);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,15 @@ public override Uri GenerateNextPageLink(Uri baseUri, int pageSize, Object insta
IEdmModel model = context.Model;

DefaultQueryConfigurations queryConfigs = context.QueryContext.DefaultQueryConfigurations;
bool isNoDollarQueryEnable = context.Request.IsNoDollarQueryEnable();
if (queryConfigs.EnableSkipToken)
{
if (expandedItem != null)
{
// Handle Delta resource; currently not value based.
if (DeltaHelper.IsDeltaOfT(context.ExpandedResource.GetType()))
{
return GetNextPageHelper.GetNextPageLink(baseUri, pageSize);
return GetNextPageHelper.GetNextPageLink(baseUri, pageSize, null, null, isNoDollarQueryEnable);
}

if (expandedItem.OrderByOption != null)
Expand All @@ -75,7 +76,7 @@ public override Uri GenerateNextPageLink(Uri baseUri, int pageSize, Object insta
return GenerateSkipTokenValue(obj, model, orderByClause, context);
};

return GetNextPageHelper.GetNextPageLink(baseUri, pageSize, instance, skipTokenGenerator);
return GetNextPageHelper.GetNextPageLink(baseUri, pageSize, instance, skipTokenGenerator, isNoDollarQueryEnable);
}

if (context.QueryOptions != null && context.QueryOptions.OrderBy != null)
Expand All @@ -89,7 +90,7 @@ public override Uri GenerateNextPageLink(Uri baseUri, int pageSize, Object insta
};
}

return GetNextPageHelper.GetNextPageLink(baseUri, pageSize, instance, skipTokenGenerator);
return GetNextPageHelper.GetNextPageLink(baseUri, pageSize, instance, skipTokenGenerator, isNoDollarQueryEnable);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,8 @@ private ODataSerializerContext GetSerializerContext(IEdmModel model, bool enable
ResourceContext resource = new ResourceContext();
ODataSerializerContext context = new ODataSerializerContext(resource, edmProperty, queryContext, null)
{
Model = model
Model = model,
Request = request
};

return context;
Expand Down