public void TestMissingSelectClause() { ReportQueryBuilder queryBuilder = null; new ReportQueryBuilder(); string query = null; Assert.Throws(typeof(System.ApplicationException), delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Where("Clicks").Equals(20) .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); }); Assert.Throws(typeof(System.ApplicationException), delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select() .Where("Clicks").Equals(20) .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); }); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> public void Run(AdWordsUser user) { // Create the query. ReportQuery query = new ReportQueryBuilder() .Select("Id", "AdNetworkType1", "Impressions") .From(ReportDefinitionReportType.CRITERIA_PERFORMANCE_REPORT) .Where("Status").In("ENABLED", "PAUSED") .During(ReportDefinitionDateRangeType.LAST_7_DAYS) .Build(); ReportUtilities reportUtilities = new ReportUtilities(user, "v201809", query, DownloadFormat.GZIPPED_XML.ToString()); try { using (ReportResponse response = reportUtilities.GetResponse()) { using (GZipStream gzipStream = new GZipStream(response.Stream, CompressionMode.Decompress)) { // Deserialize the report into a list of CriteriaReportRow. // You can also deserialize the list into your own POCOs as follows. // 1. Annotate your class properties with ReportRow annotation. // // public class MyCriteriaReportRow { // // [ReportColumn] // public long KeywordID { get; set; } // // [ReportColumn] // public long Impressions { get; set; } // } // // 2. Deserialize into your own report rows. // // var report = new AwReport<MyCriteriaReportRow>( // new AwXmlTextReader(gzipStream), "Example"); using (var report = new AwReport <CriteriaReportRow>(new AwXmlTextReader(gzipStream), "Example")) { // Print the contents of each row object. foreach (var record in report.Rows) { Console.WriteLine(record); } } } } } catch (Exception e) { throw new System.ApplicationException("Failed to download and parse report.", e); } }
public void TestMissingDuringClause() { ReportQueryBuilder queryBuilder = new ReportQueryBuilder(); string query = queryBuilder.Select("CampaignId", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("Clicks") .Equals(20).Build(); Assert.AreEqual( "SELECT CampaignId, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE Clicks = 20", query); }
public void TestMissingWhereClause() { ReportQueryBuilder queryBuilder = new ReportQueryBuilder(); string query = queryBuilder.Select("CampaignId", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .During(ReportDefinitionDateRangeType.YESTERDAY).Build(); Assert.AreEqual( "SELECT CampaignId, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT DURING YESTERDAY", query); }
public void TestMissingFromClause() { ReportQueryBuilder queryBuilder = new ReportQueryBuilder(); Assert.Throws(typeof(System.ApplicationException), delegate() { string query = queryBuilder.Select("CampaignId", "Status", "Clicks", "Impressions") .Where("Clicks").Equals(20).During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); }); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> public void Run(AdWordsUser user) { // Create the query. ReportQuery query = new ReportQueryBuilder() .Select("Id", "AdNetworkType1", "Impressions") .From(ReportDefinitionReportType.CRITERIA_PERFORMANCE_REPORT) .Where("Status").In("ENABLED", "PAUSED") .During(ReportDefinitionDateRangeType.LAST_7_DAYS) .Build(); ReportUtilities reportUtilities = new ReportUtilities(user, "v201806", query, DownloadFormat.GZIPPED_XML.ToString()); Dictionary <string, long> impressionsByAdNetworkType1 = new Dictionary <string, long>(); try { using (ReportResponse response = reportUtilities.GetResponse()) { using (GZipStream gzipStream = new GZipStream(response.Stream, CompressionMode.Decompress)) { using (XmlTextReader reader = new XmlTextReader(gzipStream)) { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // The node is an Element. if (reader.Name == "row") { ParseRow(impressionsByAdNetworkType1, reader); } break; } } } } } Console.WriteLine("Network, Impressions"); foreach (string network in impressionsByAdNetworkType1.Keys) { Console.WriteLine("{0}, {1}", network, impressionsByAdNetworkType1[network]); } } catch (Exception e) { throw new System.ApplicationException("Failed to download report.", e); } }
public GADCustomReport Get(GADCustomReportInitializer initializer) { GCommonCredentialsExtended cred = (GCommonCredentialsExtended)(new GCommonCredentialManager <GRestUserCredentialReceiver, GRestUserCredentialInitializer>().Get(new GRestUserCredentialInitializer(initializer.Config.CredentialsJsonPath, null))); AdWordsAppConfig config = new AdWordsAppConfig(); config.DeveloperToken = initializer.Config.DeveloperToken; AdWordsUser user = new AdWordsUser(config); user.Config.OAuth2RefreshToken = cred.RefreshToken; user.Config.OAuth2AccessToken = cred.AccessToken; user.Config.OAuth2ClientId = cred.ClientId; user.Config.OAuth2ClientSecret = cred.ClientSecret; config.ClientCustomerId = initializer.Account.Id; // Create the required service. ReportQuery query = new ReportQueryBuilder() .Select(initializer.Columns.Select(x => x.Value.Name).ToArray()) .From(initializer.Type.Name) .During(initializer.DateStart, initializer.DateEnd) .Build(); ReportUtilities utilities = new ReportUtilities(user, "v201809", query, DownloadFormat.XML.ToString()); string xmlResult; using (ReportResponse response = utilities.GetResponse()) { using (var sr = new StreamReader(response.Stream)) { xmlResult = sr.ReadToEnd(); } } XmlSerializer serializer = new XmlSerializer(typeof(XML201809ReportResponse)); XML201809ReportResponse xmlReport; using (TextReader tr = new StringReader(xmlResult)) { xmlReport = (XML201809ReportResponse)serializer.Deserialize(tr); } GADCustomReport report = new GADCustomReport(initializer); report.Rows = xmlReport.Table.Row.Select(x => new CustomReportRow( ((XmlNode[])x) .Where(t => initializer.AlterColumns.ContainsKey(t.Name.ToLower())) .Select(t => new CustomReportCell(initializer.AlterColumns[t.Name.ToLower()], t.Value)).ToArray() ) ).ToArray(); return(report); }
public void TestStandardQueryConstruction() { ReportQueryBuilder queryBuilder = null; string query = null; queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignId", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("Clicks") .Equals(20).During(ReportDefinitionDateRangeType.YESTERDAY).Build(); Assert.AreEqual( "SELECT CampaignId, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE Clicks = 20 DURING YESTERDAY", query); }
public void TestFromClauseInputTypes() { ReportQueryBuilder queryBuilder = null; string query = null; // FROM clause accepts ReportDefinitionReportType values. queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").In("TEST_CAMPAIGN1", "TEST_CAMPAIGN2") .Where("CampaignId").In(123, 456) .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); Assert.AreEqual("SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName IN " + "['TEST_CAMPAIGN1', 'TEST_CAMPAIGN2'] AND CampaignId IN [123, 456] DURING YESTERDAY", query); // FROM clause accepts ReportDefinitionReportType values, specified in string format. queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From("CAMPAIGN_PERFORMANCE_REPORT") .Where("CampaignName").In("TEST_CAMPAIGN1", "TEST_CAMPAIGN2") .Where("CampaignId").In(123, 456) .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); Assert.AreEqual("SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName IN " + "['TEST_CAMPAIGN1', 'TEST_CAMPAIGN2'] AND CampaignId IN [123, 456] DURING YESTERDAY", query); // Exception is thrown if FROM clause cannot be parsed into a // known report type. Assert.Throws <ArgumentException>(delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From("UNKNOWN_PERFORMANCE_REPORT") .Where("CampaignName").Equals("TEST_CAMPAIGN") .During("Foo", "20140301") .Build(); }); }
public void TestStringParameters() { ReportQueryBuilder queryBuilder = null; string query = null; // Single string parameter. queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").Equals("TEST_CAMPAIGN") .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); Assert.AreEqual("SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'TEST_CAMPAIGN' DURING YESTERDAY", query); // Multiple string parameters. queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").Equals("TEST_CAMPAIGN") .Where("Status").Equals("ENABLED") .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); Assert.AreEqual("SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'TEST_CAMPAIGN' " + "AND Status = 'ENABLED' DURING YESTERDAY", query); // String parameters with quotes and backslashes in them. queryBuilder = new ReportQueryBuilder(); query = queryBuilder .Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").Equals("T'EST_\"CAMPAIGN") .Where("Status").Equals("ENA\\BLED") .During(ReportDefinitionDateRangeType.YESTERDAY) .Build(); Assert.AreEqual("SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'T\\'EST_\\\"CAMPAIGN' " + "AND Status = 'ENA\\\\BLED' DURING YESTERDAY", query); }
public void TestMultiArgumentFunctions() { ReportQueryBuilder queryBuilder = null; string query = null; // Multi-argument, string parameters and non-string parameters. queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("CampaignName") .In("TEST_CAMPAIGN1", "TEST_CAMPAIGN2").Where("CampaignId").In(123, 456) .During(ReportDefinitionDateRangeType.YESTERDAY).Build(); Assert.AreEqual( "SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName IN " + "['TEST_CAMPAIGN1', 'TEST_CAMPAIGN2'] AND CampaignId IN [123, 456] " + "DURING YESTERDAY", query); }
public void TestFieldsInSelectClause() { ReportQueryBuilder queryBuilder = null; string query = null; // Duplicate fields and order are preserved. queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignId", "Status", "Clicks", "Status") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Build(); Assert.AreEqual( "SELECT CampaignId, Status, Clicks, Status FROM CAMPAIGN_PERFORMANCE_REPORT", query); // If multiple Select calls are done, only the last instance is kept. queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignId", "Status").Select("Clicks", "Status") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Build(); Assert.AreEqual("SELECT Clicks, Status FROM CAMPAIGN_PERFORMANCE_REPORT", query); }
public void TestDuringClauseInputTypes() { ReportQueryBuilder queryBuilder = null; string query = null; // Exception is thrown if minDate is not in yyyyMMdd format. Assert.Throws <ArgumentException>(delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").Equals("TEST_CAMPAIGN").During("Foo", "20140301") .Build(); }); // Exception is thrown if maxDate is not in yyyyMMdd format. Assert.Throws <ArgumentException>(delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) .Where("CampaignName").Equals("TEST_CAMPAIGN").During("20140301", "Foo") .Build(); }); // DURING query accepts date strings in yyyyMMdd format. queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("CampaignName") .Equals("TEST_CAMPAIGN").During("20170101", "20170131").Build(); Assert.AreEqual( "SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'TEST_CAMPAIGN' " + "DURING 20170101, 20170131", query); // DURING query accepts DateTime formats. DateTime minDate = new DateTime(2017, 1, 1); DateTime maxDate = new DateTime(2017, 1, 31); queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("CampaignName") .Equals("TEST_CAMPAIGN").During(minDate, maxDate).Build(); Assert.AreEqual( "SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'TEST_CAMPAIGN' " + "DURING 20170101, 20170131", query); // DURING supports predefined dateranges in string format. queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From(ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT).Where("CampaignName") .Equals("TEST_CAMPAIGN").During("YESTERDAY").Build(); Assert.AreEqual( "SELECT CampaignName, Status, Clicks, Impressions FROM " + "CAMPAIGN_PERFORMANCE_REPORT WHERE CampaignName = 'TEST_CAMPAIGN' " + "DURING YESTERDAY", query); // Exception is thrown if DURING clause cannot be parsed into a // known date range type. Assert.Throws <ArgumentException>(delegate() { queryBuilder = new ReportQueryBuilder(); query = queryBuilder.Select("CampaignName", "Status", "Clicks", "Impressions") .From("CAMPAIGN_PERFORMANCE_REPORT").Where("CampaignName") .Equals("TEST_CAMPAIGN").During("Foo").Build(); }); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> /// <param name="downloadFolder">The file to which the report is downloaded. /// </param> public void Run(AdWordsUser user, string downloadFolder) { // Increase the number of HTTP connections we can do in parallel. System.Net.ServicePointManager.DefaultConnectionLimit = 100; try { // Start the rate limiter with an initial value of zero, so that all // threads block immediately. Semaphore rateLimiter = new Semaphore(0, MAX_REPORT_DOWNLOADS_IN_PARALLEL); // Get all the advertiser accounts under this manager account. List <long> allCustomerIds = GetDescendantAdvertiserAccounts(user); // Create a concurrent queue of customers so that all threads can work // on the collection in parallel. ConcurrentQueue <long> customerQueue = new ConcurrentQueue <long>(allCustomerIds); // Create queues to keep track of successful and failed report downloads. ConcurrentQueue <SuccessfulReportDownload> reportsSucceeeded = new ConcurrentQueue <SuccessfulReportDownload>(); ConcurrentQueue <FailedReportDownload> reportsFailed = new ConcurrentQueue <FailedReportDownload>(); // Keep an array of events. This is used by the main thread to wait for // all worker threads to join. ManualResetEvent[] doneEvents = new ManualResetEvent[MAX_NUMBER_OF_THREADS]; // The list of threads to download reports. Thread[] threads = new Thread[MAX_NUMBER_OF_THREADS]; // The data for each thread. ReportDownloadData[] threadData = new ReportDownloadData[MAX_NUMBER_OF_THREADS]; // The query to be run on each account. ReportQuery query = new ReportQueryBuilder() .Select("CampaignId", "AdGroupId", "Impressions", "Clicks", "Cost") .From(ReportDefinitionReportType.ADGROUP_PERFORMANCE_REPORT) .Where("AdGroupStatus").In("ENABLED", "PAUSED") .During(ReportDefinitionDateRangeType.LAST_7_DAYS).Build(); // Initialize the threads and their data. for (int i = 0; i < MAX_NUMBER_OF_THREADS; i++) { doneEvents[i] = new ManualResetEvent(false); threadData[i] = new ReportDownloadData() { Config = (AdWordsAppConfig)(user.Config.Clone()), DownloadFolder = downloadFolder, SignalEvent = doneEvents[i], ThreadIndex = i, QuotaLock = rateLimiter, CustomerIdQueue = customerQueue, SuccessfulReports = reportsSucceeeded, FailedReports = reportsFailed }; threads[i] = new Thread(threadData[i].ThreadCallback); } // Start the threads. Since the initial value of rate limiter is zero, // all threads will block immediately. for (int i = 0; i < threads.Length; i++) { threads[i].Start(query); } // Now reset the rate limiter so all threads can start downloading reports. rateLimiter.Release(MAX_REPORT_DOWNLOADS_IN_PARALLEL); // Wait for all threads in pool to complete. WaitHandle.WaitAll(doneEvents); Console.WriteLine("Download completed, results:"); Console.WriteLine("Successful reports:"); while (!reportsSucceeeded.IsEmpty) { SuccessfulReportDownload success = null; if (reportsSucceeeded.TryDequeue(out success)) { Console.WriteLine("Client ID: {0}, Path: {1}", success.CustomerId, success.Path); } } Console.WriteLine("Failed reports:"); while (!reportsFailed.IsEmpty) { FailedReportDownload failure = null; if (reportsFailed.TryDequeue(out failure)) { Console.WriteLine("Client ID: {0}, Cause: {1}", failure.CustomerId, failure.Exception.Message); } } Console.WriteLine("All reports are downloaded."); } catch (Exception e) { throw new System.ApplicationException("Failed to download reports.", e); } }