public static MockWorkItemStore AddChildLink(this MockWorkItemStore store, int parentId, int childId) { var child = store.Query(childId); if (child == null) { throw new ArgumentException($"Parameter {nameof(childId)} ({childId}) does not refer to a work item in the store."); } child.Links.Add(child.CreateRelatedLink(parentId, store.GetChildLinkTypeEnd())); store.BatchSave(child); return(store); }
public static MockWorkItemStore AddLink(this MockWorkItemStore store, int targetId, int sourceId, string linkType) { var child = store.Query(targetId); if (child == null) { throw new ArgumentException($"Parameter {nameof(targetId)} ({targetId}) does not refer to a work item in the store."); } var lt = store.WorkItemLinkTypes[linkType]; child.Links.Add(child.CreateRelatedLink(sourceId, lt.ForwardEnd)); store.BatchSave(child); return(store); }
public IEnumerable <IWorkItemLinkInfo> RunLinkQuery() { var linkPredicates = _parts.Where(p => StringComparer.OrdinalIgnoreCase.Equals(CoreFieldRefNames.LinkType, p.Item2)).ToList(); var fieldPredicateGroups = _parts.Except(linkPredicates).GroupBy(k => k.Item2, e => e).ToList(); foreach (var li in _store.LinkInfo) { // If self link, return if (li.LinkType == null) { yield return(li); } else { // Check the link predicate values for a match on the immutable name foreach (var linkPredicate in linkPredicates) { if (!StringComparer.OrdinalIgnoreCase.Equals(linkPredicate.Item3, li.LinkType.ImmutableName)) { continue; } // The link type immutable name matches. Check for additional predicates if (!fieldPredicateGroups.Any()) { // No additional predicates -- return the link yield return(li); } else { var match = true; var source = _store.Query(li.SourceId); var target = _store.Query(li.TargetId); foreach (var fieldPredicateGroup in fieldPredicateGroups) { var matchAny = fieldPredicateGroup.Count() > 1; if (matchAny) { // Must match ANY (e.g. an IN) var directionGroups = fieldPredicateGroup.GroupBy(k => k.Item1, e => e).ToList(); foreach (var directionGroup in directionGroups) { var workItem = "Source".Equals(directionGroup.Key, StringComparison.OrdinalIgnoreCase) ? source : target; match = directionGroup.Any(e => StringComparer.OrdinalIgnoreCase.Equals(e.Item3, workItem[e.Item2]?.ToString())); if (!match) { break; } } //foreach (var fieldPredicate in fieldPredicateGroup.Where(p => !string.IsNullOrEmpty(p.Item1))) //{ // var workItem = "Source".Equals(fieldPredicate.Item1, StringComparison.OrdinalIgnoreCase) ? source : target; // match = MatchAggregate(match, fieldPredicate, workItem); //} } else { // There should be only one, so must match var fieldPredicate = fieldPredicateGroup.Single(); var workItem = "Source".Equals(fieldPredicate.Item1, StringComparison.OrdinalIgnoreCase) ? source : target; match = MatchAggregate(match, fieldPredicate, workItem); } if (!match) { break; } } if (match) { yield return(li); } } } } } }