index_type = 'nosql';
$Mongo = new MongoClient();
// select database
$this->biblio = $Mongo->slims->biblio;
}
}
$this->obj_db = $obj_db;
$this->verbose = $bool_verbose;
}
/**
* Creating full index database of bibliographic records
* @param boolean $bool_empty_first: Emptying current index first
* @return void
*/
public function createFullIndex($bool_empty_first = false) {
if ($bool_empty_first) {
$this->emptyingIndex();
}
$bib_sql = 'SELECT biblio_id FROM biblio ORDER BY biblio_id ASC LIMIT '.$this->max_indexed;
// query
$rec_bib = $this->obj_db->query($bib_sql);
$r = 0;
if ($rec_bib->num_rows > 0) {
// start time counter
$_start = function_exists('microtime')?microtime(true):time();
$this->total_records = $rec_bib->num_rows;
// loop records and create index
while ($rb_id = $rec_bib->fetch_row()) {
$biblio_id = $rb_id[0];
$index = $this->makeIndex($biblio_id);
}
// get end time
$_end = function_exists('microtime')?microtime(true):time();
$this->indexing_time = $_end-$_start;
}
}
/**
* Emptying index table
* @return boolean true on success, false otherwise
*/
public function emptyingIndex() {
@$this->obj_db->query('TRUNCATE TABLE `search_biblio`');
if ($this->obj_db->errno) {
$this->errors[] = $this->obj_db->error;
return false;
}
return true;
}
/**
* Make index for one bibliographic record
* @param int $int_biblio_id: ID of biblio to index
* @return boolean false on Failed, true otherwise
*/
public function makeIndex($int_biblio_id) {
$bib_sql = 'SELECT b.biblio_id, b.title, b.edition, b.publish_year, b.notes, b.series_title, b.classification, b.spec_detail_info,
g.gmd_name AS `gmd`, pb.publisher_name AS `publisher`, pl.place_name AS `publish_place`, b.isbn_issn,
lg.language_name AS `language`, b.call_number, b.opac_hide, b.promoted, b.labels, b.`collation`, b.image,
rct.content_type, rmt.media_type, rcrt.carrier_type,
b.input_date, b.last_update
FROM biblio AS b
LEFT JOIN mst_gmd AS g ON b.gmd_id = g.gmd_id
LEFT JOIN mst_publisher AS pb ON b.publisher_id = pb.publisher_id
LEFT JOIN mst_place AS pl ON b.publish_place_id = pl.place_id
LEFT JOIN mst_language AS lg ON b.language_id = lg.language_id
LEFT JOIN mst_content_type rct ON b.content_type_id=rct.id
LEFT JOIN mst_media_type AS rmt ON b.media_type_id=rmt.id
LEFT JOIN mst_carrier_type AS rcrt ON b.carrier_type_id=rcrt.id
WHERE b.biblio_id='.$int_biblio_id;
// query
$rec_bib = $this->obj_db->query($bib_sql);
if ($rec_bib->num_rows < 1) {
return false;
} else {
$rb_id = $rec_bib->fetch_assoc();
}
if ($this->verbose) { echo 'Indexing: '.$rb_id['title'].'...'; }
$data['biblio_id'] = $int_biblio_id;
/* GMD , Title, Year */
$data['title'] = $this->obj_db->escape_string($rb_id['title']);
$data['edition'] = $this->obj_db->escape_string($rb_id['edition']);
$data['gmd'] = $this->obj_db->escape_string($rb_id['gmd']);
$data['content_type'] = $this->obj_db->escape_string($rb_id['content_type']);
$data['media_type'] = $this->obj_db->escape_string($rb_id['media_type']);
$data['carrier_type'] = $this->obj_db->escape_string($rb_id['carrier_type']);
$data['publisher'] = $this->obj_db->escape_string($rb_id['publisher']);
$data['publish_place'] = $this->obj_db->escape_string($rb_id['publish_place']);
$data['isbn_issn'] = $this->obj_db->escape_string($rb_id['isbn_issn']);
$data['language'] = $this->obj_db->escape_string($rb_id['language']);
$data['publish_year'] = $rb_id['publish_year'];
$data['classification'] = $this->obj_db->escape_string($rb_id['classification']);
$data['spec_detail_info'] = $this->obj_db->escape_string($rb_id['spec_detail_info']);
$data['call_number'] = $this->obj_db->escape_string($rb_id['call_number']);
$data['opac_hide'] = $rb_id['opac_hide'];
$data['promoted'] = $rb_id['promoted'];
if ($rb_id['labels']) {
$data['labels'] = $rb_id['labels'];
} else {
$data['labels'] = 'literal{NULL}';
}
$data['collation'] = $this->obj_db->escape_string($rb_id['collation']);
$data['image'] = $this->obj_db->escape_string($rb_id['image']);
$data['input_date'] = $rb_id['input_date'];
$data['last_update'] = $rb_id['last_update'];
if ($rb_id['notes'] != '') {
$data['notes'] = trim($this->obj_db->escape_string(strip_tags($rb_id['notes'], '
')));
}
if ($rb_id['series_title'] != '') {
$data['series_title'] = $this->obj_db->escape_string($rb_id['series_title']);
}
/* author */
$au_all = '';
$au_sql = 'SELECT ba.biblio_id, ba.level, au.author_name AS `name`, au.authority_type AS `type`
FROM biblio_author AS ba LEFT JOIN mst_author AS au ON ba.author_id = au.author_id
WHERE ba.biblio_id ='. $int_biblio_id;
$au_id = $this->obj_db->query($au_sql);
while($rs_au = $au_id->fetch_assoc()) {
$au_all .= $rs_au['name'] . ' - ';
}
if ($au_all !='') {
$au_all = substr_replace($au_all, '', -3);
$data['author'] = $this->obj_db->escape_string($au_all);
}
/* subject */
$topic_all = '';
$topic_sql = 'SELECT bt.biblio_id, bt.level, tp.topic, tp.topic_type AS `type`
FROM biblio_topic AS bt LEFT JOIN mst_topic AS tp ON bt.topic_id = tp.topic_id
WHERE bt.biblio_id ='. $int_biblio_id;
$topic_id = $this->obj_db->query($topic_sql);
while ($rs_topic = $topic_id->fetch_assoc()) {
$topic_all .= $rs_topic['topic'] . ' - ';
}
if ($topic_all != '') {
$topic_all = substr_replace($topic_all, '', -3);
$data['topic'] = $this->obj_db->escape_string($topic_all);
}
/* items */
$barcode_all = '';
$barcode_sql = 'SELECT i.item_code FROM item AS i WHERE i.biblio_id ='. $int_biblio_id;
$barcode_q = $this->obj_db->query($barcode_sql);
while ($rs_barcode = $barcode_q->fetch_assoc()) {
$barcode_all .= $rs_barcode['item_code'] . ' - ';
}
if ($barcode_all != '') {
$barcode_all = substr_replace($barcode_all, '', -3);
$data['items'] = $barcode_all;
}
/* location */
$loc_all = '';
$loc_sql = 'SELECT i.biblio_id, l.location_name AS `name`
FROM item AS i LEFT JOIN mst_location AS l ON i.location_id = l.location_id
WHERE i.biblio_id ='. $int_biblio_id;
$loc_id = $this->obj_db->query($loc_sql);
$_prev_loc = '';
while ($rs_loc = $loc_id->fetch_assoc()) {
if ($rs_loc['name'] == $_prev_loc) { continue; }
$loc_all .= $rs_loc['name'] . ' - ';
$_prev_loc = $rs_loc['name'];
}
if ($loc_all != '') {
$loc_all = substr_replace($loc_all, '', -3);
$data['location'] = $this->obj_db->escape_string($loc_all);
}
/* collection types */
$colltype_all = '';
$colltype_sql = 'SELECT ct.coll_type_name AS `name`
FROM item AS i LEFT JOIN mst_coll_type AS ct ON i.coll_type_id = ct.coll_type_id
WHERE i.biblio_id ='. $int_biblio_id;
$colltype_q = $this->obj_db->query($colltype_sql);
$_prev_colltype = '';
while ($rs_colltype = $colltype_q->fetch_assoc()) {
if ($rs_colltype['name'] == $_prev_colltype) { continue; }
$colltype_all .= $rs_colltype['name'] . ' - ';
$_prev_colltype = $rs_colltype['name'];
}
if ($colltype_all != '') {
$colltype_all = substr_replace($colltype_all, '', -3);
$data['collection_types'] = $this->obj_db->escape_string($colltype_all);
}
if ($this->index_type == 'nosql') {
$this->biblio->insert($data);
// create index
$this->biblio->ensureIndex(array('title' => 1, 'author' => 1, 'topic' => 1));
if ($this->verbose) { echo " indexed\n"; }
$this->indexed++;
} else {
/* SQL operation object */
$sql_op = new simbio_dbop($this->obj_db);
/* Insert all variable */
if ($sql_op->insert('search_biblio', $data)) {
if ($this->verbose) { echo " indexed\n"; }
$this->indexed++;
} else {
if ($this->verbose) { echo " FAILED! (Error: '.$sql_op->error.')\n"; }
$this->failed[] = $int_biblio_id;
// line below is for debugging purpose only
// echo ''.$sql_op->error.'';
}
}
return true;
}
/**
* Update index
*
* @return void
*/
public function updateFullIndex() {
$bib_sql = 'SELECT b.biblio_id FROM biblio AS b
LEFT JOIN search_biblio AS sb ON b.biblio_id = sb.biblio_id
WHERE sb.biblio_id is NULL ORDER BY b.biblio_id LIMIT '.$this->max_indexed;
// query
$rec_bib = $this->obj_db->query($bib_sql);
$r = 0;
if ($rec_bib->num_rows > 0) {
// start time counter
$_start = function_exists('microtime')?microtime(true):time();
$this->total_records = $rec_bib->num_rows;
while ($rb_id = $rec_bib->fetch_row()) {
$biblio_id = $rb_id[0];
$index = $this->makeIndex($biblio_id);
}
// end time
$_end = function_exists('microtime')?microtime(true):time();
$this->indexing_time = $_end-$_start;
}
}
}