/** * Add special filtering of tasks by categories. * @param array<mixed> $filter two dimensional array of category IDs, it is represented as logic formula in conjunctive normal form, where first dimension is clause and second is disjunct inside clause. */ public function add_categories_filter($filter) { $select_subquery = ' ( SELECT `cat_tasks`.`id` FROM `tasks` `cat_tasks` '; $where_part = ''; if (count($filter) > 0) { $clause = 0; /*echo '<pre>'; print_r($filter); echo '</pre>';*/ foreach ($filter as $cats) { if (count($cats) > 0) { $where_part .= (!empty($where_part) ? ' AND ' : '') . ' ( '; $or_where_part = ''; $category = FALSE; $task_set = FALSE; foreach ($cats as $cat) { if (substr($cat, 0, 9) == 'category:') { if (!$category) { $select_subquery .= ' LEFT OUTER JOIN `task_category_rel` `categories_' . $clause . '` ON `cat_tasks`.`id` = `categories_' . $clause . '`.`task_id` '; $category = TRUE; } $category = new Category(); $id_list = $category->get_id_list(intval(substr($cat, 9))); $or_where_part .= (!empty($or_where_part) ? ' OR ' : '') . '`categories_' . $clause . '`.`category_id` IN (' . implode(', ', $id_list) . ') '; } else { if (substr($cat, 0, 7) == 'course:') { if (!$task_set) { $select_subquery .= ' LEFT OUTER JOIN `task_task_set_rel` `task_rel_' . $clause . '` ON `cat_tasks`.`id` = `task_rel_' . $clause . '`.`task_id` '; $select_subquery .= ' LEFT OUTER JOIN `task_sets` `task_set_' . $clause . '` ON `task_rel_' . $clause . '`.`task_set_id` = `task_set_' . $clause . '`.`id` '; $task_set = TRUE; } $or_where_part .= (!empty($or_where_part) ? ' OR ' : '') . '`task_set_' . $clause . '`.`course_id` = ' . intval(substr($cat, 7)); } } } $where_part .= $or_where_part . ' ) '; $clause++; } } } $where_part .= (!empty($where_part) ? ' AND ' : '') . ' `tasks`.`id` = `cat_tasks`.`id` '; $select_subquery .= ' WHERE ' . $where_part . ' GROUP BY `cat_tasks`.`id` ) '; $this->db->ar_where[] = ' EXISTS ' . $select_subquery; //echo ' EXISTS ' . $select_subquery; }