コード例 #1
0
ファイル: ODataQuery.cs プロジェクト: MondayCoffee/pnpcore
        /// <summary>
        /// Returns the OData $filter clause
        /// </summary>
        /// <param name="targetPlatform"></param>
        /// <param name="urlEncode"></param>
        /// <returns></returns>
        internal string GetFilters(ODataTargetPlatform targetPlatform, bool urlEncode = true)
        {
            var sb = new StringBuilder();

            ProcessFilters(Filters, sb, targetPlatform, 0, urlEncode);
            return(sb.ToString());
        }
コード例 #2
0
        private static void TestInDepthFiltersByPlatform(string expected, ODataTargetPlatform platform)
        {
            ODataQuery <IWeb> query = new ODataQuery <IWeb>
            {
                Top  = 10,
                Skip = 5
            };

            // Add one filter
            query.Filters.Add(new FilterItem
            {
                Field    = "Title",
                Criteria = FilteringCriteria.Equal,
                Value    = "Test 01",
            });

            // Add a group filter
            query.Filters.Add(new FiltersGroup(
                                  new List <ODataFilter>(new ODataFilter[]
            {
                new FilterItem
                {
                    Field    = "ID",
                    Criteria = FilteringCriteria.Equal,
                    Value    = 7,
                },
                new FilterItem
                {
                    Field          = "AuthorID",
                    Criteria       = FilteringCriteria.Equal,
                    Value          = 15,
                    ConcatOperator = FilteringConcatOperator.OR
                },
                new FilterItem
                {
                    Field          = "ModifiedBy",
                    Criteria       = FilteringCriteria.Equal,
                    Value          = "*****@*****.**",
                    ConcatOperator = FilteringConcatOperator.AND
                },
            })
                                  )
            {
                ConcatOperator = FilteringConcatOperator.OR,
            });

            // Add another filter
            query.Filters.Add(new FilterItem
            {
                Field          = "Description",
                Criteria       = FilteringCriteria.NotEqual,
                Value          = "Test 02",
                ConcatOperator = FilteringConcatOperator.AND
            });

            var actual = query.ToQueryString(platform);

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected, actual);
        }
コード例 #3
0
        private static void TestFlatFilterByPlatform(string expected, ODataTargetPlatform platform)
        {
            ODataQuery <IWeb> query = new ODataQuery <IWeb>
            {
                Top  = 10,
                Skip = 5
            };

            // Add one filter
            query.Filters.Add(new FilterItem
            {
                Field    = "Title",
                Criteria = FilteringCriteria.Equal,
                Value    = "Test 01",
            });

            // Add another filter
            query.Filters.Add(new FilterItem
            {
                Field          = "Description",
                Criteria       = FilteringCriteria.NotEqual,
                Value          = "Test 02",
                ConcatOperator = FilteringConcatOperator.AND
            });

            var actual = query.ToQueryString(platform);

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected, actual);
        }
コード例 #4
0
        private static void TestInDepthFiltersSingleGroupByPlatform(string expected, ODataTargetPlatform platform)
        {
            ODataQuery <IWeb> query = new ODataQuery <IWeb>();

            // Add a group filter
            query.Filters.Add(new FiltersGroup(
                                  new List <ODataFilter>(new ODataFilter[]
            {
                new FilterItem
                {
                    Field    = "ID",
                    Criteria = FilteringCriteria.Equal,
                    Value    = 1,
                },
                new FilterItem
                {
                    Field          = "AuthorID",
                    Criteria       = FilteringCriteria.Equal,
                    Value          = 2,
                    ConcatOperator = FilteringConcatOperator.OR
                }
            })
                                  )
            {
                ConcatOperator = FilteringConcatOperator.OR,
            });

            var actual = query.ToQueryString(platform);

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected, actual);
        }
コード例 #5
0
        /// <summary>
        /// Private method to translate the query field toward the target platform
        /// </summary>
        /// <param name="fieldName"></param>
        /// <param name="targetPlatform"></param>
        /// <returns></returns>
        private static string TranslateFieldName(string fieldName, ODataTargetPlatform targetPlatform)
        {
            // Retrieve information about the field
            var modelType   = typeof(TModel);
            var entityInfo  = EntityManager.Instance.GetStaticClassInfo(modelType);
            var entityField = entityInfo?.Fields.FirstOrDefault(f => f.Name.Equals(fieldName, StringComparison.InvariantCultureIgnoreCase));

            // Configure the default result
            var result = fieldName;

            if (entityField != null)
            {
                switch (targetPlatform)
                {
                case ODataTargetPlatform.Graph when !string.IsNullOrEmpty(entityField.GraphName):
                    result = entityField.GraphName;
                    break;

                case ODataTargetPlatform.SPORest when !string.IsNullOrEmpty(entityField.SharePointName):
                    result = entityField.SharePointName;
                    break;
                }
            }

            return(result);
        }
