mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-03-06 07:28:29 -05:00
Merge branch 'aledeg-change-filter' into dev
This commit is contained in:
@@ -173,7 +173,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
|
||||
FreshRSS_Context::$state |= FreshRSS_Entry::STATE_READ;
|
||||
}
|
||||
|
||||
FreshRSS_Context::$search = Minz_Request::param('search', '');
|
||||
FreshRSS_Context::$search = new FreshRSS_Search(Minz_Request::param('search', ''));
|
||||
FreshRSS_Context::$order = Minz_Request::param(
|
||||
'order', FreshRSS_Context::$user_conf->sort_order
|
||||
);
|
||||
|
||||
@@ -30,7 +30,7 @@ class FreshRSS_Context {
|
||||
public static $state = 0;
|
||||
public static $order = 'DESC';
|
||||
public static $number = 0;
|
||||
public static $search = '';
|
||||
public static $search;
|
||||
public static $first_id = '';
|
||||
public static $next_id = '';
|
||||
public static $id_max = '';
|
||||
|
||||
@@ -441,54 +441,46 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo {
|
||||
$where .= 'AND e1.id >= ' . $date_min . '000000 ';
|
||||
}
|
||||
$search = '';
|
||||
if ($filter !== '') {
|
||||
require_once(LIB_PATH . '/lib_date.php');
|
||||
$filter = trim($filter);
|
||||
$filter = addcslashes($filter, '\\%_');
|
||||
$terms = array_unique(explode(' ', $filter));
|
||||
//sort($terms); //Put #tags first //TODO: Put the cheapest filters first
|
||||
foreach ($terms as $word) {
|
||||
$word = trim($word);
|
||||
if (stripos($word, 'intitle:') === 0) {
|
||||
$word = substr($word, strlen('intitle:'));
|
||||
$search .= 'AND e1.title LIKE ? ';
|
||||
$values[] = '%' . $word .'%';
|
||||
} elseif (stripos($word, 'inurl:') === 0) {
|
||||
$word = substr($word, strlen('inurl:'));
|
||||
$search .= 'AND CONCAT(e1.link, e1.guid) LIKE ? ';
|
||||
$values[] = '%' . $word .'%';
|
||||
} elseif (stripos($word, 'author:') === 0) {
|
||||
$word = substr($word, strlen('author:'));
|
||||
$search .= 'AND e1.author LIKE ? ';
|
||||
$values[] = '%' . $word .'%';
|
||||
} elseif (stripos($word, 'date:') === 0) {
|
||||
$word = substr($word, strlen('date:'));
|
||||
list($minDate, $maxDate) = parseDateInterval($word);
|
||||
if ($minDate) {
|
||||
$search .= 'AND e1.id >= ' . $minDate . '000000 ';
|
||||
}
|
||||
if ($maxDate) {
|
||||
$search .= 'AND e1.id <= ' . $maxDate . '000000 ';
|
||||
}
|
||||
} elseif (stripos($word, 'pubdate:') === 0) {
|
||||
$word = substr($word, strlen('pubdate:'));
|
||||
list($minDate, $maxDate) = parseDateInterval($word);
|
||||
if ($minDate) {
|
||||
$search .= 'AND e1.date >= ' . $minDate . ' ';
|
||||
}
|
||||
if ($maxDate) {
|
||||
$search .= 'AND e1.date <= ' . $maxDate . ' ';
|
||||
}
|
||||
} else {
|
||||
if ($word[0] === '#' && isset($word[1])) {
|
||||
$search .= 'AND e1.tags LIKE ? ';
|
||||
$values[] = '%' . $word .'%';
|
||||
} else {
|
||||
$search .= 'AND ' . $this->sqlconcat('e1.title', $this->isCompressed() ? 'UNCOMPRESS(content_bin)' : 'content') . ' LIKE ? ';
|
||||
$values[] = '%' . $word .'%';
|
||||
}
|
||||
if ($filter !== null) {
|
||||
if ($filter->getIntitle()) {
|
||||
$search .= 'AND e1.title LIKE ? ';
|
||||
$values[] = "%{$filter->getIntitle()}%";
|
||||
}
|
||||
if ($filter->getInurl()) {
|
||||
$search .= 'AND CONCAT(e1.link, e1.guid) LIKE ? ';
|
||||
$values[] = "%{$filter->getInurl()}%";
|
||||
}
|
||||
if ($filter->getAuthor()) {
|
||||
$search .= 'AND e1.author LIKE ? ';
|
||||
$values[] = "%{$filter->getAuthor()}%";
|
||||
}
|
||||
if ($filter->getMinDate()) {
|
||||
$search .= 'AND e1.id >= ? ';
|
||||
$values[] = "{$filter->getMinDate()}000000";
|
||||
}
|
||||
if ($filter->getMaxDate()) {
|
||||
$search .= 'AND e1.id <= ?';
|
||||
$values[] = "{$filter->getMaxDate()}000000";
|
||||
}
|
||||
if ($filter->getMinPubdate()) {
|
||||
$search .= 'AND e1.date >= ? ';
|
||||
$values[] = $filter->getMinPubdate();
|
||||
}
|
||||
if ($filter->getMaxPubdate()) {
|
||||
$search .= 'AND e1.date <= ? ';
|
||||
$values[] = $filter->getMaxPubdate();
|
||||
}
|
||||
if ($filter->getTags()) {
|
||||
$tags = $filter->getTags();
|
||||
foreach ($tags as $tag) {
|
||||
$search .= 'AND e1.tags LIKE ? ';
|
||||
$values[] = "%{$tag}%";
|
||||
}
|
||||
}
|
||||
if ($filter->getSearch()) {
|
||||
$search .= 'AND ' . $this->sqlconcat('e1.title', $this->isCompressed() ? 'UNCOMPRESS(content_bin)' : 'content') . ' LIKE ? ';
|
||||
$values[] = "%{$filter->getSearch()}%";
|
||||
}
|
||||
}
|
||||
|
||||
return array($values,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
require_once(LIB_PATH . '/lib_date.php');
|
||||
|
||||
/**
|
||||
* Contains a search from the search form.
|
||||
*
|
||||
@@ -9,7 +11,7 @@
|
||||
class FreshRSS_Search {
|
||||
|
||||
// This contains the user input string
|
||||
private $raw_input;
|
||||
private $raw_input = '';
|
||||
// The following properties are extracted from the raw input
|
||||
private $intitle;
|
||||
private $min_date;
|
||||
@@ -34,6 +36,10 @@ class FreshRSS_Search {
|
||||
$input = $this->parseTagsSeach($input);
|
||||
$this->search = $this->cleanSearch($input);
|
||||
}
|
||||
|
||||
public function __toString() {
|
||||
return $this->getRawInput();
|
||||
}
|
||||
|
||||
public function getRawInput() {
|
||||
return $this->raw_input;
|
||||
|
||||
@@ -10,7 +10,7 @@ class SearchTest extends \PHPUnit_Framework_TestCase {
|
||||
*/
|
||||
public function test__construct_whenInputIsEmpty_getsOnlyNullValues($input) {
|
||||
$search = new FreshRSS_Search($input);
|
||||
$this->assertNull($search->getRawInput());
|
||||
$this->assertEquals('', $search->getRawInput());
|
||||
$this->assertNull($search->getIntitle());
|
||||
$this->assertNull($search->getMinDate());
|
||||
$this->assertNull($search->getMaxDate());
|
||||
|
||||
Reference in New Issue
Block a user