@@ -230,6 +230,165 @@ def count_query_with_stale_read(client):
230
230
return [task1 , task2 , task3 ]
231
231
232
232
233
+ def sum_query_on_kind (client ):
234
+ # [START datastore_sum_aggregation_query_on_kind]
235
+ # Set up sample entities
236
+ # Use incomplete key to auto-generate ID
237
+ task1 = datastore .Entity (client .key ("Task" ))
238
+ task2 = datastore .Entity (client .key ("Task" ))
239
+ task3 = datastore .Entity (client .key ("Task" ))
240
+
241
+ task1 ["hours" ] = 5
242
+ task2 ["hours" ] = 3
243
+ task3 ["hours" ] = 1
244
+
245
+ tasks = [task1 , task2 , task3 ]
246
+ client .put_multi (tasks )
247
+
248
+ # Execute sum aggregation query
249
+ all_tasks_query = client .query (kind = "Task" )
250
+ all_tasks_sum_query = client .aggregation_query (all_tasks_query ).sum ("hours" )
251
+ query_result = all_tasks_sum_query .fetch ()
252
+ for aggregation_results in query_result :
253
+ for aggregation in aggregation_results :
254
+ print (f"Total sum of hours in tasks is { aggregation .value } " )
255
+ # [END datastore_sum_aggregation_query_on_kind]
256
+ return tasks
257
+
258
+
259
+ def sum_query_property_filter (client ):
260
+ # [START datastore_sum_aggregation_query_with_filters]
261
+ # Set up sample entities
262
+ # Use incomplete key to auto-generate ID
263
+ task1 = datastore .Entity (client .key ("Task" ))
264
+ task2 = datastore .Entity (client .key ("Task" ))
265
+ task3 = datastore .Entity (client .key ("Task" ))
266
+
267
+ task1 ["hours" ] = 5
268
+ task2 ["hours" ] = 3
269
+ task3 ["hours" ] = 1
270
+
271
+ task1 ["done" ] = True
272
+ task2 ["done" ] = True
273
+ task3 ["done" ] = False
274
+
275
+ tasks = [task1 , task2 , task3 ]
276
+ client .put_multi (tasks )
277
+
278
+ # Execute sum aggregation query with filters
279
+ completed_tasks = client .query (kind = "Task" ).add_filter ("done" , "=" , True )
280
+ completed_tasks_query = client .aggregation_query (query = completed_tasks ).sum (
281
+ property_ref = "hours" ,
282
+ alias = "total_completed_sum_hours"
283
+ )
284
+
285
+ completed_query_result = completed_tasks_query .fetch ()
286
+ for aggregation_results in completed_query_result :
287
+ for aggregation_result in aggregation_results :
288
+ if aggregation_result .alias == "total_completed_sum_hours" :
289
+ print (f"Total sum of hours in completed tasks is { aggregation_result .value } " )
290
+ # [END datastore_sum_aggregation_query_with_filters]
291
+ return tasks
292
+
293
+
294
+ def avg_query_on_kind (client ):
295
+ # [START datastore_avg_aggregation_query_on_kind]
296
+ # Set up sample entities
297
+ # Use incomplete key to auto-generate ID
298
+ task1 = datastore .Entity (client .key ("Task" ))
299
+ task2 = datastore .Entity (client .key ("Task" ))
300
+ task3 = datastore .Entity (client .key ("Task" ))
301
+
302
+ task1 ["hours" ] = 5
303
+ task2 ["hours" ] = 3
304
+ task3 ["hours" ] = 1
305
+
306
+ tasks = [task1 , task2 , task3 ]
307
+ client .put_multi (tasks )
308
+
309
+ # Execute average aggregation query
310
+ all_tasks_query = client .query (kind = "Task" )
311
+ all_tasks_avg_query = client .aggregation_query (all_tasks_query ).avg ("hours" )
312
+ query_result = all_tasks_avg_query .fetch ()
313
+ for aggregation_results in query_result :
314
+ for aggregation in aggregation_results :
315
+ print (f"Total average of hours in tasks is { aggregation .value } " )
316
+ # [END datastore_avg_aggregation_query_on_kind]
317
+ return tasks
318
+
319
+
320
+ def avg_query_property_filter (client ):
321
+ # [START datastore_avg_aggregation_query_with_filters]
322
+ # Set up sample entities
323
+ # Use incomplete key to auto-generate ID
324
+ task1 = datastore .Entity (client .key ("Task" ))
325
+ task2 = datastore .Entity (client .key ("Task" ))
326
+ task3 = datastore .Entity (client .key ("Task" ))
327
+
328
+ task1 ["hours" ] = 5
329
+ task2 ["hours" ] = 3
330
+ task3 ["hours" ] = 1
331
+
332
+ task1 ["done" ] = True
333
+ task2 ["done" ] = True
334
+ task3 ["done" ] = False
335
+
336
+ tasks = [task1 , task2 , task3 ]
337
+ client .put_multi (tasks )
338
+
339
+ # Execute average aggregation query with filters
340
+ completed_tasks = client .query (kind = "Task" ).add_filter ("done" , "=" , True )
341
+ completed_tasks_query = client .aggregation_query (query = completed_tasks ).avg (
342
+ property_ref = "hours" ,
343
+ alias = "total_completed_avg_hours"
344
+ )
345
+
346
+ completed_query_result = completed_tasks_query .fetch ()
347
+ for aggregation_results in completed_query_result :
348
+ for aggregation_result in aggregation_results :
349
+ if aggregation_result .alias == "total_completed_avg_hours" :
350
+ print (f"Total average of hours in completed tasks is { aggregation_result .value } " )
351
+ # [END datastore_avg_aggregation_query_with_filters]
352
+ return tasks
353
+
354
+
355
+ def multiple_aggregations_query (client ):
356
+ # [START datastore_multiple_aggregation_in_structured_query]
357
+ # Set up sample entities
358
+ # Use incomplete key to auto-generate ID
359
+ task1 = datastore .Entity (client .key ("Task" ))
360
+ task2 = datastore .Entity (client .key ("Task" ))
361
+ task3 = datastore .Entity (client .key ("Task" ))
362
+
363
+ task1 ["hours" ] = 5
364
+ task2 ["hours" ] = 3
365
+ task3 ["hours" ] = 1
366
+
367
+ tasks = [task1 , task2 , task3 ]
368
+ client .put_multi (tasks )
369
+
370
+ # Execute query with multiple aggregations
371
+ all_tasks_query = client .query (kind = "Task" )
372
+ aggregation_query = client .aggregation_query (all_tasks_query )
373
+ # Add aggregations
374
+ aggregation_query .add_aggregations (
375
+ [
376
+ datastore .aggregation .CountAggregation (alias = "count_aggregation" ),
377
+ datastore .aggregation .SumAggregation (
378
+ property_ref = "hours" , alias = "sum_aggregation" ),
379
+ datastore .aggregation .AvgAggregation (
380
+ property_ref = "hours" , alias = "avg_aggregation" )
381
+ ]
382
+ )
383
+
384
+ query_result = aggregation_query .fetch ()
385
+ for aggregation_results in query_result :
386
+ for aggregation in aggregation_results :
387
+ print (f"{ aggregation .alias } value is { aggregation .value } " )
388
+ # [END datastore_multiple_aggregation_in_structured_query]
389
+ return tasks
390
+
391
+
233
392
def main (project_id ):
234
393
client = datastore .Client (project_id )
235
394
0 commit comments