Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/main/inc/lib/search/ChamiloIndexer.class.php

104 lines
3.1 KiB

<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.include.search
*/
require_once __DIR__.'/../../global.inc.php';
/**
* Class wrapper.
*
* @package chamilo.include.search
*/
class ChamiloIndexer extends XapianIndexer
{
/**
* Set terms on search_did given.
*
* @param string $terms_string Comma-separated list of terms from input form
* @param string $prefix Search engine prefix
* @param string $course_code Course code
* @param string $tool_id Tool id from mainapi.lib.php
* @param int $ref_id_high_level Main id of the entity to index (Ex. lp_id)
* @param int $ref_id_second_level Secondary id of the entity to index (Ex. lp_item)
* @param int $search_did Search engine document id from search_engine_ref table
*
* @return bool False on error or nothing to do, true otherwise
*/
public function set_terms(
$terms_string,
$prefix,
$course_code,
$tool_id,
$ref_id_high_level,
$ref_id_second_level,
$search_did
) {
$terms_string = trim($terms_string);
$terms = explode(',', $terms_string);
array_walk($terms, 'trim_value');
$stored_terms = $this->get_terms_on_db($prefix, $course_code, $tool_id, $ref_id_high_level);
// 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 api_get_path(LIBRARY_PATH).'search/xapian/XapianQuery.php';
// compare terms
$doc = $this->get_document($search_did);
$xapian_terms = xapian_get_doc_terms($doc, $prefix);
$xterms = [];
foreach ($xapian_terms as $xapian_term) {
$xterms[] = substr($xapian_term['name'], 1);
}
$dterms = $terms;
$missing_terms = array_diff($dterms, $xterms);
$deprecated_terms = array_diff($xterms, $dterms);
// save it to search engine
foreach ($missing_terms as $term) {
$this->add_term_to_doc($prefix.$term, $doc);
}
foreach ($deprecated_terms as $term) {
$this->remove_term_from_doc($prefix.$term, $doc);
}
// don't do anything if no change
if ((count($missing_terms) > 0) || (count($deprecated_terms) > 0)) {
$this->replace_document($doc, (int) $search_did);
}
return true;
}
/**
* Get the terms stored at database.
*
* @return array Array of terms
*/
public function get_terms_on_db($prefix, $course_code, $tool_id, $ref_id)
{
require_once api_get_path(LIBRARY_PATH).'specific_fields_manager.lib.php';
$terms = get_specific_field_values_list_by_prefix(
$prefix,
$course_code,
$tool_id,
$ref_id
);
$prefix_terms = [];
foreach ($terms as $term) {
$prefix_terms[] = $term['value'];
}
return $prefix_terms;
}
[svn r17550] search: refactor search engine index and search interface and let learnpath follow it Search engine: - Index - use wrapper methods instead on calling xapian.php directly in most of callings - improve dokeos xapian-API - XapianIndexer - new methods: - replace_document() - remove_term_from_doc() - add_term_to_doc() - DokeosIndexer - new methods: - dokeos_preprocess_results() - Preprocess all results depending on the toolid - set_terms() - general interface for getting, comparing and set search engine terms - get_terms_on_db() - Get the terms stored at database (normal, no xapian) - more wrappers for XapianIndexer methods: dokeos_query_query(), dokeos_query_query(), dokeos_get_boolean_query(), dokeos_join_queries() - remove tags search engine feature to replace it with a new generic feature: specific fields - it let define xapian prefix terms dinamically to be included across dokeos index on each tool - move search engine document ID field from lp item table to a general man db table search_engine_ref - Search - use search_engine processor classes to change how process results depending of the dokeos tool - change interface for terms select at search: now use one multiple select foreach specific field instead of jquery thickbox plugin only for tags - search ajax suggestion feature to query terms on db - it need some work Learnpath: - refactor search engine pieces to use new tables search_engine_ref, specific_field and specific_field_values - add scorm and woogie index - remove search widget from lp list and use it from main/search - also, there are part on audios on lp items feature added
16 years ago
}