Skip to content
Snippets Groups Projects
Commit 5eb9e867 authored by Michael Hamann's avatar Michael Hamann
Browse files

Indexer: Added page and meta value rename functions

With these functions that search index can be updated after page moves
or mass metadata updates without the need to reindex the whole
page/wiki. These functions will be used by the new pagemove plugin.
parent e6c4a822
No related branches found
No related tags found
No related merge requests found
......@@ -338,6 +338,106 @@ class Doku_Indexer {
return true;
}
/**
* Rename a page in the search index without changing the indexed content
*
* @param string $oldpage The old page name
* @param string $newpage The new page name
* @return string|bool If the page was successfully renamed, can be a message in the case of an error
*/
public function renamePage($oldpage, $newpage) {
if (!$this->lock()) return 'locked';
$pages = $this->getPages();
$id = array_search($oldpage, $pages);
if ($id === false) {
$this->unlock();
return 'page is not in index';
}
$new_id = array_search($newpage, $pages);
if ($new_id !== false) {
$this->unlock();
// make sure the page is not in the index anymore
$this->deletePage($newpage);
if (!$this->lock()) return 'locked';
$pages[$new_id] = 'deleted:'.time().rand(0, 9999);
}
$pages[$id] = $newpage;
// update index
if (!$this->saveIndex('page', '', $pages)) {
$this->unlock();
return false;
}
// reset the pid cache
$this->pidCache = array();
$this->unlock();
return true;
}
/**
* Renames a meta value in the index. This doesn't change the meta value in the pages, it assumes that all pages
* will be updated.
*
* @param string $key The metadata key of which a value shall be changed
* @param string $oldvalue The old value that shall be renamed
* @param string $newvalue The new value to which the old value shall be renamed, can exist (then values will be merged)
* @return bool|string If renaming the value has been successful, false or error message on error.
*/
public function renameMetaValue($key, $oldvalue, $newvalue) {
if (!$this->lock()) return 'locked';
// change the relation references index
$metavalues = $this->getIndex($key, '_w');
$oldid = array_search($oldvalue, $metavalues);
if ($oldid !== false) {
$newid = array_search($newvalue, $metavalues);
if ($newid !== false) {
// free memory
unset ($metavalues);
// okay, now we have two entries for the same value. we need to merge them.
$indexline = $this->getIndexKey($key, '_i', $oldid);
if ($indexline != '') {
$newindexline = $this->getIndexKey($key, '_i', $newid);
$pagekeys = $this->getIndex($key, '_p');
$parts = explode(':', $indexline);
foreach ($parts as $part) {
list($id, $count) = explode('*', $part);
$newindexline = $this->updateTuple($newindexline, $id, $count);
$keyline = explode(':', $pagekeys[$id]);
// remove old meta value
$keyline = array_diff($keyline, array($oldid));
// add new meta value when not already present
if (!in_array($newid, $keyline)) {
array_push($keyline, $newid);
}
$pagekeys[$id] = implode(':', $keyline);
}
$this->saveIndex($key, '_p', $pagekeys);
unset($pagekeys);
$this->saveIndexKey($key, '_i', $oldid, '');
$this->saveIndexKey($key, '_i', $newid, $newindexline);
}
} else {
$metavalues[$oldid] = $newvalue;
if (!$this->saveIndex($key, '_w', $metavalues)) {
$this->unlock();
return false;
}
}
}
$this->unlock();
return true;
}
/**
* Remove a page from the index
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment