| OLD | NEW |
| 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 |
| 18 | 20 |
| 19 # TODO(katesonia): Switch to use fuction of objects encapsulating CrashClients, | |
| 20 # after the refactoring is done. | |
| 21 # TODO(crbug.com/662540): Add unittests. | 21 # TODO(crbug.com/662540): Add unittests. |
| 22 def GetAnalysisClassForClient(client_id): # pragma: no cover. | 22 _CLIENT_TO_ANALYSIS_CLASS = {CrashClient.FRACAS: FracasCrashAnalysis, |
| 23 if client_id == CrashClient.FRACAS: | 23 CrashClient.CRACAS: CracasCrashAnalysis} |
| 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 | 24 |
| 33 | 25 |
| 34 # TODO(crbug.com/662540): Add unittests. | 26 # TODO(crbug.com/662540): Add unittests. |
| 35 def GetQueryForClient(client_id, property_values, start_date, end_date, | 27 def GetQueryForClient(client_id, property_values, start_date, end_date, |
| 36 datetime_pattern='%Y-%m-%d'): # pragma: no cover. | 28 datetime_pattern='%Y-%m-%d'): # pragma: no cover. |
| 37 if property_values is None: | 29 if property_values is None: |
| 38 property_values = {} | 30 property_values = {} |
| 39 | 31 |
| 40 start_date = datetime.strptime(start_date, datetime_pattern) | 32 start_date = datetime.strptime(start_date, datetime_pattern) |
| 41 end_date = datetime.strptime(end_date, datetime_pattern) | 33 end_date = datetime.strptime(end_date, datetime_pattern) |
| 42 cls = GetAnalysisClassForClient(client_id) | 34 cls = _CLIENT_TO_ANALYSIS_CLASS.get(client_id) |
| 35 if not cls: |
| 36 return None |
| 37 |
| 43 query = cls.query() | 38 query = cls.query() |
| 44 for property_name, value in property_values.iteritems(): | 39 for property_name, value in property_values.iteritems(): |
| 45 query = query.filter(getattr(cls, property_name) == value) | 40 query = query.filter(getattr(cls, property_name) == value) |
| 46 | 41 |
| 47 return query.filter( | 42 return query.filter( |
| 48 cls.requested_time >= start_date).filter( | 43 cls.requested_time >= start_date).filter( |
| 49 cls.requested_time < end_date) | 44 cls.requested_time < end_date) |
| 50 | 45 |
| 51 | 46 |
| 52 # TODO(crbug.com/662540): Add unittests. | 47 # TODO(crbug.com/662540): Add unittests. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 73 batch_size (int): The number of crashes to query at one time. | 68 batch_size (int): The number of crashes to query at one time. |
| 74 batch_run (bool): If True, iterate batches of crashes, if | 69 batch_run (bool): If True, iterate batches of crashes, if |
| 75 False, iterate each crash. | 70 False, iterate each crash. |
| 76 | 71 |
| 77 An example is available in crash_printer/print_crash.py. | 72 An example is available in crash_printer/print_crash.py. |
| 78 """ | 73 """ |
| 79 if property_values is None: | 74 if property_values is None: |
| 80 property_values = {} | 75 property_values = {} |
| 81 | 76 |
| 82 query = GetQueryForClient(client_id, property_values, start_date, end_date) | 77 query = GetQueryForClient(client_id, property_values, start_date, end_date) |
| 78 if not query: |
| 79 return |
| 80 |
| 83 for crash in iterator.Iterate(query, app_id, fields=fields, | 81 for crash in iterator.Iterate(query, app_id, fields=fields, |
| 84 batch_size=batch_size, | 82 batch_size=batch_size, |
| 85 batch_run=batch_run): | 83 batch_run=batch_run): |
| 86 yield crash | 84 yield crash |
| 85 |
| 86 |
| 87 @GeneratorCached(LocalCache(), namespace='Crash-iterator') # pragma: no cover. |
| 88 def CachedCrashIterator(client_id, app_id, |
| 89 fields=None, property_values=None, |
| 90 start_date=_A_YEAR_AGO, end_date=_TODAY, |
| 91 batch_size=_DEFAULT_BATCH_SIZE, batch_run=False): |
| 92 """Genrates query to query crashes and iterates crashes. |
| 93 |
| 94 This iterator will check local cache first, if there is cache, iterate cached |
| 95 values, else it will visit datastore of appengine app to yield data. |
| 96 |
| 97 Args: |
| 98 client_id (CrashClient): One of CrashClient.FRACAS, CrashClient.CRACAS, |
| 99 CrashClient.CLUSTERFUZZ. |
| 100 app_id (str): App engine app id. |
| 101 fields (list): Field names of CrashAnalysis entity to project. |
| 102 property_values (dict): Property values to filter. |
| 103 start_date (str): Only iterate testcases after this date including this |
| 104 date, format '%Y-%m-%d'. |
| 105 end_date (str): Only iterate testcases before this date excluding this date, |
| 106 format '%Y-%m-%d'. |
| 107 batch_size (int): The number of crashes to query at one time. |
| 108 batch_run (bool): If True, iterate batches of crashes, if |
| 109 False, iterate each crash. |
| 110 |
| 111 An example is available in crash_printer/print_crash.py. |
| 112 """ |
| 113 for crash in IterateCrashes(client_id, app_id, fields=fields, |
| 114 property_values=property_values, |
| 115 start_date=start_date, end_date=end_date, |
| 116 batch_size=batch_size, batch_run=batch_run): |
| 117 yield crash |
| OLD | NEW |