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

Unified 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698