22
22
import org .slf4j .Logger ;
23
23
import org .slf4j .LoggerFactory ;
24
24
25
- import java .util .ArrayList ;
26
- import java .util .Iterator ;
27
- import java .util .List ;
28
- import java .util .Map ;
25
+ import java .util .*;
26
+ import java .util .function .Function ;
29
27
import java .util .stream .Collectors ;
30
28
import java .util .stream .Stream ;
31
29
@@ -38,6 +36,8 @@ public class GoogleAdsReporter
38
36
private GoogleAdsClient client ;
39
37
private ObjectMapper mapper = new ObjectMapper ();
40
38
39
+ private Iterable <GoogleAdsServiceClient .SearchPage > searchResult ;
40
+
41
41
public GoogleAdsReporter (PluginTask task )
42
42
{
43
43
this .task = task ;
@@ -53,40 +53,44 @@ private UserCredentials buildCredential(PluginTask task)
53
53
.build ();
54
54
}
55
55
56
- public Iterable <GoogleAdsServiceClient .SearchPage > getReportPage ()
57
- {
58
- List <GoogleAdsServiceClient .SearchPage > pages = new ArrayList <GoogleAdsServiceClient .SearchPage >();
59
-
60
- String startDateTime = null ;
61
- do {
62
- String query = buildQuery (task , startDateTime );
63
- logger .info (query );
64
- SearchGoogleAdsRequest request = buildRequest (task , query );
65
- GoogleAdsServiceClient googleAdsService = client .getVersion14 ().createGoogleAdsServiceClient ();
66
- GoogleAdsServiceClient .SearchPagedResponse response = googleAdsService .search (request );
67
-
68
- if (response .getPage ().getResponse ().getResultsCount () == 0 ) {
69
- return pages ;
70
- }
56
+ public void search (Map <String , String > params ) {
57
+ String query = buildQuery (task , params );
58
+ logger .info (query );
59
+ SearchGoogleAdsRequest request = buildRequest (task , query );
60
+ GoogleAdsServiceClient googleAdsService = client .getVersion14 ().createGoogleAdsServiceClient ();
61
+ GoogleAdsServiceClient .SearchPagedResponse response = googleAdsService .search (request );
62
+ this .searchResult = response .iteratePages ();
63
+ }
71
64
72
- response .iteratePages ().iterator ().forEachRemaining (pages ::add );
65
+ public boolean fetchResult (Function <Iterable <GoogleAdsServiceClient .SearchPage >, Void > func ) {
66
+ logger .info ("fetchResult" );
67
+ func .apply (this .searchResult );
68
+ Iterator < GoogleAdsServiceClient .SearchPage > pageItr = this .searchResult .iterator ();
73
69
74
- if (task .getResourceType ().equals ("change_event" )) {
75
- GoogleAdsServiceClient .SearchPage lastPage = pages .get (pages .size () - 1 );
76
- GoogleAdsRow lastRow = null ;
77
- for (GoogleAdsRow row : lastPage .getValues ()) {
78
- lastRow = row ;
79
- }
70
+ if (!task .getResourceType ().equals ("change_event" )) return false ;
80
71
81
- if (lastRow == null ) {
82
- break ;
83
- } else {
84
- startDateTime = lastRow .getChangeEvent ().getChangeDateTime ();
85
- }
86
- }
87
- } while (startDateTime != null && !startDateTime .isEmpty ());
72
+ // NOTE: reset iterator
73
+ this .searchResult .iterator ();
88
74
89
- return pages ;
75
+ GoogleAdsServiceClient .SearchPage lastPage = null ;
76
+ while (pageItr .hasNext ()) {
77
+ lastPage = pageItr .next ();
78
+ }
79
+ if (lastPage == null ) return false ;
80
+
81
+ Iterator <GoogleAdsRow > rowItr = lastPage .getValues ().iterator ();
82
+ GoogleAdsRow lastRow = null ;
83
+ while (rowItr .hasNext ()) {
84
+ lastRow = rowItr .next ();
85
+ }
86
+ if (lastRow == null ) return false ;
87
+ lastRow .getChangeEvent ().getChangeDateTime ();
88
+
89
+ this .searchResult = null ;
90
+ Map <String , String > params = new HashMap <>();
91
+ params .put ("start_datetime" , lastRow .getChangeEvent ().getChangeDateTime ());
92
+ search (params );
93
+ return true ;
90
94
}
91
95
92
96
public void flattenResource (String resourceName , Map <Descriptors .FieldDescriptor , Object > fields , Map <String , String > result )
@@ -230,7 +234,7 @@ public SearchGoogleAdsRequest buildRequest(PluginTask task, String query)
230
234
.build ();
231
235
}
232
236
233
- public String buildQuery (PluginTask task , String startDateTime )
237
+ public String buildQuery (PluginTask task , Map < String , String > params )
234
238
{
235
239
StringBuilder sb = new StringBuilder ();
236
240
@@ -240,7 +244,7 @@ public String buildQuery(PluginTask task, String startDateTime)
240
244
sb .append (" FROM " );
241
245
sb .append (task .getResourceType ());
242
246
243
- List <String > whereClause = buildWhereClauseConditions (task , startDateTime );
247
+ List <String > whereClause = buildWhereClauseConditions (task , params );
244
248
if (!whereClause .isEmpty ()) {
245
249
sb .append (" WHERE " );
246
250
sb .append (String .join (" AND " , whereClause ));
@@ -255,7 +259,7 @@ public String buildQuery(PluginTask task, String startDateTime)
255
259
}
256
260
257
261
@ VisibleForTesting
258
- public List <String > buildWhereClauseConditions (PluginTask task , String startDateTime )
262
+ public List <String > buildWhereClauseConditions (PluginTask task , Map < String , String > params )
259
263
{
260
264
List <String > whereConditions = new ArrayList <String >()
261
265
{
@@ -264,7 +268,7 @@ public List<String> buildWhereClauseConditions(PluginTask task, String startDate
264
268
if (task .getDateRange ().isPresent ()) {
265
269
StringBuilder dateSb = new StringBuilder ();
266
270
if (task .getResourceType ().equals ("change_event" )) {
267
- dateSb .append (buildWhereClauseConditionsForChangeEvent (startDateTime ));
271
+ dateSb .append (buildWhereClauseConditionsForChangeEvent (params . get ( "start_datetime" ) ));
268
272
} else {
269
273
dateSb .append ("segments.date BETWEEN '" );
270
274
dateSb .append (task .getDateRange ().get ().getStartDate ());
0 commit comments