diff options
author | rvelices <rv-github@modusoptimus.com> | 2014-04-04 04:14:38 +0000 |
---|---|---|
committer | rvelices <rv-github@modusoptimus.com> | 2014-04-04 04:14:38 +0000 |
commit | be877ea935d6619f4c3ce63df11d4d7124317eea (patch) | |
tree | 2ed22381a35abe001ac75d2c05bc01137ca0e0ac | |
parent | 74c69a086225e0d422ee8d53b979b6b414421d29 (diff) |
bug 3056: quick search - fixes and better numeric range searches examples:
ratio:0.9..1.1
ratio:0.9..
ratio:>0.9
ratio:<1.1
ratio:>3/2
ratio:16/9
git-svn-id: http://piwigo.org/svn/trunk@28066 68402e56-0260-453c-a942-63ccdbb3a9ee
-rw-r--r-- | include/functions_search.inc.php | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/include/functions_search.inc.php b/include/functions_search.inc.php index 24421d2a4..b59f8a164 100644 --- a/include/functions_search.inc.php +++ b/include/functions_search.inc.php @@ -315,9 +315,11 @@ class QSearchScope class QNumericRangeScope extends QSearchScope { - function __construct($id, $aliases, $allow_empty=false) + private $epsilon; + function __construct($id, $aliases, $allow_empty=false, $epsilon=0) { parent::__construct($id, $aliases, $allow_empty, false); + $this->epsilon = $epsilon; } function parse($token) @@ -326,10 +328,22 @@ class QNumericRangeScope extends QSearchScope if ( ($pos = strpos($str, '..')) !== false) $range = array( substr($str,0,$pos), substr($str, $pos+2)); else - $range = array($str, $str); + { + if ('>' == @$str[0])// ratio:>1 + $range = array( substr($str,1), ''); + elseif ('<' == @$str[0]) // size:<5mp + $range = array('', substr($str,1)); + else + $range = array($str, $str); + } + foreach ($range as $i =>&$val) { - if (preg_match('/^([0-9.]+)([km])?/i', $val, $matches)) + if (preg_match('#^([0-9.]+)/([0-9.]+)$#i', $val, $matches)) + { + $val = floatval($matches[1]/$matches[2]); + } + elseif (preg_match('/^([0-9.]+)([km])?/i', $val, $matches)) { $val = floatval($matches[1]); if (isset($matches[2])) @@ -348,6 +362,13 @@ class QNumericRangeScope extends QSearchScope } else $val = ''; + if (is_numeric($val)) + { + if ($i) + $val += $this->epsilon; + else + $val -= $this->epsilon; + } } if (!$this->allow_empty && $range[0]=='' && $range[1] == '') @@ -583,7 +604,7 @@ class QMultiToken if ('or' == strtolower($token->term)) { if ($i+1 < count($this->tokens)) - $this->token[$i+1]->modifier |= QST_OR; + $this->tokens[$i+1]->modifier |= QST_OR; $token->term = ""; } if ('and' == strtolower($token->term)) @@ -618,6 +639,20 @@ class QMultiToken } } + private function apply_scope(QSearchScope $scope) + { + for ($i=0; $i<count($this->tokens); $i++) + { + if ($this->tokens[$i]->is_single) + { + if (!isset($this->tokens[$i]->scope)) + $this->tokens[$i]->scope = $scope; + } + else + $this->tokens[$i]->aooky_scope($scope); + } + } + private static function priority($modifier) { return $modifier & QST_OR ? 0 :1; @@ -726,7 +761,7 @@ class QResults function qsearch_get_images(QExpression $expr, QResults $qsr) { - $qsr->images_iids = array_fill(0, count($expr->tokens), array()); + $qsr->images_iids = array_fill(0, count($expr->stokens), array()); $inflector = null; $lang_code = substr(get_default_language(),0,2); @@ -829,7 +864,7 @@ function qsearch_get_tags(QExpression $expr, QResults $qsr) $transliterated_tokens = array(); foreach ($tokens as $token) { - if (!isset($token->scope) || 'tag' == $token->scope) + if (!isset($token->scope) || 'tag' == $token->scope->id) { $transliterated_tokens[] = transliterate($token->term); } @@ -1087,7 +1122,7 @@ function get_quick_search_results($q, $super_order_by, $images_where='') $scopes[] = new QSearchScope('file', array('filename')); $scopes[] = new QNumericRangeScope('width', array()); $scopes[] = new QNumericRangeScope('height', array()); - $scopes[] = new QNumericRangeScope('ratio', array()); + $scopes[] = new QNumericRangeScope('ratio', array(), false, 0.001); $scopes[] = new QNumericRangeScope('size', array()); $scopes[] = new QNumericRangeScope('filesize', array()); $scopes[] = new QNumericRangeScope('hits', array('hit', 'visit', 'visits')); |