/// <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)); }
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; }
/// <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); }
internal ExpandQueryOptions Clone() { var clone = new ExpandQueryOptions(ExpandInfo?.Clone(), _selects, IsRoot, Parent); foreach (var expand in Expands) { clone.AddExpand(expand.Clone()); } return(clone); }
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); }
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)); }
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)); }
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)); }
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); }
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); }
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); }
private bool AddExpand(ExpandPath expandPath, ExpandQueryOptions expandQueryOptions) { this._expandQueryOptions.Add(expandPath, expandQueryOptions); return(true); }
internal bool RemoveExpand(ExpandQueryOptions expand) { _expands.Remove(expand); return(true); }
private bool AddExpand(ExpandQueryOptions expand) { _expands.Add(expand); return(true); }