UpdateAttributes() public method

returns amount of updated documents (0 or more) on success, or -1 on failure
public UpdateAttributes ( $index, $attrs, $values, $mva = false )
 /**
  * {@inheritdoc}
  */
 public function removeRecord(\record_adapter $record)
 {
     if (!$this->rt_conn) {
         throw new RuntimeException('Unable to connect to sphinx real-time index');
     }
     $CRCdatabox = $this->CRCdatabox($record->get_databox());
     $indexes = ["metadatas" . $CRCdatabox, "metadatas" . $CRCdatabox . "_stemmed_en", "metadatas" . $CRCdatabox . "_stemmed_fr", "metadatas" . $CRCdatabox . "_stemmed_de", "metadatas" . $CRCdatabox . "_stemmed_nl"];
     $RTindexes = ["metas_realtime" . $CRCdatabox, "metas_realtime_stemmed_fr_" . $CRCdatabox, "metas_realtime_stemmed_en_" . $CRCdatabox, "metas_realtime_stemmed_nl_" . $CRCdatabox, "metas_realtime_stemmed_de_" . $CRCdatabox];
     foreach ($record->get_caption()->get_fields(null, true) as $field) {
         foreach ($field->get_values() as $value) {
             foreach ($indexes as $index) {
                 $this->sphinx->UpdateAttributes($index, ["deleted"], [$value->getId() => [1]]);
             }
             foreach ($RTindexes as $index) {
                 $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $value->getId());
             }
         }
     }
     $indexes = ["documents" . $CRCdatabox, "documents" . $CRCdatabox . "_stemmed_fr", "documents" . $CRCdatabox . "_stemmed_en", "documents" . $CRCdatabox . "_stemmed_de", "documents" . $CRCdatabox . "_stemmed_nl"];
     $RTindexes = ["docs_realtime" . $CRCdatabox, "docs_realtime_stemmed_fr_" . $CRCdatabox, "docs_realtime_stemmed_en_" . $CRCdatabox, "docs_realtime_stemmed_nl_" . $CRCdatabox, "docs_realtime_stemmed_de_" . $CRCdatabox];
     foreach ($indexes as $index) {
         $this->sphinx->UpdateAttributes($index, ["deleted"], [$record->get_record_id() => [1]]);
     }
     foreach ($RTindexes as $index) {
         $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $record->get_record_id());
     }
     return $this;
 }
Exemplo n.º 2
0
 /**
  * Delete a post from the index after it was deleted
  */
 public function index_remove($post_ids, $author_ids, $forum_ids)
 {
     $values = array();
     foreach ($post_ids as $post_id) {
         $values[$post_id] = array(1);
     }
     $this->sphinx->UpdateAttributes($this->indexes, array('deleted'), $values);
 }
Exemplo n.º 3
0
fwrite($file, $client->_reqs[$client->AddQuery("test ")]);
fclose($file);
$client->SetWeights(array());
// anchor
$client->SetGeoAnchor("latitude", "longitude", 10.0, 95.0);
$file = fopen("spec/fixtures/data/anchor.bin", "w");
fwrite($file, $client->_reqs[$client->AddQuery("test ")]);
fclose($file);
$client->ResetFilters();
// rank_mode
$client->SetRankingMode(SPH_RANK_WORDCOUNT);
$file = fopen("spec/fixtures/data/rank_mode.bin", "w");
fwrite($file, $client->_reqs[$client->AddQuery("test ")]);
fclose($file);
$client->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
// index_weights
$client->SetIndexWeights(array("people" => 101));
$file = fopen("spec/fixtures/data/index_weights.bin", "w");
fwrite($file, $client->_reqs[$client->AddQuery("test ")]);
fclose($file);
$client->SetIndexWeights(array());
// index_weights
$client->SetFieldWeights(array("city" => 101));
$file = fopen("spec/fixtures/data/field_weights.bin", "w");
fwrite($file, $client->_reqs[$client->AddQuery("test ")]);
fclose($file);
$client->SetFieldWeights(array());
// update_simple
$file = fopen("spec/fixtures/data/update_simple.bin", "w");
fwrite($file, $client->UpdateAttributes("people", array("birthday"), array(1 => array(191163600))));
fclose($file);
Exemplo n.º 4
0
 public function update($index, array $attrs, array $values, $mfa = false)
 {
     return $this->sphinxClient->UpdateAttributes($index, $attrs, $values, $mfa);
 }
