From 5cd1f0affd14d39da502d14b58f831bf101fdc7e Mon Sep 17 00:00:00 2001 From: Matthias Sebastian Sort Date: Tue, 4 Mar 2025 11:13:44 +0100 Subject: [PATCH] override $top query in the GetEndpointUrlWithTop function call and in the CheckIfEndpointIsReadyForUse function call --- ...Integration.Providers.ODataProvider.csproj | 2 +- src/ODataSourceReader.cs | 71 ++++++++++++------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/Dynamicweb.DataIntegration.Providers.ODataProvider.csproj b/src/Dynamicweb.DataIntegration.Providers.ODataProvider.csproj index cad308a..940d2f3 100644 --- a/src/Dynamicweb.DataIntegration.Providers.ODataProvider.csproj +++ b/src/Dynamicweb.DataIntegration.Providers.ODataProvider.csproj @@ -1,6 +1,6 @@  - 10.8.7 + 10.8.8 1.0.0.0 OData Provider The Odata Provider lets you fetch and map data from or to any OData endpoint. diff --git a/src/ODataSourceReader.cs b/src/ODataSourceReader.cs index 15a0af5..65038a1 100644 --- a/src/ODataSourceReader.cs +++ b/src/ODataSourceReader.cs @@ -15,6 +15,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using System.Web; namespace Dynamicweb.DataIntegration.Providers.ODataProvider; @@ -238,26 +239,7 @@ public static string GetEndpointURL(string baseURL, string tableName, string pat if (parameters != null && parameters.Count > 0) { - StringBuilder stringBuilder = new StringBuilder(string.Empty); - foreach (KeyValuePair parameter in parameters) - { - stringBuilder.Append("&" + parameter.Key + "=" + WebUtility.UrlEncode(parameter.Value)); - } - - if (stringBuilder.Length > 0) - { - if (!result.Contains("?")) - { - return $"{result}?{stringBuilder.Remove(0, 1)}"; - } - - if (!result.EndsWith("?")) - { - return $"{result}{stringBuilder}"; - } - - return $"{result}{stringBuilder.Remove(0, 1)}"; - } + return BuildURLWithParameters(parameters, result); } return result; @@ -381,7 +363,7 @@ private List GetFilterParameters(Mapping mapping) foreach (var group in groups) { var filters = GetFilterAsParameters(mapping, group.Conditionals); - result.AddRange(filters); + result.AddRange(filters); } } else @@ -406,8 +388,8 @@ private string GetFilterStatement(Mapping mapping) if (filterAsParameters.Any()) { var groupFilter = string.Join($" {group.ConditionalOperator} ", filterAsParameters); - result += $"({groupFilter}){prependOperator}"; - } + result += $"({groupFilter}){prependOperator}"; + } } if (!string.IsNullOrEmpty(result) && result.Length > prependOperator.Length) { @@ -427,7 +409,7 @@ private string GetFilterStatement(Mapping mapping) private List GetFilterAsParameters(Mapping mapping, IEnumerable mappingConditionals) { - List result = new(); + List result = new(); if (mappingConditionals.Any()) { foreach (var item in mappingConditionals) @@ -436,7 +418,7 @@ private List GetFilterAsParameters(Mapping mapping, IEnumerable k, k => paramsCollection[k]); + paramsAsDictionary["$top"] = "1"; + return BuildURLWithParameters(paramsAsDictionary, url[..url.IndexOf('?')]); + } } else { @@ -755,6 +746,32 @@ internal static string GetEndpointUrlWithTop(string url) } } + private static string BuildURLWithParameters(IDictionary parameters, string url) + { + StringBuilder stringBuilder = new(string.Empty); + foreach (KeyValuePair parameter in parameters) + { + stringBuilder.Append("&" + parameter.Key + "=" + WebUtility.UrlEncode(parameter.Value)); + } + + if (stringBuilder.Length > 0) + { + if (!url.Contains('?')) + { + return $"{url}?{stringBuilder.Remove(0, 1)}"; + } + + if (!url.EndsWith('?')) + { + return $"{url}{stringBuilder}"; + } + + return $"{url}{stringBuilder.Remove(0, 1)}"; + } + + return url; + } + private bool CheckIfEndpointIsReadyForUse(string url) { string checkUrl = GetEndpointUrlWithTop(url);