| 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 _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 Loading... |
| 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 |
| OLD | NEW |