129 lines
3.7 KiB
PHP
129 lines
3.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file
|
|
* Contains the SearchApiViewsCache class.
|
|
*/
|
|
|
|
/**
|
|
* Plugin class for caching Search API views.
|
|
*/
|
|
class SearchApiViewsCache extends views_plugin_cache_time {
|
|
|
|
/**
|
|
* Static cache for get_results_key().
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_results_key = NULL;
|
|
|
|
/**
|
|
* Static cache for getSearchApiQuery().
|
|
*
|
|
* @var SearchApiQueryInterface
|
|
*/
|
|
protected $search_api_query = NULL;
|
|
|
|
/**
|
|
* Overrides views_plugin_cache::cache_set().
|
|
*
|
|
* Also stores Search API's internal search results.
|
|
*/
|
|
public function cache_set($type) {
|
|
if ($type != 'results') {
|
|
return parent::cache_set($type);
|
|
}
|
|
|
|
$cid = $this->get_results_key();
|
|
$data = array(
|
|
'result' => $this->view->result,
|
|
'total_rows' => isset($this->view->total_rows) ? $this->view->total_rows : 0,
|
|
'current_page' => $this->view->get_current_page(),
|
|
'search_api results' => $this->view->query->getSearchApiResults(),
|
|
);
|
|
cache_set($cid, $data, $this->table, $this->cache_set_expire($type));
|
|
}
|
|
|
|
/**
|
|
* Overrides views_plugin_cache::cache_get().
|
|
*
|
|
* Additionally stores successfully retrieved results with
|
|
* search_api_current_search().
|
|
*/
|
|
public function cache_get($type) {
|
|
if ($type != 'results') {
|
|
return parent::cache_get($type);
|
|
}
|
|
|
|
// Values to set: $view->result, $view->total_rows, $view->execute_time,
|
|
// $view->current_page.
|
|
if ($cache = cache_get($this->get_results_key(), $this->table)) {
|
|
$cutoff = $this->cache_expire($type);
|
|
if (!$cutoff || $cache->created > $cutoff) {
|
|
$this->view->result = $cache->data['result'];
|
|
$this->view->total_rows = $cache->data['total_rows'];
|
|
$this->view->set_current_page($cache->data['current_page']);
|
|
$this->view->execute_time = 0;
|
|
|
|
// Trick Search API into believing a search happened, to make facetting
|
|
// et al. work.
|
|
$query = $this->getSearchApiQuery();
|
|
search_api_current_search($query->getOption('search id'), $query, $cache->data['search_api results']);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* Overrides views_plugin_cache::get_results_key().
|
|
*
|
|
* Use the Search API query as the main source for the key.
|
|
*/
|
|
public function get_results_key() {
|
|
global $user;
|
|
|
|
if (!isset($this->_results_key)) {
|
|
$query = $this->getSearchApiQuery();
|
|
$query->preExecute();
|
|
$key_data = array(
|
|
'query' => $query,
|
|
'roles' => array_keys($user->roles),
|
|
'super-user' => $user->uid == 1, // special caching for super user.
|
|
'language' => $GLOBALS['language']->language,
|
|
'base_url' => $GLOBALS['base_url'],
|
|
);
|
|
// Not sure what gets passed in exposed_info, so better include it. All
|
|
// other parameters used in the parent method are already reflected in the
|
|
// Search API query object we use.
|
|
if (isset($_GET['exposed_info'])) {
|
|
$key_data['exposed_info'] = $_GET['exposed_info'];
|
|
}
|
|
|
|
$this->_results_key = $this->view->name . ':' . $this->display->id . ':results:' . md5(serialize($key_data));
|
|
}
|
|
|
|
return $this->_results_key;
|
|
}
|
|
|
|
/**
|
|
* Get the Search API query object associated with the current view.
|
|
*
|
|
* @return SearchApiQueryInterface|null
|
|
* The Search API query object associated with the current view; or NULL if
|
|
* there is none.
|
|
*/
|
|
protected function getSearchApiQuery() {
|
|
if (!isset($this->search_api_query)) {
|
|
$this->search_api_query = FALSE;
|
|
if (isset($this->view->query) && $this->view->query instanceof SearchApiViewsQuery) {
|
|
$this->search_api_query = $this->view->query->getSearchApiQuery();
|
|
}
|
|
}
|
|
|
|
return $this->search_api_query ? $this->search_api_query : NULL;
|
|
}
|
|
|
|
}
|