[open-ils-commits] r16506 - trunk/Open-ILS/src/sql/Pg/upgrade (miker)
svn at svn.open-ils.org
svn at svn.open-ils.org
Wed May 26 14:07:08 EDT 2010
Author: miker
Date: 2010-05-26 14:07:04 -0400 (Wed, 26 May 2010)
New Revision: 16506
Added:
trunk/Open-ILS/src/sql/Pg/upgrade/0277.schema.address_schema_drift.sql
Removed:
trunk/Open-ILS/src/sql/Pg/upgrade/0227.schema.address_schema_drift.sql
Log:
arg ... typo in filename. moved
Deleted: trunk/Open-ILS/src/sql/Pg/upgrade/0227.schema.address_schema_drift.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0227.schema.address_schema_drift.sql 2010-05-26 15:08:33 UTC (rev 16505)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0227.schema.address_schema_drift.sql 2010-05-26 18:07:04 UTC (rev 16506)
@@ -1,222 +0,0 @@
-BEGIN;
-
-INSERT INTO config.upgrade_log (version) VALUES ('0227'); -- miker
-
--- Use oils_xpath_table instead of pgxml's xpath_table
-CREATE OR REPLACE FUNCTION acq.extract_holding_attr_table (lineitem int, tag text) RETURNS SETOF acq.flat_lineitem_holding_subfield AS $$
-DECLARE
- counter INT;
- lida acq.flat_lineitem_holding_subfield%ROWTYPE;
-BEGIN
-
- SELECT COUNT(*) INTO counter
- FROM oils_xpath_table(
- 'id',
- 'marc',
- 'acq.lineitem',
- '//*[@tag="' || tag || '"]',
- 'id=' || lineitem
- ) as t(i int,c text);
-
- FOR i IN 1 .. counter LOOP
- FOR lida IN
- SELECT *
- FROM ( SELECT id,i,t,v
- FROM oils_xpath_table(
- 'id',
- 'marc',
- 'acq.lineitem',
- '//*[@tag="' || tag || '"][position()=' || i || ']/*/@code|' ||
- '//*[@tag="' || tag || '"][position()=' || i || ']/*[@code]',
- 'id=' || lineitem
- ) as t(id int,t text,v text)
- )x
- LOOP
- RETURN NEXT lida;
- END LOOP;
- END LOOP;
-
- RETURN;
-END;
-$$ LANGUAGE PLPGSQL;
-
--- Use the identifier search class tsconfig
-DROP TRIGGER metabib_identifier_field_entry_fti_trigger ON identifier_field_entry;
-CREATE TRIGGER metabib_identifier_field_entry_fti_trigger
- BEFORE INSERT OR UPDATE ON identifier_field_entry
- FOR EACH ROW
- EXECUTE PROCEDURE public.oils_tsearch2('identifier');
-
--- Return the correct fail_part when the item can't be found
-CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.matrix_test_result AS $func$
-DECLARE
- user_object actor.usr%ROWTYPE;
- standing_penalty config.standing_penalty%ROWTYPE;
- item_object asset.copy%ROWTYPE;
- item_status_object config.copy_status%ROWTYPE;
- item_location_object asset.copy_location%ROWTYPE;
- result action.matrix_test_result;
- circ_test config.circ_matrix_matchpoint%ROWTYPE;
- out_by_circ_mod config.circ_matrix_circ_mod_test%ROWTYPE;
- circ_mod_map config.circ_matrix_circ_mod_test_map%ROWTYPE;
- hold_ratio action.hold_stats%ROWTYPE;
- penalty_type TEXT;
- tmp_grp INT;
- items_out INT;
- context_org_list INT[];
- done BOOL := FALSE;
-BEGIN
- result.success := TRUE;
-
- -- Fail if the user is BARRED
- SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
-
- -- Fail if we couldn't find the user
- IF user_object.id IS NULL THEN
- result.fail_part := 'no_user';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- RETURN;
- END IF;
-
- SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
-
- -- Fail if we couldn't find the item
- IF item_object.id IS NULL THEN
- result.fail_part := 'no_item';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- RETURN;
- END IF;
-
- SELECT INTO circ_test * FROM action.find_circ_matrix_matchpoint(circ_ou, match_item, match_user, renewal);
- result.matchpoint := circ_test.id;
-
- -- Fail if we couldn't find a matchpoint
- IF result.matchpoint IS NULL THEN
- result.fail_part := 'no_matchpoint';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- IF user_object.barred IS TRUE THEN
- result.fail_part := 'actor.usr.barred';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- -- Fail if the item can't circulate
- IF item_object.circulate IS FALSE THEN
- result.fail_part := 'asset.copy.circulate';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- -- Fail if the item isn't in a circulateable status on a non-renewal
- IF NOT renewal AND item_object.status NOT IN ( 0, 7, 8 ) THEN
- result.fail_part := 'asset.copy.status';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- ELSIF renewal AND item_object.status <> 1 THEN
- result.fail_part := 'asset.copy.status';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- -- Fail if the item can't circulate because of the shelving location
- SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
- IF item_location_object.circulate IS FALSE THEN
- result.fail_part := 'asset.copy_location.circulate';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( circ_test.org_unit );
-
- -- Fail if the test is set to hard non-circulating
- IF circ_test.circulate IS FALSE THEN
- result.fail_part := 'config.circ_matrix_test.circulate';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
-
- -- Fail if the total copy-hold ratio is too low
- IF circ_test.total_copy_hold_ratio IS NOT NULL THEN
- SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
- IF hold_ratio.total_copy_ratio IS NOT NULL AND hold_ratio.total_copy_ratio < circ_test.total_copy_hold_ratio THEN
- result.fail_part := 'config.circ_matrix_test.total_copy_hold_ratio';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
- END IF;
-
- -- Fail if the available copy-hold ratio is too low
- IF circ_test.available_copy_hold_ratio IS NOT NULL THEN
- SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
- IF hold_ratio.available_copy_ratio IS NOT NULL AND hold_ratio.available_copy_ratio < circ_test.available_copy_hold_ratio THEN
- result.fail_part := 'config.circ_matrix_test.available_copy_hold_ratio';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
- END IF;
-
- IF renewal THEN
- penalty_type = '%RENEW%';
- ELSE
- penalty_type = '%CIRC%';
- END IF;
-
- FOR standing_penalty IN
- SELECT DISTINCT csp.*
- FROM actor.usr_standing_penalty usp
- JOIN config.standing_penalty csp ON (csp.id = usp.standing_penalty)
- WHERE usr = match_user
- AND usp.org_unit IN ( SELECT * FROM explode_array(context_org_list) )
- AND (usp.stop_date IS NULL or usp.stop_date > NOW())
- AND csp.block_list LIKE penalty_type LOOP
-
- result.fail_part := standing_penalty.name;
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END LOOP;
-
- -- Fail if the user has too many items with specific circ_modifiers checked out
- FOR out_by_circ_mod IN SELECT * FROM config.circ_matrix_circ_mod_test WHERE matchpoint = circ_test.id LOOP
- SELECT INTO items_out COUNT(*)
- FROM action.circulation circ
- JOIN asset.copy cp ON (cp.id = circ.target_copy)
- WHERE circ.usr = match_user
- AND circ.circ_lib IN ( SELECT * FROM explode_array(context_org_list) )
- AND circ.checkin_time IS NULL
- AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL)
- AND cp.circ_modifier IN (SELECT circ_mod FROM config.circ_matrix_circ_mod_test_map WHERE circ_mod_test = out_by_circ_mod.id);
- IF items_out >= out_by_circ_mod.items_out THEN
- result.fail_part := 'config.circ_matrix_circ_mod_test';
- result.success := FALSE;
- done := TRUE;
- RETURN NEXT result;
- END IF;
- END LOOP;
-
- -- If we passed everything, return the successful matchpoint id
- IF NOT done THEN
- RETURN NEXT result;
- END IF;
-
- RETURN;
-END;
-$func$ LANGUAGE plpgsql;
-
-COMMIT;
Copied: trunk/Open-ILS/src/sql/Pg/upgrade/0277.schema.address_schema_drift.sql (from rev 16505, trunk/Open-ILS/src/sql/Pg/upgrade/0227.schema.address_schema_drift.sql)
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0277.schema.address_schema_drift.sql (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0277.schema.address_schema_drift.sql 2010-05-26 18:07:04 UTC (rev 16506)
@@ -0,0 +1,222 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0227'); -- miker
+
+-- Use oils_xpath_table instead of pgxml's xpath_table
+CREATE OR REPLACE FUNCTION acq.extract_holding_attr_table (lineitem int, tag text) RETURNS SETOF acq.flat_lineitem_holding_subfield AS $$
+DECLARE
+ counter INT;
+ lida acq.flat_lineitem_holding_subfield%ROWTYPE;
+BEGIN
+
+ SELECT COUNT(*) INTO counter
+ FROM oils_xpath_table(
+ 'id',
+ 'marc',
+ 'acq.lineitem',
+ '//*[@tag="' || tag || '"]',
+ 'id=' || lineitem
+ ) as t(i int,c text);
+
+ FOR i IN 1 .. counter LOOP
+ FOR lida IN
+ SELECT *
+ FROM ( SELECT id,i,t,v
+ FROM oils_xpath_table(
+ 'id',
+ 'marc',
+ 'acq.lineitem',
+ '//*[@tag="' || tag || '"][position()=' || i || ']/*/@code|' ||
+ '//*[@tag="' || tag || '"][position()=' || i || ']/*[@code]',
+ 'id=' || lineitem
+ ) as t(id int,t text,v text)
+ )x
+ LOOP
+ RETURN NEXT lida;
+ END LOOP;
+ END LOOP;
+
+ RETURN;
+END;
+$$ LANGUAGE PLPGSQL;
+
+-- Use the identifier search class tsconfig
+DROP TRIGGER metabib_identifier_field_entry_fti_trigger ON identifier_field_entry;
+CREATE TRIGGER metabib_identifier_field_entry_fti_trigger
+ BEFORE INSERT OR UPDATE ON identifier_field_entry
+ FOR EACH ROW
+ EXECUTE PROCEDURE public.oils_tsearch2('identifier');
+
+-- Return the correct fail_part when the item can't be found
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.matrix_test_result AS $func$
+DECLARE
+ user_object actor.usr%ROWTYPE;
+ standing_penalty config.standing_penalty%ROWTYPE;
+ item_object asset.copy%ROWTYPE;
+ item_status_object config.copy_status%ROWTYPE;
+ item_location_object asset.copy_location%ROWTYPE;
+ result action.matrix_test_result;
+ circ_test config.circ_matrix_matchpoint%ROWTYPE;
+ out_by_circ_mod config.circ_matrix_circ_mod_test%ROWTYPE;
+ circ_mod_map config.circ_matrix_circ_mod_test_map%ROWTYPE;
+ hold_ratio action.hold_stats%ROWTYPE;
+ penalty_type TEXT;
+ tmp_grp INT;
+ items_out INT;
+ context_org_list INT[];
+ done BOOL := FALSE;
+BEGIN
+ result.success := TRUE;
+
+ -- Fail if the user is BARRED
+ SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+ -- Fail if we couldn't find the user
+ IF user_object.id IS NULL THEN
+ result.fail_part := 'no_user';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ RETURN;
+ END IF;
+
+ SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
+
+ -- Fail if we couldn't find the item
+ IF item_object.id IS NULL THEN
+ result.fail_part := 'no_item';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ RETURN;
+ END IF;
+
+ SELECT INTO circ_test * FROM action.find_circ_matrix_matchpoint(circ_ou, match_item, match_user, renewal);
+ result.matchpoint := circ_test.id;
+
+ -- Fail if we couldn't find a matchpoint
+ IF result.matchpoint IS NULL THEN
+ result.fail_part := 'no_matchpoint';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ IF user_object.barred IS TRUE THEN
+ result.fail_part := 'actor.usr.barred';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item can't circulate
+ IF item_object.circulate IS FALSE THEN
+ result.fail_part := 'asset.copy.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item isn't in a circulateable status on a non-renewal
+ IF NOT renewal AND item_object.status NOT IN ( 0, 7, 8 ) THEN
+ result.fail_part := 'asset.copy.status';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ ELSIF renewal AND item_object.status <> 1 THEN
+ result.fail_part := 'asset.copy.status';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item can't circulate because of the shelving location
+ SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
+ IF item_location_object.circulate IS FALSE THEN
+ result.fail_part := 'asset.copy_location.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ SELECT INTO context_org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( circ_test.org_unit );
+
+ -- Fail if the test is set to hard non-circulating
+ IF circ_test.circulate IS FALSE THEN
+ result.fail_part := 'config.circ_matrix_test.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the total copy-hold ratio is too low
+ IF circ_test.total_copy_hold_ratio IS NOT NULL THEN
+ SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+ IF hold_ratio.total_copy_ratio IS NOT NULL AND hold_ratio.total_copy_ratio < circ_test.total_copy_hold_ratio THEN
+ result.fail_part := 'config.circ_matrix_test.total_copy_hold_ratio';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END IF;
+
+ -- Fail if the available copy-hold ratio is too low
+ IF circ_test.available_copy_hold_ratio IS NOT NULL THEN
+ SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+ IF hold_ratio.available_copy_ratio IS NOT NULL AND hold_ratio.available_copy_ratio < circ_test.available_copy_hold_ratio THEN
+ result.fail_part := 'config.circ_matrix_test.available_copy_hold_ratio';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END IF;
+
+ IF renewal THEN
+ penalty_type = '%RENEW%';
+ ELSE
+ penalty_type = '%CIRC%';
+ END IF;
+
+ FOR standing_penalty IN
+ SELECT DISTINCT csp.*
+ FROM actor.usr_standing_penalty usp
+ JOIN config.standing_penalty csp ON (csp.id = usp.standing_penalty)
+ WHERE usr = match_user
+ AND usp.org_unit IN ( SELECT * FROM explode_array(context_org_list) )
+ AND (usp.stop_date IS NULL or usp.stop_date > NOW())
+ AND csp.block_list LIKE penalty_type LOOP
+
+ result.fail_part := standing_penalty.name;
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END LOOP;
+
+ -- Fail if the user has too many items with specific circ_modifiers checked out
+ FOR out_by_circ_mod IN SELECT * FROM config.circ_matrix_circ_mod_test WHERE matchpoint = circ_test.id LOOP
+ SELECT INTO items_out COUNT(*)
+ FROM action.circulation circ
+ JOIN asset.copy cp ON (cp.id = circ.target_copy)
+ WHERE circ.usr = match_user
+ AND circ.circ_lib IN ( SELECT * FROM explode_array(context_org_list) )
+ AND circ.checkin_time IS NULL
+ AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL)
+ AND cp.circ_modifier IN (SELECT circ_mod FROM config.circ_matrix_circ_mod_test_map WHERE circ_mod_test = out_by_circ_mod.id);
+ IF items_out >= out_by_circ_mod.items_out THEN
+ result.fail_part := 'config.circ_matrix_circ_mod_test';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END LOOP;
+
+ -- If we passed everything, return the successful matchpoint id
+ IF NOT done THEN
+ RETURN NEXT result;
+ END IF;
+
+ RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+COMMIT;
More information about the open-ils-commits
mailing list