(dev/core#217) Query::getCachedContacts - Use swappable fetch() instead of SQL JOIN
authorTim Otten <totten@civicrm.org>
Tue, 14 Aug 2018 22:12:57 +0000 (15:12 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 27 Nov 2018 23:16:22 +0000 (15:16 -0800)
commit2ca46d4d5a8cd15929ac0939ca2bb380a3de027e
tree5df36cee9e932ca57191312bf7f48221ec56a9a1
parent852077a4e1cb990b6db6a81a30fc97df3aafe677
(dev/core#217) Query::getCachedContacts - Use swappable fetch() instead of SQL JOIN

The general context of this code is roughly as follows:

* We've already filled up the prevnext cache with a bunch of contact-IDs.
* The user wants to view a page of 50 contacts.
* We want to lookup full information about 50 specific contacts for this page.

It does makes sense to use `CRM_Contact_BAO_Query` for looking up the "full information"
about contacts. However, the function `Query::getCachedContacts()` is hard-coded to
read from the SQL-based prevnext cache.

Before
------

* In `getCachedContacts()`, it grabbed the full SQL for `CRM_Contact_BAO_Query`
  and munged the query to:
    * Add an extra JOIN on `civicrm_prevnext_cache` (with a constraint on `cacheKey`)
    * Respect pagination (LIMIT/OFFSET)
    * Order results based on their position in the prevnext cache

After
-----

* In `CRM_Core_PrevNextCache_Interface`, the `fetch()` function provides one page-worth
  of contact IDs (in order). The `fetch()` function is tested by `E2E_Core_PrevNextTest`.
* In `getCachedContacts()`, it doesn't know anything about `civicrm_prevnext_cache`
  or `cacheKey` or pagination.  Instead, it just accepts CIDs for one page-worth of
  contacts.  It returns contacts in the same order that was given.
CRM/Contact/BAO/Query.php
CRM/Contact/Selector.php
CRM/Core/PrevNextCache/Interface.php
CRM/Core/PrevNextCache/Sql.php
tests/phpunit/E2E/Core/PrevNextTest.php