From: Mike Rylander Date: Tue, 8 Apr 2014 19:27:51 +0000 (-0400) Subject: LP#1304559: Use new attribute data structures in matching X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=c2d15efad9e3764901a53a410b35875f404c9754;p=working%2FEvergreen.git LP#1304559: Use new attribute data structures in matching Vandelay is using the back-compat metabib.record_attr view, which is slow for some use cases. Here we teach it to look directly at the intarray vector instead. Signed-off-by: Mike Rylander --- diff --git a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql index 5076037d52..c7eb3a53a1 100644 --- a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql +++ b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql @@ -683,24 +683,24 @@ BEGIN END IF; END IF; - IF node.negate THEN - IF caseless THEN - op := 'NOT LIKE'; - ELSE - op := '<>'; - END IF; - ELSE - IF caseless THEN - op := 'LIKE'; - ELSE - op := '='; - END IF; - END IF; - my_alias := 'n' || node.id::TEXT; jrow := my_join || ' (SELECT *, '; IF node.tag IS NOT NULL THEN + IF node.negate THEN + IF caseless THEN + op := 'NOT LIKE'; + ELSE + op := '<>'; + END IF; + ELSE + IF caseless THEN + op := 'LIKE'; + ELSE + op := '='; + END IF; + END IF; + jrow := jrow || node.quality || ' AS quality FROM metabib.full_rec mfr WHERE mfr.tag = ''' || node.tag || ''''; @@ -711,11 +711,25 @@ BEGIN jrow := jrow || ' AND ('; jrow := jrow || vandelay._node_tag_comparisons(caseless, op, tags_rstore, tagkey); jrow := jrow || ')) ' || my_alias || my_using || E'\n'; - ELSE -- svf - jrow := jrow || 'id AS record, ' || node.quality || - ' AS quality FROM metabib.record_attr mra WHERE mra.attrs->''' || - node.svf || ''' ' || op || ' $2->''' || node.svf || ''') ' || - my_alias || my_using || E'\n'; + ELSE -- svf XXX TODO multi and composite attrs are not supported yet + jrow := jrow || 'mra.source AS record, ' || node.quality || + ' AS quality FROM metabib.record_attr_vector_list mra,' || + ' config.coded_value_map ccvm WHERE' || + ' ccvm.ctype = ' || quote_literal(node.svf) || + ' AND ccvm.code = ' || quote_literal( ($2 -> node.svf) ) || ' AND'; + + IF node.negate THEN + jrow := jrow || ' NOT ('; + END IF; + + jrow := jrow || ' mra.vlist @> intset(ccvm.id)' || + + IF node.negate THEN + jrow := jrow || ' )'; + END IF; + + jrow := jrow || ' ' || my_alias || my_using || E'\n'; + END IF; INSERT INTO _vandelay_tmp_jrows (j) VALUES (jrow); END;