From b42bcfe76a8bf94574aebbbe4f9cf31d37b65553 Mon Sep 17 00:00:00 2001
From: "daniel.lindgren" <daniel.lindgren@tullverket.se>
Date: Wed, 11 Mar 2009 17:02:55 +0100
Subject: [PATCH] Search function update

Ignore-this: 4cd6bddacb795ef15f133559c223ac1f

* Adds the possibility to exclude namespace(s) from search, by preceding them with "^".
* Changed handling of search parameters to allow any order of words and namespaces.

darcs-hash:20090311160255-13810-c2e00cc7764d180967b4c6f22e17b1c0dafe36f4.gz
---
 inc/fulltext.php | 23 +++++++++++++++++------
 inc/html.php     |  2 +-
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/inc/fulltext.php b/inc/fulltext.php
index 5399989fa..3badb757c 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -78,6 +78,16 @@ function _ft_pageSearch(&$data){
         }
     }
 
+    // filter unwanted namespaces
+    if(!empty($q['notns'])) {
+        $pattern = implode('|^',$q['notns']);
+        foreach($docs as $key => $val) {
+            if(preg_match('/^'.$pattern.'/',$key)) {
+                unset($docs[$key]);
+            }
+        }
+    }
+
     // remove negative matches
     foreach($not as $n){
         unset($docs[$n]);
@@ -402,17 +412,12 @@ function ft_queryParser($query){
     $q = array();
     $q['query']   = $query;
     $q['ns']      = array();
+    $q['notns']   = array();
     $q['phrases'] = array();
     $q['words']   = array();
     $q['and']     = array();
     $q['not']     = array();
 
-    // strip namespace from query
-    if(preg_match('/([^@]*)@(.*)/',$query,$match))  {
-        $query = $match[1];
-        $q['ns'] = explode('@',preg_replace("/ /",'',$match[2]));
-    }
-
     // handle phrase searches
     while(preg_match('/"(.*?)"/',$query,$match)){
         $q['phrases'][] = $match[1];
@@ -425,6 +430,12 @@ function ft_queryParser($query){
         if($w{0} == '-'){
             $token = idx_tokenizer($w,$stopwords,true);
             if(count($token)) $q['not'] = array_merge($q['not'],$token);
+        } else if ($w{0} == '@') { // Namespace to search?
+            $w = substr($w,1);
+            $q['ns'] = array_merge($q['ns'],(array)$w);
+        } else if ($w{0} == '^') { // Namespace not to search?
+            $w = substr($w,1);
+            $q['notns'] = array_merge($q['notns'],(array)$w);
         }else{
             // asian "words" need to be searched as phrases
             if(@preg_match_all('/(('.IDX_ASIAN.')+)/u',$w,$matches)){
diff --git a/inc/html.php b/inc/html.php
index 114bdad9d..b1e755cd3 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -302,7 +302,7 @@ function html_search(){
   flush();
 
   //check if search is restricted to namespace
-  if(preg_match('/([^@]*)@([^@]*)/',$QUERY,$match)) {
+  if(preg_match('/@([^@]*)/',$QUERY,$match)) {
       $id = cleanID($match[1]);
       if(empty($id)) {
         print '<div class="nothing">'.$lang['nothingfound'].'</div>';
-- 
GitLab