Add a sort_value field to contain the NFI-adjusted headings, and functions to search...
authorMike Rylander <mrylander@gmail.com>
Thu, 22 Sep 2011 20:19:10 +0000 (16:19 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 6 Oct 2011 15:34:35 +0000 (11:34 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/011.schema.authority.sql

index a9244fb..838de08 100644 (file)
@@ -328,6 +328,53 @@ index to defend against duplicated authority records from the same
 thesaurus.
 $$;
 
+CREATE OR REPLACE FUNCTION authority.find_start_pivot( a TEXT, q TEXT, lim INT DEFAULT 10, offs INT DEFAULT 0 ) RETURNS TABLE (rank NUMERIC, id BIGINT, record BIGINT, atag INT, value TEXT, sort_value TEXT) AS $$
+BEGIN
+    RETURN QUERY
+        SELECT  ts_rank_cd(ash.index_vector,ptsq.term,14)::numeric
+                    + CASE WHEN ash.sort_value LIKE t.term || '%' THEN 2 ELSE 0 END
+                    + CASE WHEN ash.value LIKE t.term || '%' THEN 1 ELSE 0 END,
+                ash.id,
+                ash.record,
+                ash.atag,
+                ash.value,
+                ash.sort_value
+          FROM  authority.simple_heading ash
+                JOIN authority.control_set_authority_field acsaf ON (acsaf.id = ash.atag)
+                JOIN authority.browse_axis_authority_field_map abaafm ON (abaafm.field = acsaf.id),
+                public.naco_normalize(q) t(term),
+                plainto_tsquery(q) ptsq(term)
+          WHERE abaafm.axis = a
+                AND ash.sort_value >= t.term OR ash.value >= t.term
+          ORDER BY ash.sort_value, 1 DESC
+          LIMIT lim
+          OFFSET offs;
+END;
+$$ LANGUAGE PLPGSQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.find_search_pivot( a TEXT, q TEXT, lim INT DEFAULT 10, offs INT DEFAULT 0 ) RETURNS TABLE (rank NUMERIC, id BIGINT, record BIGINT, atag INT, value TEXT, sort_value TEXT) AS $$
+BEGIN
+    RETURN QUERY
+        SELECT  ts_rank_cd(ash.index_vector,ptsq.term,14)::numeric
+                    + CASE WHEN ash.sort_value LIKE t.term || '%' THEN 2 ELSE 0 END
+                    + CASE WHEN ash.value LIKE t.term || '%' THEN 1 ELSE 0 END,
+                ash.id,
+                ash.record,
+                ash.atag,
+                ash.value,
+                ash.sort_value
+          FROM  authority.simple_heading ash
+                JOIN authority.control_set_authority_field acsaf ON (acsaf.id = ash.atag)
+                JOIN authority.browse_axis_authority_field_map abaafm ON (abaafm.field = acsaf.id),
+                public.naco_normalize(q) t(term),
+                plainto_tsquery(q) ptsq(term)
+          WHERE abaafm.axis = a
+                AND ash.index_vector @@ ptsq.term
+          ORDER BY 1 DESC, ash.sort_value
+          LIMIT lim
+          OFFSET offs;
+END;
+$$ LANGUAGE PLPGSQL ROWS 10;
 
 -- Adding indexes using oils_xpath_string() for the main entry tags described in
 -- authority.control_set_authority_field would speed this up, if we ever want to use it, though