seeddms-code/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php

167 lines
4.5 KiB
PHP
Raw Normal View History

<?php
/**
* Implementation of search in SQlite FTS index
*
* @category DMS
* @package SeedDMS_Lucene
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010, Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class for searching in a SQlite FTS index.
*
* @category DMS
* @package SeedDMS_Lucene
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2011, Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_SQliteFTS_Search {
/**
* @var object $index SQlite FTS index
* @access protected
*/
protected $index;
/**
* Create a new instance of the search
*
* @param object $index SQlite FTS index
* @return object instance of SeedDMS_SQliteFTS_Search
*/
function __construct($index) { /* {{{ */
$this->index = $index;
$this->version = '@package_version@';
if($this->version[0] == '@')
$this->version = '3.0.0';
} /* }}} */
/**
* Get document from index
*
* @param int $id id of seeddms document
* @return object instance of SeedDMS_SQliteFTS_QueryHit or false
*/
function getDocument($id) { /* {{{ */
$hits = $this->index->findById('D'.$id);
return $hits ? $hits[0] : false;
} /* }}} */
/**
* Get folder from index
*
* @param int $id id of seeddms folder
* @return object instance of SeedDMS_SQliteFTS_QueryHit or false
*/
function getFolder($id) { /* {{{ */
$hits = $this->index->findById('F'.$id);
return $hits ? $hits[0] : false;
} /* }}} */
/**
* Search in index
*
* @param object $index SQlite FTS index
* @return object instance of SeedDMS_Lucene_Search
*/
function search($term, $fields=array(), $limit=array(), $order=array()) { /* {{{ */
$querystr = '';
$term = trim($term);
if($term) {
$querystr = substr($term, -1) != '*' ? $term.'*' : $term;
}
2020-09-14 07:33:01 +00:00
if(!empty($fields['owner'])) {
2020-09-12 11:40:53 +00:00
if(is_string($fields['owner'])) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2020-09-12 11:40:53 +00:00
$querystr .= 'owner:'.$fields['owner'];
} elseif(is_array($fields['owner'])) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2020-09-12 11:40:53 +00:00
$querystr .= '(owner:';
$querystr .= implode(' OR owner:', $fields['owner']);
$querystr .= ')';
}
}
2021-12-04 12:18:05 +00:00
if(!empty($fields['record_type'])) {
if($querystr)
$querystr .= ' AND ';
$querystr .= '(record_type:';
$querystr .= implode(' OR record_type:', $fields['record_type']);
$querystr .= ')';
}
2020-09-14 07:33:01 +00:00
if(!empty($fields['category'])) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2021-12-09 09:11:17 +00:00
$querystr .= '(category:"';
$querystr .= implode('" AND category:"', $fields['category']);
$querystr .= '")';
}
2021-12-04 12:18:05 +00:00
if(!empty($fields['mimetype'])) {
if($querystr)
$querystr .= ' AND ';
$querystr .= '(mimetype:"';
$querystr .= implode('" OR mimetype:"', $fields['mimetype']);
$querystr .= '")';
}
2020-09-14 07:33:01 +00:00
if(!empty($fields['status'])) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2022-03-04 07:18:30 +00:00
$status = array_map(function($v){return (int)$v+10;}, $fields['status']);
2020-09-12 11:40:53 +00:00
$querystr .= '(status:';
$querystr .= implode(' OR status:', $status);
$querystr .= ')';
}
2020-09-14 07:33:01 +00:00
if(!empty($fields['user'])) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2020-09-12 11:40:53 +00:00
$querystr .= '(users:';
$querystr .= implode(' OR users:', $fields['user']);
$querystr .= ')';
}
2020-12-17 17:33:16 +00:00
if(!empty($fields['rootFolder']) && $fields['rootFolder']->getFolderList()) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2020-12-17 17:33:16 +00:00
$querystr .= '(path:';
2020-12-21 07:14:54 +00:00
$querystr .= str_replace(':', 'x', $fields['rootFolder']->getFolderList().$fields['rootFolder']->getID().':');
$querystr .= '*)';
2020-12-17 17:33:16 +00:00
}
if(!empty($fields['startFolder']) && $fields['startFolder']->getFolderList()) {
if($querystr)
2021-05-05 11:44:02 +00:00
$querystr .= ' AND ';
2020-12-17 17:33:16 +00:00
$querystr .= '(path:';
2020-12-21 07:14:54 +00:00
$querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':');
$querystr .= '*)';
2020-12-17 17:33:16 +00:00
}
$filterstr = '';
if(!empty($fields['created_start'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created>='.$fields['created_start'].')';
}
if(!empty($fields['created_end'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created<'.$fields['created_end'].')';
}
try {
$result = $this->index->find($querystr, $filterstr, $limit, $order);
$recs = array();
foreach($result["hits"] as $hit) {
$recs[] = array('id'=>$hit->id, 'document_id'=>$hit->documentid);
}
2021-12-04 12:18:05 +00:00
return array('count'=>$result['count'], 'hits'=>$recs, 'facets'=>$result['facets']);
} catch (Exception $e) {
return false;
}
} /* }}} */
}
?>