QueryParser Driver: Improve format filter
authorThomas Berezansky <tsbere@mvlc.org>
Tue, 18 Sep 2012 15:55:07 +0000 (11:55 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 15 Feb 2013 20:39:49 +0000 (15:39 -0500)
Allow multi-select in particular, and make negate more intuitive.

-format(at-d) would previously generate:
-item_type(a,t) -item_form(d)

Now it generates:
-(item_type(a,t) item_form(d))

Multi-select allows for things like:
format(at-d,g)

To generate:
((item_type(a,t) item_form(d)) || item_type(g))

Negating that results in:
-((item_type(a,t) item_form(d)) || item_type(g))

Signed-off-by: Thomas Berezansky <tsbere@mvlc.org>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index bb12b75..9fff3de 100644 (file)
@@ -67,13 +67,19 @@ sub format_callback {
 
     my $return = '';
     my $negate_flag = ($negate ? '-' : '');
-    if(@$params[0]) {
-        my ($t,$f) = split('-', @$params[0]);
-        $return .= $negate_flag .'item_type(' . join(',',split('', $t)) . ')' if ($t);
-        $return .= ' ' if ($t and $f);
-        $return .= $negate_flag .'item_form(' . join(',',split('', $f)) . ')' if ($f);
-        $return = '(' . $return . ')' if ($t and $f);
+    my @returns;
+    for my $param (@$params) {
+        my ($t,$f) = split('-', $param);
+        my $treturn = '';
+        $treturn .= 'item_type(' . join(',',split('', $t)) . ')' if ($t);
+        $treturn .= ' ' if ($t and $f);
+        $treturn .= 'item_form(' . join(',',split('', $f)) . ')' if ($f);
+        $treturn = '(' . $treturn . ')' if ($t and $f);
+        push(@returns, $treturn) if $treturn;
     }
+    $return = join(' || ', @returns);
+    $return = '(' . $return . ')' if(@returns > 1);
+    $return = $negate_flag.$return if($return);
     return $return;
 }