Support for traditional Boolean operators LP 1152863
authorFredric T Parks <fparks@catalystitservices.com>
Wed, 5 Feb 2014 00:43:11 +0000 (16:43 -0800)
committerFredric T Parks <fparks@catalystitservices.com>
Thu, 13 Feb 2014 00:23:03 +0000 (16:23 -0800)
Added boolean search tab to advanced search page in a way that
utilizes the ability to set operators in query parser

Signed-off-by: Fredrick T Parks <fparks@catalystitservices.com>
modified:   Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
modified:   Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
modified:   Open-ILS/src/templates/opac/advanced.tt2
modified:   Open-ILS/src/templates/opac/css/style.css.tt2
new file:   Open-ILS/src/templates/opac/parts/advanced/boolean.tt2
modified:   Open-ILS/src/templates/opac/parts/config.tt2
modified:   Open-ILS/src/templates/opac/parts/header.tt2
modified:   Open-ILS/src/templates/opac/parts/searchbar.tt2

Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
Open-ILS/src/templates/opac/advanced.tt2
Open-ILS/src/templates/opac/css/style.css.tt2
Open-ILS/src/templates/opac/parts/advanced/boolean.tt2 [new file with mode: 0644]
Open-ILS/src/templates/opac/parts/config.tt2
Open-ILS/src/templates/opac/parts/header.tt2
Open-ILS/src/templates/opac/parts/searchbar.tt2

