Files
FreshRSS/app/models/EntriesGetter.php
Alexandre Alapetite f55ae730e6 Disable SQL LIMIT optimisation during search
This patch is to make search work again after the new SQL optimisations,
by removing some of the optimisations when searching is used.
Optimisation of search is left for some future work.
The whole base is indeed transfered from MySQL to PHP, which is not
good.
2013-09-03 23:35:33 +02:00

157 lines
3.8 KiB
PHP

<?php
class EntriesGetter {
private $type = array (
'type' => 'all',
'id' => 'all'
);
private $state = 'all';
private $filter = array (
'words' => array (),
'tags' => array (),
);
private $order = 'high_to_low';
private $entries = array ();
private $nb = 1;
private $first = '';
private $next = '';
public function __construct ($type, $state, $filter, $order, $nb, $first = '') {
$this->_type ($type);
$this->_state ($state);
$this->_filter ($filter);
$this->_order ($order);
$this->nb = $nb;
$this->first = $first;
}
public function type () {
return $this->type;
}
public function state () {
return $this->state;
}
public function filter () {
return $this->filter;
}
public function order () {
return $this->order;
}
public function entries () {
return $this->entries;
}
public function _type ($value) {
if (!is_array ($value) ||
!isset ($value['type']) ||
!isset ($value['id'])) {
throw new EntriesGetterException ('Bad type line ' . __LINE__ . ' in file ' . __FILE__);
}
$type = $value['type'];
$id = $value['id'];
if ($type != 'all' && $type != 'favoris' && $type != 'public' && $type != 'c' && $type != 'f') {
throw new EntriesGetterException ('Bad type line ' . __LINE__ . ' in file ' . __FILE__);
}
if (($type == 'all' || $type == 'favoris' || $type == 'public') &&
($type != $id)) {
throw new EntriesGetterException ('Bad type line ' . __LINE__ . ' in file ' . __FILE__);
}
$this->type = $value;
}
public function _state ($value) {
if ($value != 'all' && $value != 'not_read' && $value != 'read') {
throw new EntriesGetterException ('Bad state line ' . __LINE__ . ' in file ' . __FILE__);
}
$this->state = $value;
}
public function _filter ($value) {
$value = trim ($value);
$terms = explode (' ', $value);
foreach ($terms as $word) {
if (!empty ($word) && $word[0] == '#' && isset ($word[1])) {
$tag = substr ($word, 1);
$this->filter['tags'][$tag] = $tag;
} elseif (!empty ($word)) {
$this->filter['words'][$word] = $word;
}
}
}
public function _order ($value) {
if ($value != 'high_to_low' && $value != 'low_to_high') {
throw new EntriesGetterException ('Bad order line ' . __LINE__ . ' in file ' . __FILE__);
}
$this->order = $value;
}
public function execute () {
$entryDAO = new EntryDAO ();
HelperEntry::$nb = $this->nb; //TODO: Update: Now done in SQL
HelperEntry::$first = $this->first; //TODO: Update: Now done in SQL
HelperEntry::$filter = $this->filter;
$sqlLimit = (empty ($this->filter['words']) && empty ($this->filter['tags'])) ? $this->nb : ''; //Disable SQL LIMIT optimisation during search //TODO: Do better!
switch ($this->type['type']) {
case 'all':
list ($this->entries, $this->next) = $entryDAO->listEntries (
$this->state,
$this->order,
$this->first,
$sqlLimit
);
break;
case 'favoris':
list ($this->entries, $this->next) = $entryDAO->listFavorites (
$this->state,
$this->order,
$this->first,
$sqlLimit
);
break;
case 'public':
list ($this->entries, $this->next) = $entryDAO->listPublic (
$this->state,
$this->order,
$this->first,
$sqlLimit
);
break;
case 'c':
list ($this->entries, $this->next) = $entryDAO->listByCategory (
$this->type['id'],
$this->state,
$this->order,
$this->first,
$sqlLimit
);
break;
case 'f':
list ($this->entries, $this->next) = $entryDAO->listByFeed (
$this->type['id'],
$this->state,
$this->order,
$this->first,
$sqlLimit
);
break;
default:
throw new EntriesGetterException ('Bad type line ' . __LINE__ . ' in file ' . __FILE__);
}
}
public function getPaginator () {
$paginator = new RSSPaginator ($this->entries, $this->next);
return $paginator;
}
}