Пример #1
0
 private ContainmentQueryPath(ContainmentQueryPath toCopy)
     : this(toCopy.rootContainer)
 {
     foreach (ContainmentQuerySegment segment in toCopy.segments)
     {
         this.segments.Add(new ContainmentQuerySegment(segment));
     }
 }
Пример #2
0
        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);
                        }
                    }
                }
            }
        }
Пример #3
0
 private ContainmentQueryPath(ContainmentQueryPath toCopy)
     : this(toCopy.rootContainer)
 {
     foreach (ContainmentQuerySegment segment in toCopy.segments)
         this.segments.Add(new ContainmentQuerySegment(segment));
 }