LP#1251394 wide_display_entry WIP
authorBill Erickson <berickxx@gmail.com>
Fri, 12 May 2017 14:39:19 +0000 (10:39 -0400)
committerMike Rylander <mrylander@gmail.com>
Fri, 18 Aug 2017 17:01:49 +0000 (13:01 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql

index b2540b1..5a00add 100644 (file)
@@ -3740,6 +3740,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                <fields>
                        <field name="source" reporter:datatype="id" />
                        <field name="name" reporter:datatype="text"/>
+                       <field name="multi" reporter:datatype="bool"/>
+                       <field name="label" reporter:datatype="text"/>
                        <field name="field" reporter:datatype="link"/>
                        <field name="value" reporter:datatype="text"/>
                </fields>
@@ -3754,6 +3756,29 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        </actions>
                </permacrud>
        </class>
+       <class id="mwde" controller="open-ils.cstore open-ils.pcrud" 
+               oils_persist:tablename="metabib.wide_display_entry"
+               oils_obj:fieldmapper="metabib::wide_display_entry" 
+               oils_persist:field_safe="true"
+               reporter:label="Wide Display Entry" 
+               oils_persist:readonly="true">
+               <fields>
+                       <field name="source" reporter:datatype="id" />
+                       <field name="title" reporter:datatype="text"/>
+                       <field name="author" reporter:datatype="text"/>
+                       <field name="subject" reporter:datatype="text"/>
+                       <field name="topic_subject" reporter:datatype="text"/>
+                       <!-- TODO add all well-known fields -->
+               </fields>
+               <links>
+                       <link field="source" reltype="has_a" key="id" map="" class="bre"/>
+               </links>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <retrieve/>
+                       </actions>
+               </permacrud>
+       </class>
 
        <class id="cdfm" controller="open-ils.cstore open-ils.pcrud" 
                oils_persist:tablename="config.display_field_map"
index 7c75c9f..e0c4b26 100644 (file)
@@ -5,6 +5,12 @@ ALTER TABLE config.metabib_field
     ADD COLUMN display_xpath TEXT, 
     ADD COLUMN display_field BOOL NOT NULL DEFAULT FALSE;
 
+CREATE TABLE config.display_field_map (
+    name    TEXT   PRIMARY KEY,
+    field   INTEGER REFERENCES config.metabib_field (id),
+    multi   BOOLEAN DEFAULT FALSE
+);
+
 CREATE TABLE metabib.display_entry (
     id      BIGSERIAL  PRIMARY KEY,
     source  BIGINT     NOT NULL REFERENCES biblio.record_entry (id),
@@ -12,12 +18,10 @@ CREATE TABLE metabib.display_entry (
     value   TEXT       NOT NULL
 );
 
-CREATE TABLE config.display_field_map (
-    name    TEXT   PRIMARY KEY,
-    field   INTEGER REFERENCES config.metabib_field (id),
-    multi   BOOLEAN DEFAULT FALSE
-);
+CREATE INDEX metabib_display_entry_field_idx ON metabib.display_entry (field);
+CREATE INDEX metabib_display_entry_source_idx ON metabib.display_entry (source);
 
+-- one row per display entry fleshed with field info
 CREATE VIEW metabib.flat_display_entry AS
     SELECT
         mde.source,
@@ -31,25 +35,43 @@ CREATE VIEW metabib.flat_display_entry AS
     JOIN config.display_field_map cdfm ON (cdfm.field = mde.field)
 ;
 
+-- like flat_display_entry except values are compressed 
+-- into one row per display_field_map and JSON-ified.
 CREATE VIEW metabib.compressed_display_entry AS
-    SELECT
+    SELECT 
         source,
         name,
+        multi,
+        label,
         field,
-        multi, -- required for group-by
         CASE WHEN multi THEN
             TO_JSON(ARRAY_AGG(value))
         ELSE
             TO_JSON(MIN(value))
         END AS value
     FROM metabib.flat_display_entry
-    GROUP BY 1,2,3,4
+    GROUP BY 1, 2, 3, 4, 5
+;
+
+-- TODO: expand to encompass all well-known fields
+CREATE VIEW metabib.wide_display_entry AS
+    SELECT 
+        mcde.source,
+        mcde_title.value AS title,
+        mcde_author.value AS author,
+        mcde_subject.value AS subject,
+        mcde_topic_subject.value AS topic_subject
+    FROM metabib.compressed_display_entry mcde
+    LEFT JOIN metabib.compressed_display_entry mcde_title 
+        ON (mcde.source = mcde_title.source AND mcde_title.name = 'title')
+    LEFT JOIN metabib.compressed_display_entry mcde_author 
+        ON (mcde.source = mcde_author.source AND mcde_author.name = 'author')
+    LEFT JOIN metabib.compressed_display_entry mcde_subject 
+        ON (mcde.source = mcde_subject.source AND mcde_subject.name = 'subject')
+    LEFT JOIN metabib.compressed_display_entry mcde_topic_subject 
+        ON (mcde.source = mcde_topic_subject.source AND mcde_topic_subject.name = 'topic_subject')
 ;
 
-CREATE INDEX metabib_display_entry_field_idx 
-    ON metabib.display_entry (field);
-CREATE INDEX metabib_display_entry_source_idx 
-    ON metabib.display_entry (source);
 
 CREATE OR REPLACE FUNCTION metabib.display_field_normalize_trigger () 
     RETURNS TRIGGER AS $$
index 2bfb04c..5997b97 100644 (file)
@@ -292,6 +292,7 @@ DROP TRIGGER display_field_normalize_tgr ON metabib.display_entry;
 DROP FUNCTION metabib.display_field_normalize_trigger();
 DROP INDEX metabib.metabib_display_entry_source_idx;
 DROP INDEX metabib.metabib_display_entry_field_idx;
+DROP VIEW metabib.wide_display_entry;
 DROP VIEW metabib.compressed_display_entry;
 DROP VIEW metabib.flat_display_entry;
 DROP TABLE config.display_field_map;