Esempio n. 1
0
 /**
  * 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;
 }