LP#1304559: Use new attribute data structures in matching
authorMike Rylander <mrylander@gmail.com>
Tue, 8 Apr 2014 19:27:51 +0000 (15:27 -0400)
committerMike Rylander <mrylander@gmail.com>
Tue, 8 Apr 2014 19:27:51 +0000 (15:27 -0400)
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 <mrylander@gmail.com>
Open-ILS/src/sql/Pg/012.schema.vandelay.sql

index 5076037..c7eb3a5 100644 (file)
@@ -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;