diff options
Diffstat (limited to 'plugins/KanboardSearchPlugin/Filter')
-rw-r--r-- | plugins/KanboardSearchPlugin/Filter/AdvancedSearchFilter.php | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/plugins/KanboardSearchPlugin/Filter/AdvancedSearchFilter.php b/plugins/KanboardSearchPlugin/Filter/AdvancedSearchFilter.php new file mode 100644 index 00000000..5809d37f --- /dev/null +++ b/plugins/KanboardSearchPlugin/Filter/AdvancedSearchFilter.php @@ -0,0 +1,198 @@ +<?php + +namespace Kanboard\Plugin\KanboardSearchPlugin\Filter; + +use Kanboard\Core\Filter\FilterInterface; +use Kanboard\Filter\BaseFilter; +use Kanboard\Model\CommentModel; +use Kanboard\Model\TaskFileModel; +use Kanboard\Model\SubtaskModel; +use Kanboard\Model\TaskModel; +use Kanboard\Model\ConfigModel; +use PicoDb\Database; + + +class AdvancedSearchFilter extends BaseFilter implements FilterInterface +{ + + /** + * Database object + * + * @access private + * @var Database + */ + private $db; + + /** + * @var ConfigModel + */ + private $config; + + /** + * @var TaskFileModel + */ + private $file; + + /** + * Set database object + * + * @access public + * @param Database $db + * @return AdvancedSearchFilter + */ + public function setDatabase(Database $db) + { + $this->db = $db; + return $this; + } + + /** + * Set configModel object + * + * @access public + * @param ConfigModel $config + * @return AdvancedSearchFilter + */ + public function setConfigModel(ConfigModel $config) + { + $this->config = $config; + return $this; + } + + /** + * Set TaskFileModel object + * + * @access public + * @param TaskFileModel $file + * @return AdvancedSearchFilter + */ + public function setFileModel(TaskFileModel $file) + { + $this->file = $file; + return $this; + } + + /** + * Get search attribute + * + * @access public + * @return string[] + */ + public function getAttributes() + { + return array('title', 'comment', 'description', 'desc'); + } + + /** + * Apply filter + * + * @access public + * @return string + */ + public function apply() + { + $commentTaskIds = $this->getTaskIdsWithGivenComment(); + $titlesTaskIds = $this->getTaskIdsWithGivenTitles(); + $descriptionTaskIds = $this->getTaskIdsWithGivenDescription(); + $subtaskTitlesIds = $this->getTaskIdsWithGivenSubtaskTitles(); + $attachmentIds = $this->getTaskIdsWithGivenAttachmentName(); + + $task_ids = array_merge($commentTaskIds, $titlesTaskIds, $descriptionTaskIds, $subtaskTitlesIds, $attachmentIds); + + 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() + { + if($this->config->get('comment_search') == 1) { + return $this->db + ->table(CommentModel::TABLE) + ->ilike(CommentModel::TABLE . '.comment', '%' . $this->value . '%') + ->findAllByColumn(CommentModel::TABLE . '.task_id'); + } + return array(); + } + + + /** + * Get task ids having this description + * + * @access public + * @return array + */ + protected function getTaskIdsWithGivenDescription() + { + if($this->config->get('description_search') == 1) { + return $this->db + ->table(TaskModel::TABLE) + ->ilike(TaskModel::TABLE . '.description', '%' . $this->value . '%') + ->findAllByColumn(TaskModel::TABLE . '.id'); + } + return array(); + } + + + /** + * Get task ids having this title + * + * @access public + * @return array + */ + private function getTaskIdsWithGivenTitles() + { + if($this->config->get('title_search') == 1) { + return $this->db + ->table(TaskModel::TABLE) + ->ilike(TaskModel::TABLE . '.title', '%' . $this->value . '%') + ->findAllByColumn(TaskModel::TABLE . '.id'); + } + return array(); + } + + + /** + * Get task ids having this Subtask title + * + * @access public + * @return array + */ + private function getTaskIdsWithGivenSubtaskTitles() + { + if($this->config->get('subtask_search') == 1) { + return $this->db + ->table(SubtaskModel::TABLE) + ->ilike(SubtaskModel::TABLE . '.title', '%' . $this->value . '%') + ->findAllByColumn(SubtaskModel::TABLE . '.task_id'); + } + return array(); + } + + + /** + * Get task ids having this Attachment Name + * + * @access public + * @return array + */ + private function getTaskIdsWithGivenAttachmentName() + { + if($this->config->get('attachment_search') == 1) { + return $this->db + ->table(TaskFileModel::TABLE) + ->ilike(TaskFileModel::TABLE . '.name', '%' . $this->value . '%') + ->findAllByColumn(TaskFileModel::TABLE . '.task_id'); + } + return array(); + } +}
\ No newline at end of file |