Hi, I have a campaign with one sitelink extension that belongs to an account with 5 sitelinks. However when I download the sitelinks for the campaign, all 5 sitelinks are returned. All the sitelinks in question are upgraded. Can someone spot the problem with the code below? The code attempts to download just the campaign's sitelinks and print them out. As you can see it incorrectly prints out all 5 sitelinks.
In the interests of full disclosure, I am a colleague of Julian who posted about this here: https://groups.google.com/forum/#!searchin/adwords-api/feed/adwords-api/HbTVwjXmPhM/PZEIXgwur7UJ without receiving a complete answer. Campaign name: campaign_2013_05_31_1105_53 Campaign ID: 135309525 Client ID: 490-175-3108 Campaign's sitelink: "Staff" Many thanks, Peter -------------------------------------- CODE -------------------------------------- public static void runExample______2(AdWordsServices adWordsServices, AdWordsSession session, long[] campaignIds) throws Exception { FeedServiceInterface feedService = adWordsServices.get(session, FeedServiceInterface.class); FeedItemServiceInterface feedItemService = adWordsServices.get(session, FeedItemServiceInterface.class); CampaignFeedServiceInterface campaignFeedService = adWordsServices.get(session, CampaignFeedServiceInterface.class); final Selector campaignFeedSelector = new Selector(); campaignFeedSelector.setFields(CAMPAIGN_FEED_FIELDS); final Predicate campaignPredicate = new Predicate(); campaignPredicate.setOperator(PredicateOperator.EQUALS); campaignPredicate.setField("CampaignId"); campaignPredicate.setValues(new String[] { Long.toString(campaignIds[0]) }); final Predicate statusPredicate = new Predicate(); statusPredicate.setOperator(PredicateOperator.EQUALS); statusPredicate.setField("Status"); statusPredicate.setValues(new String[] { CampaignFeedStatus.ACTIVE.getValue() }); campaignFeedSelector.setPredicates(new Predicate[] { campaignPredicate, statusPredicate }); final CampaignFeedPage campaignFeedPage = campaignFeedService.get(campaignFeedSelector); if (campaignFeedPage != null && campaignFeedPage.getEntries() != null) { final CampaignFeed[] campaignFeedEntries = campaignFeedPage.getEntries(); final List<String> s = new ArrayList<String>(); for (final CampaignFeed campaignFeed : campaignFeedEntries) { final Long campaignId = campaignFeed.getCampaignId(); final Long feedId = campaignFeed.getFeedId(); final CampaignFeedStatus campaignFeedStatus = campaignFeed.getStatus(); final int[] placeholderTypesArray = campaignFeed.getPlaceholderTypes(); final List<Integer> placeholderTypes = getList(placeholderTypesArray); final Function matchingFunction = campaignFeed.getMatchingFunction(); final FunctionArgumentOperand[] lhsOperands = matchingFunction.getLhsOperand(); final FunctionArgumentOperand[] rhsOperands = matchingFunction.getRhsOperand(); final FunctionOperator functionOperator = matchingFunction.getOperator(); final String functionOperatorString = functionOperator.getValue(); final List<String> lhsFunctionArgumentOperandTypes = new ArrayList<String>(); final List<String> rhsFunctionArgumentOperandTypes = new ArrayList<String>(); if (lhsOperands != null) { for (final FunctionArgumentOperand lhsOperand : lhsOperands) { final String lhsFunctionArgumentOperandType = lhsOperand.getFunctionArgumentOperandType(); lhsFunctionArgumentOperandTypes.add(lhsFunctionArgumentOperandType); } } if (rhsOperands != null) { for (final FunctionArgumentOperand rhsOperand : rhsOperands) { final String rhsFunctionArgumentOperandType = rhsOperand.getFunctionArgumentOperandType(); rhsFunctionArgumentOperandTypes.add(rhsFunctionArgumentOperandType); } } s.add("Campaign Feed: Campaign ID " + campaignId + ", " + "Feed ID " + feedId + ", " + "CampaignFeedStatus " + campaignFeedStatus + ", " + "Placeholder Types " + placeholderTypes); s.add("\tMatching Function: functionOperatorString [" + functionOperatorString + "]"); final Selector feedSelector = new Selector(); feedSelector.setFields(FEED_FIELDS); final Predicate feedIdPredicate = new Predicate(); feedIdPredicate.setOperator(PredicateOperator.EQUALS); feedIdPredicate.setField("Id"); feedIdPredicate.setValues(new String[] { Long.toString(feedId) }); final Predicate feedStatusPredicate = new Predicate(); feedStatusPredicate.setOperator(PredicateOperator.EQUALS); feedStatusPredicate.setField("FeedStatus"); feedStatusPredicate.setValues(new String[] { FeedStatus.ACTIVE.getValue() }); feedSelector.setPredicates(new Predicate[] { feedIdPredicate, feedStatusPredicate }); final FeedPage feedPage = feedService.get(feedSelector); if (feedPage != null && feedPage.getEntries() != null) { final Feed[] feeds = feedPage.getEntries(); for (final Feed feed : feeds) { final Long currentFeedId = feed.getId(); final String feedName = feed.getName(); final String feedOrigin = feed.getOrigin() != null ? feed.getOrigin().getValue() : ""; final String FeedStatus = feed.getStatus() != null ? feed.getStatus().getValue() : ""; s.add("\tFeed: " + "currentFeedId " + currentFeedId + ", feedName " + feedName + ", feedOrigin " + feedOrigin + ", FeedStatus " + FeedStatus); final FeedAttribute[] feedAttributes = feed.getAttributes(); for (final FeedAttribute feedAttribute : feedAttributes) { final Long attributeId = feedAttribute.getId(); final Boolean isPartOfKey = feedAttribute.getIsPartOfKey(); final String attributeName = feedAttribute.getName(); final String feedAttributeType = feedAttribute.getType() != null ? feedAttribute.getType().getValue() : ""; s.add("\t\tFeedAttribute: " + "attributeId " + attributeId + ", isPartOfKey " + isPartOfKey + ", attributeName " + attributeName + ", feedAttributeType " + feedAttributeType); } final Selector feedItemSelector = new Selector(); feedItemSelector.setFields(FEED_ITEM_FIELDS); final Predicate feedItemFeedIdPredicate = new Predicate(); feedItemFeedIdPredicate.setOperator(PredicateOperator.EQUALS); feedItemFeedIdPredicate.setField("FeedId"); feedItemFeedIdPredicate.setValues(new String[] { Long.toString(feedId) }); feedItemSelector.setPredicates(new Predicate[] { feedItemFeedIdPredicate }); final FeedItemPage feedItemPage = feedItemService.get(feedItemSelector); if (feedItemPage != null && feedItemPage.getEntries() != null) { final FeedItem[] feedItems = feedItemPage.getEntries(); for (final FeedItem feedItem : feedItems) { final Long devicePreference = feedItem.getDevicePreference() != null ? feedItem.getDevicePreference().getDevicePreference() : null; final String endTime = feedItem.getEndTime(); final Long feedIdentifier = feedItem.getFeedId(); final Long feedItemId = feedItem.getFeedItemId(); final String startTime = feedItem.getStartTime(); final FeedItemStatus feedItemStatus = feedItem.getStatus(); s.add("\t\tFeedItem: feedItemId " + feedItemId + ", feedId " + feedIdentifier + ", startTime " + startTime + ", endTime " + endTime + ", feedItemStatus " + feedItemStatus + ", devicePreference " + devicePreference); final FeedItemValidationDetail[] validationDetails = feedItem.getValidationDetails(); if (validationDetails != null) { for (final FeedItemValidationDetail validationDetail : validationDetails) { final Long feedItemMappingId = validationDetail.getFeedMappingId(); final FeedItemValidationDetailValidationStatus validationStatus = validationDetail.getValidationStatus(); final FeedItemValidationDetailApprovalStatus validationDetailApprovalStatus = validationDetail.getApprovalStatus(); s.add("\t\t\tFeedItemValidationDetail: feedItemMappingId " + feedItemMappingId + ", validationStatus " + validationStatus + ", approvalStatus " + validationDetailApprovalStatus); final FeedItemAttributeError[] validationErrors = validationDetail.getValidationErrors(); if (validationErrors != null) { for (final FeedItemAttributeError validationError : validationErrors) { final Integer validationErrorCode = validationError.getValidationErrorCode(); s.add("\t\t\t\tFeedItemAttributeError: errorCode " + validationErrorCode); } } } } final FeedItemAttributeValue[] feedItemAttributeValues = feedItem.getAttributeValues(); if (feedItemAttributeValues != null) { for (final FeedItemAttributeValue feedItemAttributeValue : feedItemAttributeValues) { final Long feedAttributeId = feedItemAttributeValue.getFeedAttributeId(); final Long feedItemAttributeId = feedItemAttributeValue.getFeedAttributeId(); final Boolean booleanValue = feedItemAttributeValue.getBooleanValue(); final Double doubleValue = feedItemAttributeValue.getDoubleValue(); final Long integerValue = feedItemAttributeValue.getIntegerValue(); final String stringValue = feedItemAttributeValue.getStringValue(); s.add("\t\t\tFeedItemAttributeValue: feedAttributeId " + feedAttributeId + ", feedItemAttributeId " + feedItemAttributeId + ", booleanValue " + booleanValue + ", doubleValue " + doubleValue + ", integerValue " + integerValue + ", stringValue " + stringValue); } } } } } } } for (String str : s) System.out.println(str); } } public static final String[] CAMPAIGN_FEED_FIELDS = new String[] { "CampaignId", "FeedId", "MatchingFunction", "PlaceholderTypes", "Status" }; public static final String[] FEED_FIELDS = new String[] { "Attributes", "FeedStatus", "Id", "Name", "Origin" }; public static final String[] FEED_ITEM_FIELDS = new String[] { "AttributeValues", "DevicePreference", "EndTime", "FeedId", "FeedItemId", "StartTime", "Status", "ValidationDetails" }; public static List<Integer> getList(final int[] array) { final List<Integer> list = new ArrayList<Integer>(); if (array != null) { if (array != null && array.length > 0) { for (final int l : array) { list.add(l); } } } return list; } -------------------------------------- OUTPUT -------------------------------------- Campaign Feed: Campaign ID 135309525, Feed ID 2026485, CampaignFeedStatus ACTIVE, Placeholder Types [1] Matching Function: functionOperatorString [EQUALS] Feed: currentFeedId 2026485, feedName Main sitelink feed, feedOrigin ADWORDS, FeedStatus ACTIVE FeedAttribute: attributeId 1, isPartOfKey false, attributeName SitelinkName, feedAttributeType STRING FeedAttribute: attributeId 2, isPartOfKey false, attributeName SitelinkUrl, feedAttributeType URL FeedAttribute: attributeId 3, isPartOfKey false, attributeName SitelinkDescription1, feedAttributeType STRING FeedAttribute: attributeId 4, isPartOfKey false, attributeName SitelinkDescription2, feedAttributeType STRING FeedItem: feedItemId 9846525, feedId 2026485, startTime null, endTime null, feedItemStatus ACTIVE, devicePreference null FeedItemValidationDetail: feedItemMappingId 2104725, validationStatus VALID, approvalStatus DISAPPROVED FeedItemAttributeValue: feedAttributeId 1, feedItemAttributeId 1, booleanValue null, doubleValue null, integerValue null, stringValue Contact Us FeedItemAttributeValue: feedAttributeId 2, feedItemAttributeId 2, booleanValue null, doubleValue null, integerValue null, stringValue http://www.oursite.com/contactus FeedItem: feedItemId 9846645, feedId 2026485, startTime null, endTime null, feedItemStatus ACTIVE, devicePreference null FeedItemValidationDetail: feedItemMappingId 2104725, validationStatus VALID, approvalStatus DISAPPROVED FeedItemAttributeValue: feedAttributeId 1, feedItemAttributeId 1, booleanValue null, doubleValue null, integerValue null, stringValue About Us FeedItemAttributeValue: feedAttributeId 2, feedItemAttributeId 2, booleanValue null, doubleValue null, integerValue null, stringValue http://www.oursite.com/aboutus FeedItem: feedItemId 9846885, feedId 2026485, startTime null, endTime null, feedItemStatus ACTIVE, devicePreference null FeedItemValidationDetail: feedItemMappingId 2104725, validationStatus VALID, approvalStatus APPROVED FeedItemAttributeValue: feedAttributeId 1, feedItemAttributeId 1, booleanValue null, doubleValue null, integerValue null, stringValue map FeedItemAttributeValue: feedAttributeId 2, feedItemAttributeId 2, booleanValue null, doubleValue null, integerValue null, stringValue http://www.oursite.com/map FeedItem: feedItemId 9847005, feedId 2026485, startTime null, endTime null, feedItemStatus ACTIVE, devicePreference null FeedItemValidationDetail: feedItemMappingId 2104725, validationStatus VALID, approvalStatus APPROVED FeedItemAttributeValue: feedAttributeId 1, feedItemAttributeId 1, booleanValue null, doubleValue null, integerValue null, stringValue Products FeedItemAttributeValue: feedAttributeId 2, feedItemAttributeId 2, booleanValue null, doubleValue null, integerValue null, stringValue http://www.oursite.com/products FeedItem: feedItemId 9847245, feedId 2026485, startTime null, endTime null, feedItemStatus ACTIVE, devicePreference null FeedItemValidationDetail: feedItemMappingId 2104725, validationStatus VALID, approvalStatus APPROVED FeedItemAttributeValue: feedAttributeId 1, feedItemAttributeId 1, booleanValue null, doubleValue null, integerValue null, stringValue Staff FeedItemAttributeValue: feedAttributeId 2, feedItemAttributeId 2, booleanValue null, doubleValue null, integerValue null, stringValue http://www.oursite.com/staff -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and discussion group: http://adwordsapi.blogspot.com http://groups.google.com/group/adwords-api =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To post to this group, send email to adwords-api@googlegroups.com To unsubscribe from this group, send email to adwords-api+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/adwords-api?hl=en --- You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To unsubscribe from this group and stop receiving emails from it, send an email to adwords-api+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.