private ContainmentQueryPath(ContainmentQueryPath toCopy) : this(toCopy.rootContainer) { foreach (ContainmentQuerySegment segment in toCopy.segments) { this.segments.Add(new ContainmentQuerySegment(segment)); } }
public ContainmentQueryFactory(ServiceContainer container) { serviceContainer = container; rootQueryPaths = new List <ContainmentQueryPath>(); List <ContainmentAttribute> attributes = container.Facets.Attributes.OfType <ContainmentAttribute>().ToList(); IEnumerable <ResourceContainer> rootContainers = attributes.Select(ca => ca.ParentContainer) .Except(attributes.Select(ca => ca.ChildContainer)); Queue <ContainmentQueryPath> buildQueue = new Queue <ContainmentQueryPath>(); foreach (ResourceContainer rootContainer in rootContainers) { buildQueue.Enqueue(new ContainmentQueryPath(rootContainer)); } while (buildQueue.Count > 0) { ContainmentQueryPath path = buildQueue.Dequeue(); rootQueryPaths.Add(path); ResourceContainer currentContainer = path.FinalContainer; ContainmentQueryPath copy; IEnumerable <ContainmentAttribute> currentAttributes = attributes.Where(ca => ca.ParentContainer == currentContainer); foreach (bool omit in new bool[] { false, true }) { if (omit && (path.FinalSetAbbreviated || path.AnyOmitted)) { continue; } foreach (bool abbreviate in new bool[] { true, false }) { foreach (ContainmentAttribute att in currentAttributes) { bool canAbbreviate = (att.ChildContainer.BaseType.Key.PropertyCount > 1); if (abbreviate && !canAbbreviate) { continue; } copy = path.Clone(); copy.Add(att, abbreviate); if (omit) { copy.OmitAll(); } buildQueue.Enqueue(copy); } } } } }
private ContainmentQueryPath(ContainmentQueryPath toCopy) : this(toCopy.rootContainer) { foreach (ContainmentQuerySegment segment in toCopy.segments) this.segments.Add(new ContainmentQuerySegment(segment)); }