/** * Set index specified prefix terms for all items in this path * @param string Comma-separated list of terms * @param char Xapian term prefix * @return boolean False on error, true otherwise */ function set_terms_by_prefix($terms_string, $prefix) { if (api_get_setting('search_enabled') !== 'true') { return FALSE; } $terms_string = trim($terms_string); $terms = explode(',', $terms_string); array_walk($terms, 'trim_value'); $stored_terms = $this->get_common_index_terms_by_prefix($prefix); //var_dump($stored_terms); //var_dump($terms); // don't do anything if no change, verify only at DB, not the search engine if (count(array_diff($terms, $stored_terms)) == 0 && count(array_diff($stored_terms, $terms)) == 0) { return FALSE; } require_once 'xapian.php'; //TODO try catch every xapian use or make wrappers on api require_once api_get_path(LIBRARY_PATH) . 'search/DokeosIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/xapian/XapianQuery.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; $items_table = Database::get_course_table(TABLE_LP_ITEM); //TODO: make query secure agains XSS : use member attr instead of post var $lp_id = intval($_POST['lp_id']); $sql = "SELECT * FROM {$items_table} WHERE lp_id = {$lp_id}"; $result = Database::query($sql); $di = new DokeosIndexer(); while ($lp_item = Database::fetch_array($result)) { // get search_did $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'SELECT * FROM %s WHERE course_code=\'%s\' AND tool_id=\'%s\' AND ref_id_high_level=%s AND ref_id_second_level=%d LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, $this->cc, TOOL_LEARNPATH, $lp_id, $lp_item['id']); $res = Database::query($sql, __FILE__, __LINE__); if (Database::num_rows($res) > 0) { $se_ref = Database::fetch_array($res); // compare terms $doc = $di->get_document($se_ref['search_did']); $xapian_terms = xapian_get_doc_terms($doc, $prefix); //var_dump($xapian_terms); $xterms = array(); foreach ($xapian_terms as $xapian_term) { $xterms[] = substr($xapian_term['name'], 1); } $dterms = $terms; //var_dump($xterms); //var_dump($dterms); $missing_terms = array_diff($dterms, $xterms); $deprecated_terms = array_diff($xterms, $dterms); // save it to search engine foreach ($missing_terms as $term) { $doc->add_term($prefix . $term, 1); } foreach ($deprecated_terms as $term) { $doc->remove_term($prefix . $term); } $di->getDb()->replace_document((int) $se_ref['search_did'], $doc); $di->getDb()->flush(); } } return true; }