Exemplo n.º 5
0
<?php

require "spec/fixtures/sphinxapi.php";
$cl = new SphinxClient();
$cl->UpdateAttributes('index', array('group', 'category'), array(123 => array(array(456, 789), array(1, 2, 3))), true);
Exemplo n.º 6
0
<?php

require "spec/fixtures/sphinxapi.php";
$cl = new SphinxClient();
$cl->UpdateAttributes('index', array('group'), array(123 => array(456)));
Exemplo n.º 7
0
 /**
  * Returns an array of item status info (availability, location, status, etc).
  *
  * @param string $bnum Bib number
  * @return array Detailed item availability
  */
 public function get_item_status($bnum, $force_refresh = FALSE, $cache_only = FALSE)
 {
     if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) {
         eval('$hook = new ' . __CLASS__ . '_hook;');
         return $hook->{__FUNCTION__}($bnum, $force_refresh);
     }
     $result = array();
     $current_json = $this->redis->get('availcache:' . $bnum);
     if ($cache_only) {
         // use the cache table, regardless of timestamp
         if ($current_json) {
             $cached = TRUE;
         }
     } else {
         if (!$force_refresh && $this->locum_config['avail_cache']['cache']) {
             // check the cache table
             $cutoff_timestamp = time() - 60 * $this->locum_config['avail_cache']['cache_cutoff'];
             if ($this->redis->zscore('availcache:timestamps', $bnum) > $cutoff_timestamp) {
                 $cached = TRUE;
             }
         }
     }
     if ($cached) {
         $result = json_decode($current_json, TRUE);
         // return as array
     } else {
         // Scrape and store new availability data
         if ($bib = self::get_bib_item($bnum)) {
             $skiporder = $bib['mat_code'] == 's';
             $status = $this->locum_cntl->item_status($bnum, $skiporder);
             $result['avail'] = 0;
             $result['total'] = count($status['items']);
             $result['libuse'] = 0;
             $result['holds'] = $status['holds'];
             $result['on_order'] = $status['on_order'];
             $result['orders'] = count($status['orders']) ? $status['orders'] : array();
             $result['nextdue'] = 0;
             $result['locations'] = array();
             $result['callnums'] = array();
             $result['ages'] = array();
             $result['branches'] = array();
             $loc_codes = array();
             if (count($status['items'])) {
                 foreach ($status['items'] as &$item) {
                     // Tally availability
                     $result['avail'] += $item['avail'];
                     // Tally libuse
                     $result['libuse'] += $item['libuse'];
                     // Parse Locations
                     $result['locations'][$item['loc_code']][$item['age']]['avail'] += $item['avail'];
                     $result['locations'][$item['loc_code']][$item['age']]['total']++;
                     // Parse Ages
                     $result['ages'][$item['age']]['avail'] += $item['avail'];
                     $result['ages'][$item['age']]['total']++;
                     // Parse Branches
                     $result['branches'][$item['branch']]['avail'] += $item['avail'];
                     $result['branches'][$item['branch']]['total']++;
                     // Parse Callnums
                     //            if ($item['callnum'] !== $bib['callnum'] && strstr($bib['callnum'], $item['callnum'])) {
                     //              $item['callnum'] = $bib['callnum'];
                     //            }
                     $result['callnums'][$item['callnum']]['avail'] += $item['avail'];
                     $result['callnums'][$item['callnum']]['total']++;
                     // Determine next item due date
                     if ($result['nextdue'] == 0 || $item['due'] > 0 && $result['nextdue'] > $item['due']) {
                         $result['nextdue'] = $item['due'];
                     }
                     // Parse location code
                     if (!in_array($item['loc_code'], $loc_codes) && trim($item['loc_code'])) {
                         $loc_codes[] = $item['loc_code'];
                     }
                 }
             }
             $result['items'] = $status['items'];
             // Cache the result
             $this->redis->zadd('availcache:timestamps', time(), $bnum);
             $available_json = json_encode($result);
             if ($available_json != $current_json) {
                 // Only update the cache if the scraped value is different than the current value
                 $this->redis->set('availcache:' . $bnum, $available_json);
                 // Update Location Attributes in Sphinx
                 $branches = array();
                 foreach ($result['branches'] as $branch => $details) {
                     if ($details['avail']) {
                         $branches[] = crc32($branch);
                         // UpdateAttributes automatically converts to unsigned
                     }
                 }
                 if (count($branches)) {
                     $branches[] = crc32('any');
                     // UpdateAttributes automatically converts to unsigned
                 }
                 require_once $this->locum_config['sphinx_config']['api_path'] . '/sphinxapi.php';
                 $cl = new SphinxClient();
                 $cl->SetServer($this->locum_config['sphinx_config']['server_addr'], (int) $this->locum_config['sphinx_config']['server_port']);
                 // Specify indexes to update (abstract into config?)
                 $indexes = 'bib_items_keyword ' . 'bib_items_author ' . 'bib_items_title ' . 'bib_items_subject ' . 'bib_items_callnum ' . 'bib_items_tags ' . 'bib_items_reviews';
                 $index_count = 7;
                 // Match count of index names in $indexes string
                 $update_num = $cl->UpdateAttributes($indexes, array('branches'), array($bnum => array($branches)), TRUE);
                 if ($update_num != $index_count) {
                     $log = '[' . date("Y-m-d H:i:s") . '] record num: b' . $bnum . ', updated ' . $update_num . '/' . $index_count . ' indices';
                     $this->redis->set('availcache:mva_update:last_error', $log);
                     $this->redis->incr('availcache:mva_update:error_count');
                 }
             }
         }
     }
     return $result;
 }
