/**
  * @see IDSequence::increaseId()
  *
  * @param int $inc
  * @return int
  */
 public function increaseId($inc = 1)
 {
     try {
         $this->dbhelper->startTransaction();
         $sql = "select current_value from id_sequence where id_key='%s' for update";
         $current_value = $this->dbhelper->getOne($sql, $this->table_name);
         if (empty($current_value)) {
             $sql = "insert into id_sequence (id_key,current_value)values('%s',%d)";
             $this->dbhelper->execute($sql, $this->table_name, $inc);
             $next_id = $inc;
         } else {
             $sql = "update id_sequence set current_value = current_value + %d where id_key = '%s'";
             $this->dbhelper->execute($sql, $inc, $this->table_name);
             $next_id = $current_value + $inc;
         }
         $this->dbhelper->commit();
     } catch (Exception $e) {
         $this->dbhelper->rollback();
         throw $e;
     }
     return $next_id;
 }
예제 #2
0
 /**
  * Dokonuje bezpo¶redniej aktualizacji zbioru cech.
  *
  * @param array $comment Tablica asocjacyjna (wyraz => liczba wyst±pieñ).
  * @param bool $positive Zbiór cech pozytywnych lub negatywnych?
  */
 protected function updateVector(array $comment, $positive)
 {
     if ($positive) {
         $pn = 'p';
     } else {
         $pn = 'n';
     }
     // uaktualnij i pobierz Nk
     $sql = "UPDATE `datavect_{$this->idc}-4o` SET Nk{$pn} = Nk{$pn}+1";
     $this->dbconn->query($sql);
     $sql = "SELECT Nkp, Nkn FROM `datavect_{$this->idc}-4o`";
     list($Nkp, $Nkn) = DBHelper::getRow($this->dbconn, $sql);
     if ($positive) {
         $logNk = log($Nkp + 1, 2);
     } else {
         $logNk = log($Nkn + 1, 2);
     }
     $NkSum = $Nkp + $Nkn;
     $oneDivLogNK = 1 / $logNk;
     // aktualizacja istniej±cych dfikp i dodanie nowych wyrazów
     $sql = "INSERT INTO `datavect_{$this->idc}-4f` (word,dfikp,dfikn,WCikp,WCikn,CCi,idf) VALUES ";
     $sql .= "(?, ";
     $sql .= $positive ? "1, 0, ?, 0" : "0, 1, 0, ?";
     $sql .= ", 2, 1)";
     $sql .= "ON DUPLICATE KEY UPDATE dfik{$pn} = dfik{$pn} + 1";
     $stmt = $this->dbconn->prepare($sql);
     $stmt->bind_param("sd", $k, $oneDivLogNK);
     foreach ($comment as $k => $v) {
         $stmt->execute();
     }
     $stmt->close();
     // uaktualnij zmienne statystyczne dla wszystkich wyrazów
     $sql = "UPDATE `datavect_{$this->idc}-4f`\n    SET WCik{$pn} = LOG2(dfik{$pn}+1)/{$logNk},\n    CCi = 2 * LOG2((2 * GREATEST(dfikp,dfikn)) / (dfikp + dfikn)),\n    idf = LOG({$NkSum}/(dfikp+dfikn));";
     $this->dbconn->query($sql);
     // pobierz wyliczone informacje statystyczne dla dodawanego komentarza
     $comment_words = array();
     $dbcom = "('" . implode("','", array_keys($comment)) . "')";
     $sql = "SELECT word, CCi, idf FROM `datavect_{$this->idc}-4f` WHERE word IN {$dbcom}";
     $res = $this->dbconn->query($sql);
     while ($row = $res->fetch_row()) {
         list($word, $CCi, $idf) = $row;
         $comment_words[$word]['idf'] = $idf;
         $comment_words[$word]['CCi'] = $CCi;
     }
     $res->free();
     // Na podstawie zebranych danych wylicz wagi i znormalizuj warto¶ci dokum.
     $sum = 0.0;
     foreach ($comment as $k => &$v) {
         $v = log($v + 0.5) * $comment_words[$k]['idf'] * $comment_words[$k]['CCi'];
         if ($v == 0.0) {
             $v = log($v + 0.5) * $comment_words[$k]['idf'] * 0.01;
         }
         $sum += $v;
     }
     if ($sum == 0.0) {
         $sum = 1.0;
     }
     $mul = 1 / $sum;
     foreach ($comment as $k => &$v) {
         $v *= $mul;
     }
     unset($comment_words);
     // dodaj nowy komentarz
     $sql = "INSERT INTO `datavect_{$this->idc}-4s` (pn, last_act) VALUES ('{$pn}',  0)";
     $this->dbconn->query($sql);
     $sql = "INSERT INTO `datavect_{$this->idc}-4p` (subcat, word, weight) VALUES ";
     $subcat = $this->dbconn->insert_id;
     foreach ($comment as $k => $v) {
         $sql .= "({$subcat}, '{$k}', {$v}),";
     }
     $sql[strlen($sql) - 1] = ' ';
     $this->dbconn->query($sql);
     // usuñ najdawniej nieu¿ywan± grupê, je¶li liczba grup
     // jest wiêksza od $this->maxComments
     $sql = "SELECT COUNT(subcat) FROM `datavect_{$this->idc}-4s`";
     $count = DBHelper::getOne($this->dbconn, $sql);
     if ($count <= $this->maxComments) {
         return;
     }
     // wybierz najdawniej nieu¿ywan± grupê
     $sql = "SELECT subcat FROM `datavect_{$this->idc}-4s` ORDER BY last_act DESC LIMIT 1";
     $subcat = DBHelper::getOne($this->dbconn, $sql);
     // usuñ z³±czane grupy, które wchodz± w sk³ad nowej grupy g³ównej
     $sql = "DELETE `datavect_{$this->idc}-4s` WHERE subcat = {$subcat}";
     $this->dbconn->query($sql);
     $sql = "DELETE `datavect_{$this->idc}-4p` WHERE subcat = {$subcat}";
     $this->dbconn->query($sql);
 }
