/// <summary> /// Using the criteria in <paramref name="parentIdMap"/>, recursively adds /// all children under the partition ID of <paramref name="parentNode"/> to /// <paramref name="parentNode"/>. /// </summary> /// <param name="parentNode">The parent node.</param> /// <param name="parentIdMap">The multimap from parent partition ID to list /// of child criteria</param> private static void AddChildNodes(ProductPartitionNode parentNode, Dictionary <long, List <AdGroupCriterion> > parentIdMap) { List <AdGroupCriterion> childCriteria = CollectionUtilities.TryGetValue(parentIdMap, parentNode.ProductPartitionId); // no children, return. if (childCriteria == null || childCriteria.Count == 0) { return; } // Ensure that the parent is a subdivision. parentNode.AsSubdivision(); foreach (AdGroupCriterion childCriterion in childCriteria) { ProductPartition partition = (ProductPartition)childCriterion.criterion; ProductPartitionNode childNode = parentNode.AddChild(partition.caseValue); childNode.ProductPartitionId = partition.id; if (childCriterion is BiddableAdGroupCriterion) { childNode = childNode.AsBiddableUnit(); Money cpcBidAmount = GetBid((BiddableAdGroupCriterion)childCriterion); if (cpcBidAmount != null) { childNode.CpcBid = cpcBidAmount.microAmount; } } else { childNode = childNode.AsExcludedUnit(); } AddChildNodes(childNode, parentIdMap); } }