コード例 #1
0
        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();
            });
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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();
            });
        }
コード例 #6
0
        /// <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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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();
            });
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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();
            });
        }
コード例 #14
0
        /// <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);
            }
        }