/// <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); }