Do not show duplicated results when multiple comments match
This commit is contained in:
parent
702379a550
commit
d5f6317608
|
|
@ -5,6 +5,7 @@ namespace Kanboard\Filter;
|
|||
use Kanboard\Core\Filter\FilterInterface;
|
||||
use Kanboard\Model\CommentModel;
|
||||
use Kanboard\Model\TaskModel;
|
||||
use PicoDb\Database;
|
||||
|
||||
/**
|
||||
* Filter tasks by comment
|
||||
|
|
@ -14,6 +15,14 @@ use Kanboard\Model\TaskModel;
|
|||
*/
|
||||
class TaskCommentFilter extends BaseFilter implements FilterInterface
|
||||
{
|
||||
/**
|
||||
* Database object
|
||||
*
|
||||
* @access private
|
||||
* @var Database
|
||||
*/
|
||||
private $db;
|
||||
|
||||
/**
|
||||
* Get search attribute
|
||||
*
|
||||
|
|
@ -25,6 +34,19 @@ class TaskCommentFilter extends BaseFilter implements FilterInterface
|
|||
return array('comment');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set database object
|
||||
*
|
||||
* @access public
|
||||
* @param Database $db
|
||||
* @return $this
|
||||
*/
|
||||
public function setDatabase(Database $db)
|
||||
{
|
||||
$this->db = $db;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply filter
|
||||
*
|
||||
|
|
@ -33,9 +55,28 @@ class TaskCommentFilter extends BaseFilter implements FilterInterface
|
|||
*/
|
||||
public function apply()
|
||||
{
|
||||
$this->query->ilike(CommentModel::TABLE.'.comment', '%'.$this->value.'%');
|
||||
$this->query->join(CommentModel::TABLE, 'task_id', 'id', TaskModel::TABLE);
|
||||
$task_ids = $this->getTaskIdsWithGivenComment();
|
||||
|
||||
if (empty($task_ids)) {
|
||||
$task_ids = array(-1);
|
||||
}
|
||||
|
||||
$this->query->in(TaskModel::TABLE.'.id', $task_ids);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get task ids having this comment
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
protected function getTaskIdsWithGivenComment()
|
||||
{
|
||||
return $this->db
|
||||
->table(CommentModel::TABLE)
|
||||
->ilike(CommentModel::TABLE.'.comment', '%'.$this->value.'%')
|
||||
->findAllByColumn(CommentModel::TABLE.'.task_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -148,7 +148,9 @@ class FilterProvider implements ServiceProviderInterface
|
|||
)
|
||||
->withFilter(new TaskPriorityFilter())
|
||||
->withFilter(new TaskColumnFilter())
|
||||
->withFilter(new TaskCommentFilter())
|
||||
->withFilter(TaskCommentFilter::getInstance()
|
||||
->setDatabase($c['db'])
|
||||
)
|
||||
->withFilter(TaskCreationDateFilter::getInstance()
|
||||
->setDateParser($c['dateParser'])
|
||||
)
|
||||
|
|
|
|||
|
|
@ -21,8 +21,10 @@ class TaskCommentFilterTest extends Base
|
|||
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1)));
|
||||
$this->assertEquals(1, $commentModel->create(array('task_id' => 1, 'user_id' => 1, 'comment' => 'This is a test')));
|
||||
$this->assertEquals(2, $commentModel->create(array('task_id' => 1, 'user_id' => 1, 'comment' => 'This is another test')));
|
||||
|
||||
$filter = new TaskCommentFilter();
|
||||
$filter->setDatabase($this->container['db']);
|
||||
$filter->withQuery($query);
|
||||
$filter->withValue('test');
|
||||
$filter->apply();
|
||||
|
|
@ -43,6 +45,7 @@ class TaskCommentFilterTest extends Base
|
|||
$this->assertEquals(1, $commentModel->create(array('task_id' => 1, 'user_id' => 1, 'comment' => 'This is a test')));
|
||||
|
||||
$filter = new TaskCommentFilter();
|
||||
$filter->setDatabase($this->container['db']);
|
||||
$filter->withQuery($query);
|
||||
$filter->withValue('foobar');
|
||||
$filter->apply();
|
||||
|
|
|
|||
Loading…
Reference in New Issue