From d0ab54f6197249cebc808395ab9de9da0df153f3 Mon Sep 17 00:00:00 2001
From: "Michael Klier chi@chimeric.de" <andi@splitbrain.org>
Date: Thu, 18 May 2006 18:18:55 +0200
Subject: [PATCH] namespace restricted fulltext-search

    - The fulltext-search can now be restricted to a given
      namespace seperated by an "@"

darcs-hash:20060518161855-484ab-1617b6d2c3593525f4d29a789b0a32ebf414b9ae.gz
---
 inc/fulltext.php | 16 ++++++++++++++++
 inc/html.php     | 15 ++++++++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/inc/fulltext.php b/inc/fulltext.php
index fd974c949..e8b31b201 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -49,6 +49,15 @@ function ft_pageSearch($query,&$poswords){
     $hidden = array_filter(array_keys($docs),'isHiddenPage');
     $not = array_merge($not,$hidden);
 
+    // filter unmatched namespaces
+    if(!empty($q['ns'])) {
+        foreach($docs as $key => $val) {
+            if(!preg_match('/^'.$q['ns'].'/',$key)) {
+                unset($docs[$key]);
+            }
+        }
+    }
+
     // remove negative matches
     foreach($not as $n){
         unset($docs[$n]);
@@ -254,10 +263,17 @@ function ft_queryParser($query){
 
     $q = array();
     $q['query']   = $query;
+    $q['ns']      = '';
     $q['phrases'] = array();
     $q['and']     = array();
     $q['not']     = array();
 
+    // strip namespace from query
+    if(preg_match('/([^@]*)@([^@]*)/',$query,$match))  {
+        $query = $match[1];
+        $q['ns'] = $match[2];
+    }
+
     // handle phrase searches
     while(preg_match('/"(.*?)"/',$query,$match)){
         $q['phrases'][] = $match[1];
diff --git a/inc/html.php b/inc/html.php
index 6d0b7e116..928da9cef 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -365,6 +365,18 @@ function html_search(){
   print p_locale_xhtml('searchpage');
   flush();
 
+  //check if search is restricted to namespace
+  if(preg_match('/([^@]*)@([^@]*)/',$QUERY,$match)) {
+      $id = cleanID($match[1]);
+      if(empty($id)) {
+        print '<div class="nothing">'.$lang['nothingfound'].'</div>';
+        flush();
+        return;
+      }
+  } else {
+      $id = cleanID($QUERY);
+  }
+
   //show progressbar
   print '<div class="centeralign" id="dw__loading">';
   print '<br /></div>';
@@ -375,7 +387,8 @@ function html_search(){
 
   //do quick pagesearch
   $data = array();
-  $data = ft_pageLookup(cleanID($QUERY));
+
+  $data = ft_pageLookup($id);
   if(count($data)){
     sort($data);
     print '<div class="search_quickresult">';
-- 
GitLab