コード例 #6
0
ファイル: ODataQuery.cs プロジェクト: MondayCoffee/pnpcore
        /// <summary>
        /// Converts the in-memory OData query representation into an actual set of querystring OData options
        /// </summary>
        /// <param name="targetPlatform">Defines the target platform for the OData query</param>
        /// <returns>The OData querystring for the current query</returns>
        public string ToQueryString(ODataTargetPlatform targetPlatform)
        {
            var urlParameters = new Dictionary <string, string>();

            AddODataToUrlParameters(urlParameters, targetPlatform);

            // Exclude empty items
            IEnumerable <string> items = urlParameters
                                         .Where(i => !string.IsNullOrEmpty(i.Value))
                                         .Select(p => $"{p.Key}={p.Value}");

            return(String.Join("&", items));
        }
コード例 #7
0
ファイル: ODataQuery.cs プロジェクト: MondayCoffee/pnpcore
        /// <summary>
        /// Returns the OData $orderby clause
        /// </summary>
        /// <param name="targetPlatform"></param>
        /// <param name="urlEncode"></param>
        /// <returns></returns>
        internal string GetOrderBy(ODataTargetPlatform targetPlatform, bool urlEncode = true)
        {
            var spacer = urlEncode ? EncodedSpace : " ";

            var sb = new StringBuilder();

            foreach (var o in OrderBy)
            {
                sb.AppendFormat(
                    FormatProvider, "{0}{1},",
                    HttpUtility.UrlEncode(TranslateFieldName(o.Field, targetPlatform)),
                    o.Direction == OrderByDirection.Desc ? $"{spacer}desc" : null
                    );
            }

            // Remove the last ,
            sb.Remove(sb.Length - 1, 1);

            return(sb.ToString());
        }
コード例 #8
0
ファイル: ODataQuery.cs プロジェクト: MondayCoffee/pnpcore
        private void ProcessFilters(List <ODataFilter> filters, StringBuilder queryText, ODataTargetPlatform targetPlatform, int depth = 0, bool urlEncode = true)
        {
            var spacer  = urlEncode ? EncodedSpace : " ";
            var isFirst = true;

            foreach (var f in filters)
            {
                switch (f)
                {
                case FiltersGroup group:
                    if (!isFirst)
                    {
                        // Add the concat operator and open the parentheses
                        queryText.AppendFormat(
                            FormatProvider,
                            "{0}{1}{0}",
                            spacer,
                            group.ConcatOperator.ToString().ToLower(FormatProvider));
                    }
                    // Open the parentheses
                    queryText.Append('(');
                    // Process the group
                    ProcessFilters(group.Filters, queryText, targetPlatform, depth: depth + 1, urlEncode);
                    // Close the parentheses
                    queryText.Append(')');
                    break;

                case FilterItem filter:

                    // Add a trailing space and the concat operator if this is not the first filter
                    if (!isFirst)
                    {
                        queryText.AppendFormat(
                            FormatProvider,
                            "{0}{1}{0}",
                            spacer,
                            filter.ConcatOperator.ToString().ToLower(FormatProvider));
                    }

                    // Process the filtering condition
                    queryText.AppendFormat(
                        FormatProvider,
                        "{0}{1}{2}{1}{3}",
                        urlEncode ? HttpUtility.UrlEncode(TranslateFieldName(filter.Field, targetPlatform)) : TranslateFieldName(filter.Field, targetPlatform),
                        spacer,
                        ConvertFilteringCriteria(filter.Criteria),
                        urlEncode ? HttpUtility.UrlEncode(ODataUtilities.ConvertToString(filter.Value)) : ODataUtilities.ConvertToString(filter.Value));

                    break;

                default:
                    throw new InvalidCastException(PnPCoreResources.Exception_InvalidTypeForFilter);
                }

                // Disable the isFirst flag, because for sure we already processed the first filter
                isFirst = false;
            }
        }
コード例 #9
0
ファイル: ODataQuery.cs プロジェクト: MondayCoffee/pnpcore
        internal void AddODataToUrlParameters(Dictionary <string, string> urlParameters, ODataTargetPlatform targetPlatform)
        {
            // Process the $filter items
            if (Filters.Count > 0)
            {
                urlParameters.Add(FilterKey, GetFilters(targetPlatform, false));
            }

            // Process any $top restriction if and only if the target platform is not Graph
            // or if the target platform is Graph, but there are no filters
            if (Top.HasValue && (Filters.Count == 0 || targetPlatform != ODataTargetPlatform.Graph))
            {
                urlParameters.Add(TopKey, Top.ToString());
            }

            // Process any $skip restriction if and only if the target platform is not Graph
            // or if the target platform is Graph, but there are no filters
            if (Skip.HasValue && (Filters.Count == 0 || targetPlatform != ODataTargetPlatform.Graph))
            {
                urlParameters.Add(SkipKey, Skip.ToString());
            }

            // Process the $orderby items
            if (OrderBy.Count > 0)
            {
                urlParameters.Add(OrderByKey, GetOrderBy(targetPlatform, false));
            }
        }