Structure match set points as a tree
authorMike Rylander <mrylander@gmail.com>
Thu, 24 Mar 2011 19:37:00 +0000 (15:37 -0400)
committerBill Erickson <berick@esilibrary.com>
Wed, 6 Jul 2011 18:50:48 +0000 (14:50 -0400)
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/sql/Pg/012.schema.vandelay.sql

index 4e5362b..4070fa3 100644 (file)
@@ -552,22 +552,33 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
        <class id="vmsp" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="vandelay::match_set_point" oils_persist:tablename="vandelay.match_set_point" reporter:label="Record Matching Definition">
                <fields oils_persist:primary="id" oils_persist:sequence="vandelay.match_set_point_id_seq">
                        <field reporter:label="Match Definition ID" name="id" reporter:datatype="id"/>
+                       <field reporter:label="Expression Tree Parent" name="parent" reporter:datatype="link"/>
                        <field reporter:label="Match Set" name="match_set" reporter:datatype="link"/>
-                       <field reporter:label="Coded Field" name="svf" reporter:datatype="text"/>
+                       <field reporter:label="Boolean Operator" name="bool_op" reporter:datatype="text"/>
+                       <field reporter:label="Coded Field" name="svf" reporter:datatype="link"/>
                        <field reporter:label="Tag" name="tag" reporter:datatype="text"/>
                        <field reporter:label="Subfield" name="subfield" reporter:datatype="text"/>
-                       <field reporter:label="Required?" name="required" reporter:datatype="bool"/>
                        <field reporter:label="Importance" name="quality" reporter:datatype="int"/>
                </fields>
                <links>
+                       <link field="parent" reltype="has_a" key="id" map="" class="vmsp"/>
                        <link field="match_set" reltype="has_a" key="id" map="" class="vms"/>
+                       <link field="svf" reltype="has_a" key="id" map="" class="crad"/>
                </links>
                <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
                        <actions>
-                               <create permission="CREATE_IMPORT_MATCH_SET ADMIN_IMPORT_IMPORT_MATCH_SET" context_field="owner"/>
-                               <retrieve permission="CREATE_IMPORT_MATCH_SET UPDATE_IMPORT_MATCH_SET DELETE_IMPORT_MATCH_SET" context_field="owner"/>
-                               <update permission="UPDATE_IMPORT_MATCH_SET" context_field="owner"/>
-                               <delete permission="DELETE_IMPORT_MATCH_SET" context_field="owner"/>
+                               <create permission="CREATE_IMPORT_MATCH_SET ADMIN_IMPORT_IMPORT_MATCH_SET">
+                    <context link="match_set" field="owner"/>
+                               </create>
+                               <retrieve permission="CREATE_IMPORT_MATCH_SET UPDATE_IMPORT_MATCH_SET DELETE_IMPORT_MATCH_SET">
+                    <context link="match_set" field="owner"/>
+                               </retrieve>
+                               <update permission="UPDATE_IMPORT_MATCH_SET">
+                    <context link="match_set" field="owner"/>
+                               </update>
+                               <delete permission="DELETE_IMPORT_MATCH_SET">
+                    <context link="match_set" field="owner"/>
+                               </delete>
                        </actions>
                </permacrud>
        </class>
index 5b6c0f5..fd3f818 100644 (file)
@@ -17,16 +17,20 @@ CREATE TABLE vandelay.match_set (
 -- Table to define match points, either FF via SVF or tag+subfield
 CREATE TABLE vandelay.match_set_point (
     id          SERIAL  PRIMARY KEY,
-    match_set   INT     NOT NULL REFERENCES vandelay.match_set (id),
-    svf         TEXT    REFERENCES config.record_attr_definition,
+    match_set   INT     REFERENCES vandelay.match_set (id),
+    parent      INT     REFERENCES vandelay.match_set_point (id),
+    bool_op     TEXT    CHECK (bool_op IS NULL OR (bool_op IN ('AND','OR','NOT'))),
+    svf         TEXT    REFERENCES config.record_attr_definition (name),
     tag         TEXT,
     subfield    TEXT,
-    required    BOOL    NOT NULL DEFAULT TRUE,
     quality     INT     NOT NULL DEFAULT 1, -- higher is better
     CONSTRAINT vmsp_need_a_subfield_with_a_tag CHECK ((tag IS NOT NULL AND subfield IS NOT NULL) OR tag IS NULL),
-    CONSTRAINT vmsp_need_a_tag_or_a_ff CHECK ((tag IS NOT NULL AND svf IS NULL) OR (tag IS NULL AND svf IS NOT NULL))
+    CONSTRAINT vmsp_need_a_tag_or_a_ff_or_a_bo CHECK (
+        (tag IS NOT NULL AND svf IS NULL AND bool_op IS NULL) OR
+        (tag IS NULL AND svf IS NOT NULL AND bool_op IS NULL) OR
+        (tag IS NULL AND svf IS NULL AND bool_op IS NOT NULL)
+    )
 );
-CREATE UNIQUE INDEX vmsp_def_once_per_set ON vandelay.match_set_point (match_set, COALESCE(tag,''), COALESCE(subfield,''), COALESCE(svf,''));
 
 CREATE TABLE vandelay.match_set_quality (
     id          SERIAL  PRIMARY KEY,
@@ -500,6 +504,10 @@ BEGIN
 
     first_round := TRUE;
     -- whew ... here we go ...
+
+
+    -- Commented out until replaced by tree-ish version
+/*
     FOR test IN SELECT * FROM vandelay.match_set_point WHERE match_set = my_bib_queue.match_set ORDER BY required DESC LOOP
         IF test.tag IS NOT NULL THEN
             FOR rvalue IN SELECT value FROM vandelay.flatten_marc( xml ) WHERE tag = test.tag AND subfield = test.subfield LOOP
@@ -551,6 +559,7 @@ BEGIN
     FOR tmp_rec IN SELECT * FROM UNNEST(matches) LOOP
         INSERT INTO vandelay.bib_match (matched_set, queued_record, eg_record, quality) VALUES (my_bib_queue.match_set, NEW.id, tmp_rec, (quality_set -> tmp_rec::TEXT));
     END LOOP;
+*/
 
     RETURN NEW;
 END;