Further fix on has
authorEileen McNaughton <emcnaughton@wikimedia.org>
Thu, 18 Aug 2022 00:22:48 +0000 (12:22 +1200)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Thu, 18 Aug 2022 00:22:48 +0000 (12:22 +1200)
CRM/Utils/Cache/FastArrayDecorator.php

index 00e2c24697d82c0d42102e372bf8d8f6f3917b52..67ebe54c4fee47c2c66c491aa67aafece2d25911 100644 (file)
@@ -119,7 +119,17 @@ class CRM_Utils_Cache_FastArrayDecorator implements CRM_Utils_Cache_Interface {
     if (array_key_exists($key, $this->values)) {
       return TRUE;
     }
-    return $this->delegate->has($key);
+    // Doing a get here populates `$this->values`. If the calling
+    // code does a `has()` followed by a `get` we want only one
+    // look-up so do that lookup on the first request.
+    // (The only real reason to do `has` & then `get` is it is
+    // less ambiguous for false & empty values)
+    // `$this->delegate->has($key)` here then an extra
+    // lookup will be needed if we do `has` followed by `get`.
+    // Reducing `get` calls to the underlying cache has significant
+    // speed improvement (see https://github.com/civicrm/civicrm-core/pull/24156)
+    $this->get($key);
+    return array_key_exists($key, $this->values);
   }
 
 }