예제 #3
0
 /**
  * Dokonuje bezpo¶redniej aktualizacji zbioru cech.
  *
  * @param array $comment Tablica asocjacyjna (wyraz => waga po log.).
  * @param bool $positive Zbiór cech pozytywnych lub negatywnych?
  */
 protected function updateVector(array $comment, $positive)
 {
     if ($positive) {
         $pn = 'p';
     } else {
         $pn = 'n';
     }
     // uaktualnij i pobierz Nk
     $sql = "UPDATE `datavect_{$this->idc}-2o` SET Nk{$pn} = Nk{$pn}+1";
     $this->dbconn->query($sql);
     $sql = "SELECT Nk{$pn} FROM `datavect_{$this->idc}-2o`";
     $Nk = DBHelper::getOne($this->dbconn, $sql);
     $logNk = log($Nk + 1, 2);
     $oneDivLogNK = 1 / $logNk;
     // aktualizacja istniej±cych i dodanie nowych
     $sql = "INSERT INTO `datavect_{$this->idc}-2` (word,dfikp,dfikn,WCikp,WCikn,CCi,widp,widn) VALUES ";
     $sql .= "(?, ";
     $sql .= $positive ? "1, 0, ?, 0" : "0, 1, 0, ?";
     $sql .= ", LOG2(dfik{$pn}), ";
     $sql .= $positive ? "?, 0" : "0, ?";
     $sql .= ") ";
     $sql .= "ON DUPLICATE KEY UPDATE dfik{$pn} = dfik{$pn} + 1, wid{$pn} = wid{$pn} + ?";
     $stmt = $this->dbconn->prepare($sql);
     $stmt->bind_param("sddd", $k, $oneDivLogNK, $v, $v);
     foreach ($comment as $k => $v) {
         $stmt->execute();
     }
     $stmt->close();
     // Aktualizacja elementów globalnych (dotycz±cych wszystkich wyrazów).
     $sql = "UPDATE `datavect_{$this->idc}-2` SET WCik{$pn} = LOG2(dfik{$pn}+1)/{$logNk}, CCi = LOG2((2 * GREATEST(dfikp,dfikn)) / (dfikp + dfikn))";
     $this->dbconn->query($sql);
 }