/** * Forces a full reindex of all rows in the database or, optionally, a single table * * @param array $pa_table_names * @param array $pa_options Reindexing options: * showProgress * interactiveProgressDisplay * log * callback * @return null|false */ public function reindex($pa_table_names = null, $pa_options = null) { define('__CollectiveAccess_IS_REINDEXING__', 1); $t_timer = new Timer(); $pb_display_progress = isset($pa_options['showProgress']) ? (bool) $pa_options['showProgress'] : true; $pb_interactive_display = isset($pa_options['interactiveProgressDisplay']) ? (bool) $pa_options['interactiveProgressDisplay'] : false; $ps_callback = isset($pa_options['callback']) ? (string) $pa_options['callback'] : false; if ($pa_table_names) { if (!is_array($pa_table_names)) { $pa_table_names = array($pa_table_names); } $va_table_names = array(); foreach ($pa_table_names as $vs_table) { if ($this->opo_datamodel->tableExists($vs_table)) { $vn_num = $this->opo_datamodel->getTableNum($vs_table); if ($pb_display_progress) { print "\nTRUNCATING {$vs_table}\n\n"; } $this->opo_engine->truncateIndex($vn_num); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $va_table_names[$vn_num] = array('name' => $vs_table, 'num' => $vn_num, 'displayName' => $t_instance->getProperty('NAME_PLURAL')); } } if (!sizeof($va_table_names)) { return false; } } else { // full reindex $this->opo_engine->truncateIndex(); $va_table_names = $this->getIndexedTables(); } $o_db = $this->opo_db; if ($pb_display_progress || $ps_callback) { $va_names = array(); foreach ($va_table_names as $vn_table_num => $va_table_info) { $va_names[] = $va_table_info['displayName']; } if ($pb_display_progress) { print "\nWILL INDEX [" . join(", ", $va_names) . "]\n\n"; } } $vn_tc = 0; foreach ($va_table_names as $vn_table_num => $va_table_info) { $vs_table = $va_table_info['name']; $t_table_timer = new Timer(); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $vs_table_pk = $t_instance->primaryKey(); $vn_table_num = $t_instance->tableNum(); $va_fields_to_index = $this->getFieldsToIndex($vn_table_num); if (!is_array($va_fields_to_index) || sizeof($va_fields_to_index) == 0) { continue; } $qr_all = $o_db->query("SELECT " . $t_instance->primaryKey() . " FROM {$vs_table}"); $vn_num_rows = $qr_all->numRows(); if ($pb_display_progress) { print CLIProgressBar::start($vn_num_rows, _t('Indexing %1', $t_instance->getProperty('NAME_PLURAL'))); } $vn_c = 0; $va_ids = $qr_all->getAllFieldValues($t_instance->primaryKey()); $va_element_ids = null; if (method_exists($t_instance, "getApplicableElementCodes")) { $va_element_ids = array_keys($t_instance->getApplicableElementCodes(null, false, false)); } $vn_table_num = $t_instance->tableNum(); $vs_table_pk = $t_instance->primaryKey(); $va_field_data = array(); $va_intrinsic_list = $this->getFieldsToIndex($vs_table, $vs_table, array('intrinsicOnly' => true)); $va_intrinsic_list[$vs_table_pk] = array(); foreach ($va_ids as $vn_i => $vn_id) { if (!($vn_i % 200)) { // Pre-load attribute values for next 200 items to index; improves index performance $va_id_slice = array_slice($va_ids, $vn_i, 200); if ($va_element_ids) { ca_attributes::prefetchAttributes($o_db, $vn_table_num, $va_id_slice, $va_element_ids); } $qr_field_data = $o_db->query("\n\t\t\t\t\t\tSELECT " . join(", ", array_keys($va_intrinsic_list)) . " \n\t\t\t\t\t\tFROM {$vs_table}\n\t\t\t\t\t\tWHERE {$vs_table_pk} IN (?)\t\n\t\t\t\t\t", array($va_id_slice)); $va_field_data = array(); while ($qr_field_data->nextRow()) { $va_field_data[(int) $qr_field_data->get($vs_table_pk)] = $qr_field_data->getRow(); } } $this->indexRow($vn_table_num, $vn_id, $va_field_data[$vn_id], true, null, array(), array()); if ($pb_display_progress && $pb_interactive_display) { CLIProgressBar::setMessage("Memory: " . caGetMemoryUsage()); print CLIProgressBar::next(); } if ($ps_callback && !($vn_c % 100)) { $ps_callback($vn_c, $vn_num_rows, null, null, (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, $vn_table_num, $t_instance->getProperty('NAME_PLURAL'), $vn_tc + 1); } $vn_c++; } $qr_all->free(); unset($t_instance); if ($pb_display_progress && $pb_interactive_display) { print CLIProgressBar::finish(); } $this->opo_engine->optimizeIndex($vn_table_num); $vn_tc++; } if ($pb_display_progress) { print "\n\n\nDone! [Indexing for " . join(", ", $va_names) . " took " . caFormatInterval((double) $t_timer->getTime(4)) . "]\n"; print "Note that if you're using an external search service like Apache Solr, the data may only now be sent to the actual service because it was buffered until now. So you still might have to wait a while for the script to finish.\n"; } if ($ps_callback) { $ps_callback(1, 1, _t('Elapsed time: %1', caFormatInterval((double) $t_timer->getTime(2))), _t('Index rebuild complete!'), (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, null, null, sizeof($va_table_names)); } }
/** * Set the current progress bar message * * @param string $ps_message The message to set. * @param bool $pb_refresh Force the progress bar to display the new message. Default is true. * * @return bool True if message was set, false if not. */ public function setMessage($ps_message, $pb_refresh = true, $pa_options = null) { $this->ops_message = $ps_message; $this->setCache($ps_message); switch ($vs_mode = $this->getMode()) { case 'CLI': CLIProgressBar::setMessage($ps_message, $pa_options); break; case 'WebUI': // noop break; } if ($pb_refresh) { $this->redraw(); } return true; }