results.webkit.org: Make recent=False more usable
https://bugs.webkit.org/show_bug.cgi?id=202873

Rubber-stamped by Aakash Jain.

* resultsdbpy/resultsdbpy/model/configuration_context.py:
(ConfigurationContext.search_for_configuration): If no configuration is specified,
use a set of configurations defined by recent platform.
* resultsdbpy/resultsdbpy/model/configuration_context_unittest.py:
(ConfigurationContextTest.test_expired_configurations): Test that recent=False works.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251072 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 7c4b09d..930786c 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,16 @@
+2019-10-14  Jonathan Bedard  <jbedard@apple.com>
+
+        results.webkit.org: Make recent=False more usable
+        https://bugs.webkit.org/show_bug.cgi?id=202873
+
+        Rubber-stamped by Aakash Jain.
+
+        * resultsdbpy/resultsdbpy/model/configuration_context.py:
+        (ConfigurationContext.search_for_configuration): If no configuration is specified,
+        use a set of configurations defined by recent platform.
+        * resultsdbpy/resultsdbpy/model/configuration_context_unittest.py:
+        (ConfigurationContextTest.test_expired_configurations): Test that recent=False works.
+
 2019-10-14  Adrian Perez de Castro  <aperez@igalia.com>
 
         Unreviewed, set Adrian Perez de Castro as WebKit Reviewer
diff --git a/Tools/resultsdbpy/resultsdbpy/model/configuration_context.py b/Tools/resultsdbpy/resultsdbpy/model/configuration_context.py
index 55e8790..9e17fa4 100644
--- a/Tools/resultsdbpy/resultsdbpy/model/configuration_context.py
+++ b/Tools/resultsdbpy/resultsdbpy/model/configuration_context.py
@@ -189,7 +189,7 @@
 
         self._register_in_redis(configuration, branch, timestamp)
 
-    def search_for_configuration(self, configuration, branch=None):
+    def search_for_configuration(self, configuration=Configuration(), branch=None):
         if not isinstance(configuration, Configuration):
             raise TypeError(f'Expected type {Configuration}, got {type(configuration)}')
 
@@ -207,7 +207,16 @@
         elif 'model' in kwargs:
             table = self.ByModel
         else:
-            raise TypeError(f'{configuration} is not specific enough to be searched by')
+            # Platforms rarely expire, so we can do a decent job of wildcard matching expired configurations
+            # if we try all platforms in the cache.
+            platforms = set([config.platform for config in self.search_for_recent_configuration(branch=branch)])
+            with self:
+                result = []
+                for platform in platforms:
+                    configuration.platform = platform
+                    result.extend(self.search_for_configuration(configuration, branch))
+                configuration.platform = None
+                return result
 
         with self:
             return [model.to_configuration() for model in self.cassandra.select_from_table(table.__table_name__, **kwargs)]
diff --git a/Tools/resultsdbpy/resultsdbpy/model/configuration_context_unittest.py b/Tools/resultsdbpy/resultsdbpy/model/configuration_context_unittest.py
index 1150eb2..47810ce 100644
--- a/Tools/resultsdbpy/resultsdbpy/model/configuration_context_unittest.py
+++ b/Tools/resultsdbpy/resultsdbpy/model/configuration_context_unittest.py
@@ -160,6 +160,14 @@
         self.assertEqual(12, len(recent_configurations))
 
     @WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
+    def test_expired_configurations(self, redis=StrictRedis, cassandra=CassandraContext):
+        self.init_database(redis=redis, cassandra=cassandra)
+        self.register_configurations()
+
+        recent_configurations = self.database.search_for_configuration()
+        self.assertEqual(24, len(recent_configurations))
+
+    @WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
     def test_recent_configurations_constrained(self, redis=StrictRedis, cassandra=CassandraContext):
         self.init_database(redis=redis, cassandra=cassandra)
         self.register_configurations()