Example #1
0
        /// <summary>
        /// Remove expands and replace it with annotated select column
        /// </summary>
        internal bool ReplaceExpandsWithAnnotation(ExpandQueryOptions expand)
        {
            RemoveExpand(expand);
            var selectColumnName = expand.ExpandInfo.ExpandPath.EntityName;

            if (string.IsNullOrEmpty(selectColumnName))
            {
                return(false);
            }

            if (ExpandInfo.ParentDataSource == null || !(ExpandInfo.ParentDataSource is IExternalCdsDataSource))
            {
                return(false);
            }
            var parentDataSource = ExpandInfo.ParentDataSource as IExternalCdsDataSource;

            if (!parentDataSource.Document.GlobalScope.TryGetCdsDataSourceWithLogicalName(parentDataSource.DatasetName, ExpandInfo.Identity, out var expandDataSourceInfo) || expandDataSourceInfo == null)
            {
                return(false);
            }
            parentDataSource.TryGetRelatedColumn(selectColumnName, out string additionalColumnName, expandDataSourceInfo.TableDefinition);
            if (additionalColumnName == null || _selects.Contains(additionalColumnName))
            {
                return(false);
            }
            return(_selects.Add(additionalColumnName));
        }
Example #2
0
        private ExpandQueryOptions(IExpandInfo expandInfo, IEnumerable <string> selects, bool isRoot, ExpandQueryOptions parent)
        {
            Contracts.AssertValue(expandInfo);
            Contracts.AssertValue(selects);
            Contracts.AssertValueOrNull(parent);

            ExpandInfo = expandInfo;

            _selects    = new HashSet <string>();
            _keyColumns = new HashSet <string>();

            foreach (var select in selects)
            {
                _selects.Add(select);
            }

            var parentDataSource = ExpandInfo.ParentDataSource as IExternalTabularDataSource;
            var keyColumns       = parentDataSource?.GetKeyColumns(ExpandInfo);

            foreach (var keyColumn in keyColumns)
            {
                _selects.Add(keyColumn);
            }

            _expands = new HashSet <ExpandQueryOptions>();
            IsRoot   = isRoot;
            Parent   = parent;
        }
Example #3
0
        /// <summary>
        /// Helper method used to merge two different entity query options.
        /// </summary>
        internal static bool MergeQueryOptions(ExpandQueryOptions original, ExpandQueryOptions added)
        {
            Contracts.AssertValue(original);
            Contracts.AssertValue(added);

            // Skip merge when both instances are same or any of them is null.
            if (original == added ||
                original == null ||
                added == null)
            {
                return(false);
            }

            bool isOriginalModified = false;

            // Update selectedfields first.
            foreach (var selectedFieldToAdd in added.Selects)
            {
                if (original.Selects.Contains(selectedFieldToAdd))
                {
                    continue;
                }

                original.AddSelect(selectedFieldToAdd);
                isOriginalModified = true;
            }

            if (original.Expands.Count == 0 && added.Expands.Count > 0)
            {
                original.SetExpands(added.Expands);
                return(true);
            }

            // Go through reachable entity list and update each of it same way.
            var entityPathToQueryOptionsMap = new Dictionary <ExpandPath, ExpandQueryOptions>();

            foreach (var expand in original.Expands)
            {
                if (!entityPathToQueryOptionsMap.ContainsKey(expand.ExpandInfo.ExpandPath))
                {
                    entityPathToQueryOptionsMap[expand.ExpandInfo.ExpandPath] = expand;
                }
            }

            foreach (var expand in added.Expands)
            {
                if (!entityPathToQueryOptionsMap.ContainsKey(expand.ExpandInfo.ExpandPath))
                {
                    isOriginalModified = original.AddExpand(expand.ExpandInfo, out _);
                }
                else
                {
                    isOriginalModified = isOriginalModified || MergeQueryOptions(entityPathToQueryOptionsMap[expand.ExpandInfo.ExpandPath], expand);
                }
            }

            return(isOriginalModified);
        }
Example #4
0
        internal ExpandQueryOptions Clone()
        {
            var clone = new ExpandQueryOptions(ExpandInfo?.Clone(), _selects, IsRoot, Parent);

            foreach (var expand in Expands)
            {
                clone.AddExpand(expand.Clone());
            }

            return(clone);
        }
Example #5
0
        internal bool TryGetExpandQueryOptions(IExpandInfo expandInfo, out ExpandQueryOptions expandQueryOptions)
        {
            foreach (var expandQueryOptionsKVP in Expands)
            {
                if (expandQueryOptionsKVP.Value.ExpandInfo.ExpandPath == expandInfo.ExpandPath)
                {
                    expandQueryOptions = (ExpandQueryOptions)expandQueryOptionsKVP.Value;
                    return(true);
                }
            }

            expandQueryOptions = null;
            return(false);
        }