index 6f29126..1089cae 100644 (file)
@@ -3204,6 +3204,14 @@ sub query_parser_fts_wrapper {
 
     _initialize_parser($parser) unless $parser->initialization_complete;
 
+    #If this is a boolean search set the human readable operators
+    #XXX hard coded to just use english for now. Needs to be able to take forign keywords
+    if($args{"_boolean"} == "true") {
+        $parser->operator("and", " and ");
+        $parser->operator("or", " or ");
+        $parser->operator("disallowed", " not ");
+    }
+
     if (! scalar( keys %{$args{searches}} )) {
         die "No search arguments were passed to ".$self->api_name;
     }
index 00c4c49..2a8dfd1 100644 (file)
@@ -398,6 +398,11 @@ sub load_rresults {
         # the query string, not special args.
         my $args = {'limit' => $limit, 'offset' => $offset};
 
+        #if this is a boolean search add flag so operators can be set later
+        if($cgi->param("_boolean")) {
+            $args->{"_boolean"} = "true";
+        }
+
         if ($tag_circs) {
             $args->{tag_circulated_records} = 1;
             $args->{authtoken} = $self->editor->authtoken;
index 904ee1a..daee126 100644 (file)
                 <a href="[% mkurl('', {pane => 'expert'}) %]"
                     [% IF pane == 'expert' %]class="on" [% END %]
                     id="expert_search">[% l('Expert Search') %]</a>
+                [% IF search.boolean_enabled == "true" %]
+                    <a href="[% mkurl('', {pane => 'boolean'}) %]"
+                        [% IF pane == 'boolean' %]class="on" [% END %]
+                        id="boolean_search">[% l('Boolean Search') %]</a>
+                [% END %]
             </div>
         </div>
     </div>
@@ -38,6 +43,8 @@
             [% INCLUDE "opac/parts/advanced/numeric.tt2" %]
             [% ELSIF pane == 'expert' %]
             [% INCLUDE "opac/parts/advanced/expert.tt2" %]
+            [% ELSIF pane == 'boolean' %]
+            [% INCLUDE "opac/parts/advanced/boolean.tt2" %]
             [% END %]
             </div>
             <div class="common-full-pad"></div>        
index e57741f..2e0eaea 100644 (file)
@@ -321,7 +321,7 @@ for now until a better color is picked - if needed.
     padding-left: 10px !important;
 }
 
-#adv_search.on, #num_search.on, #expert_search.on {
+#adv_search.on, #num_search.on, #expert_search.on, #boolean_search.on {
     color: [% css_colors.accent_darker %];
     background: [% css_colors.background %];
     text-decoration: none;
diff --git a/Open-ILS/src/templates/opac/parts/advanced/boolean.tt2 b/Open-ILS/src/templates/opac/parts/advanced/boolean.tt2
new file mode 100644 (file)
index 0000000..05c8b03
--- /dev/null
@@ -0,0 +1,126 @@
+[% 
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS get_library;
+    query = CGI.param('boolean_query');
+%]
+<form action="[% ctx.opac_root %]/results" method="get">
+<div id='adv_global_search' class='data_grid data_grid_center'>
+    <div id='boolean_search_rows'>
+        <div valign='top' class='adv_global_input_container'>
+            <table id='adv_global_input_table'>
+                <thead>
+                    <tr>
+                        <td>
+                            <div class="header_middle" id="boolean_search_input">
+                                [% l("Free-Form Boolean Search") %]
+                            </div>
+                        </td>
+                    </tr>
+                </thead>
+                <tbody id='adv_global_tbody'>
+                    <tr>
+                        <td>
+                            <input class="hidden" name="_boolean" class="hidden" value=true />
+                            <input type="text" name="query" size="50" value="[% query | html %]" autofocus />
+                        </td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+
+    <div id='adv_search_submit'>
+        <input type="hidden" name="_adv" value="1" />
+        <span>
+            <input id='search-submit-go' type="submit" value="[% l('Search') %]" alt="[% l('Search') %]" class="opac-button"
+                onclick='setTimeout(function(){$("search-submit-spinner").className=""; $("search-submit-go").className="hidden"}, 2000)'/>
+            <img id='search-submit-spinner' src='/opac/images/progressbar_green.gif' class='hidden' alt=''/>
+        </span>
+    </div>
+
+    <div id='adv_search_filters'>
+        <div class="header_middle">[% l('Search Filters') %]</div>
+
+[%
+    in_row = 0;
+    FOR adv_chunk IN search.adv_config;
+        NEXT IF adv_chunk.adv_hide;
+        IF in_row == 0;
+            in_row = 1; %]
+            <div id='adv_filter_block'>
+[%
+        END; %]
+            <div id='adv_filter_block_item'>
+            <div valign='top'[% IF adv_chunk.js_only %]
+                id='adv_chunk_[% adv_chunk.adv_special %]'
+                class='hidden'[% END %]>
+                <strong>[% adv_chunk.adv_label %]</strong><br />
+[%
+        IF adv_chunk.adv_special;
+            SWITCH adv_chunk.adv_special;
+                CASE "lib_selector";
+                    PROCESS "opac/parts/org_selector.tt2";
+                        INCLUDE build_org_selector show_loc_groups=1 id="adv_org_selector" %]
+                            <div class="adv_search_available">
+                                <input type='checkbox' name="modifier"
+                                    value="available"[% CGI.param('modifier').grep('available').size ? ' checked="checked"' : '' %]
+                                    id='opac.result.limit2avail' />
+                                <label for='opac.result.limit2avail'>
+                                    [% l("Limit to Available") %]</label>
+                            </div>
+[%
+                CASE "pub_year"; %]
+                            <select name='pubdate' onchange='
+                                if(this.selectedIndex == 3)
+                                    unHideMe($("adv_global_pub_date_2_span"));
+                                else
+                                    hideMe($("adv_global_pub_date_2_span"));'>
+                                    [%  FOR opt IN [
+                                            {"code" => "is", "label" => l("Is")},
+                                            {"code" => "before", "label" => l("Before")},
+                                            {"code" => "after", "label" => l("After")},
+                                            {"code" => "between", "label" => l("Between")} ] %]
+                                        <option value="[% opt.code %]"[% CGI.param('pubdate') == opt.code ? ' selected="selected"' : '' %]>[% opt.label | html %]</option>
+                                    [%  END %]
+                            </select>    
+                            <br/>
+                            <div id='adv_special_block'>
+                                <input name='date1' type='text' size='4' maxlength='4' value="[% CGI.param('date1') | html %]" />
+                                <span id='adv_global_pub_date_2_span' class='[% CGI.param("pubdate") == "between" ? "" : "hide_me" %]'>
+                                   [% l("and") %] <input name='date2' type='text' size='4' maxlength='4' value="[% CGI.param('date2') | html %]" />
+                                </span>
+                            </div>
+[%
+                CASE "sort_selector";
+                    INCLUDE "opac/parts/filtersort.tt2"
+                        value=CGI.param('sort') class='results_header_sel';
+
+                CASE "copy_location" %]
+                    <select id="adv_copy_location_selector" 
+                        aria-label="[% l('Select Shelving Location') %]"
+                        name="fi:locations" size="3" multiple="multiple">
+                    </select>
+                [% 
+            END;
+        ELSIF adv_chunk.adv_attr;
+            INCLUDE "opac/parts/coded_value_selector.tt2"
+                attr=adv_chunk.adv_attr multiple="multiple" size=adv_chunk.adv_size || search.default_adv_select_height || "4";
+        ELSIF adv_chunk.adv_filter;
+            INCLUDE "opac/parts/filter_group_selector.tt2"
+                filter_group=adv_chunk.adv_filter multiple="multiple" size=adv_chunk.adv_size || search.default_adv_select_height || "4";
+        END; %]
+            </div>
+        </div>
+[%
+        IF adv_chunk.adv_break;
+            in_row = 0; %]
+            </div>
+[%
+        END;
+    END; %]
+
+            </div>
+        </div>
+    </div>
+</div>
+</form>
index bd4f77c..516118e 100644 (file)
@@ -129,6 +129,12 @@ search.adv_config = [
 #search.default_adv_select_height = 4;
 
 ##############################################################################
+# Define if the boolean search tab is enabled on the
+# advanced search page
+
+search.boolean_enabled = "true";
+
+##############################################################################
 # For each search box the default "query type" value can be specified here
 # This is the actual backend value, not the label
 # Also note that including more than the row count entries won't add rows
index 7c9b95f..c622831 100644 (file)
@@ -11,6 +11,7 @@
 
     is_advanced = CGI.param("_adv").size;
     is_special = CGI.param("_special").size;
+    is_boolean = CGI.param("boolean").size;
 
     #variables to use to remove parameters via mkurk
     expert_search_parms = ['tag','subfield','term','_special'];
index a7bdb90..366919b 100644 (file)
         %]</a> ]
     </div>
     [% END %]
+    [% IF (is_boolean) %]
+    <div class="opac-auto-102">
+        [ <a href="[% mkurl(ctx.opac_root _ '/advanced', {$loc_name => loc_value, pane => 'boolean'}) %]">[%
+            l('Refine My Original Search')
+        %]</a> ]
+    </div>
+    [% END %]
     <!--
     <div id="breadcrumb">
         <a href="[% ctx.opac_root %]/home">[% l('Catalog Home') %]</a> &gt;