public static function get_reports_count($category_ids, $approved_text, $where_text, $logical_operator, $joins = array(), $custom_category_to_table_mapping = array()) { $incidents_count = -1; //run a filter just in case someone wants to mess with this: $data = array( "was_changed_by_plugin" => false, "category_ids" => $category_ids, "approved_text" => $approved_text, "where_text" => $where_text, "logical_operator" => $logical_operator, "incidents_count" => $incidents_count, "custom_category_to_table_mapping" => $custom_category_to_table_mapping ); Event::run('ushahidi_filter.admin_map_get_reports_count', $data); //check if someone has changed this and see what we get //in case the filter changed the data, make sure it gets passed in if($data["was_changed_by_plugin"]) { return $incidents_count = $data["incidents_count"]; } //check if we're showing all categories, or if no category info was selected then return everything If(count($category_ids) == 0 || $category_ids[0] == '0') { // Retrieve all markers $incidents = ORM::factory('incident') ->select('DISTINCT incident.*') ->with('location'); //->join('media', 'incident.id', 'media.incident_id','LEFT'); //run code to add in extra joins foreach($joins as $join) { if(count($join) < 4) { $incidents = $incidents->join($join[0], $join[1], $join[2]); } else { $incidents = $incidents->join($join[0], $join[1], $join[2], $join[3]); } } //I hate finding the count this way because it forces you to download all //the incidents and not just a number, but if i use count_all() it sometimes gives //erroneous numbers, but doing it this way seems to work. I imagine //it has to do with the way count and distinct work together. $incidents_found = $incidents->where($approved_text.$where_text)->find_all(); $incidents_count = count($incidents_found); } else //we are using category IDs, double the fun { // OR up all the categories we're interested in $where_category = reports::or_up_categories($category_ids, $custom_category_to_table_mapping); //if we're using OR if($logical_operator == "or") { $incidents = ORM::factory('incident') ->select('DISTINCT incident.*, COUNT(DISTINCT '.Kohana::config('database.default.table_prefix').'incident.id) as incidents_found' ) ->with('location') ->join('incident_category', 'incident.id', 'incident_category.incident_id','LEFT') //->join('media', 'incident.id', 'media.incident_id','LEFT') ->join('category', 'incident_category.category_id', 'category.id', 'LEFT') ->join('category as parent_cat', 'category.parent_id', 'parent_cat.id', 'LEFT'); //run code to add in extra joins foreach($joins as $join) { if(count($join) < 4) { $incidents = $incidents->join($join[0], $join[1], $join[2]); } else { $incidents = $incidents->join($join[0], $join[1], $join[2], $join[3]); } } $incidents = $incidents->where($approved_text.' AND ('.$where_category. ')' . $where_text) ->find(); $incidents_count = $incidents->incidents_found; } else //if we're using AND { //based on what's in the custom cat mappings make some fancy selects $custom_cat_selects = reports::create_custom_category_selects($category_ids, $custom_category_to_table_mapping); // Retrieve incidents by category $incidents = ORM::factory('incident') ->select('incident.*, category.category_color as color, category.category_title as category_title, category.id as cat_id, '. 'parent_cat.category_title as parent_title, parent_cat.category_color as parent_color, parent_cat.id as parent_id'. $custom_cat_selects) ->with('location') ->join('incident_category', 'incident.id', 'incident_category.incident_id','LEFT') ->join('category', 'incident_category.category_id', 'category.id') //->join('media', 'incident.id', 'media.incident_id','LEFT') ->join('category as parent_cat', 'category.parent_id', 'parent_cat.id', 'LEFT'); //run code to add in extra joins foreach($joins as $join) { if(count($join) < 4) { $incidents = $incidents->join($join[0], $join[1], $join[2]); } else { $incidents = $incidents->join($join[0], $join[1], $join[2], $join[3]); } } $incidents = $incidents->where($approved_text.' AND ('.$where_category. ')' . $where_text) ->find_all(); $incidents = self::post_process_and($category_ids, $incidents); $incidents_count = count($incidents); } }//end else we are using category IDs return $incidents_count; }//end method