db agnostic field weighting, take 1
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 2 Jul 2006 02:51:58 +0000 (02:51 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 2 Jul 2006 02:51:58 +0000 (02:51 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@4877 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/config.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/sql/Pg/002.schema.config.sql

index 9967f7d..7ec9cc6 100644 (file)
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" />
                        <field name="name" oils_obj:array_position="5" oils_persist:virtual="false" />
                        <field name="xpath" oils_obj:array_position="6" oils_persist:virtual="false" />
+                       <field name="weight" oils_obj:array_position="7" oils_persist:virtual="false" />
                </fields>
                <links>
                </links>
index 9423d73..6bc9763 100644 (file)
@@ -31,7 +31,7 @@ package config::metabib_field;
 use base qw/config/;
 __PACKAGE__->table('config_metabib_field');
 __PACKAGE__->columns(Primary => 'id');
-__PACKAGE__->columns(Essential => qw/field_class name xpath/);
+__PACKAGE__->columns(Essential => qw/field_class name xpath wieght/);
 #-------------------------------------------------------------------------------
 
 package config::identification_type;
index e6d79bc..36c52c1 100644 (file)
@@ -1486,6 +1486,8 @@ sub postfilter_search_multi_class_fts {
        my $join_table_list = '';
        my @rank_list;
 
+       my $field_table = config::metabib_field->table;
+
        my @bonus_lists;
        my @bonus_values;
        my $prev_search_class;
@@ -1511,6 +1513,7 @@ sub postfilter_search_multi_class_fts {
                my $REstring = '^' . join('\s+',map { lc($_) } $fts->words) . '\W*$';
                my $first_word = lc(($fts->words)[0]).'%';
 
+               $_.=" * (SELECT weight FROM $field_table WHERE $search_class.field = id)" for (@fts_ranks);
                my $rank = join(' + ', @fts_ranks);
 
                my %bonus = ();
@@ -1896,7 +1899,6 @@ sub biblio_search_multi_class_fts {
                $ot_filter = ' AND ord.item_type IN ('.join(',',map{'?'}@types).')';
        }
 
-
        # XXX legacy format and item type support
        if ($args{format}) {
                my ($t, $f) = split '-', $args{format};
@@ -1923,6 +1925,7 @@ sub biblio_search_multi_class_fts {
        my $join_table_list = '';
        my @rank_list;
 
+       my $field_table = config::metabib_field->table;
 
        my @bonus_lists;
        my @bonus_values;
@@ -1949,7 +1952,8 @@ sub biblio_search_multi_class_fts {
                my $REstring = '^' . join('\s+',map { lc($_) } $fts->words) . '\W*$';
                my $first_word = lc(($fts->words)[0]).'%';
 
-               my $rank = join(' + ', @fts_ranks);
+               $_.=" * (SELECT weight FROM $field_table WHERE $search_class.field = id)" for (@fts_ranks);
+               my $rank = join('  + ', @fts_ranks);
 
                my %bonus = ();
                $bonus{'keyword'} = [ { "CASE WHEN $search_class.value ILIKE ? THEN 10 ELSE 1 END" => $SQLstring } ];
@@ -1964,7 +1968,7 @@ sub biblio_search_multi_class_fts {
                my $bonus_list = join ' * ', map { keys %$_ } @{ $bonus{$search_class} };
                $bonus_list ||= '1';
 
-               push @bonus_lists, $bonus_list;
+               push @bonus_lists, $bonus_list,;
                push @bonus_values, map { values %$_ } @{ $bonus{$search_class} };
 
                #---------------------
index fad7748..c3c4919 100644 (file)
@@ -103,7 +103,8 @@ CREATE TABLE config.metabib_field (
        id              SERIAL  PRIMARY KEY,
        field_class     TEXT    NOT NULL CHECK (lower(field_class) IN ('title','author','subject','keyword','series')),
        name            TEXT    NOT NULL UNIQUE,
-       xpath           TEXT    NOT NULL
+       xpath           TEXT    NOT NULL,
+       weight          INT     NOT NULL DEFUALT 1,
 );
 COMMENT ON TABLE config.metabib_field IS $$
 /*