LP#1374091: Speed up metarecord version of unAPI mra call
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.record_attr_flat_speedup.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
4
5 CREATE OR REPLACE VIEW metabib.record_attr_flat AS
6     SELECT  v.source AS id,
7             m.attr AS attr,
8             m.value AS value
9       FROM  metabib.record_attr_vector_list v
10             LEFT JOIN metabib.uncontrolled_record_attr_value m ON ( m.id = ANY( v.vlist ) )
11         UNION
12     SELECT  v.source AS id,
13             c.ctype AS attr,
14             c.code AS value
15       FROM  metabib.record_attr_vector_list v
16             LEFT JOIN config.coded_value_map c ON ( c.id = ANY( v.vlist ) );
17
18 CREATE OR REPLACE FUNCTION unapi.mmr_mra (
19     obj_id BIGINT,
20     format TEXT,
21     ename TEXT,
22     includes TEXT[],
23     org TEXT,
24     depth INT DEFAULT NULL,
25     slimit HSTORE DEFAULT NULL,
26     soffset HSTORE DEFAULT NULL,
27     include_xmlns BOOL DEFAULT TRUE,
28     pref_lib INT DEFAULT NULL
29 ) RETURNS XML AS $F$
30     SELECT  XMLELEMENT(
31         name attributes,
32         XMLATTRIBUTES(
33             CASE WHEN $9 THEN 'http://open-ils.org/spec/indexing/v1' ELSE NULL END AS xmlns,
34             'tag:open-ils.org:U2@mmr/' || $1 AS metarecord
35         ),
36         (SELECT XMLAGG(foo.y)
37           FROM (
38             WITH sourcelist AS (
39                 WITH aou AS (SELECT COALESCE(id, (evergreen.org_top()).id) AS id
40                     FROM actor.org_unit WHERE shortname = $5 LIMIT 1)
41                 SELECT source
42                 FROM metabib.metarecord_source_map, aou
43                 WHERE metarecord = $1 AND (
44                     EXISTS (
45                         SELECT 1 FROM asset.opac_visible_copies
46                         WHERE record = source AND circ_lib IN (
47                             SELECT id FROM actor.org_unit_descendants(aou.id, $6))
48                         LIMIT 1
49                     )
50                     OR EXISTS (SELECT 1 FROM located_uris(source, aou.id, $10) LIMIT 1)
51                 )
52             )
53             SELECT  cmra.aid,
54                     XMLELEMENT(
55                         name field,
56                         XMLATTRIBUTES(
57                             cmra.attr AS name,
58                             cmra.value AS "coded-value",
59                             cmra.aid AS "cvmid",
60                             rad.composite,
61                             rad.multi,
62                             rad.filter,
63                             rad.sorter
64                         ),
65                         cmra.value
66                     )
67               FROM  (
68                 SELECT  v.source AS id,
69                         c.id AS aid,
70                         c.ctype AS attr,
71                         c.code AS value
72                   FROM  metabib.record_attr_vector_list v
73                         JOIN config.coded_value_map c ON ( c.id = ANY( v.vlist ) )
74                 ) AS cmra
75                     JOIN config.record_attr_definition rad ON (cmra.attr = rad.name)
76                     JOIN sourcelist ON (cmra.id = sourcelist.source)
77                 UNION ALL
78             SELECT  umra.aid,
79                     XMLELEMENT(
80                         name field,
81                         XMLATTRIBUTES(
82                             umra.attr AS name,
83                             rad.composite,
84                             rad.multi,
85                             rad.filter,
86                             rad.sorter
87                         ),
88                         umra.value
89                     )
90               FROM  (
91                 SELECT  v.source AS id,
92                         m.id AS aid,
93                         m.attr AS attr,
94                         m.value AS value
95                   FROM  metabib.record_attr_vector_list v
96                         JOIN metabib.uncontrolled_record_attr_value m ON ( m.id = ANY( v.vlist ) )
97                 ) AS umra
98                     JOIN config.record_attr_definition rad ON (umra.attr = rad.name)
99                     JOIN sourcelist ON (umra.id = sourcelist.source)
100                 ORDER BY 1
101
102             )foo(id,y)
103         )
104     )
105 $F$ LANGUAGE SQL STABLE;
106
107 COMMIT;
108