Example #6
0
        internal bool AddExpand(IExpandInfo expandInfo, out ExpandQueryOptions expandQueryOptions)
        {
            if (expandInfo == null || !TabularDataSourceInfo.CanIncludeExpand(expandInfo))
            {
                expandQueryOptions = null;
                return(false);
            }

            if (_expandQueryOptions.ContainsKey(expandInfo.ExpandPath))
            {
                expandQueryOptions = (ExpandQueryOptions)_expandQueryOptions[expandInfo.ExpandPath];
                return(false);
            }

            expandQueryOptions = ExpandQueryOptions.CreateExpandQueryOptions(expandInfo);
            return(AddExpand(expandInfo.ExpandPath, expandQueryOptions));
        }
Example #7
0
        internal bool AddExpand(IExpandInfo expandInfoToAdd, out ExpandQueryOptions expand)
        {
            if (expandInfoToAdd == null)
            {
                expand = null;
                return(false);
            }

            var parentDataSource = ExpandInfo.ParentDataSource as IExternalTabularDataSource;

            if (!parentDataSource.CanIncludeExpand(ExpandInfo, expandInfoToAdd))
            {
                expand = null;
                return(false);
            }

            expand = CreateExpandQueryOptions(expandInfoToAdd);

            return(AddExpand(expand));
        }
Example #8
0
        internal bool ReplaceExpandsWithAnnotation(ExpandQueryOptions expand)
        {
            Contracts.AssertValue(expand);
            RemoveExpand(expand.ExpandInfo);
            var selectColumnName = expand.ExpandInfo.ExpandPath.EntityName;

            if (string.IsNullOrEmpty(selectColumnName) || !(TabularDataSourceInfo is IExternalCdsDataSource))
            {
                return(false);
            }
            var CdsDataSourceInfo = TabularDataSourceInfo as IExternalCdsDataSource;

            if (_selects.Contains(selectColumnName) ||
                !CdsDataSourceInfo.TryGetRelatedColumn(selectColumnName, out string additionalColumnName) || additionalColumnName == null ||
                _selects.Contains(additionalColumnName))
            {
                return(false);
            }

            return(_selects.Add(additionalColumnName));
        }
Example #9
0
        internal bool AppendExpandQueryOptions(ExpandQueryOptions mergeExpandValue)
        {
            foreach (var expand in Expands)
            {
                var srcExpandInfo    = expand.Value.ExpandInfo;
                var mergedExpandInfo = mergeExpandValue.ExpandInfo;
                if (srcExpandInfo.Identity == mergedExpandInfo.Identity &&
                    srcExpandInfo.Name == mergedExpandInfo.Name &&
                    srcExpandInfo.IsTable == mergedExpandInfo.IsTable)
                {
                    return(MergeQueryOptions((ExpandQueryOptions)expand.Value, mergeExpandValue));
                }

                if (!string.IsNullOrEmpty(mergeExpandValue.ExpandInfo.ExpandPath.RelatedEntityPath) &&
                    mergeExpandValue.ExpandInfo.ExpandPath.RelatedEntityPath.Contains(expand.Value.ExpandInfo.ExpandPath.EntityName))
                {
                    return(AppendExpandQueryOptions((ExpandQueryOptions)expand.Value, mergeExpandValue));
                }
            }

            _expandQueryOptions[mergeExpandValue.ExpandInfo.ExpandPath] = mergeExpandValue?.Clone();
            return(true);
        }
Example #10
0
        private bool AppendExpandQueryOptions(ExpandQueryOptions options, ExpandQueryOptions mergeExpandValue)
        {
            foreach (var expand in options.Expands)
            {
                if (expand.ExpandInfo.ExpandPath == mergeExpandValue.ExpandInfo.ExpandPath)
                {
                    return(MergeQueryOptions(expand, mergeExpandValue));
                }

                if (mergeExpandValue.ExpandInfo.ExpandPath.RelatedEntityPath.Contains(expand.ExpandInfo.ExpandPath.EntityName))
                {
                    foreach (var childExpand in expand.Expands)
                    {
                        if (AppendExpandQueryOptions(childExpand, mergeExpandValue))
                        {
                            return(true);
                        }
                    }
                    return(false);
                }
            }

            return(false);
        }
Example #11
0
        public ExpandQueryOptions AppendDataEntity(IExpandInfo expandInfo)
        {
            var queryOptions = CreateExpandQueryOptions(expandInfo);

            foreach (var currentExpand in Expands)
            {
                if (!currentExpand.ExpandInfo.Equals(queryOptions.ExpandInfo))
                {
                    continue;
                }

                foreach (var qoSelect in queryOptions.Selects)
                {
                    currentExpand.AddSelect(qoSelect);
                }

                return(currentExpand);
            }

            var expand = new ExpandQueryOptions(queryOptions.ExpandInfo, queryOptions.Selects, isRoot: false, parent: this);

            AddExpand(expand);
            return(expand);
        }
Example #12
0
 private bool AddExpand(ExpandPath expandPath, ExpandQueryOptions expandQueryOptions)
 {
     this._expandQueryOptions.Add(expandPath, expandQueryOptions);
     return(true);
 }
Example #13
0
 internal bool RemoveExpand(ExpandQueryOptions expand)
 {
     _expands.Remove(expand);
     return(true);
 }
Example #14
0
 private bool AddExpand(ExpandQueryOptions expand)
 {
     _expands.Add(expand);
     return(true);
 }