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