| Index: appengine/findit/util_scripts/crash_queries/crash_iterator.py
|
| diff --git a/appengine/findit/util_scripts/crash_queries/crash_iterator.py b/appengine/findit/util_scripts/crash_queries/crash_iterator.py
|
| index 3a02e9a610a80dbda5f5d71b6a97e48b5d0dde4c..ffae0d1d2f03d2700cfc975fb4588b05da9c9811 100644
|
| --- a/appengine/findit/util_scripts/crash_queries/crash_iterator.py
|
| +++ b/appengine/findit/util_scripts/crash_queries/crash_iterator.py
|
| @@ -8,27 +8,16 @@ from datetime import timedelta
|
|
|
| from crash.type_enums import CrashClient
|
| import iterator
|
| +from libs.cache_decorator import GeneratorCached
|
| +from local_cache import LocalCache
|
| from model.crash.cracas_crash_analysis import CracasCrashAnalysis
|
| from model.crash.fracas_crash_analysis import FracasCrashAnalysis
|
|
|
| _DEFAULT_BATCH_SIZE = 1000
|
| _TODAY = date.today().strftime('%Y-%m-%d')
|
| _A_YEAR_AGO = (date.today() - timedelta(days=365)).strftime('%Y-%m-%d')
|
| -
|
| -
|
| -# TODO(katesonia): Switch to use fuction of objects encapsulating CrashClients,
|
| -# after the refactoring is done.
|
| -# TODO(crbug.com/662540): Add unittests.
|
| -def GetAnalysisClassForClient(client_id): # pragma: no cover.
|
| - if client_id == CrashClient.FRACAS:
|
| - return FracasCrashAnalysis
|
| - elif client_id == CrashClient.CRACAS:
|
| - return CracasCrashAnalysis
|
| - elif client_id == CrashClient.CLUSTERFUZZ:
|
| - # TODO(katesonia): Define ClusterfuzzCrashAnalysis.
|
| - return None
|
| -
|
| - return None
|
| +_CLIENT_TO_ANALYSIS_CLASS = {CrashClient.FRACAS: FracasCrashAnalysis,
|
| + CrashClient.CRACAS: CracasCrashAnalysis}
|
|
|
|
|
| # TODO(crbug.com/662540): Add unittests.
|
| @@ -39,7 +28,10 @@ def GetQueryForClient(client_id, property_values, start_date, end_date,
|
|
|
| start_date = datetime.strptime(start_date, datetime_pattern)
|
| end_date = datetime.strptime(end_date, datetime_pattern)
|
| - cls = GetAnalysisClassForClient(client_id)
|
| + cls = _CLIENT_TO_ANALYSIS_CLASS.get(client_id)
|
| + if not cls:
|
| + return None
|
| +
|
| query = cls.query()
|
| for property_name, value in property_values.iteritems():
|
| query = query.filter(getattr(cls, property_name) == value)
|
| @@ -80,7 +72,43 @@ def IterateCrashes(client_id,
|
| property_values = {}
|
|
|
| query = GetQueryForClient(client_id, property_values, start_date, end_date)
|
| + if not query:
|
| + return
|
| +
|
| for crash in iterator.Iterate(query, app_id, fields=fields,
|
| batch_size=batch_size,
|
| batch_run=batch_run):
|
| yield crash
|
| +
|
| +
|
| +@GeneratorCached(LocalCache(), namespace='Crash-iterator') # pragma: no cover.
|
| +def CachedCrashIterator(client_id, app_id,
|
| + fields=None, property_values=None,
|
| + start_date=_A_YEAR_AGO, end_date=_TODAY,
|
| + batch_size=_DEFAULT_BATCH_SIZE, batch_run=False):
|
| + """Genrates query to query crashes and iterates crashes.
|
| +
|
| + This iterator will check local cache first, if there is cache, iterate cached
|
| + values, else it will visit datastore of appengine app to yield data.
|
| +
|
| + Args:
|
| + client_id (CrashClient): One of CrashClient.FRACAS, CrashClient.CRACAS,
|
| + CrashClient.CLUSTERFUZZ.
|
| + app_id (str): App engine app id.
|
| + fields (list): Field names of CrashAnalysis entity to project.
|
| + property_values (dict): Property values to filter.
|
| + start_date (str): Only iterate testcases after this date including this
|
| + date, format '%Y-%m-%d'.
|
| + end_date (str): Only iterate testcases before this date excluding this date,
|
| + format '%Y-%m-%d'.
|
| + batch_size (int): The number of crashes to query at one time.
|
| + batch_run (bool): If True, iterate batches of crashes, if
|
| + False, iterate each crash.
|
| +
|
| + An example is available in crash_printer/print_crash.py.
|
| + """
|
| + for crash in IterateCrashes(client_id, app_id, fields=fields,
|
| + property_values=property_values,
|
| + start_date=start_date, end_date=end_date,
|
| + batch_size=batch_size, batch_run=batch_run):
|
| + yield crash
|
|
|