public function executeSenatorisioccupanodi() { $options = array('limit' => 10, 'sort_by_relevance' => true); //$options = array('sort_by_relevance' => true); // estrazione cariche, tipo firma, tipo atto $c = new Criteria(); $c->addJoin(OppCaricaPeer::ID, OppCaricaHasAttoPeer::CARICA_ID); $c->addJoin(OppCaricaHasAttoPeer::ATTO_ID, OppAttoPeer::ID); $c->addJoin(TaggingPeer::TAGGABLE_ID, OppAttoPeer::ID); $c->add(OppCaricaPeer::TIPO_CARICA_ID, array(4, 5), Criteria::IN); $c->add(OppCaricaPeer::DATA_FINE, NULL); $c->add(TaggingPeer::TAG_ID, $this->tag->getId()); $c->add(TaggingPeer::TAGGABLE_MODEL, 'OppAtto'); $c->clearSelectColumns(); $c->addSelectColumn(OppCaricaPeer::ID); $c->addSelectColumn(OppCaricaHasAttoPeer::TIPO); $c->addSelectColumn(OppAttoPeer::TIPO_ATTO_ID); // costruzione array associativo dei politici $politici = array(); $rs = OppCaricaPeer::doSelectRS($c); while ($rs->next()) { $carica_id = $rs->getInt(1); $tipo = $rs->getString(2); $tipo_atto_id = $rs->getInt(3); if (!array_key_exists($carica_id, $politici)) { $politici[$carica_id] = 0; } $politici[$carica_id] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * OppAttoPeer::get_fattore_tipo_atto($tipo_atto_id); } // ordinamento per rilevanza, prima dello slice arsort($politici); // slice dell'array, se specificata l'opzione limit $this->n_remaining_politici = 0; if (isset($options['limit']) && count($politici) > $options['limit']) { $this->n_remaining_politici = count($politici) - $options['limit']; $politici = array_slice($politici, 0, $options['limit'], true); } // ordinamento per triple_value, in caso sort_by_relevance non sia specificato if (!isset($options['sort_by_relevance']) || true !== $options['sort_by_relevance']) { krsort($politici); } $this->politici = $politici; }
/** * torna un array associativo di politici che si occupano di certi argomenti, * ordinati in base al punteggio, con eventuale limit * * @param array $argomenti_ids * @param string $ramo (C o S) * @param integer $gruppo_id filtro opzionale per gruppo * @param boolean fetch_interventi (se fetchare o meno gli interventi) * @return array di hash, con chiave carica_id * - politico_id, * - nome, cognome, acronimo, * - punteggio * @author Guglielmo Celata */ public static function getClassificaPoliticiSiOccupanoDiArgomenti($argomenti_ids, $ramo, $data, $limit = null, $gruppo_ids = null, $fetch_interventi = true) { // definizione array tipi di cariche if ($ramo == 'C') { $tipi_cariche = array(1); } else { if ($ramo == 'S') { $tipi_cariche = array(4, 5); } else { $tipi_cariche = array(1, 4, 5); } } if (is_array($gruppo_ids)) { if (count($gruppo_ids) > 0) { $group_constraint = sprintf(" and g.id in (%s) ", implode(", ", $gruppo_ids)); } else { $group_constraint = ''; } } else { if (is_null($gruppo_ids)) { $group_constraint = ''; } else { $group_constraint = " and g.id = {$gruppo_ids} "; } } // Firme // estrazione di tutte le firme relative ad atti non-omnibus taggati con argomento $con = Propel::getConnection(self::DATABASE_NAME); $sql = sprintf("select p.nome, p.cognome, p.id as politico_id, g.acronimo, c.id as carica_id, c.circoscrizione, ca.tipo, ca.atto_id, ah.indice, ah.priorita from opp_carica c, opp_carica_has_atto ca, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging t, opp_act_history_cache ah, opp_politico p, opp_atto a where p.id=c.politico_id and c.id=ca.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and a.is_omnibus = 0 and t.taggable_id=ca.atto_id and t.taggable_model='OppAtto' and ah.chi_tipo='A' and ah.data='%s' and ah.chi_id=ca.atto_id and a.id=ca.atto_id and (ca.tipo != 'P' or ca.tipo = 'P' and a.pred is null) and c.tipo_carica_id in (%s) and c.data_fine is null and cg.data_fine is null and t.tag_id in (%s) group by ca.tipo, ca.atto_id, ca.carica_id", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids)); $stm = $con->createStatement(); $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); // costruzione array associativo dei politici (sommatoria pesata) $politici = array(); while ($rs->next()) { $row = $rs->getRow(); $carica_id = $row['carica_id']; $circoscrizione = $row['circoscrizione']; $atto_id = $row['atto_id']; $tipo = $row['tipo']; $punti_atto = $row['indice']; $priorita = $row['priorita']; $politico_id = $row['politico_id']; $nome = $row['nome']; $cognome = $row['cognome']; $acronimo = $row['acronimo']; if (!array_key_exists($carica_id, $politici)) { $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0); } $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * $punti_atto / (double) $priorita; } // Firme // estrazione di tutte le firme relative ad atti omnibus taggati con argomento $con = Propel::getConnection(self::DATABASE_NAME); $sql = sprintf("select p.nome, p.cognome, p.id as politico_id, g.acronimo, c.id as carica_id, c.circoscrizione, ca.tipo, ca.atto_id, ah.indice, ah.priorita from opp_carica c, opp_carica_has_atto ca, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging_for_index t, opp_act_history_cache ah, opp_politico p, opp_atto a where p.id=c.politico_id and c.id=ca.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and a.is_omnibus = 1 and t.atto_id=ca.atto_id and (ca.tipo != 'P' or ca.tipo = 'P' and a.pred is null) and ah.chi_tipo='A' and ah.data='%s' and ah.chi_id=ca.atto_id and a.id=ca.atto_id and c.tipo_carica_id in (%s) and c.data_fine is null and cg.data_fine is null and t.tag_id in (%s) group by ca.tipo, ca.atto_id, ca.carica_id", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids)); $stm = $con->createStatement(); $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); // aggiunta all'array della classifica dei politici while ($rs->next()) { $row = $rs->getRow(); $carica_id = $row['carica_id']; $circoscrizione = $row['circoscrizione']; $atto_id = $row['atto_id']; $tipo = $row['tipo']; $punti_atto = $row['indice']; $priorita = $row['priorita']; $politico_id = $row['politico_id']; $nome = $row['nome']; $cognome = $row['cognome']; $acronimo = $row['acronimo']; if (!array_key_exists($carica_id, $politici)) { $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0); } $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma($tipo) * $punti_atto / (double) $priorita; } if ($fetch_interventi) { // Interventi // estrazione degli interventi relativi ad atti non-omnibus taggati con argomenti $sql = sprintf("select count(*) as ni, p.id as politico_id, p.nome, p.cognome, c.circoscrizione, g.acronimo, i.atto_id, i.carica_id, ah.indice, ah.priorita from opp_intervento i, opp_atto a, opp_politico p, opp_carica c, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging t, opp_act_history_cache ah where p.id=c.politico_id and ah.chi_id=i.atto_id and i.atto_id=a.id and c.id=i.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and ah.data='%s' and c.tipo_carica_id in (%s) and c.data_fine is null and a.is_omnibus = 0 and t.taggable_id=a.id and t.taggable_model='OppAtto' and t.tag_id in (%s) group by i.carica_id, i.atto_id;", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids)); $stm = $con->createStatement(); $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); // costruzione array associativo dei politici (sommatoria pesata) while ($rs->next()) { $row = $rs->getRow(); $n_interventi = $row['ni']; $carica_id = $row['carica_id']; $atto_id = $row['atto_id']; $circoscrizione = $row['circoscrizione']; $priorita = $row['priorita']; $punti_atto = $row['indice']; $politico_id = $row['politico_id']; $nome = $row['nome']; $cognome = $row['cognome']; $acronimo = $row['acronimo']; if (!array_key_exists($carica_id, $politici)) { $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0); } $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I') * $n_interventi * $punti_atto / (double) $priorita; } // estrazione di tutte le sedute con interventi relativi ad atti omnibus taggati con argomenti $sql = sprintf("select count(*) as ni, p.id as politico_id, p.nome, p.cognome, c.circoscrizione, g.acronimo, i.atto_id, i.sede_id, i.data, i.carica_id, ah.indice, ah.priorita from opp_intervento i, opp_atto a, opp_politico p, opp_carica c, opp_carica_has_gruppo cg, opp_gruppo g, sf_tagging_for_index t, opp_act_history_cache ah where p.id=c.politico_id and ah.chi_id=i.atto_id and i.atto_id=a.id and c.id=i.carica_id and cg.carica_id=c.id and cg.data_fine is null and cg.gruppo_id=g.id %s and ah.data='%s' and c.tipo_carica_id in (%s) and c.data_fine is null and a.is_omnibus = 1 and t.atto_id=a.id and t.tag_id in (%s) group by i.carica_id, i.atto_id;", $group_constraint, $data, implode(", ", $tipi_cariche), implode(", ", $argomenti_ids)); $stm = $con->createStatement(); $rs = $stm->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); // costruzione array associativo dei politici (sommatoria pesata) while ($rs->next()) { $row = $rs->getRow(); $n_interventi = $row['ni']; $carica_id = $row['carica_id']; $circoscrizione = $row['circoscrizione']; $atto_id = $row['atto_id']; $priorita = $row['priorita']; $punti_atto = $row['indice']; $politico_id = $row['politico_id']; $nome = $row['nome']; $cognome = $row['cognome']; $acronimo = $row['acronimo']; if (!array_key_exists($carica_id, $politici)) { $politici[$carica_id] = array('politico_id' => $politico_id, 'circoscrizione' => $circoscrizione, 'nome' => $nome, 'cognome' => $cognome, 'acronimo' => $acronimo, 'punteggio' => 0); } $politici[$carica_id]['punteggio'] += OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I') * $n_interventi * $punti_atto / (double) $priorita; } } // ordinamento per rilevanza, prima dello slice if (count($politici) > 1) { uasort($politici, array("OppCaricaPeer", "comparisonIndice")); } // slice dell'array, se specificata l'opzione limit if (!is_null($limit) && count($politici) > $limit) { $politici = array_slice($politici, 0, $limit, true); } return $politici; }
$atto = $intervento['atto']; ?> <li> <?php echo $intervento['n_interventi']; ?> Interventi: Atto: <?php echo link_to($atto->getShortTitle(), '@singolo_atto?id=' . $atto->getId()); ?> punti: <?php echo $intervento['n_interventi']; ?> x <?php echo $intervento['punti_atto']; ?> x <?php echo OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I'); ?> = <?php echo $intervento['punti_atto'] * $intervento['n_interventi'] * OppCaricaHasAttoPeer::get_nuovo_fattore_firma('I'); ?> </li> <?php } ?> </ul> <?php }