Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(424)

Side by Side Diff: appengine/findit/util_scripts/crash_queries/crash_iterator.py

Issue 2644543006: [Culprit-Finder] Add generator cache decorator. (Closed)
Patch Set: Rebase and fix nits. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 from datetime import date 5 from datetime import date
6 from datetime import datetime 6 from datetime import datetime
7 from datetime import timedelta 7 from datetime import timedelta
8 8
9 from crash.type_enums import CrashClient 9 from crash.type_enums import CrashClient
10 import iterator 10 import iterator
11 from libs.cache_decorator import GeneratorCached
12 from local_cache import LocalCache
11 from model.crash.cracas_crash_analysis import CracasCrashAnalysis 13 from model.crash.cracas_crash_analysis import CracasCrashAnalysis
12 from model.crash.fracas_crash_analysis import FracasCrashAnalysis 14 from model.crash.fracas_crash_analysis import FracasCrashAnalysis
13 15
14 _DEFAULT_BATCH_SIZE = 1000 16 _DEFAULT_BATCH_SIZE = 1000
15 _TODAY = date.today().strftime('%Y-%m-%d') 17 _TODAY = date.today().strftime('%Y-%m-%d')
16 _A_YEAR_AGO = (date.today() - timedelta(days=365)).strftime('%Y-%m-%d') 18 _A_YEAR_AGO = (date.today() - timedelta(days=365)).strftime('%Y-%m-%d')
17 19 _CLIENT_TO_ANALYSIS_CLASS = {CrashClient.FRACAS: FracasCrashAnalysis,
18 20 CrashClient.CRACAS: CracasCrashAnalysis}
19 # TODO(katesonia): Switch to use fuction of objects encapsulating CrashClients,
20 # after the refactoring is done.
21 # TODO(crbug.com/662540): Add unittests.
22 def GetAnalysisClassForClient(client_id): # pragma: no cover.
23 if client_id == CrashClient.FRACAS:
24 return FracasCrashAnalysis
25 elif client_id == CrashClient.CRACAS:
26 return CracasCrashAnalysis
27 elif client_id == CrashClient.CLUSTERFUZZ:
28 # TODO(katesonia): Define ClusterfuzzCrashAnalysis.
29 return None
30
31 return None
32 21
33 22
34 # TODO(crbug.com/662540): Add unittests. 23 # TODO(crbug.com/662540): Add unittests.
35 def GetQueryForClient(client_id, property_values, start_date, end_date, 24 def GetQueryForClient(client_id, property_values, start_date, end_date,
36 datetime_pattern='%Y-%m-%d'): # pragma: no cover. 25 datetime_pattern='%Y-%m-%d'): # pragma: no cover.
37 if property_values is None: 26 if property_values is None:
38 property_values = {} 27 property_values = {}
39 28
40 start_date = datetime.strptime(start_date, datetime_pattern) 29 start_date = datetime.strptime(start_date, datetime_pattern)
41 end_date = datetime.strptime(end_date, datetime_pattern) 30 end_date = datetime.strptime(end_date, datetime_pattern)
42 cls = GetAnalysisClassForClient(client_id) 31 cls = _CLIENT_TO_ANALYSIS_CLASS.get(client_id)
32 if not cls:
33 return None
34
43 query = cls.query() 35 query = cls.query()
44 for property_name, value in property_values.iteritems(): 36 for property_name, value in property_values.iteritems():
45 query = query.filter(getattr(cls, property_name) == value) 37 query = query.filter(getattr(cls, property_name) == value)
46 38
47 return query.filter( 39 return query.filter(
48 cls.requested_time >= start_date).filter( 40 cls.requested_time >= start_date).filter(
49 cls.requested_time < end_date) 41 cls.requested_time < end_date)
50 42
51 43
52 # TODO(crbug.com/662540): Add unittests. 44 # TODO(crbug.com/662540): Add unittests.
(...skipping 20 matching lines...) Expand all
73 batch_size (int): The number of crashes to query at one time. 65 batch_size (int): The number of crashes to query at one time.
74 batch_run (bool): If True, iterate batches of crashes, if 66 batch_run (bool): If True, iterate batches of crashes, if
75 False, iterate each crash. 67 False, iterate each crash.
76 68
77 An example is available in crash_printer/print_crash.py. 69 An example is available in crash_printer/print_crash.py.
78 """ 70 """
79 if property_values is None: 71 if property_values is None:
80 property_values = {} 72 property_values = {}
81 73
82 query = GetQueryForClient(client_id, property_values, start_date, end_date) 74 query = GetQueryForClient(client_id, property_values, start_date, end_date)
75 if not query:
76 return
77
83 for crash in iterator.Iterate(query, app_id, fields=fields, 78 for crash in iterator.Iterate(query, app_id, fields=fields,
84 batch_size=batch_size, 79 batch_size=batch_size,
85 batch_run=batch_run): 80 batch_run=batch_run):
86 yield crash 81 yield crash
82
83
84 @GeneratorCached(LocalCache(), namespace='Crash-iterator') # pragma: no cover.
85 def CachedCrashIterator(client_id, app_id,
86 fields=None, property_values=None,
87 start_date=_A_YEAR_AGO, end_date=_TODAY,
88 batch_size=_DEFAULT_BATCH_SIZE, batch_run=False):
89 """Genrates query to query crashes and iterates crashes.
90
91 This iterator will check local cache first, if there is cache, iterate cached
92 values, else it will visit datastore of appengine app to yield data.
93
94 Args:
95 client_id (CrashClient): One of CrashClient.FRACAS, CrashClient.CRACAS,
96 CrashClient.CLUSTERFUZZ.
97 app_id (str): App engine app id.
98 fields (list): Field names of CrashAnalysis entity to project.
99 property_values (dict): Property values to filter.
100 start_date (str): Only iterate testcases after this date including this
101 date, format '%Y-%m-%d'.
102 end_date (str): Only iterate testcases before this date excluding this date,
103 format '%Y-%m-%d'.
104 batch_size (int): The number of crashes to query at one time.
105 batch_run (bool): If True, iterate batches of crashes, if
106 False, iterate each crash.
107
108 An example is available in crash_printer/print_crash.py.
109 """
110 for crash in IterateCrashes(client_id, app_id, fields=fields,
111 property_values=property_values,
112 start_date=start_date, end_date=end_date,
113 batch_size=batch_size, batch_run=batch_run):
114 yield crash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698