Пример #1
0
 /// <summary>
 /// Removes all children from this node and modifies this node to be a UNIT
 /// node excluded from bidding.
 /// </summary>
 /// <returns>This node, updated to an excluded node.</returns>
 public ProductPartitionNode AsExcludedUnit()
 {
     PreconditionUtilities.CheckState(this.Parent != null, ShoppingMessages.RootCannotBeExcluded);
     nodeState = nodeState.TransitionTo(NodeType.EXCLUDED_UNIT);
     RemoveAllChildren();
     return(this);
 }
        /// <summary>
        /// Returns a new tree based on a non-empty collection of ad group criteria.
        /// </summary>
        /// <param name="adGroupId">The ad group ID.</param>
        /// <param name="parentIdMap">The multimap from parent product partition ID
        /// to child criteria.</param>
        /// <returns>a new product partition tree.</returns>
        private static ProductPartitionTree CreateAdGroupTree(long adGroupId,
                                                              Dictionary <long, List <AdGroupCriterion> > parentIdMap)
        {
            ProductPartitionNode rootNode = null;

            if (parentIdMap.Count == 0)
            {
                rootNode = new ProductPartitionNode(null, null, NEW_ROOT_ID);
            }
            else
            {
                List <AdGroupCriterion> root =
                    CollectionUtilities.TryGetValue(parentIdMap, ROOT_PARENT_ID);

                PreconditionUtilities.CheckState(root != null,
                                                 string.Format(ShoppingMessages.RootCriteriaNotFoundInCriteriaList, adGroupId));

                PreconditionUtilities.CheckState(root.Count == 1,
                                                 string.Format(ShoppingMessages.MoreThanOneRootFound, adGroupId));

                AdGroupCriterion rootCriterion = root[0];

                PreconditionUtilities.CheckState(rootCriterion is BiddableAdGroupCriterion,
                                                 string.Format(ShoppingMessages.RootCriterionIsNotBiddable, adGroupId));

                BiddableAdGroupCriterion biddableRootCriterion =
                    (BiddableAdGroupCriterion)rootCriterion;

                rootNode = new ProductPartitionNode(null, null, rootCriterion.criterion.id,
                                                    new ProductDimensionEqualityComparer());

                // Set the root's bid if a bid exists on the BiddableAdGroupCriterion.
                Money rootNodeBid = GetBid(biddableRootCriterion);

                if (rootNodeBid != null)
                {
                    rootNode.AsBiddableUnit().CpcBid = rootNodeBid.microAmount;
                }

                AddChildNodes(rootNode, parentIdMap);
            }

            return(new ProductPartitionTree(adGroupId, rootNode));
        }
        /// <summary>
        /// Creates a map with key as the parent criterion ID and value as the list of child nodes.
        /// </summary>
        /// <param name="adGroupCriteria">The list of ad group criteria.</param>
        /// <returns>A criteria map.</returns>
        private static Dictionary <long, List <AdGroupCriterion> > CreateParentIdMap(
            List <AdGroupCriterion> adGroupCriteria)
        {
            PreconditionUtilities.CheckNotNull(adGroupCriteria, ShoppingMessages.CriteriaListNull);

            Dictionary <long, List <AdGroupCriterion> > parentIdMap =
                new Dictionary <long, List <AdGroupCriterion> >();

            foreach (AdGroupCriterion adGroupCriterion in adGroupCriteria)
            {
                PreconditionUtilities.CheckNotNull(adGroupCriterion.criterion,
                                                   ShoppingMessages.AdGroupCriterionNull);
                if (adGroupCriterion is BiddableAdGroupCriterion)
                {
                    BiddableAdGroupCriterion biddableCriterion =
                        (BiddableAdGroupCriterion)adGroupCriterion;

                    PreconditionUtilities.CheckState(biddableCriterion.userStatusSpecified,
                                                     string.Format(ShoppingMessages.UserStatusNotSpecified,
                                                                   biddableCriterion.criterion.id));

                    if (biddableCriterion.userStatus == UserStatus.REMOVED)
                    {
                        continue;
                    }
                }

                if (adGroupCriterion.criterion is ProductPartition)
                {
                    ProductPartition        partition = (ProductPartition)adGroupCriterion.criterion;
                    List <AdGroupCriterion> children  = null;
                    if (!parentIdMap.TryGetValue(partition.parentCriterionId, out children))
                    {
                        children = new List <AdGroupCriterion>();
                        parentIdMap[partition.parentCriterionId] = children;
                    }

                    children.Add(adGroupCriterion);
                }
            }

            return(parentIdMap);
        }