From: J. David Bavousett <dbavous...@ptfs.com>

This patch will enable C4::Members::SearchMember to handle searching for 
punctuated
names (e.g. the "Jones" in "Smith-Jones" or the "Angelo" in "D'Angelo")

It is possible to add a bunch of LIKE clauses, but that adds to the search time 
in
a rather dramatic way.  REGEXP, by itself, is also a performance killer, but I 
found
a suggestion of using a more-general LIKE ANDed with the specific REGEXP, and 
this
gives excellent performance over other approaches.

Signed-off-by: Guillaume Hatt <guillaume.h...@enc.sorbonne.fr>
---
 C4/Members.pm |   26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/C4/Members.pm b/C4/Members.pm
index b9391a9..2d915ad 100644
--- a/C4/Members.pm
+++ b/C4/Members.pm
@@ -208,22 +208,28 @@ sub SearchMember {
             $query.=" borrowers.branchcode 
=".$dbh->quote(C4::Context->userenv->{'branch'})." AND " unless 
(C4::Context->userenv->{'branch'} eq "insecure");
           }      
         }     
-        $query.="((surname LIKE ? OR surname LIKE ?
-                OR firstname  LIKE ? OR firstname LIKE ?
-                OR othernames LIKE ? OR othernames LIKE ?)
+        $query.="((surname LIKE ? OR (surname LIKE ? AND surname REGEXP ?)
+                OR firstname  LIKE ? OR (firstname LIKE ? AND firstname REGEXP 
?)
+                OR othernames LIKE ? OR (othernames LIKE ? AND othernames 
REGEXP ?))
         " .
         ($category_type?" AND category_type = 
".$dbh->quote($category_type):"");
+        my $regex = '[[:punct:][:space:]]'.$data[0];
         @bind = (
-            "$data[0]%", "% $data[0]%", "$data[0]%", "% $data[0]%",
-            "$data[0]%", "% $data[0]%"
+            "$data[0]%", "%$data[0]%", $regex, 
+            "$data[0]%", "%$data[0]%", $regex, 
+            "$data[0]%", "%$data[0]%", $regex 
         );
         for ( my $i = 1 ; $i < $count ; $i++ ) {
-            $query = $query . " AND (" . " surname LIKE ? OR surname LIKE ?
-                OR firstname  LIKE ? OR firstname LIKE ?
-                OR othernames LIKE ? OR othernames LIKE ?)";
+            $query = $query . " AND (" . " surname LIKE ? OR (surname LIKE ? 
AND surname REGEXP ?)
+                OR firstname  LIKE ? OR (firstname LIKE ? AND firstname REGEXP 
?)
+                OR othernames LIKE ? OR (othernames LIKE ? AND othernames 
REGEXP ?))";
+            $regex = '[[:punct:][:space:]]'.$data[$i];
             push( @bind,
-                "$data[$i]%",   "% $data[$i]%", "$data[$i]%",
-                "% $data[$i]%", "$data[$i]%",   "% $data[$i]%" );
+              "$data[$i]%", "%$data[$i]%", $regex,
+              "$data[$i]%", "%$data[$i]%", $regex,
+              "$data[$i]%", "%$data[$i]%", $regex
+            );
+
 
             # FIXME - .= <<EOT;
         }
-- 
1.5.6.5

_______________________________________________
Koha-patches mailing list
Koha-patches@lists.koha-community.org
http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-patches
website : http://www.koha-community.org/
git : http://git.koha-community.org/
bugs : http://bugs.koha-community.org/

Reply via email to