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