Exemplo n.º 8
0
<?php

require "spec/fixtures/sphinxapi.php";
$cl = new SphinxClient();
$cl->UpdateAttributes('test1', array('group_id'), array(2 => array(1)));
Exemplo n.º 9
0
function CsDataUpAttr($ids, $index = '*', $attrs = array('status'), $values = 0, $timeout = 1, $host = 'localhost', $port = 9312)
{
    require C('INTERFACE_PATH') . 'coreseek/api/sphinxapi.php';
    $cl = new SphinxClient();
    $cl->SetServer($host, $port);
    $cl->SetConnectTimeout($timeout);
    foreach ($ids as $id) {
        $cl->UpdateAttributes($index, $attrs, array($id => array($values)));
    }
}
Exemplo n.º 10
0
 /**
  * Does the actual import of bib records.  Called by the harvester.
  * It uses start and end parameters because this function can potentially be called by a
  * child process.
  *
  * @param int $start Bib number to start with
  * @param int $end Bib number to end with
  * @return array Array of information about the bibs imported
  */
 public function import_bibs($start, $end, $force = TRUE)
 {
     if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) {
         eval('$hook = new ' . __CLASS__ . '_hook;');
         return $hook->{__FUNCTION__}($start, $end);
     }
     $db =& MDB2::connect($this->dsn);
     $couch = new couchClient($this->couchserver, $this->couchdatabase);
     $process_report['skipped'] = 0;
     $process_report['imported'] = 0;
     $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'";
     $utfprep = $db->query($utf);
     for ($i = $start; $i <= $end; $i++) {
         $sql = "SELECT * FROM locum_bib_items WHERE bnum = {$i}";
         $init_result = $db->query($sql);
         $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC);
         try {
             $doc = $couch->getDoc((string) $i);
         } catch (Exception $e) {
             if ($e->getCode() == 404) {
                 // document doesn't exist. create a new one
                 $doc = new stdClass();
                 $doc->_id = (string) $i;
             } else {
                 // something probably wrong with the server. dump out
                 $this->putlog("Problem with CouchDB server for record {$i}. " . $e->getCode());
                 exit(1);
             }
         }
         if ($doc->protected != 1) {
             $bib = $this->locum_cntl->scrape_bib($i, $this->locum_config['api_config']['skip_covers']);
             if ($bib == FALSE || $bib == 'skip' || $bib['suppress'] == 1) {
                 if ($init_bib_arr) {
                     $sql_prep =& $db->prepare('UPDATE locum_bib_items SET active = ? WHERE bnum = ?', array('text', 'integer'));
                     $sql_prep->execute(array('0', $i));
                 }
                 if ($doc->active) {
                     $doc->active = 0;
                     $couch->storeDoc($doc);
                     require_once $this->locum_config['sphinx_config']['api_path'] . '/sphinxapi.php';
                     $cl = new SphinxClient();
                     $cl->SetServer($this->locum_config['sphinx_config']['server_addr'], (int) $this->locum_config['sphinx_config']['server_port']);
                     $cl->UpdateAttributes("bib_items_keyword,bib_items_author,bib_items_title,bib_items_subject,bib_items_callnum,bib_items_tags,bib_items_reviews", array("active"), array($i => array(0)));
                     $this->putlog("suppressed {$i}");
                 }
                 $process_report['skipped']++;
             } else {
                 if ($force || $doc->bib_lastupdate != $bib['bib_lastupdate']) {
                     $subj = $bib['subjects'];
                     $valid_vals = array('bib_created', 'bib_lastupdate', 'bib_prevupdate', 'bib_revs', 'lang', 'loc_code', 'mat_code', 'author', 'addl_author', 'title', 'title_medium', 'addl_title', 'edition', 'series', 'callnum', 'pub_info', 'pub_year', 'stdnum', 'upc', 'lccn', 'descr', 'notes', 'bnum', 'cover_img', 'non_romanized_title', 'non_romanized_author', 'genres', 'non_romanized_notes');
                     foreach ($bib as $bkey => $bval) {
                         if (in_array($bkey, $valid_vals)) {
                             if ($bval) {
                                 $doc->{$bkey} = $bval;
                             }
                             if (is_array($bval)) {
                                 if (count($bval) == 1) {
                                     $bval = $bval[0];
                                 } else {
                                     $bval = serialize($bval);
                                 }
                             }
                             $bib_values[$bkey] = $bval;
                         }
                     }
                     // unset items that are in couch but not mysql for now
                     unset($bib_values['non_romanized_title']);
                     unset($bib_values['non_romanized_author']);
                     unset($bib_values['non_romanized_notes']);
                     unset($bib_values['genres']);
                     if ($init_bib_arr) {
                         $bib_values['cover_img'] = $init_bib_arr[0]['cover_img'];
                     }
                     $bib_values['subjects_ser'] = serialize($subj);
                     $types = array('date', 'date', 'date', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'integer', 'text');
                     $sql_prep = $db->prepare('REPLACE INTO locum_bib_items VALUES (:bnum, :author, :addl_author, :title, :addl_title, :title_medium, :edition, :series, :callnum, :pub_info, :pub_year, :stdnum, :upc, :lccn, :descr, :notes, :subjects_ser, :lang, :loc_code, :mat_code, :cover_img, NOW(), :bib_created, :bib_lastupdate, :bib_prevupdate, :bib_revs, \'1\')');
                     $affrows = $sql_prep->execute($bib_values);
                     $doc->subjects = $subj;
                     $doc->active = 1;
                     if ($doc->upc == '000000000000') {
                         unset($doc->upc);
                     }
                     if (!$bib['pub_year']) {
                         unset($doc->pub_year);
                     }
                     $couch->storeDoc($doc);
                     $this->putlog("Importing bib # {$i} - {$bib['title']}");
                     $sql_prep->free();
                     /*
                               if (is_array($subj) && count($subj)) {
                                 foreach ($subj as $subj_heading) {
                                   $insert_data = array($bib['bnum'], $subj_heading);
                                   $types = array('integer', 'text');
                                   $sql_prep = $db->prepare('INSERT INTO locum_bib_items_subject VALUES (?, ?)', $types, MDB2_PREPARE_MANIP);
                                   $affrows = $sql_prep->execute($insert_data);
                                   $sql_prep->free();
                                 }
                               }
                     */
                     $process_report['imported']++;
                 } else {
                     $process_report['skipped']++;
                     $this->putlog("Skipping unchanged bib # {$i} - {$bib['title']}");
                 }
             }
         }
     }
     $db->disconnect();
     return $process_report;
 }
Exemplo n.º 11
0
 /**
  * update attr value
  * 更新属性值
  * @param $fields 需要修改的字段
  * $fields = array('age1','age2');
  * @param $values 要修改的值
  * $values = array(100004 => array(20,26));
  * 意思是把uid为100004的数据的属性age1改成20,age2改成26
  */
 public function updateAttr($fields, $values)
 {
     $index = $this->index;
     return parent::UpdateAttributes($index, $fields, $values);
 }