From 41ab5fb041c91368c60889ebc11a2b926f8a878b Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Wed, 25 Apr 2018 09:33:57 -0400 Subject: [PATCH] add prefix in views (#68) * add prefix in views * remove topology schema from original dump * remove bomb * add SRID as variable * update to last pum for variables * some column fixes * fix arguments * more fixes * more fixes * more fixes * more fixes * fix * even more fixes * try with co id * fix id * fix --- .travis.yml | 4 +- delta/delta_1.0.1_prefix_reach_view.sql | 440 +++++++++++++ ...1.0.1_prefix_wastewater_structure_view.sql | 599 ++++++++++++++++++ metaproject | 2 +- test/test_on_delete.py | 2 +- test/test_triggers.py | 9 +- test/test_views.py | 16 +- test_data/qgep_demodata_1.0.0.dump | Bin 5999302 -> 6016017 bytes view/vw_qgep_reach.py | 121 ++++ view/vw_qgep_reach.sql | 206 +++--- view/vw_qgep_wastewater_structure.sql | 322 +++++----- 11 files changed, 1449 insertions(+), 272 deletions(-) create mode 100644 delta/delta_1.0.1_prefix_reach_view.sql create mode 100644 delta/delta_1.0.1_prefix_wastewater_structure_view.sql create mode 100755 view/vw_qgep_reach.py diff --git a/.travis.yml b/.travis.yml index 9ce2569c..e7b942fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,7 +53,7 @@ script: - export VERSION=$(sed 'r' "$TRAVIS_BUILD_DIR/system/CURRENT_VERSION.txt") # Create a db from a dump file. This simulate the prod db - - pum restore -p qgep_prod -x --exclude-schema public -- $TRAVIS_BUILD_DIR/test_data/qgep_demodata_1.0.0.dump + - pum restore -p qgep_prod -x --exclude-schema public --exclude-schema topology -- $TRAVIS_BUILD_DIR/test_data/qgep_demodata_1.0.0.dump - pum baseline -p qgep_prod -t qgep_sys.pum_info -d $TRAVIS_BUILD_DIR/delta/ -b 1.0.0 # Create last version of qgep db using db_setup.sh script as comp db @@ -62,7 +62,7 @@ script: - pum baseline -p qgep_comp -t qgep_sys.pum_info -d $TRAVIS_BUILD_DIR/delta/ -b $VERSION # Run pum's test and upgrade - - yes | pum test-and-upgrade -pp qgep_prod -pt qgep_test -pc qgep_comp -t qgep_sys.pum_info -d $TRAVIS_BUILD_DIR/delta/ -f /tmp/qwat_dump -i constraints views --exclude-schema public + - yes | pum test-and-upgrade -pp qgep_prod -pt qgep_test -pc qgep_comp -t qgep_sys.pum_info -d $TRAVIS_BUILD_DIR/delta/ -f /tmp/qwat_dump -i constraints views --exclude-schema public -v int SRID 2056 after_success: - ./.deploy/create-release.sh diff --git a/delta/delta_1.0.1_prefix_reach_view.sql b/delta/delta_1.0.1_prefix_reach_view.sql new file mode 100644 index 00000000..6fb8d93d --- /dev/null +++ b/delta/delta_1.0.1_prefix_reach_view.sql @@ -0,0 +1,440 @@ +-- View: vw_qgep_reach + +BEGIN TRANSACTION; + +DROP VIEW IF EXISTS qgep_od.vw_qgep_reach; + +CREATE OR REPLACE VIEW qgep_od.vw_qgep_reach AS + +/* WITH active_maintenance_event AS ( + SELECT me.obj_id, me.identifier, me.active_zone, mews.fk_wastewater_structure FROM qgep_od.maintenance_event me + LEFT JOIN + qgep_od.re_maintenance_event_wastewater_structure mews ON mews.fk_maintenance_event = me.obj_id + WHERE active_zone IS NOT NULL +) */ + +SELECT re.obj_id, + re.clear_height AS clear_height, + re.material, + ch.usage_current AS ch_usage_current, + ch.function_hierarchic AS ch_function_hierarchic, + ws.status AS ws_status, + ws.fk_owner AS ws_fk_owner, + ch.function_hydraulic AS ch_function_hydraulic, + CASE WHEN pp.height_width_ratio IS NOT NULL THEN round(re.clear_height::numeric * pp.height_width_ratio)::smallint ELSE clear_height END AS width, + re.coefficient_of_friction, + re.elevation_determination, + re.horizontal_positioning, + re.inside_coating, + re.length_effective, + CASE WHEN rp_from.level > 0 AND rp_to.level > 0 THEN round((rp_from.level - rp_to.level)/re.length_effective*1000,1) ELSE NULL END AS _slope_per_mill, + re.progression_geometry, + re.reliner_material, + re.reliner_nominal_size, + re.relining_construction, + re.relining_kind, + re.ring_stiffness, + re.slope_building_plan, + re.wall_roughness, + re.fk_pipe_profile, + ne.identifier, + ne.remark, + ne.last_modification, + ne.fk_dataowner, + ne.fk_provider, + ne.fk_wastewater_structure, + ch.bedding_encasement AS ch_bedding_encasement, + ch.connection_type AS ch_connection_type, + ch.jetting_interval AS ch_jetting_interval, + ch.pipe_length AS ch_pipe_length, + ch.usage_planned AS ch_usage_planned, + ws.obj_id AS ws_obj_id, + ws.accessibility AS ws_accessibility, + ws.contract_section AS ws_contract_section, + ws.financing AS ws_financing, + ws.gross_costs AS ws_gross_costs, + ws.identifier AS ws_identifier, + ws.inspection_interval AS ws_inspection_interval, + ws.location_name AS ws_location_name, + ws.records AS ws_records, + ws.remark AS ws_remark, + ws.renovation_necessity AS ws_renovation_necessity, + ws.replacement_value AS ws_replacement_value, + ws.rv_base_year AS ws_rv_base_year, + ws.rv_construction_type AS ws_rv_construction_type, + ws.structure_condition AS ws_structure_condition, + ws.subsidies AS ws_subsidies, + ws.year_of_construction AS ws_year_of_construction, + ws.year_of_replacement AS ws_year_of_replacement, + ws.fk_operator AS ws_fk_operator, + rp_from.obj_id AS rp_from_obj_id, + rp_from.elevation_accuracy AS rp_from_elevation_accuracy, + rp_from.identifier AS rp_from_identifier, + rp_from.level AS rp_from_level, + rp_from.outlet_shape AS rp_from_outlet_shape, + rp_from.position_of_connection AS rp_from_position_of_connection, + rp_from.remark AS rp_from_remark, + rp_from.last_modification AS rp_from_last_modification, + rp_from.fk_dataowner AS rp_from_fk_dataowner, + rp_from.fk_provider AS rp_from_fk_provider, + rp_from.fk_wastewater_networkelement AS rp_from_fk_wastewater_networkelement, + rp_to.obj_id AS rp_to_obj_id, + rp_to.elevation_accuracy AS rp_to_elevation_accuracy, + rp_to.identifier AS rp_to_identifier, + rp_to.level AS rp_to_level, + rp_to.outlet_shape AS rp_to_outlet_shape, + rp_to.position_of_connection AS rp_to_position_of_connection, + rp_to.remark AS rp_to_remark, + rp_to.last_modification AS rp_to_last_modification, + rp_to.fk_dataowner AS rp_to_fk_dataowner, + rp_to.fk_provider AS rp_to_fk_provider, + rp_to.fk_wastewater_networkelement AS rp_to_fk_wastewater_networkelement + /* am.obj_id AS me_obj_id, + am.active_zone AS me_active_zone, + am.identifier AS me_identifier */ + FROM qgep_od.reach re + LEFT JOIN qgep_od.wastewater_networkelement ne ON ne.obj_id = re.obj_id + LEFT JOIN qgep_od.reach_point rp_from ON rp_from.obj_id = re.fk_reach_point_from + LEFT JOIN qgep_od.reach_point rp_to ON rp_to.obj_id = re.fk_reach_point_to + LEFT JOIN qgep_od.wastewater_structure ws ON ne.fk_wastewater_structure = ws.obj_id + LEFT JOIN qgep_od.channel ch ON ch.obj_id = ws.obj_id + LEFT JOIN qgep_od.pipe_profile pp ON re.fk_pipe_profile = pp.obj_id; + /* LEFT JOIN active_maintenance_event am ON am.fk_wastewater_structure = ch.obj_id; */ + +-- REACH INSERT +-- Function: vw_qgep_reach_insert() + +CREATE OR REPLACE FUNCTION qgep_od.vw_qgep_reach_insert() + RETURNS trigger AS +$BODY$ +BEGIN + INSERT INTO qgep_od.reach_point( + obj_id + , elevation_accuracy + , identifier + , level + , outlet_shape + , position_of_connection + , remark + , situation_geometry + , last_modification + , fk_dataowner + , fk_provider + , fk_wastewater_networkelement + ) + VALUES ( + COALESCE(NEW.rp_from_obj_id,qgep_sys.generate_oid('qgep_od','reach_point')) -- obj_id + , NEW.rp_from_elevation_accuracy -- elevation_accuracy + , NEW.rp_from_identifier -- identifier + , NEW.rp_from_level -- level + , NEW.rp_from_outlet_shape -- outlet_shape + , NEW.rp_from_position_of_connection -- position_of_connection + , NEW.rp_from_remark -- remark + , ST_Force2D(ST_StartPoint(NEW.progression_geometry)) -- situation_geometry + , NEW.rp_from_last_modification -- last_modification + , NEW.rp_from_fk_dataowner -- fk_dataowner + , NEW.rp_from_fk_provider -- fk_provider + , NEW.rp_from_fk_wastewater_networkelement -- fk_wastewater_networkelement + ) + RETURNING obj_id INTO NEW.rp_from_obj_id; + + + INSERT INTO qgep_od.reach_point( + obj_id + , elevation_accuracy + , identifier + , level + , outlet_shape + , position_of_connection + , remark + , situation_geometry + , last_modification + , fk_dataowner + , fk_provider + , fk_wastewater_networkelement + ) + VALUES ( + COALESCE(NEW.rp_to_obj_id,qgep_sys.generate_oid('qgep_od','reach_point')) -- obj_id + , NEW.rp_to_elevation_accuracy -- elevation_accuracy + , NEW.rp_to_identifier -- identifier + , NEW.rp_to_level -- level + , NEW.rp_to_outlet_shape -- outlet_shape + , NEW.rp_to_position_of_connection -- position_of_connection + , NEW.rp_to_remark -- remark + , ST_Force2D(ST_EndPoint(NEW.progression_geometry)) -- situation_geometry + , NEW.rp_to_last_modification -- last_modification + , NEW.rp_to_fk_dataowner -- fk_dataowner + , NEW.rp_to_fk_provider -- fk_provider + , NEW.rp_to_fk_wastewater_networkelement -- fk_wastewater_networkelement + ) + RETURNING obj_id INTO NEW.rp_to_obj_id; + + INSERT INTO qgep_od.wastewater_structure ( + obj_id + , accessibility + , contract_section + -- , detail_geometry_geometry + , financing + , gross_costs + , identifier + , inspection_interval + , location_name + , records + , remark + , renovation_necessity + , replacement_value + , rv_base_year + , rv_construction_type + , status + , structure_condition + , subsidies + , year_of_construction + , year_of_replacement + -- , last_modification + -- , fk_dataowner + -- , fk_provider + , fk_owner + , fk_operator ) + + VALUES ( COALESCE(NEW.fk_wastewater_structure,qgep_sys.generate_oid('qgep_od','channel')) -- obj_id + , NEW.ws_accessibility + , NEW.ws_contract_section + -- , NEW.detail_geometry_geometry + , NEW.ws_financing + , NEW.ws_gross_costs + , NEW.ws_identifier + , NEW.ws_inspection_interval + , NEW.ws_location_name + , NEW.ws_records + , NEW.ws_remark + , NEW.ws_renovation_necessity + , NEW.ws_replacement_value + , NEW.ws_rv_base_year + , NEW.ws_rv_construction_type + , NEW.ws_status + , NEW.ws_structure_condition + , NEW.ws_subsidies + , NEW.ws_year_of_construction + , NEW.ws_year_of_replacement + -- , NEW.ws_last_modification + -- , NEW.fk_dataowner + -- , NEW.fk_provider + , NEW.ws_fk_owner + , NEW.ws_fk_operator + ) + RETURNING obj_id INTO NEW.fk_wastewater_structure; + + INSERT INTO qgep_od.channel( + obj_id + , bedding_encasement + , connection_type + , function_hierarchic + , function_hydraulic + , jetting_interval + , pipe_length + , usage_current + , usage_planned + ) + VALUES( + NEW.fk_wastewater_structure + , NEW.ch_bedding_encasement + , NEW.ch_connection_type + , NEW.ch_function_hierarchic + , NEW.ch_function_hydraulic + , NEW.ch_jetting_interval + , NEW.ch_pipe_length + , NEW.ch_usage_current + , NEW.ch_usage_planned + ); + + INSERT INTO qgep_od.wastewater_networkelement ( + obj_id + , identifier + , remark + , last_modification + , fk_dataowner + , fk_provider + , fk_wastewater_structure ) + VALUES ( COALESCE(NEW.obj_id,qgep_sys.generate_oid('qgep_od','reach')) -- obj_id + , NEW.identifier -- identifier + , NEW.remark -- remark + , NEW.last_modification -- last_modification + , NEW.fk_dataowner -- fk_dataowner + , NEW.fk_provider -- fk_provider + , NEW.fk_wastewater_structure -- fk_wastewater_structure + ) + RETURNING obj_id INTO NEW.obj_id; + + INSERT INTO qgep_od.reach ( + obj_id + , clear_height + , coefficient_of_friction + , elevation_determination + , horizontal_positioning + , inside_coating + , length_effective + , material + , progression_geometry + , reliner_material + , reliner_nominal_size + , relining_construction + , relining_kind + , ring_stiffness + , slope_building_plan + , wall_roughness + , fk_reach_point_from + , fk_reach_point_to + , fk_pipe_profile ) + VALUES( + NEW.obj_id -- obj_id + , NEW.clear_height + , NEW.coefficient_of_friction + , NEW.elevation_determination + , NEW.horizontal_positioning + , NEW.inside_coating + , NEW.length_effective + , NEW.material + , NEW.progression_geometry + , NEW.reliner_material + , NEW.reliner_nominal_size + , NEW.relining_construction + , NEW.relining_kind + , NEW.ring_stiffness + , NEW.slope_building_plan + , NEW.wall_roughness + , NEW.rp_from_obj_id + , NEW.rp_to_obj_id + , NEW.fk_pipe_profile); + + RETURN NEW; +END; $BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; + +CREATE TRIGGER vw_qgep_reach_on_insert INSTEAD OF INSERT ON qgep_od.vw_qgep_reach + FOR EACH ROW EXECUTE PROCEDURE qgep_od.vw_qgep_reach_insert(); + +-- REACH UPDATE +-- Rule: vw_qgep_reach_on_update() + +CREATE OR REPLACE RULE vw_qgep_reach_on_update AS ON UPDATE TO qgep_od.vw_qgep_reach DO INSTEAD ( + UPDATE qgep_od.reach_point + SET + elevation_accuracy = NEW.rp_from_elevation_accuracy + , identifier = NEW.rp_from_identifier + , level = NEW.rp_from_level + , outlet_shape = NEW.rp_from_outlet_shape + , position_of_connection = NEW.rp_from_position_of_connection + , remark = NEW.rp_from_remark + , situation_geometry = ST_Force2D(ST_StartPoint(NEW.progression_geometry)) + , last_modification = NEW.rp_from_last_modification + , fk_dataowner = NEW.rp_from_fk_dataowner + , fk_provider = NEW.rp_from_fk_provider + , fk_wastewater_networkelement = NEW.rp_from_fk_wastewater_networkelement + WHERE obj_id = OLD.rp_from_obj_id; + + UPDATE qgep_od.reach_point + SET + elevation_accuracy = NEW.rp_to_elevation_accuracy + , identifier = NEW.rp_to_identifier + , level = NEW.rp_to_level + , outlet_shape = NEW.rp_to_outlet_shape + , position_of_connection = NEW.rp_to_position_of_connection + , remark = NEW.rp_to_remark + , situation_geometry = ST_Force2D(ST_EndPoint(NEW.progression_geometry)) + , last_modification = NEW.rp_to_last_modification + , fk_dataowner = NEW.rp_to_fk_dataowner + , fk_provider = NEW.rp_to_fk_provider + , fk_wastewater_networkelement = NEW.rp_to_fk_wastewater_networkelement + WHERE obj_id = OLD.rp_to_obj_id; + + UPDATE qgep_od.channel + SET + bedding_encasement = NEW.ch_bedding_encasement + , connection_type = NEW.ch_connection_type + , function_hierarchic = NEW.ch_function_hierarchic + , function_hydraulic = NEW.ch_function_hydraulic + , jetting_interval = NEW.ch_jetting_interval + , pipe_length = NEW.ch_pipe_length + , usage_current = NEW.ch_usage_current + , usage_planned = NEW.ch_usage_planned + WHERE obj_id = OLD.fk_wastewater_structure; + + UPDATE qgep_od.wastewater_structure + SET + accessibility = NEW.ws_accessibility + , contract_section = NEW.ws_contract_section + -- , detail_geometry_geometry = NEW.detail_geometry_geometry + , financing = NEW.ws_financing + , gross_costs = NEW.ws_gross_costs + , identifier = NEW.ws_identifier + , inspection_interval = NEW.ws_inspection_interval + , location_name = NEW.ws_location_name + , records = NEW.ws_records + , remark = NEW.ws_remark + , renovation_necessity = NEW.ws_renovation_necessity + , replacement_value = NEW.ws_replacement_value + , rv_base_year = NEW.ws_rv_base_year + , rv_construction_type = NEW.ws_rv_construction_type + , status = NEW.ws_status + , structure_condition = NEW.ws_structure_condition + , subsidies = NEW.ws_subsidies + , year_of_construction = NEW.ws_year_of_construction + , year_of_replacement = NEW.ws_year_of_replacement + , fk_dataowner = NEW.fk_dataowner + , fk_provider = NEW.fk_provider + , last_modification = NEW.last_modification + , fk_owner = NEW.ws_fk_owner + , fk_operator = NEW.ws_fk_operator + WHERE obj_id = OLD.fk_wastewater_structure; + + + UPDATE qgep_od.wastewater_networkelement + SET + identifier = NEW.identifier + , remark = NEW.remark + , last_modification = NEW.last_modification + , fk_dataowner = NEW.fk_dataowner + , fk_provider = NEW.fk_provider + , fk_wastewater_structure = NEW.fk_wastewater_structure + WHERE obj_id = OLD.obj_id; + + UPDATE qgep_od.reach + SET clear_height = NEW.clear_height + , coefficient_of_friction = NEW.coefficient_of_friction + , elevation_determination = NEW.elevation_determination + , horizontal_positioning = NEW.horizontal_positioning + , inside_coating = NEW.inside_coating + , length_effective = NEW.length_effective + , material = NEW.material + , progression_geometry = NEW.progression_geometry + , reliner_material = NEW.reliner_material + , reliner_nominal_size = NEW.reliner_nominal_size + , relining_construction = NEW.relining_construction + , relining_kind = NEW.relining_kind + , ring_stiffness = NEW.ring_stiffness + , slope_building_plan = NEW.slope_building_plan + , wall_roughness = NEW.wall_roughness + , fk_pipe_profile = NEW.fk_pipe_profile + WHERE obj_id = OLD.obj_id; +); + +-- REACH DELETE +-- Rule: vw_qgep_reach_on_delete() + +CREATE OR REPLACE RULE vw_qgep_reach_on_delete AS ON DELETE TO qgep_od.vw_qgep_reach DO INSTEAD ( + DELETE FROM qgep_od.reach WHERE obj_id = OLD.obj_id; + DELETE FROM qgep_od.wastewater_networkelement WHERE obj_id = OLD.obj_id; + DELETE FROM qgep_od.reach_point WHERE obj_id = OLD.rp_from_obj_id; + DELETE FROM qgep_od.reach_point WHERE obj_id = OLD.rp_to_obj_id; +); + +--missing: delete also connected wastewater_structure (and subclass channel or other), structure_parts, re_maintenance_events + +ALTER VIEW qgep_od.vw_qgep_reach ALTER obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach'); + +ALTER VIEW qgep_od.vw_qgep_reach ALTER rp_from_obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach_point'); +ALTER VIEW qgep_od.vw_qgep_reach ALTER rp_to_obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach_point'); +ALTER VIEW qgep_od.vw_qgep_reach ALTER fk_wastewater_structure SET DEFAULT qgep_sys.generate_oid('qgep_od','channel'); + +END TRANSACTION; diff --git a/delta/delta_1.0.1_prefix_wastewater_structure_view.sql b/delta/delta_1.0.1_prefix_wastewater_structure_view.sql new file mode 100644 index 00000000..84698c41 --- /dev/null +++ b/delta/delta_1.0.1_prefix_wastewater_structure_view.sql @@ -0,0 +1,599 @@ +-- View: vw_qgep_wastewater_structure + +BEGIN TRANSACTION; + +DROP VIEW IF EXISTS qgep_od.vw_qgep_wastewater_structure; + +CREATE OR REPLACE VIEW qgep_od.vw_qgep_wastewater_structure AS + SELECT + ws.identifier as identifier, + + CASE + WHEN ma.obj_id IS NOT NULL THEN 'manhole' + WHEN ss.obj_id IS NOT NULL THEN 'special_structure' + WHEN dp.obj_id IS NOT NULL THEN 'discharge_point' + WHEN ii.obj_id IS NOT NULL THEN 'infiltration_installation' + ELSE 'unknown' + END AS ws_type, + ma.function AS ma_function, + ss.function as ss_function, + ws.fk_owner, + ws.status, + + ws.accessibility, + ws.contract_section, + ws.financing, + ws.gross_costs, + ws.inspection_interval, + ws.location_name, + ws.records, + ws.remark, + ws.renovation_necessity, + ws.replacement_value, + ws.rv_base_year, + ws.rv_construction_type, + ws.structure_condition, + ws.subsidies, + ws.year_of_construction, + ws.year_of_replacement, + ws.last_modification, + ws.fk_operator, + ws.fk_dataowner, + ws.fk_provider, + ws._depth, + ws.obj_id, + + main_co_sp.identifier AS co_identifier, + main_co.brand AS co_brand, + main_co.cover_shape AS co_shape, + main_co.diameter AS co_diameter, + main_co.fastening AS co_fastening, + main_co.level AS co_level, + main_co.material AS co_material, + main_co.positional_accuracy AS co_positional_accuracy, + aggregated_wastewater_structure.situation_geometry, + main_co.sludge_bucket AS co_sludge_bucket, + main_co.venting AS co_venting, + main_co_sp.remark AS co_remark, + main_co_sp.renovation_demand AS co_renovation_demand, + main_co.obj_id AS co_obj_id, + + ma.material AS ma_material, + ma.surface_inflow AS ma_surface_inflow, + ma.dimension1 AS ma_dimension1, + ma.dimension2 AS ma_dimension2, + ma._orientation AS ma_orientation, + + ss.bypass AS ss_bypass, + ss.emergency_spillway AS ss_emergency_spillway, + ss.stormwater_tank_arrangement AS ss_stormwater_tank_arrangement, + ss.upper_elevation AS ss_upper_elevation, + + ii.absorption_capacity AS ii_absorption_capacity, + ii.defects AS ii_defects, + ii.dimension1 AS ii_dimension1, + ii.dimension2 AS ii_dimension2, + ii.distance_to_aquifer AS ii_distance_to_aquifer, + ii.effective_area AS ii_effective_area, + ii.emergency_spillway AS ii_emergency_spillway, + ii.kind AS ii_kind, + ii.labeling AS ii_labeling, + ii.seepage_utilization AS ii_seepage_utilization, + ii.upper_elevation AS ii_upper_elevation, + ii.vehicle_access AS ii_vehicle_access, + ii.watertightness AS ii_watertightness, + + dp.highwater_level AS dp_highwater_level, + dp.relevance AS dp_relevance, + dp.terrain_level AS dp_terrain_level, + dp.upper_elevation AS dp_upper_elevation, + dp.waterlevel_hydraulic AS dp_waterlevel_hydraulic, + + wn.identifier AS wn_identifier, + wn.obj_id AS wn_obj_id, + wn.backflow_level AS wn_backflow_level, + wn.bottom_level AS wn_bottom_level, + -- wn.situation_geometry , + wn.remark AS wn_remark, + wn.last_modification AS wn_last_modification, + wn.fk_dataowner AS wn_fk_dataowner, + wn.fk_provider AS wn_fk_provider, + + ws._label, + ws._usage_current AS _channel_usage_current, + ws._function_hierarchic AS _channel_function_hierarchic + + FROM ( + SELECT ws.obj_id, + ST_Collect(co.situation_geometry)::geometry(MultiPoint, %(SRID)s) AS situation_geometry, + CASE WHEN COUNT(wn.obj_id) = 1 THEN MIN(wn.obj_id) ELSE NULL END AS wn_obj_id + FROM qgep_od.wastewater_structure ws + FULL OUTER JOIN qgep_od.structure_part sp ON sp.fk_wastewater_structure = ws.obj_id + LEFT JOIN qgep_od.cover co ON co.obj_id = sp.obj_id + LEFT JOIN qgep_od.wastewater_networkelement ne ON ne.fk_wastewater_structure = ws.obj_id + LEFT JOIN qgep_od.wastewater_node wn ON wn.obj_id = ne.obj_id + GROUP BY ws.obj_id + ) aggregated_wastewater_structure + LEFT JOIN qgep_od.wastewater_structure ws ON ws.obj_id = aggregated_wastewater_structure.obj_id + LEFT JOIN qgep_od.cover main_co ON main_co.obj_id = ws.fk_main_cover + LEFT JOIN qgep_od.structure_part main_co_sp ON main_co_sp.obj_id = ws.fk_main_cover + LEFT JOIN qgep_od.manhole ma ON ma.obj_id = ws.obj_id + LEFT JOIN qgep_od.special_structure ss ON ss.obj_id = ws.obj_id + LEFT JOIN qgep_od.discharge_point dp ON dp.obj_id = ws.obj_id + LEFT JOIN qgep_od.infiltration_installation ii ON ii.obj_id = ws.obj_id + LEFT JOIN qgep_od.vw_wastewater_node wn ON wn.obj_id = aggregated_wastewater_structure.wn_obj_id; + +-- INSERT function + +CREATE OR REPLACE FUNCTION qgep_od.vw_qgep_wastewater_structure_INSERT() + RETURNS trigger AS +$BODY$ +BEGIN + + NEW.identifier = COALESCE(NEW.identifier, NEW.obj_id); + + INSERT INTO qgep_od.wastewater_structure( + obj_id + , accessibility + , contract_section + , financing + , gross_costs + , identifier + , inspection_interval + , location_name + , records + , remark + , renovation_necessity + , replacement_value + , rv_base_year + , rv_construction_type + , status + , structure_condition + , subsidies + , year_of_construction + , year_of_replacement + , last_modification + , fk_dataowner + , fk_provider + , fk_owner + , fk_operator + ) + VALUES + ( + NEW.obj_id + , NEW.accessibility + , NEW.contract_section + , NEW.financing + , NEW.gross_costs + , NEW.identifier + , NEW.inspection_interval + , NEW.location_name + , NEW.records + , NEW.remark + , NEW.renovation_necessity + , NEW.replacement_value + , NEW.rv_base_year + , NEW.rv_construction_type + , NEW.status + , NEW.structure_condition + , NEW.subsidies + , NEW.year_of_construction + , NEW.year_of_replacement + , NEW.last_modification + , NEW.fk_dataowner + , NEW.fk_provider + , NEW.fk_owner + , NEW.fk_operator + ); + + -- Manhole + CASE + WHEN NEW.ws_type = 'manhole' THEN + INSERT INTO qgep_od.manhole( + obj_id + , dimension1 + , dimension2 + , function + , material + , surface_inflow + ) + VALUES + ( + NEW.obj_id + , NEW.ma_dimension1 + , NEW.ma_dimension2 + , NEW.ma_function + , NEW.ma_material + , NEW.ma_surface_inflow + ); + + -- Special Structure + WHEN NEW.ws_type = 'special_structure' THEN + INSERT INTO qgep_od.special_structure( + obj_id + , bypass + , emergency_spillway + , function + , stormwater_tank_arrangement + , upper_elevation + ) + VALUES + ( + NEW.obj_id + , NEW.ss_bypass + , NEW.ss_emergency_spillway + , NEW.ss_special_structure_function + , NEW.ss_stormwater_tank_arrangement + , NEW.ss_upper_elevation + ); + + -- Discharge Point + WHEN NEW.ws_type = 'discharge_point' THEN + INSERT INTO qgep_od.discharge_point( + obj_id + , highwater_level + , relevance + , terrain_level + , upper_elevation + , waterlevel_hydraulic + ) + VALUES + ( + NEW.obj_id + , NEW.dp_highwater_level + , NEW.dp_relevance + , NEW.dp_terrain_level + , NEW.dp_upper_elevation + , NEW.dp_waterlevel_hydraulic + ); + + -- Infiltration Installation + WHEN NEW.ws_type = 'infiltration_installation' THEN + INSERT INTO qgep_od.infiltration_installation( + obj_id + , absorption_capacity + , defects + , dimension1 + , dimension2 + , distance_to_aquifer + , effective_area + , emergency_spillway + , kind + , labeling + , seepage_utilization + , upper_elevation + , vehicle_access + , watertightness + ) + VALUES + ( + NEW.obj_id + , NEW.ii_absorption_capacity + , NEW.ii_defects + , NEW.ii_dimension1 + , NEW.ii_dimension2 + , NEW.ii_distance_to_aquifer + , NEW.ii_effective_area + , NEW.ii_emergency_spillway + , NEW.ii_kind + , NEW.ii_labeling + , NEW.ii_seepage_utilization + , NEW.ii_upper_elevation + , NEW.ii_vehicle_access + , NEW.ii_watertightness + ); + ELSE + RAISE NOTICE 'Wastewater structure type not known (%%)', NEW.ws_type; -- ERROR + END CASE; + + INSERT INTO qgep_od.vw_wastewater_node( + obj_id + , backflow_level + , bottom_level + , situation_geometry + , identifier + , remark + , last_modification + , fk_dataowner + , fk_provider + , fk_wastewater_structure + ) + VALUES + ( + NEW.wn_obj_id + , NEW.wn_backflow_level + , NEW.wn_bottom_level + , ST_GeometryN( NEW.situation_geometry, 1 ) + , COALESCE(NULLIF(NEW.wn_identifier,''), NEW.identifier) + , NEW.wn_remark + , NOW() + , COALESCE(NULLIF(NEW.wn_fk_provider,''), NEW.fk_provider) + , COALESCE(NULLIF(NEW.wn_fk_dataowner,''), NEW.fk_dataowner) + , NEW.obj_id + ); + + INSERT INTO qgep_od.vw_cover( + obj_id + , brand + , cover_shape + , diameter + , fastening + , level + , material + , positional_accuracy + , situation_geometry + , sludge_bucket + , venting + , identifier + , remark + , renovation_demand + , last_modification + , fk_dataowner + , fk_provider + , fk_wastewater_structure + ) + VALUES + ( + NEW.co_obj_id + , NEW.co_brand + , NEW.co_shape + , NEW.co_diameter + , NEW.co_fastening + , NEW.co_level + , NEW.co_material + , NEW.co_positional_accuracy + , ST_GeometryN( NEW.situation_geometry, 1 ) + , NEW.co_sludge_bucket + , NEW.co_venting + , COALESCE(NULLIF(NEW.co_identifier,''), NEW.identifier) + , NEW.co_remark + , NEW.co_renovation_demand + , NOW() + , NEW.fk_dataowner + , NEW.fk_provider + , NEW.obj_id + ); + + UPDATE qgep_od.wastewater_structure + SET fk_main_cover = NEW.co_obj_id + WHERE obj_id = NEW.obj_id; + + RETURN NEW; +END; $BODY$ LANGUAGE plpgsql VOLATILE; + +DROP TRIGGER IF EXISTS vw_qgep_wastewater_structure_ON_INSERT ON qgep_od.vw_qgep_wastewater_structure; + +CREATE TRIGGER vw_qgep_wastewater_structure_ON_INSERT INSTEAD OF INSERT ON qgep_od.vw_qgep_wastewater_structure + FOR EACH ROW EXECUTE PROCEDURE qgep_od.vw_qgep_wastewater_structure_INSERT(); + +/************************************************************** + * UPDATE + *************************************************************/ +CREATE OR REPLACE FUNCTION qgep_od.vw_qgep_wastewater_structure_UPDATE() + RETURNS trigger AS +$BODY$ +DECLARE + dx float; + dy float; +BEGIN + UPDATE qgep_od.cover + SET + brand = NEW.co_brand, + cover_shape = new.co_shape, + diameter = new.co_diameter, + fastening = new.co_fastening, + level = new.co_level, + material = new.co_material, + positional_accuracy = new.co_positional_accuracy, + sludge_bucket = new.co_sludge_bucket, + venting = new.co_venting + WHERE cover.obj_id::text = OLD.co_obj_id::text; + + UPDATE qgep_od.structure_part + SET + identifier = new.co_identifier, + remark = new.co_remark, + renovation_demand = new.co_renovation_demand, + last_modification = new.last_modification, + fk_dataowner = new.fk_dataowner, + fk_provider = new.fk_provider + WHERE structure_part.obj_id::text = OLD.co_obj_id::text; + + UPDATE qgep_od.wastewater_structure + SET + obj_id = NEW.obj_id, + identifier = NEW.identifier, + accessibility = NEW.accessibility, + contract_section = NEW.contract_section, + financing = NEW.financing, + gross_costs = NEW.gross_costs, + inspection_interval = NEW.inspection_interval, + location_name = NEW.location_name, + records = NEW.records, + remark = NEW.remark, + renovation_necessity = NEW.renovation_necessity, + replacement_value = NEW.replacement_value, + rv_base_year = NEW.rv_base_year, + rv_construction_type = NEW.rv_construction_type, + status = NEW.status, + structure_condition = NEW.structure_condition, + subsidies = NEW.subsidies, + year_of_construction = NEW.year_of_construction, + year_of_replacement = NEW.year_of_replacement, + fk_owner = NEW.fk_owner, + fk_operator = NEW.fk_operator + WHERE wastewater_structure.obj_id::text = OLD.obj_id::text; + + IF OLD.ws_type <> NEW.ws_type THEN + CASE + WHEN OLD.ws_type = 'manhole' THEN DELETE FROM qgep_od.manhole WHERE obj_id = OLD.obj_id; + WHEN OLD.ws_type = 'special_structure' THEN DELETE FROM qgep_od.special_structure WHERE obj_id = OLD.obj_id; + WHEN OLD.ws_type = 'discharge_point' THEN DELETE FROM qgep_od.discharge_point WHERE obj_id = OLD.obj_id; + WHEN OLD.ws_type = 'infiltration_installation' THEN DELETE FROM qgep_od.infiltration_installation WHERE obj_id = OLD.obj_id; + END CASE; + + CASE + WHEN NEW.ws_type = 'manhole' THEN INSERT INTO qgep_od.manhole (obj_id) VALUES(OLD.obj_id); + WHEN NEW.ws_type = 'special_structure' THEN INSERT INTO qgep_od.special_structure (obj_id) VALUES(OLD.obj_id); + WHEN NEW.ws_type = 'discharge_point' THEN INSERT INTO qgep_od.discharge_point (obj_id) VALUES(OLD.obj_id); + WHEN NEW.ws_type = 'infiltration_installation' THEN INSERT INTO qgep_od.infiltration_installation (obj_id) VALUES(OLD.obj_id); + END CASE; + END IF; + + CASE + WHEN NEW.ws_type = 'manhole' THEN + UPDATE qgep_od.manhole + SET + dimension1 = NEW.ma_dimension1, + dimension2 = NEW.ma_dimension2, + function = NEW.ma_function, + material = NEW.ma_material, + surface_inflow = NEW.ma_surface_inflow + WHERE obj_id = OLD.obj_id; + + WHEN NEW.ws_type = 'special_structure' THEN + UPDATE qgep_od.special_structure + SET + bypass = NEW.ss_bypass, + emergency_spillway = NEW.ss_emergency_spillway, + function = NEW.ss_function, + stormwater_tank_arrangement = NEW.ss_stormwater_tank_arrangement, + upper_elevation = NEW.ss_upper_elevation + WHERE obj_id = OLD.obj_id; + + WHEN NEW.ws_type = 'discharge_point' THEN + UPDATE qgep_od.discharge_point + SET + highwater_level = NEW.dp_highwater_level, + relevance = NEW.dp_relevance, + terrain_level = NEW.dp_terrain_level, + upper_elevation = NEW.dp_upper_elevation, + waterlevel_hydraulic = NEW.dp_waterlevel_hydraulic + WHERE obj_id = OLD.obj_id; + + WHEN NEW.ws_type = 'infiltration_installation' THEN + UPDATE qgep_od.infiltration_installation + SET + absorption_capacity = NEW.ii_absorption_capacity, + defects = NEW.ii_defects, + dimension1 = NEW.ii_dimension1, + dimension2 = NEW.ii_dimension2, + distance_to_aquifer = NEW.ii_distance_to_aquifer, + effective_area = NEW.ii_effective_area, + emergency_spillway = NEW.ii_emergency_spillway, + kind = NEW.ii_kind, + labeling = NEW.ii_labeling, + seepage_utilization = NEW.ii_seepage_utilization, + upper_elevation = NEW.ii_upper_elevation, + vehicle_access = NEW.ii_vehicle_access, + watertightness = NEW.ii_watertightness + WHERE obj_id = OLD.obj_id; + END CASE; + + UPDATE qgep_od.vw_wastewater_node NO1 + SET + backflow_level = NEW.wn_backflow_level + , bottom_level = NEW.wn_bottom_level + -- , situation_geometry = NEW.situation_geometry -- Geometry is handled separately below + , identifier = NEW.wn_identifier + , remark = NEW.wn_remark + -- , last_modification -- Handled by triggers + , fk_dataowner = NEW.fk_dataowner + , fk_provider = NEW.fk_provider + -- Only update if there is a single wastewater node on this structure + WHERE fk_wastewater_structure = NEW.obj_id AND + ( + SELECT COUNT(*) + FROM qgep_od.vw_wastewater_node NO2 + WHERE NO2.fk_wastewater_structure = NO1.fk_wastewater_structure + ) = 1; + + -- Cover geometry has been moved + IF NOT ST_Equals( OLD.situation_geometry, NEW.situation_geometry) THEN + dx = ST_XMin(NEW.situation_geometry) - ST_XMin(OLD.situation_geometry); + dy = ST_YMin(NEW.situation_geometry) - ST_YMin(OLD.situation_geometry); + + -- Move wastewater node as well + UPDATE qgep_od.wastewater_node WN + SET situation_geometry = ST_TRANSLATE(WN.situation_geometry, dx, dy ) + WHERE obj_id IN + ( + SELECT obj_id FROM qgep_od.wastewater_networkelement + WHERE fk_wastewater_structure = NEW.obj_id + ); + + -- Move covers + UPDATE qgep_od.cover CO + SET situation_geometry = ST_TRANSLATE(CO.situation_geometry, dx, dy ) + WHERE obj_id IN + ( + SELECT obj_id FROM qgep_od.structure_part + WHERE fk_wastewater_structure = NEW.obj_id + ); + + -- Move reach(es) as well + UPDATE qgep_od.reach RE + SET progression_geometry = + ST_ForceCurve (ST_SetPoint( + ST_CurveToLine (RE.progression_geometry ), + 0, -- SetPoint index is 0 based, PointN index is 1 based. + ST_TRANSLATE(ST_PointN(RE.progression_geometry, 1), dx, dy ) + ) ) + WHERE fk_reach_point_from IN + ( + SELECT RP.obj_id FROM qgep_od.reach_point RP + LEFT JOIN qgep_od.wastewater_networkelement NE ON RP.fk_wastewater_networkelement = NE.obj_id + WHERE NE.fk_wastewater_structure = NEW.obj_id + ); + + UPDATE qgep_od.reach RE + SET progression_geometry = + ST_ForceCurve( ST_SetPoint( + ST_CurveToLine( RE.progression_geometry ), + ST_NumPoints(RE.progression_geometry) - 1, + ST_TRANSLATE(ST_EndPoint(RE.progression_geometry), dx, dy ) + ) ) + WHERE fk_reach_point_to IN + ( + SELECT RP.obj_id FROM qgep_od.reach_point RP + LEFT JOIN qgep_od.wastewater_networkelement NE ON RP.fk_wastewater_networkelement = NE.obj_id + WHERE NE.fk_wastewater_structure = NEW.obj_id + ); + END IF; + + RETURN NEW; +END; $BODY$ LANGUAGE plpgsql VOLATILE; + +DROP TRIGGER IF EXISTS vw_qgep_wastewater_structure_ON_UPDATE ON qgep_od.vw_qgep_wastewater_structure; + +CREATE TRIGGER vw_qgep_wastewater_structure_ON_UPDATE INSTEAD OF UPDATE ON qgep_od.vw_qgep_wastewater_structure + FOR EACH ROW EXECUTE PROCEDURE qgep_od.vw_qgep_wastewater_structure_UPDATE(); + + +/************************************************************** + * DELETE + *************************************************************/ + +CREATE OR REPLACE FUNCTION qgep_od.vw_qgep_wastewater_structure_DELETE() + RETURNS trigger AS +$BODY$ +DECLARE +BEGIN + DELETE FROM qgep_od.wastewater_structure WHERE obj_id = OLD.obj_id; +RETURN OLD; +END; $BODY$ LANGUAGE plpgsql VOLATILE; + +DROP TRIGGER IF EXISTS vw_qgep_wastewater_structure_ON_DELETE ON qgep_od.vw_qgep_wastewater_structure; + +CREATE TRIGGER vw_qgep_wastewater_structure_ON_DELETE INSTEAD OF DELETE ON qgep_od.vw_qgep_wastewater_structure + FOR EACH ROW EXECUTE PROCEDURE qgep_od.vw_qgep_wastewater_structure_DELETE(); + +/************************************************************** + * DEFAULT VALUES + *************************************************************/ + +ALTER VIEW qgep_od.vw_qgep_wastewater_structure ALTER obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','wastewater_structure'); +ALTER VIEW qgep_od.vw_qgep_wastewater_structure ALTER co_obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','structure_part'); + + +END TRANSACTION; diff --git a/metaproject b/metaproject index 1bbae923..39f2080a 160000 --- a/metaproject +++ b/metaproject @@ -1 +1 @@ -Subproject commit 1bbae923feb2ec15791f40ad3fa492496f591cbc +Subproject commit 39f2080a393a4646e7f4293af4d02be5f2260307 diff --git a/test/test_on_delete.py b/test/test_on_delete.py index fa8d9699..663070f6 100644 --- a/test/test_on_delete.py +++ b/test/test_on_delete.py @@ -22,7 +22,7 @@ def test_delete_wastewater_structure(self): # Create a new cover(structure part) with manhole(wastewater structure) row = { 'identifier': 'CO698', - 'level': decimal.Decimal('50.000'), + 'co_level': decimal.Decimal('50.000'), 'ws_type': 'manhole' } diff --git a/test/test_triggers.py b/test/test_triggers.py index 2e1fe8bb..a104e5b0 100644 --- a/test/test_triggers.py +++ b/test/test_triggers.py @@ -53,15 +53,22 @@ def test_last_modified(self): def test_identifier(self): row = { - 'level': decimal.Decimal('50.000'), + 'co_level': decimal.Decimal('50.000'), 'ws_type': 'manhole' } obj_id = self.insert_check('vw_qgep_wastewater_structure', row) row = self.select('vw_qgep_wastewater_structure', obj_id) + + for r in row: + print(r) + row = self.select('structure_part', row['co_obj_id']) + for r in row: + print(r) + identifier = row['identifier'] assert identifier, "Identifier not set on insert: {}".format(repr(identifier)) diff --git a/test/test_views.py b/test/test_views.py index 241eaa8c..4769ae64 100644 --- a/test/test_views.py +++ b/test/test_views.py @@ -54,8 +54,8 @@ def test_vw_qgep_reach(self): row = { 'clear_height': 100, 'coefficient_of_friction': 10, - 'identifier': 'pra', - 'usage_current': 4514 + 'ws_identifier': 'pra', + 'ch_usage_current': 4514 } obj_id = self.insert_check('vw_qgep_reach', row) @@ -63,8 +63,8 @@ def test_vw_qgep_reach(self): row = { 'clear_height': 200, 'coefficient_of_friction': 20, - 'identifier': '10', - 'usage_current': 4516 + 'ws_identifier': '10', + 'ch_usage_current': 4516 } self.update_check('vw_qgep_reach', row, obj_id) @@ -74,8 +74,8 @@ def test_vw_qgep_wastewater_structure(self): 'identifier': '20', 'ws_type': 'manhole', 'situation_geometry': '0104000020080800000100000001010000000000000020D6434100000000804F3241', # SELECT ST_SetSRID(ST_GeomFromText('MULTIPOINT(2600000 1200000)'), 2056) - 'cover_material': 5355, - 'backflow_level': decimal.Decimal('100.000') + 'co_material': 5355, + 'wn_backflow_level': decimal.Decimal('100.000') } expected_row = copy.deepcopy(row) @@ -86,8 +86,8 @@ def test_vw_qgep_wastewater_structure(self): row = { 'identifier': '10', 'ws_type': 'special_structure', - 'cover_material': 233, - 'upper_elevation': decimal.Decimal('405.000'), + 'co_material': 233, + 'ss_upper_elevation': decimal.Decimal('405.000'), } self.update_check('vw_qgep_wastewater_structure', row, obj_id) diff --git a/test_data/qgep_demodata_1.0.0.dump b/test_data/qgep_demodata_1.0.0.dump index 5e414a099c7d6acbe82766553bf3e6754d0f9517..848e78b3112ba7c2a782f9d4333372c672a46b61 100644 GIT binary patch delta 117800 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�&aE?PN7Yl;&em4tAzo8S9Nj(W6W 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

(+?jx%b;81gkJB~h}fIXCOA}d z>#6rqM$A@S1l$&`!>h+b_OfoO+8eF#5afffKs+~k87J$vcg8J4)M#E7t<9&#;uuIx zWLWQnv3;{)S3Q4+u5UlL=~>I|Y3z8S3X{Dp8nnJU^%~)9YFv_vIj~I(5}*B4PsA)# zK0hxw5T~ZltUWpx%tB$h(FxYS&nqyC*9)liu~|z1VCY_v%g1^qb5`r@U^RHZE^YwF zk6c{D=FLy{Dyb^VETrPIKmiq)wFd;}5T=bOT^uFZ;le5=(yuho4j$5Jm{OY2jkWd+ zw!Mh@I?QY$XqRDJ(7A#hHZ)De8nJZ}5@Ws=i9V)fs8}KXmJf-a9T8jtm~AS3fbZIS zim8}rW)uKz=(mCvLT|j*3%&7t2^GE3pA1^)m`=k~(2C}7w3i@Ah6CQxY8pFSN`;;J zCIuDWeOxaR2U=arsMr}lUl@r`oX{(dP)&MIx`FF5Oex2EQja3w9Cu3Off*>TVwq7d zjVGQFc|uX#9h3B^yp2X+m_AcUEyDU%RBK?~N(XT3Sv@z7uFh0aVT?N!Lt;;u3XEM$ z0WGM)7JD($v;LfkkhaK*6#}0pSMfVB4X@XZU4<|k1mCN3}UtnM;MJbpoB2t{S{v$isX8C;{QAp~|@`=TR>h5ahF zEbo^E^vR1H3jZ@4!5A@o?c~^w30=n{d~X7)5L9ujI<7nvc>R*Vd!qW#*`W?pHKf8I z{#pUFMOU~iA?!RZR#i7)>{dbnpI_tJ!;@A~Zmzw9?bM>|PIc9dPdimWPWVOS!S=nT z3iFlaM&itydLft+g0x@{0t>%TQ^f&5Ey$0>W03mPQh%XK9w5uZwtzc~zaCe8+{;*L zmVOL4tp;?fPaGZVA%bfE$MC;Z`PE{ax`CGa)Iu|F=_TWXKw=%W0VcNq`0e^bBnH@o zx;*iv5E9$p5#of<-;6lBc2=pribd~+ssO~?(*bxd3s=H;Al_Pyu#3-Vs4lb7JJq3? z_wEY-?*ux42h?R5jn#4ZAW##4Cm#xc55@q1H1?p0ileDrS!!V_ZR5M;5Uf8gEphIN zE!6z%R5Nv#joQ}+;Ape}@MAQb_!VWhTBt+tHRUnT2FB<#>^ZRHqh(D%yR7LnOb(rO8Q9uv zZU}}pgJ$L@3YrJHT;;I1?YW~1fB2LaE4e^gvg!sGG?c19n>i{>hm~S zNXsu!e9Z||Dcwv`dS|r^OMF)CVWV!XfLdKZp!gmDsA6<&H&(X`>hjBqhf(*c(L zoQmCLqt?JTPuB66Gg@1La@oNy+)nm+3V^FHM9>{(jcT;^3<4>mWfG}>FEy6!>!#Mh z+|mZ9Nw7>DwO;Q4z%S`KAdrcDiVi^F+*0r0e22VioM>eA!k zw&_VH?6c_m@5NOwS3xS>G; z#8e#hDOMdh6IF#ePE_xUTL_<9MTJFCrzW8&y;6En=O(Fp#HECjW>J_oPfu18gT$vE47ON|lVzim-uo2ufVClvOwq0`g?^1F0`o($z;^3)$4(Pp5c zx*V&fL81aP)KB!!&Nhe1z|WjBRh%UA@6EQNW^#b_Ar*(g{L`*2!%Pm+?pf+-9z-uM zl|G;k2E-|?G6xr9=by&z`uf|dB0ubwHZz480A=M@-EuNHj88`s=BgRut1f-C50MA7 zsj3p=<35#V=cz@+hh2n0;dON&*%MV(Hp02QMd;E>Rbd?#s4n?|x9wrxNyE5@#P1x? zl^h&v>Q(RfCX{e9N8O=+# z&zpvRq;uZ*j=Ej{G;3>XvIw#jOH`-)7@BsB>nV(V;N^Gmc{Squ=JDe~EK@%cUp(JBq2sVZ(BDnlvK+IBUbX&j0k?Cx`l0>})Hc8n!0l#h-s8=u zf7e8eKcPV^9Eu4It}Ts?QXgoLput3{xl+9(KWpG)=OdprhMHWxtlcU#4(q>laP%E+ zCgZ-&YBf3H=sry6-x*yr_-BP@BQ))bkOa zGAV9>S{B;F<^L(`)he8m`2myu$b;1+?==Vg0E;jOc}>aB$B%lTgLH4eITG{K4^Uqh{C#@88HRh5pU(uG8Y|aYvOB zf{dz?RERzIp_(YZ7Sdzq^^Sngcgr`Sdz+u{J~Wwn*`3X5b@THbZ7Cx8LIe1=*Xv`x zk~F{IQG>JyvY#E^q81e&@u+8UsTrOzK*hGfqVTVC(Tfd>67~dH{q5L^{ud8XN4|BR z>(OZaS;$E0zxVH4xzZ(5VeudRD!ts2H-uxpznr{}Uj18R$s1;UcdAwYTKaWAI=D9q zc`+WbXx87yZ2zfRnyw$g$Z7VedhO5d9dV*}Q2%v~#;dfxkyFddK&cqJ#Qr31<2X z+!19n538mBblHtQapMS7d&^R7h?V~GFEGU!;uWirCpr3#C0>|q{z{$nm(gA(E@aY` z^;n_LTcRqM!f>RbZ&34oqlOu#u+U#d)HU_;B-^kl$2y$L>5i(vr-x2Q)e2(JAHR){ z3|GHZzyGTY`Ug!Qux1MEiOS>xPdTO{=04U2Y{W5D{mW=~%J=99PmR+zNpSz-S3Bs7 z?^HZd&6hEl1&Yv#?=TZ@KZfJx$z@%MH0wKc*#hm zwsw_t=`d^IN+UmdhB58S?=$C|GG?s_m!RY+r_>976|Eks8+|30dvITv9X$6JSP0~5{-BR$ zO;^ic%Z{5r?a%)O76Q4&3((ma`q7Qwt)I0})&+b~z@jz!PjBM1$YCUd;8}~ofyO+B zPZRogxwAj3ZnphroId_l22Z~kvB`8PPM+srjeu8I^pAXbZ{TV{mrH7ezl^9Ie~C+` z#_#Bs6<={ee71#@8I*Vx-wMiqht)xYD{84fU0ylt7c5Rpv8^zBfL|^VxxoEbEAjNq zHJH`jch$t1->5}ct!p^9{j)noWN-G#r+%#7yxOcwK)-gwmG5WR@K*fO1y>`6Aw0UG zf6&iv{XzD|FZjUwXRFnisHXmb3+WqlEpl5MVm*Jw1(Lstbh<~!CR4gFEBw3K^)Dlx z?p3nIkPf$VF5dbJ>F!z&c*ATprE{~{x7C_|8QpQ|s86hA<8hCPe=4Afchyqd1U>w# z^ua096Y*q4LWHDV{mT&*xsOXF{A`UJ_thW%D&ppB#f((LBgMs-M$n3#W0y)Q1 zYHO#0yTNJ-_Adzk!#|;6NxiKNF0w6psD5pMY$wg06PU4ByMe&bsArW3w)i}3(@OJ* z(uuaSIv6uG{9yEl?OW#2Qm9HE?Jy@t|51qY#%TB`9)?3otvIbDYZ0TpgYVVC{~oTx z`ZsPk{K;?KermTjE;;(PnJD1Em=-Ec-*?jnr%jdlRslSHs z|NO5k_)(z8irpY6C_WKqO z9|MnF(Ry}6BhsM}myu=m|D(T;R_I^f^nq?ETID#NqXiYQYYol+WsZ;x5FJmJ{J;CR&i_EcbS4~M zjIt9oCv`~F5_11fp$!-|xYv;wqv2jh7~TM9Gc;TpU+&Vh5=KjTaM4{FQtXFyMQtXIFnf)*S9^w06F3>DbjGYm%sQIP4ur;$vmRocP04YUq{Jr1XtXub zIz>0e<2<^Z|3`m~pj~(oSQjEF=LxTfgUQpxe-5)GuU-}Nx3V`zea{>N?IcsI*wYM1icbD7&O-i^tCNveB>yEo0eSSw zqqqDk8AJhy4EO)b9;vSXPwBn+zt?Asx$2SinbVwH{q)gNS7E~WM*;S3CvA)kVR=O+ zeZ=66hxxY_gt0P?ZMhH8yscyB@yleilvdUk`W6GMCg2^v*k6}AXpaI zP~uSRK$=#=c|fNZwD>$D9${!O{!jn@s|Eq_=>O}Q$dh=yRU_$U4QbrT#B@3|TT5_3 zJKm@w7*l#wfDF1ZOv9CeVH(0xW91VAf;$wXrHd0YbbJi(KDO#*ErUOqB^U>ThS{Y6YvQI~9eQZvC z9-xbYo6+>@%UYQ@5Mf)WHez(K(XVRRHV2G`gy1dM2O@u%<$q0UgLkE*q@j>|#z+@u zjTiGkDmQI%;W+y6h?Ybd6SSfl=xn)!d^BaIR)C7m(8{oK)3oVm>wwU12;nYUX9#dO63hVpC=%zU+r@Moe8C@O zN^1#2=)wW${h1kBnBixg$h;V6B}86#6hh+7*YdNhx3#V|>NqQj*BgN_my{9!j|30^ zMXBW+@GU&kl|BKyQELt0uqj7HEng9IQG#}ty3h{ zO|N-%EDk1d{fl>-j1~B_HD6`hEd(OBe&JUj)KS_W}apiDWdb#j|nj z;Y#S&V&f6RHZ3PX|q_(k+fKD3Yl9`&u>q zm(?N8Y`{mC>+3b=(%I{@2qpn)P+c(bGnDje1Sv=dY6y7)QSEuf)2HS1bx|LtRhqW8 zZyd|spshs6Rl_`HQqL?`Sqv|4Fapj1KMj{f6NRWHwFK8t1Wa%}^MV{MeKu%W)9{N` z->kKc$PIfo<1ryFLceX%(8WH+P^hp2m0qwML!td{oNiv;f<6X<133+g>UPtRx_VAT z&P2}9ku(prs4r-4!L{RdW8miIN+86OeV$f~GPY{1_|G`9 zeVAD2+AavT9Rqb*#v5@AvLXz?mg$;3+U=tmjRX{<&44mMI~oW-HE$viJ_{k3^`9EY zChxMC1?YBDQ3<>!vqvj4Epu8Nq01!Ep*>nj{a3w@wemD)x3Z)=~i>0iuHRm)=OyJ#a`yy8?WqhMGMp6Q$ z9@R!m&LMhwov1~S?tKTd_~5AKLwNI*yx1_=TMJ@H5Z^j(67ij7&Xa-|X2^*!hk7Qj zn=*SQiS-laRoru$a#9-xBW1L4fPU?jWUiM2ZdUs=lv)Hn;-YKG2e_=|&^ux|1QUT< zKehBHCn!%zS3xTDJvO$^v)c1m-vo`^0eWGnwb}}J*@xeQy#os(gFUTYE&-gSFRHo- z#rotqm`Q7)gz&3-RzxuJvr^}^9+t5U;N65(lAafQ0=f_Avt9aj?%tzsH#&O;E5-9a zY0WIl2#!@Uq-J=@K}?nFHX{nz@SnAbwj#zdEG!==w-oT6xgHFJSglLiK!6Pc^>^SE z7C6ipx^V+j7+w2O!+Heuq0E;gQ`Mh|muWI!wDbs~Uo>(hvyC^k z`Uo8PlNMiqgCE&otTS653+52!(7Xj$qu;9#4i1PjH>hIc+TupUvVFW$E zX8oa!#DgA2{zuE)VCpa!WXvenFzI6-7i9ih^KZJ1J!{S@=PUH7!Uynv;OzB zx_GVBYz4{~WeottSHJi`8;@1eO+#BBHqC2}pOAaQ3fFjB5o3w@_X^r<3X2d{y`x>v zpeS=RP(pcG6nY$<9QTp!OT5+dYsgiAYQ?%-EEwbJ3gOMs5uhWlSRDYNMtn5&EA-I| zv96)OnJN!Zx%E<|oU=cwCKWpZZ_Io#=qPvXF2tcvaM{^+@h(IdIyhX5`>)z|tJ$^) z;~Nl9ZOpN|#^o9_-8M#)6O5{=Ke<8As0fHV(cya0R>WK+{9WJKZt)LAHPr)=vTW70 zBVrOqb3WWG3&3_S6xMx9yS&(`4{o}-i@H*2i_7I;qg}36$YnNRfMT~;Jqi&?oOxZL zh&e7m1uI%@9CovzNv1Eh_% zdK4m;%q`#=h`7>r!7V_yUbET^@gklU?{xG^c6|*t5p8z$jR>3{D%o)kuM+)H##LZu zVd!&rA=em$pfNl0BSY~sv!@}Bs( zC{W4uSgygbeWygn0Ud;W9CZs1@nCotWSc6x+Ti7jVlLgRKH5HC8|}j%ByE_9w!}-Q zM*9TFJw8HjVdzbNd?eQ6!fb)njM9FhBO~nUgm^I( zjVwR{Mi9U?^xg5eV-0Ih|YkB4qRG*Nx9vl-Q0l_N&Lqgp#*YR!$v`!!rx z515mPpI9)W%tL$5Gzs}o!Ws1j7>n9sS$uM+y0pAJzEhhQ6%8e zdFqTQ4uY!W)OEeXpD#7R^wdF1_jojWXnhzB2No&@H=2A{0`lU`22WIFXrh0Q{#`os zAJ~ub=EZl2$qijj*1Dm~4=GG*^r%vPu%z&^?TuX6BjIANS;*P1Bc$-LmzwYyp<|XY z9twRc$u7v?*MmRwAK2shPJ{XINujLft~l1LnJX*TAnAB4f@gs3Xzm)7t0kWKPSPD< z8q^0-{~>g?y(@*yZ0Yjg@Xc(MM|FD9s!fPJc-++;hi_H`P^SwKC5PGER@}0gr*l{o z&Z%KFAs&A4wZ?>u7fcO(_^JD}2!NaIeiCySU2SUUV|-Qw*~11u&4(PK@SA<4b?pd% zm!-9Jbw+)x{{4v2zG>FSi@}iXYRBJZk<93~mU)epxZCSzjoP`M%B9Eo7p>ajt%)P; zU9Z@v**ZhkHFc#Zus)crLX@c_6<|3XVNGcANU@ypQ<*vu0*6?=XL)0pGWe;>NezdN zZoE5nx3eoJqI^uEr*#tc-iNzjDB!5mYB!qry&$^Tx^AvPk>{XjhJ5D)(ZjNPxLR|f z*@%9+^CLebbz{D1Nc~fiin6#~u9+NT4jwKbWHM!BzAA-5u8}$b)qBWnm zD$4P*g?(L*=c-qYp9Lwv%Jhd>L_Tu}1*pI!K@75s0|e1*;s8CkCWs-nYLKg5ghu?d z<+2bx9QBxZCZ^61%-P^=b^v^sF2MI?Zn#3)UU2O}gUxfvb@<`Vg5qWmUUbdJ>$6`P zjZ`R^pRTy!=GWAG4Mr>zE5C%b;^852aje8J*Cea~O+^N1=kK~Sm^m7X*I;6YyJki1 z#{3ljn}G0@|5aRH6V#K!P)F^ykOI(}~M@I&^^3w22I9AZpa`q&~vHY*Q3Sc&m zXwo;j2_=PChc{d&L5pa%%pO9HFlsZP9%?gYtgB1pV!%%y_tYVXqga=04VIH>h5TWBl;o}TnH?CdYLPZ@0R>@ub(ae9+5gc(S@yZ#1yk_fFOC< z$jL5jSJ7Ukp}jX)(0r`LR4hiR#%o52yKm_I39Pw01sz!m!}@s+CQ#Qj*RKvZNeCWz zMlG;f@W6>B{0msW>8=)7wf5E-`P|g&rdB48-yNX0lW?fee5NaozFUg(xu)*AIZ!^8}3SU`GQ(H8%eJG*7)#wsos4dmAH4!rK(Ib-$samd-HIF< z*9jcr+S+x&@cb#imCRbsc2$em*!uib#UTK0hWn)xAoMFjXl!{^LBV$zT;inq%P|Y= zpXb7pyygZLCsp6&6DY5K^^ry{;PcJ`mkN|IGVy3oqo)PR$8g;ayVm||HM`A6J|aQyDuFD zD1>8XR|!0cwoBt98W%SUKg-XB+_3-Vw`7KI$?ef6jdg|JM>pH(`LWl;H@coyE8wZz zK7Z(~fE(i-SGx8`j9q+8dZxQ&xv{zIv>KD0zN^P(&j0AddC8n;LSA-zjq3@U-JCdS zUA3fQ@)MamZ~Ms{Qi zi^z@vS%RntK24+WG>Se15d!*X77={%P((l!L=lliM0u<#h=At*tLnMo-Xz~SALqGp~D((w5>Q(K@3d>QqX9xL{&GZKWp9Y5)XT(`@KqbENYXM~BYYdVf{?uz3`-Dupd zF5B;h=ts+Tek6`it+?e3f6ItOWl+maMRAv~nyTepA3KN3zdv%q8Je}k2n&Zp$i@Qe zED{RC1(VILMVI%8zMW|9#j%2b!u5r;gaHRl4LC5L z2Z0AgGp_=HTIE&l!k(&`c;q{ERc1+VT&_|2>9FR3FD}VHcfo z4sr}_`A4K!xO`i=_83xA+%o#S^C`k>vpa+$jRkc?oe7K=JH&5(a*hCAk3G(GRhGv) z%#YXQma~3#b_I2@NoCrkyTs5LSm2@4iTtV9;FSF0M4--NOIw`ICXQ?XK+I$X;Fk3- z@ly5QQihusod+=iWBrZ5xIcPX;qZ6fE&l!<1Ph(XIMUqm`c>x%y6DW`bFq0ZE|VR> zD5|>Yy5y!J?vk^vxcvrfGVibC2J+Z)0-uC&i=y#tM(2im_%}>A0PIP?rz|VR7cXC&JVouRRqA5*Hl-=T0q!#94I8LHf=g&cy_&#()eAK}VE{&_&!R zTw84Z?nwxRzA?`=Y-q^kD=kE!==nH8n~7w_#( zBOJ@8Xth7i@1aZZK2_bW^js|+&TQKv!R|^yUjCD*29bt4fm&jlQdCz@RCg?`uA}3? z`rJ>P)!59=KZfI>zdOPG$0F~|;1b~Bj&R%VfbAz3EbpWOb0bD}4=XNOsv=v~*Wt1B z+ExgxELG#c9qtG3RPNP?Z-AQ|`o!rQsD^)x>8i%XkvuVAcD~lh?)jzzV7lkx^>3(# zy|NI=8i#x5ucu?x4DST@&i= zr5g4eLdZgFNW*6Q6K6)^EHIbS7!R|C#g_HLXZ z%y79s6CC71rFgN)rPq@~TI-1K_B_cgBUPy+q)y=_1>?411a5E&m9Z)MLxj*j1|P$U z%hzcP-~#!sOMi&~?8!pdmXL`qTSzis)ya8j`XvIeyN=N9ey9o4u&60;#6mC z`5%vt^r^dNsY{6Ce$)u0N{~cS*eI1+(G^cM~5sD^==BdmqNKUu+NMP z{U8C@{iR$KI#F!aAKV&-(OS&P(3{KRHu_vmwE3A^LoNydx&LxThq)n9Dz$-pQddzI zw9_Tw^YFu6mM~)K#x9OFHX&G;!cMOq$_7*y%I&GMPMX`BzuH zrb86}hF(Kv%v*|%jH%5pp)C4z*P+6^wyK8kR6Xqw&22zgB&eP~-xJK*vZszD3a_oB zA?XzG>=*_HGqhB|xG5@1bl(UoB%-%Ij%wIbgv~e;Vsxk;9pc7rtYJ6UgrD@`g={Ns zH#XtdLU5Rx+hDrGta?3Le~z%&69a3P4>CJ9i$?)%GQO|A0x1k7G(?Yh?Gkv)m`g8l zaize^CUST`9hO;ZO$P+-a3Kg^9m4Oy<|%vtq^G#!pqD-|F&5`MjjBr`%L84~MC{1X z6JE-U43i}TbzF$_Y-NH=S8xaFF%qo(Z831(xnPo_VR{YOX_!8Q;B9tAIK_`MCP^oFtp556ULT1Y_{eS)up5!Umtj;96Z@Gp zMe<}FdF1pq`mD1#T{BfxtQ?`g7X>ZO=+bOqO5I33!rcHvy2P^4dZOGoQiq?_>$d{% zNiH4m7X1~E7@Lu2N9$`r65Bv@<7V9>9uR+jf&y^M$zw3FQC`0}U|Xux*5XD?7VJPW z$LZ?{#$ID?+tLM0|E4@ltiFb7n7hZ~`jkx*u#|gG&<9f`KW)@t2yvq(j2I4}Ia4r% z>JzbW0BEm0aGfHeNAye6X=1>Z08EnKPSQtdrr##88Ont%*zhHc5SA6-;Gnw;y%&yX zjUUg)U#s_S*<~u^YpFfpNfqsSf*NluBle=3{g9G7S8pgz){CqyF3rbewQgXZT}Kg!*-Q`0L|uQKHUb{eDrj8EF_v zGxa^C<^ntp=aNDWjMueNe24@iKcwyEgD6ndCbcCc^HHXcF ztAiP4bQ|Id+_5KLnG0?T_xVi*kH{X3jukDZ6#zp*p2^n>wdy{+Xw8K)*o%6`{K85~1BxCAYfgOLeF)J+hv}x5l`7XHIAI$Cj1U$d(=^O(3`^ z`epqXuBGb=3j18*!!5W-y5k0QKNB$12>b&*+n|ysXluj@Ai2FA8!;fK>@f0 z0P2Zjlc20?ys38=8{W`=0k~~LB3+!p|MJnK`mnnoaCv17c0{68UmBKAK`gzkAlx$l zE$k%3Uk}sEbTR2IbZ1#F6Kv)K2RuLlnha6YEiyvFnAog|&-()qIpPd>r9bhb4~A7+ z0!$aU>#Lfqw_b-^-{)8S=_v|$>p%tuA7n7FY`Fmv7;tvyF%yh*b&i5_<9;wkiaWrf zBy|3M0=7jl_UH^8I*SPd2FNbPj;1gdQ)}Ngk_K(RE01`O<_y=G(x(J@Tl6EE17sES z!9(FBZVD#W{rp2}l*y+;#%%n9K?mqCJuhUg2xkGsRF%F#RZX9&No zQ)mxQHJVN3(ZkqE-UUPeP~1(n2?OMYa0g&)bqk0&t=z4j1;5!W;IS18&KeZ|SitlG zGj&qYr#Abrtt%OV8|B!iSiA)ap?Du;IsO(V;aF@yh|~SSkBc{U%6a z8vwAi1fA?BzFk6-ggkdRH8{HU%4a&98a~?)z>VO7&e#(vLx?izP$liekuP<(cycV( z`0JnRYY5msAg|zK+n&y(nMsGq)=>dxjl(&Y`w!{w5wL$WJ_WpP8TSBc=Y9hAisC#l z#qBS!o&c<7&;vJt!n~YjFda7B;V<w65w zoZm&@fs24Kt$mR(VPk~b$?A%t@ANnkzXqF~=a1{V5iqxhlp?N-!AWIr6f$Ng85l-1 z{LB-2W%0@#XLMl}SRk{V*+di{(_%NBy)GfqArNEXAI&ziTogFrGac z=XLmL*8BwHkD%=-OR=Zy&Dx9)Rve}b+ph(YhN$zEK8yb+AN@sd&b4e#gcE@&wtqF# z!Rwa$FY5mw2-~{#z*W$23;fy%wl^^yifGj(csopc&isd^AQ&SS_$XSC4i4(TS;X?W zEBX#CDh+9U#Ck5jahU8C@3vu3uvB{$Tl(iUeR~B+)5Vw$kx7O-9SgZBaFpi%8o$9J zJa`E<(|0jutVlO%R2RkDs~aNzGB%?1e$%U!$A;B-z9XEqkU+`u(ckrxS|TGBsbsS|vVkW`TKxAa+BVz~hap7Mi1RDz?) zMhZ(W>^3$FNDfo;j&CTH1OC-V87Y|W!W{;<*HiYei+Q6J04$%s;8qB~*Q%Jj3*Ory z{x-0MT2%s9K)ES{SLe^X$fO9!IyYZnHe%=mvBF{8Cr)C=E??1%KIm9LyX2bI9`oac zUP}rw=7Au%kC-PI4jyt&YvW5n-12z7zcvhzkV6M*vP&RD|k=7xrPsh#7U_eXM(`kU;NM;FkU>#;FDvf zu?p`Mhq~M@b_GvI9EV=J<-0WvET%y6zUGEkY0Fl)ogjj-ajs1Ofvb&fy$}!l&KRI& z9*H*Y22+IZop|IX#3#gbGH$7+{8PCt#(;w-kaFxdj{Fu5Bfybl;k3=Y^^M)Z4YK3a z@eYlM(hon1Ga?*8OO?HXvx1P-K3wnBE&?YK?cxnN{xo~(KlrVIG zTlQ&UlwmA(+r@@(FR*%BHZxwWKs@2B`;t!>33eu7EsX!+hR@|jwGjC4Me7&gMk+qQ z1i`i>rIi8ul-@d0(_g~n+~U{$>YZEmO*Y`-4d|knRD?m^uEEV?y|#533xlb|?wx4| z83R06C8@?!!Bk)e&cMSAfQ7o-4c-c5{P}$#5M$%H1xWL`UV{@A?vasQFIHnlfF)Wt z-FO>h^aoD;YZV)`3rCp(Sf?c!AY)X(GE}7Ydc}eh41=ZmeH#Ni_<;H34dDCdxgD(3 zP3??r!L;BF;Kd%)Qw06xTbWpTWd&3!tn=R=#Qp~$$p7kSoTR>%%1Q1A?UANs!y^Gz zl`MC5GTyBKjaM8^rLH2RE#K+_kU%NHo1D8(a8Ix_pYLXzCZd<>Eb*!jCRxM`Vk!#9 z_bScbl83rO;*`^GX%K@$N5jNKgr1Bt&dR#g(>M$Y+@mz4Ja#i92Sd99j<$nC7dzu+ zQXk`k;6=ff<7=IWlrAjVhS|nvgs7AZN+uJTXi0n!(n^Drj z7LACH!$(3X9^w?@(lV}}F&4ur_4(L78)znXJE(0B1QR6u2F!=ueA&d2On)obcGy*)9Qyxi<=sBq z3Jf3{^w9ACzg8adx568Xh;c^OL9HeNhgN3rtut%eWSdfP@^z7iX2DY?me(T%qRROdmH+V|m_SyYc_1g02GGl!(6o=1-hjZVci#}Km zvn+@}92uJ)LCql+j~&T}%Z()Y;R^=BY;J#o4TL(w_5G6wP9b?8!-@XYjGE%zXH2-I zh0$LOtcH~DMl9g>2egm^C6>2=mtd)aW{8zfs@A;`nQyKIeS4Ke#l-TaUOkg@W~RprzN z1^Yhr5bGm`FBkvQ7*@d+rkwI<%(4J=V2w3?jTOedHK&*Y?u^|TwBJetLmeur7;o8Y zN}KrcLf7TJQ88YhINY8jExbaIfY2t*Mcp4UxFK&E$rbdy+|{DV{x)F39eN8!Rs~zO zvInt1kMlk-4O@|AYoTDv>3z~n)3do>U`J#vtTkGTl68n}9xgUKA}iO3l!w+CX2mrZ z3};Hg?2CKHSQ)%PS&sMT4q(t=#SD_;Zt?EB3VE~`pNCEGq)|pw@x^ANs`&67qc*+0 z5VX!2%|QP+;AEe_uX;_fz8I1;z8I0OxE~<};x`$-;MVDuMe*!NULdd;3yWEx-bOR340!a+E|TT;Yz@0R!^pd&*M1XLWHBQ=T6wZU054 z1Y7R>x6wHm73CI*c5?|8!vC_JH1NT4pa5imBM%d|AtR?!teCUIs3)D$A=_fkl==p1vFnv+2bQ)P!Jjh>;ACT?n4eUi8_R$4v)~f?zmSpyR({I4}$6IMow?i<6rU8#_1`j`*a0x=YHYtfH~5|wXY4Y z>~YMX4;up5h_&9f%RDz=i7Q_l$lWRj@a1oe2n=DX#f#rS7zM#`Udgn7Q^(-8!W5DE z6o6|eFPtzYQ~+F1m1c+h)T~3_K8a-!R@$^EPJoR$dIBS4b;XG)GfrXuS{AA+ytHT* zDk_!KV;vED)`*c4PM4ia)@QSIMhPwDVPFYhm)Jt_TKs;YwKs;p7$9J_dl}AnTg)j@%QL43JTk7BMnKW$jnTu%{NoVH4z2aC>f-B?ZGJwdQ`pn0xZBfzS5>=aDlh zP9_roLiRHG@3In(0hW2FB?{IfWTcs`|6R{Sl5-#)&OvzjS)v%l>o;m9ZDRu1l>uhH zpa77_8)BB(eR074-4|)vy;$Nc#GDW_N%pB?_6kPCaEDhiB4~vZRn5mLFcEwyB4!mi zF%Ybm^Fqx@6~nB(U?hbArmzv5QS~Cs_?PN|F<6Y9UZGc(Md4-{F~*Vh{=aZHvE9j_ zj|}l0T!hJXi)~uG7H)Q?zXclKlM<$wTl7KTO5Tk$XJ}>ssn{AsFn;?3dK1tB zEZ|d+pF7QY6+$lStRQK6vZBn^a;H&temDSrrYp}gc%pYy+4*6Bv};UO@I*|lipUDX zS)6LlWCdI7sa+9S38qQ1g254J(dMV+Nl(7PrG3cfgHS!vDe=`~XVI&kO+$$o1+r<% zlf*4dmyr~PN{CXEXyeZySJgL>{Zk&=BmQ@jp}`=TerN&cM#zXUL*=G8b3(=Sat3qP zpfoyA*g8gxO)&41tK!Wkf|nwPt%rJPEg;~JFc$$!0KZWI+^4f?;(g$u_JuQ@b>+xL z=1b+9r%3n2xzs#D{*^isqyS_i5!oDF&Tni^uDDL$yGX=99rBEA?pdwA?AgSmja>i- zo~c$1IS_wyZ^2;r_5yGMa7`IGncdNHRWp#je6>R*v@nnzAlkQ!h>?R^mQ2~PRDhh$SQjdEvZqdtS zHWOE8LU)nLEu4QVRQ1GRm)VY9^bqnqZd(QVW#!fZg~CVVAR_JYfn9swLo0!HXGO$x zi+?R852+8a?1`NtYDp{2oF3d+4m+FS2p%E*t?d!rHXbQkJmLS^v3V^4M;5Ly&wYwWkt&V0H&BrSs4k8Ba=WO#RS_yD{vkLaKWF)C6 zazI~mE|A=F5tbrJoKIv=M|?3(4C-q(kg5I5hbso1y_6(0E-;t>?GKI@n;xd`>1-1T z>4D(s2^NSd(^Q*ut?- z)Qb;4D1mIpEd}6}@#D=Sz;G{GpaACdfee7L=8~=RpuzlcB=Vt%TH= zJhPU(HqmUNX4rw1#xOS@W*CGM8Y`Fylfmyny=Az=i@*)uWaLd`D&>~(xQXnjK>lMT zc>e;1bGcv;vBm^kJvrqGb14a>djT~DPRNBO^d^IcZS_jP;=389Q-aU_i33?m-MeBk zl4``h;amYHD>W{h4P98O3*@Ua&4ggF$3*Uj9A%Iw)hqv=1ri0xMF#k9K4ZigKs{I) z@10}*U49vnGLFfHxbr5bdAH`9HG;jktWYP6WK768PEnz&q4Q0OLkGCJIdqjZkSUIg zUUd?#XtM~*d;9_zf5-^1;{ix9U`6^-8zv`m-94;GC4kH54uOp0^d8a}*{i@r zwtk?ZVc?gM3kr}GO)DOMJbPl&7~ko!|b9{7ie=z1FLOvPq)>d&b9 z#6>B|Ub*Zg^M-bRSrL-vPAT&(VoPZjkG zPV6`FMB%B4rxu>tcqUECo~Gvv~2YgF-&^dR~3jl(yxB1fbW`q z4JatdYlP=MJdN=r;c0@WDV}C{n&WAKrzM_Ncv|C0#*>1_g(p>(i^qp29Zv?H`|-5F(-u!VJnivh$^mb7IIn4gR9EnQGWEz(1->e#UyrB)-~H0B zM^%A5D*AOm6`ynAI2a>`tnE-(#c?R6;MRr?csk;FK;GKW>0(Fiu!8+U6-QL@r7FHs z#ZgrpQ^nV+IHiiys`!Bm$2TzriPt;f>5Qifp00Sh;dxLdUhf`~>Np-#(4>v34Cyq-ovi6EW2b_+}F$L#}2FY_pIi1^TR~6Lt7}51q z&NA&g_4BtF`TMDyIhy157%}B^&UVL*7}4@f&KHiGF{0#5&KSoZ*r}e)dCYMuMjSnx z^PA((7_t9c&P~Vd7-Tl#{hb)m;ylW`F+!XN++Q(5`w8XWaN6cszdA}{#G@B-ytut` zPd}@Nrpa>`a$FA0A!}dE$#rNU@`+11BOO|0`Q4SA<_@ijtad$Ty{1)_TYk-XNz+ z^QPt$<8S92)pXh6PELzZ%@BDZRyRmW8Dbp>g``{%VGV(#{4v6st<@4kBCYqe+M-qs zYqf?9uo~7?En2?ev|==^uGpnpKWj1KUxsyAt0!JGt?OESu{g^5OpBG-HLZhTTAXMQ zXKjJh`!dcNt;LIs2G(O*L$RiT^&t{Bhs9fKv_x68q4lH&Nw+A$D$wqek%?Aaht^mm z-DiCVQ5Vt}O*fH6jjgeo)>Kw+V!iBuuzRbS^(KT}_vY44t%a!C!V(a6uePw>(prg5 zEv@|!b~RdA8?|J)tCdw%gS6Y*+S;JG93z9*^~qrujsa&-w!L?nj^XA1y1a*S zy2`u0nKqTMoxXu zs#{s>jZY7(ueCmMWN)jZre(>u`&c_2TDBbV5WuyE#2#o0u=x_b44G`4_SQoW{^5y_E3rRF-khKjbB{a>!)L7!}9BaKcSoF25w;_q{T37|S z;?iJ{;ZZr_5i3#ChKMD()>&<+9QUYIUDJk%=|ikj+Hlc-sC7&mAzBQ>T#gi>!_kjX z^3CD2en!jPBdp_9khLksT2dP$`i!$))5aFgv2JPO#LweValH6&0>(W-^*m4Ye4^_4 zB>Cw?tC6Nn7MCYki?u0Y>SU1oaT!0w(jE9rKV_=*iuQ!~d@7dOH1W(6)^=^W=seAO zUYjA0O|zgKX38I?TMuj6ESWab>fq33i)pj1r?olUgSo2BCsmvIs?B*~%9B_p^F?UB zRj55BUdzW?Um(WL!#Z9lYRpF)i^Qk%t=F~1V(e3x-2&Nif#uM&B_eqtP(LkpEVOoM xOT~;u*5}$YqVr-b)MtgWz*?z2C*Cdqm6wUWORT4~=f&4cK#k>c+S68+_J4M`&FlaG delta 101118 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 K{OD;jgZ)4EK*Q4j diff --git a/view/vw_qgep_reach.py b/view/vw_qgep_reach.py new file mode 100755 index 00000000..b5c02694 --- /dev/null +++ b/view/vw_qgep_reach.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +from __future__ import print_function +import imp +import os +import sys + +pgiv = imp.load_source('PGInheritanceViewRecursive', + os.path.join(os.path.dirname(__file__), + '../metaproject/postgresql/pg_inheritance_view/pg_inheritance_view_recursive.py')) + +if len(sys.argv) > 1: + pg_service = sys.argv[1] +else: + pg_service = 'pg_qgep' + +if len(sys.argv) > 2: + srid = sys.argv[2] +else: + srid = 2056 + + +qgep_reach = """ +table: qgep_od.wastewater_networkelement +alias: networkelement +pkey: obj_id +pkey_value: qgep_sys.generate_oid('qgep_od','wastewater_networkelement') +pkey_value_create_entry: False +schema: qgep_od +generate_child_views: True +exec_order: 1 +isroot: True + +children: + reach: + c_table: qgep_od.reach + table: qgep_od.vw_reach + pkey: obj_id + alias: reach + pkey_value: COALESCE(NEW.obj_id, qgep_sys.generate_oid('qgep_od','reach')) + schema: qgep_od + generate_child_views: True + exec_order: 2 + trig_here: True + + children: + wastewater_structure: + c_table: qgep_od.wastewater_structure + table: qgep_od.wastewater_structure + alias: wastewater_structure + prefix: ws + pkey: obj_id + pkey_value: COALESCE(NEW.fk_wastewater_structure,qgep_sys.generate_oid('qgep_od','channel')) + schema: qgep_od + generate_child_views: False + exec_order: 3 + trig_here: True + + children: + channel: + table: qgep_od.channel + c_table: qgep_od.channel + pkey: obj_id + generate_view: False + pkey_value: NEW.fk_wastewater_structure + + reach_point_from: + table: qgep_od.reach_point + c_table: qgep_od.reach_point + pkey: obj_id + generate_view: False + pkey_value: COALESCE(NEW.rp_from_obj_id, qgep_sys.generate_oid('qgep_od','reach_point')) + alias: rp_from + schema: qgep_od + + reach_point_to: + table: qgep_od.reach_point + c_table: qgep_od.reach_point + pkey: obj_id + generate_view: False + pkey_value: COALESCE(NEW.rp_to_obj_id, qgep_sys.generate_oid('qgep_od','reach_point')) + alias: rp_to + schema: qgep_od + +merge_view: + name: vw_qgep_reach + allow_type_change: false + allow_parent_only: false +""" + +trigger_plan = """ +view: qgep_od.vw_node_element + +view: qgep_od.vw_element_installation + trig_for: + qgep_od.node + qgep_od.network_element + qgep_od.source + qgep_od.pump + qgep_od.tank + qgep_od.treatment + qgep_od.chamber + qgep_od.pressurecontrol + +view: qgep_od.vw_element_hydrant + trig_for: + qgep_od.node + qgep_od.network_element + hydrant + +view: qgep_od.vw_element_samplingpoint +view: qgep_od.vw_element_meter +view: qgep_od.vw_element_subscriber +view: qgep_od.vw_element_part + + +""" +# fix_print_with_import + +# fix_print_with_import +print(pgiv.PGInheritanceViewRecursive(pg_service, qgep_reach).sql_all()) diff --git a/view/vw_qgep_reach.sql b/view/vw_qgep_reach.sql index 5eaa4e8b..3b3431f9 100644 --- a/view/vw_qgep_reach.sql +++ b/view/vw_qgep_reach.sql @@ -3,23 +3,28 @@ DROP VIEW IF EXISTS qgep_od.vw_qgep_reach; CREATE OR REPLACE VIEW qgep_od.vw_qgep_reach AS -WITH active_maintenance_event AS ( +/* WITH active_maintenance_event AS ( SELECT me.obj_id, me.identifier, me.active_zone, mews.fk_wastewater_structure FROM qgep_od.maintenance_event me LEFT JOIN qgep_od.re_maintenance_event_wastewater_structure mews ON mews.fk_maintenance_event = me.obj_id WHERE active_zone IS NOT NULL -) +) */ SELECT re.obj_id, re.clear_height AS clear_height, + re.material, + ch.usage_current AS ch_usage_current, + ch.function_hierarchic AS ch_function_hierarchic, + ws.status AS ws_status, + ws.fk_owner AS ws_fk_owner, + ch.function_hydraulic AS ch_function_hydraulic, CASE WHEN pp.height_width_ratio IS NOT NULL THEN round(re.clear_height::numeric * pp.height_width_ratio)::smallint ELSE clear_height END AS width, re.coefficient_of_friction, re.elevation_determination, re.horizontal_positioning, re.inside_coating, re.length_effective, - CASE WHEN rp_from.level > 0 AND rp_to.level > 0 THEN round((rp_from.level - rp_to.level)/NULLIF(re.length_effective,0)*1000,1) ELSE NULL END AS slope_per_mill, - re.material, + CASE WHEN rp_from.level > 0 AND rp_to.level > 0 THEN round((rp_from.level - rp_to.level)/re.length_effective*1000,1) ELSE NULL END AS _slope_per_mill, re.progression_geometry, re.reliner_material, re.reliner_nominal_size, @@ -29,39 +34,36 @@ SELECT re.obj_id, re.slope_building_plan, re.wall_roughness, re.fk_pipe_profile, - ch.bedding_encasement, - ch.function_hierarchic, - ch.connection_type, - ch.function_hydraulic, - ch.jetting_interval, - ch.pipe_length, - ch.usage_current, - ch.usage_planned, - ws.obj_id AS ws_obj_id, - ws.accessibility, - ws.contract_section, - ws.financing, - ws.gross_costs, - ws.inspection_interval, - ws.location_name, - ws.records, - ws.renovation_necessity, - ws.replacement_value, - ws.rv_base_year, - ws.rv_construction_type, - ws.status, - ws.structure_condition, - ws.subsidies, - ws.year_of_construction, - ws.year_of_replacement, - ws.fk_owner, - ws.fk_operator, ne.identifier, ne.remark, ne.last_modification, ne.fk_dataowner, ne.fk_provider, ne.fk_wastewater_structure, + ch.bedding_encasement AS ch_bedding_encasement, + ch.connection_type AS ch_connection_type, + ch.jetting_interval AS ch_jetting_interval, + ch.pipe_length AS ch_pipe_length, + ch.usage_planned AS ch_usage_planned, + ws.obj_id AS ws_obj_id, + ws.accessibility AS ws_accessibility, + ws.contract_section AS ws_contract_section, + ws.financing AS ws_financing, + ws.gross_costs AS ws_gross_costs, + ws.identifier AS ws_identifier, + ws.inspection_interval AS ws_inspection_interval, + ws.location_name AS ws_location_name, + ws.records AS ws_records, + ws.remark AS ws_remark, + ws.renovation_necessity AS ws_renovation_necessity, + ws.replacement_value AS ws_replacement_value, + ws.rv_base_year AS ws_rv_base_year, + ws.rv_construction_type AS ws_rv_construction_type, + ws.structure_condition AS ws_structure_condition, + ws.subsidies AS ws_subsidies, + ws.year_of_construction AS ws_year_of_construction, + ws.year_of_replacement AS ws_year_of_replacement, + ws.fk_operator AS ws_fk_operator, rp_from.obj_id AS rp_from_obj_id, rp_from.elevation_accuracy AS rp_from_elevation_accuracy, rp_from.identifier AS rp_from_identifier, @@ -83,18 +85,18 @@ SELECT re.obj_id, rp_to.last_modification AS rp_to_last_modification, rp_to.fk_dataowner AS rp_to_fk_dataowner, rp_to.fk_provider AS rp_to_fk_provider, - rp_to.fk_wastewater_networkelement AS rp_to_fk_wastewater_networkelement, - am.obj_id AS me_obj_id, + rp_to.fk_wastewater_networkelement AS rp_to_fk_wastewater_networkelement + /* am.obj_id AS me_obj_id, am.active_zone AS me_active_zone, - am.identifier AS me_identifier + am.identifier AS me_identifier */ FROM qgep_od.reach re LEFT JOIN qgep_od.wastewater_networkelement ne ON ne.obj_id = re.obj_id LEFT JOIN qgep_od.reach_point rp_from ON rp_from.obj_id = re.fk_reach_point_from LEFT JOIN qgep_od.reach_point rp_to ON rp_to.obj_id = re.fk_reach_point_to LEFT JOIN qgep_od.wastewater_structure ws ON ne.fk_wastewater_structure = ws.obj_id LEFT JOIN qgep_od.channel ch ON ch.obj_id = ws.obj_id - LEFT JOIN qgep_od.pipe_profile pp ON re.fk_pipe_profile = pp.obj_id - LEFT JOIN active_maintenance_event am ON am.fk_wastewater_structure = ch.obj_id; + LEFT JOIN qgep_od.pipe_profile pp ON re.fk_pipe_profile = pp.obj_id; + /* LEFT JOIN active_maintenance_event am ON am.fk_wastewater_structure = ch.obj_id; */ -- REACH INSERT -- Function: vw_qgep_reach_insert() @@ -163,7 +165,7 @@ BEGIN , NEW.rp_to_fk_wastewater_networkelement -- fk_wastewater_networkelement ) RETURNING obj_id INTO NEW.rp_to_obj_id; - + INSERT INTO qgep_od.wastewater_structure ( obj_id , accessibility @@ -185,37 +187,37 @@ BEGIN , subsidies , year_of_construction , year_of_replacement - , last_modification - , fk_dataowner - , fk_provider + -- , last_modification + -- , fk_dataowner + -- , fk_provider , fk_owner , fk_operator ) VALUES ( COALESCE(NEW.fk_wastewater_structure,qgep_sys.generate_oid('qgep_od','channel')) -- obj_id - , NEW.accessibility - , NEW.contract_section + , NEW.ws_accessibility + , NEW.ws_contract_section -- , NEW.detail_geometry_geometry - , NEW.financing - , NEW.gross_costs - , NEW.identifier - , NEW.inspection_interval - , NEW.location_name - , NEW.records - , NEW.remark - , NEW.renovation_necessity - , NEW.replacement_value - , NEW.rv_base_year - , NEW.rv_construction_type - , NEW.status - , NEW.structure_condition - , NEW.subsidies - , NEW.year_of_construction - , NEW.year_of_replacement - , NEW.last_modification - , NEW.fk_dataowner - , NEW.fk_provider - , NEW.fk_owner - , NEW.fk_operator + , NEW.ws_financing + , NEW.ws_gross_costs + , NEW.ws_identifier + , NEW.ws_inspection_interval + , NEW.ws_location_name + , NEW.ws_records + , NEW.ws_remark + , NEW.ws_renovation_necessity + , NEW.ws_replacement_value + , NEW.ws_rv_base_year + , NEW.ws_rv_construction_type + , NEW.ws_status + , NEW.ws_structure_condition + , NEW.ws_subsidies + , NEW.ws_year_of_construction + , NEW.ws_year_of_replacement + -- , NEW.ws_last_modification + -- , NEW.fk_dataowner + -- , NEW.fk_provider + , NEW.ws_fk_owner + , NEW.ws_fk_operator ) RETURNING obj_id INTO NEW.fk_wastewater_structure; @@ -232,14 +234,14 @@ BEGIN ) VALUES( NEW.fk_wastewater_structure - , NEW.bedding_encasement - , NEW.connection_type - , NEW.function_hierarchic - , NEW.function_hydraulic - , NEW.jetting_interval - , NEW.pipe_length - , NEW.usage_current - , NEW.usage_planned + , NEW.ch_bedding_encasement + , NEW.ch_connection_type + , NEW.ch_function_hierarchic + , NEW.ch_function_hydraulic + , NEW.ch_jetting_interval + , NEW.ch_pipe_length + , NEW.ch_usage_current + , NEW.ch_usage_planned ); INSERT INTO qgep_od.wastewater_networkelement ( @@ -327,7 +329,7 @@ CREATE OR REPLACE RULE vw_qgep_reach_on_update AS ON UPDATE TO qgep_od.vw_qgep_r , fk_provider = NEW.rp_from_fk_provider , fk_wastewater_networkelement = NEW.rp_from_fk_wastewater_networkelement WHERE obj_id = OLD.rp_from_obj_id; - + UPDATE qgep_od.reach_point SET elevation_accuracy = NEW.rp_to_elevation_accuracy @@ -345,42 +347,42 @@ CREATE OR REPLACE RULE vw_qgep_reach_on_update AS ON UPDATE TO qgep_od.vw_qgep_r UPDATE qgep_od.channel SET - bedding_encasement = NEW.bedding_encasement - , connection_type = NEW.connection_type - , function_hierarchic = NEW.function_hierarchic - , function_hydraulic = NEW.function_hydraulic - , jetting_interval = NEW.jetting_interval - , pipe_length = NEW.pipe_length - , usage_current = NEW.usage_current - , usage_planned = NEW.usage_planned + bedding_encasement = NEW.ch_bedding_encasement + , connection_type = NEW.ch_connection_type + , function_hierarchic = NEW.ch_function_hierarchic + , function_hydraulic = NEW.ch_function_hydraulic + , jetting_interval = NEW.ch_jetting_interval + , pipe_length = NEW.ch_pipe_length + , usage_current = NEW.ch_usage_current + , usage_planned = NEW.ch_usage_planned WHERE obj_id = OLD.fk_wastewater_structure; UPDATE qgep_od.wastewater_structure SET - accessibility = NEW.accessibility - , contract_section = NEW.contract_section + accessibility = NEW.ws_accessibility + , contract_section = NEW.ws_contract_section -- , detail_geometry_geometry = NEW.detail_geometry_geometry - , financing = NEW.financing - , gross_costs = NEW.gross_costs - , identifier = NEW.identifier - , inspection_interval = NEW.inspection_interval - , location_name = NEW.location_name - , records = NEW.records - , remark = NEW.remark - , renovation_necessity = NEW.renovation_necessity - , replacement_value = NEW.replacement_value - , rv_base_year = NEW.rv_base_year - , rv_construction_type = NEW.rv_construction_type - , status = NEW.status - , structure_condition = NEW.structure_condition - , subsidies = NEW.subsidies - , year_of_construction = NEW.year_of_construction - , year_of_replacement = NEW.year_of_replacement + , financing = NEW.ws_financing + , gross_costs = NEW.ws_gross_costs + , identifier = NEW.ws_identifier + , inspection_interval = NEW.ws_inspection_interval + , location_name = NEW.ws_location_name + , records = NEW.ws_records + , remark = NEW.ws_remark + , renovation_necessity = NEW.ws_renovation_necessity + , replacement_value = NEW.ws_replacement_value + , rv_base_year = NEW.ws_rv_base_year + , rv_construction_type = NEW.ws_rv_construction_type + , status = NEW.ws_status + , structure_condition = NEW.ws_structure_condition + , subsidies = NEW.ws_subsidies + , year_of_construction = NEW.ws_year_of_construction + , year_of_replacement = NEW.ws_year_of_replacement , fk_dataowner = NEW.fk_dataowner , fk_provider = NEW.fk_provider , last_modification = NEW.last_modification - , fk_owner = NEW.fk_owner - , fk_operator = NEW.fk_operator + , fk_owner = NEW.ws_fk_owner + , fk_operator = NEW.ws_fk_operator WHERE obj_id = OLD.fk_wastewater_structure; @@ -424,8 +426,10 @@ CREATE OR REPLACE RULE vw_qgep_reach_on_delete AS ON DELETE TO qgep_od.vw_qgep_r DELETE FROM qgep_od.reach_point WHERE obj_id = OLD.rp_to_obj_id; ); +--missing: delete also connected wastewater_structure (and subclass channel or other), structure_parts, re_maintenance_events + ALTER VIEW qgep_od.vw_qgep_reach ALTER obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach'); ALTER VIEW qgep_od.vw_qgep_reach ALTER rp_from_obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach_point'); ALTER VIEW qgep_od.vw_qgep_reach ALTER rp_to_obj_id SET DEFAULT qgep_sys.generate_oid('qgep_od','reach_point'); -ALTER VIEW qgep_od.vw_qgep_reach ALTER fk_wastewater_structure SET DEFAULT qgep_sys.generate_oid('qgep_od','channel') +ALTER VIEW qgep_od.vw_qgep_reach ALTER fk_wastewater_structure SET DEFAULT qgep_sys.generate_oid('qgep_od','channel'); diff --git a/view/vw_qgep_wastewater_structure.sql b/view/vw_qgep_wastewater_structure.sql index b0220d91..166762db 100644 --- a/view/vw_qgep_wastewater_structure.sql +++ b/view/vw_qgep_wastewater_structure.sql @@ -5,35 +5,21 @@ BEGIN TRANSACTION; DROP VIEW IF EXISTS qgep_od.vw_qgep_wastewater_structure; CREATE OR REPLACE VIEW qgep_od.vw_qgep_wastewater_structure AS - SELECT - ws.obj_id, - main_co.brand, - main_co.cover_shape, - main_co.diameter, - main_co.fastening, - main_co.level, - main_co.material AS cover_material, - main_co.positional_accuracy, - aggregated_wastewater_structure.situation_geometry, - main_co.sludge_bucket, - main_co.venting, - main_co_sp.identifier AS co_identifier, - main_co_sp.remark, - main_co_sp.renovation_demand, - main_co_sp.last_modification, - ws.fk_dataowner, - ws.fk_provider, + SELECT + ws.identifier as identifier, CASE - WHEN mh.obj_id IS NOT NULL THEN 'manhole' + WHEN ma.obj_id IS NOT NULL THEN 'manhole' WHEN ss.obj_id IS NOT NULL THEN 'special_structure' WHEN dp.obj_id IS NOT NULL THEN 'discharge_point' WHEN ii.obj_id IS NOT NULL THEN 'infiltration_installation' ELSE 'unknown' END AS ws_type, + ma.function AS ma_function, + ss.function as ss_function, + ws.fk_owner, + ws.status, - main_co.obj_id as co_obj_id, - ws.identifier as identifier, ws.accessibility, ws.contract_section, ws.financing, @@ -41,61 +27,81 @@ CREATE OR REPLACE VIEW qgep_od.vw_qgep_wastewater_structure AS ws.inspection_interval, ws.location_name, ws.records, - ws.remark AS ws_remark, + ws.remark, ws.renovation_necessity, ws.replacement_value, ws.rv_base_year, ws.rv_construction_type, - ws.status, ws.structure_condition, ws.subsidies, ws.year_of_construction, ws.year_of_replacement, - ws.fk_owner, + ws.last_modification, ws.fk_operator, - ws._label, + ws.fk_dataowner, + ws.fk_provider, ws._depth, - COALESCE( mh.dimension1, ii.dimension1 ) AS dimension1, - COALESCE( mh.dimension2, ii.dimension2 ) AS dimension2, - COALESCE( ss.upper_elevation, dp.upper_elevation, ii.upper_elevation ) AS upper_elevation, - - mh.function AS manhole_function, - mh.material, - mh.surface_inflow, - - ws._usage_current AS channel_usage_current, - ws._function_hierarchic AS channel_function_hierarchic, - mh._orientation AS manhole_orientation, - - ss.bypass, - ss.function as special_structure_function, - ss.stormwater_tank_arrangement, - - dp.highwater_level, - dp.relevance, - dp.terrain_level, - dp.waterlevel_hydraulic, - - ii.absorption_capacity, - ii.defects, - ii.distance_to_aquifer, - ii.effective_area, - ii.emergency_spillway, - ii.kind, - ii.labeling, - ii.seepage_utilization, - ii.vehicle_access, - ii.watertightness, - - wn.obj_id AS wn_obj_id, - wn.backflow_level, - wn.bottom_level, - -- wn.situation_geometry , - wn.identifier AS wn_identifier, - wn.remark AS wn_remark, - wn.last_modification AS wn_last_modification, - wn.fk_dataowner AS wn_fk_dataowner, - wn.fk_provider AS wn_fk_provider + ws.obj_id, + + main_co_sp.identifier AS co_identifier, + main_co.brand AS co_brand, + main_co.cover_shape AS co_shape, + main_co.diameter AS co_diameter, + main_co.fastening AS co_fastening, + main_co.level AS co_level, + main_co.material AS co_material, + main_co.positional_accuracy AS co_positional_accuracy, + aggregated_wastewater_structure.situation_geometry, + main_co.sludge_bucket AS co_sludge_bucket, + main_co.venting AS co_venting, + main_co_sp.remark AS co_remark, + main_co_sp.renovation_demand AS co_renovation_demand, + main_co.obj_id AS co_obj_id, + + ma.material AS ma_material, + ma.surface_inflow AS ma_surface_inflow, + ma.dimension1 AS ma_dimension1, + ma.dimension2 AS ma_dimension2, + ma._orientation AS ma_orientation, + + ss.bypass AS ss_bypass, + ss.emergency_spillway AS ss_emergency_spillway, + ss.stormwater_tank_arrangement AS ss_stormwater_tank_arrangement, + ss.upper_elevation AS ss_upper_elevation, + + ii.absorption_capacity AS ii_absorption_capacity, + ii.defects AS ii_defects, + ii.dimension1 AS ii_dimension1, + ii.dimension2 AS ii_dimension2, + ii.distance_to_aquifer AS ii_distance_to_aquifer, + ii.effective_area AS ii_effective_area, + ii.emergency_spillway AS ii_emergency_spillway, + ii.kind AS ii_kind, + ii.labeling AS ii_labeling, + ii.seepage_utilization AS ii_seepage_utilization, + ii.upper_elevation AS ii_upper_elevation, + ii.vehicle_access AS ii_vehicle_access, + ii.watertightness AS ii_watertightness, + + dp.highwater_level AS dp_highwater_level, + dp.relevance AS dp_relevance, + dp.terrain_level AS dp_terrain_level, + dp.upper_elevation AS dp_upper_elevation, + dp.waterlevel_hydraulic AS dp_waterlevel_hydraulic, + + wn.identifier AS wn_identifier, + wn.obj_id AS wn_obj_id, + wn.backflow_level AS wn_backflow_level, + wn.bottom_level AS wn_bottom_level, + -- wn.situation_geometry , + wn.remark AS wn_remark, + wn.last_modification AS wn_last_modification, + wn.fk_dataowner AS wn_fk_dataowner, + wn.fk_provider AS wn_fk_provider, + + ws._label, + ws._usage_current AS _channel_usage_current, + ws._function_hierarchic AS _channel_function_hierarchic FROM ( SELECT ws.obj_id, @@ -111,7 +117,7 @@ CREATE OR REPLACE VIEW qgep_od.vw_qgep_wastewater_structure AS LEFT JOIN qgep_od.wastewater_structure ws ON ws.obj_id = aggregated_wastewater_structure.obj_id LEFT JOIN qgep_od.cover main_co ON main_co.obj_id = ws.fk_main_cover LEFT JOIN qgep_od.structure_part main_co_sp ON main_co_sp.obj_id = ws.fk_main_cover - LEFT JOIN qgep_od.manhole mh ON mh.obj_id = ws.obj_id + LEFT JOIN qgep_od.manhole ma ON ma.obj_id = ws.obj_id LEFT JOIN qgep_od.special_structure ss ON ss.obj_id = ws.obj_id LEFT JOIN qgep_od.discharge_point dp ON dp.obj_id = ws.obj_id LEFT JOIN qgep_od.infiltration_installation ii ON ii.obj_id = ws.obj_id @@ -194,11 +200,11 @@ BEGIN VALUES ( NEW.obj_id - , NEW.dimension1 - , NEW.dimension2 - , NEW.manhole_function - , NEW.material - , NEW.surface_inflow + , NEW.ma_dimension1 + , NEW.ma_dimension2 + , NEW.ma_function + , NEW.ma_material + , NEW.ma_surface_inflow ); -- Special Structure @@ -214,11 +220,11 @@ BEGIN VALUES ( NEW.obj_id - , NEW.bypass - , NEW.emergency_spillway - , NEW.special_structure_function - , NEW.stormwater_tank_arrangement - , NEW.upper_elevation + , NEW.ss_bypass + , NEW.ss_emergency_spillway + , NEW.ss_special_structure_function + , NEW.ss_stormwater_tank_arrangement + , NEW.ss_upper_elevation ); -- Discharge Point @@ -234,11 +240,11 @@ BEGIN VALUES ( NEW.obj_id - , NEW.highwater_level - , NEW.relevance - , NEW.terrain_level - , NEW.upper_elevation - , NEW.waterlevel_hydraulic + , NEW.dp_highwater_level + , NEW.dp_relevance + , NEW.dp_terrain_level + , NEW.dp_upper_elevation + , NEW.dp_waterlevel_hydraulic ); -- Infiltration Installation @@ -262,19 +268,19 @@ BEGIN VALUES ( NEW.obj_id - , NEW.absorption_capacity - , NEW.defects - , NEW.dimension1 - , NEW.dimension2 - , NEW.distance_to_aquifer - , NEW.effective_area - , NEW.emergency_spillway - , NEW.kind - , NEW.labeling - , NEW.seepage_utilization - , NEW.upper_elevation - , NEW.vehicle_access - , NEW.watertightness + , NEW.ii_absorption_capacity + , NEW.ii_defects + , NEW.ii_dimension1 + , NEW.ii_dimension2 + , NEW.ii_distance_to_aquifer + , NEW.ii_effective_area + , NEW.ii_emergency_spillway + , NEW.ii_kind + , NEW.ii_labeling + , NEW.ii_seepage_utilization + , NEW.ii_upper_elevation + , NEW.ii_vehicle_access + , NEW.ii_watertightness ); ELSE RAISE NOTICE 'Wastewater structure type not known (%)', NEW.ws_type; -- ERROR @@ -295,8 +301,8 @@ BEGIN VALUES ( NEW.wn_obj_id - , NEW.backflow_level - , NEW.bottom_level + , NEW.wn_backflow_level + , NEW.wn_bottom_level , ST_GeometryN( NEW.situation_geometry, 1 ) , COALESCE(NULLIF(NEW.wn_identifier,''), NEW.identifier) , NEW.wn_remark @@ -329,19 +335,19 @@ BEGIN VALUES ( NEW.co_obj_id - , NEW.brand - , NEW.cover_shape - , NEW.diameter - , NEW.fastening - , NEW.level - , NEW.cover_material - , NEW.positional_accuracy + , NEW.co_brand + , NEW.co_shape + , NEW.co_diameter + , NEW.co_fastening + , NEW.co_level + , NEW.co_material + , NEW.co_positional_accuracy , ST_GeometryN( NEW.situation_geometry, 1 ) - , NEW.sludge_bucket - , NEW.venting + , NEW.co_sludge_bucket + , NEW.co_venting , COALESCE(NULLIF(NEW.co_identifier,''), NEW.identifier) - , NEW.remark - , NEW.renovation_demand + , NEW.co_remark + , NEW.co_renovation_demand , NOW() , NEW.fk_dataowner , NEW.fk_provider @@ -351,7 +357,7 @@ BEGIN UPDATE qgep_od.wastewater_structure SET fk_main_cover = NEW.co_obj_id WHERE obj_id = NEW.obj_id; - + RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE; @@ -372,22 +378,22 @@ DECLARE BEGIN UPDATE qgep_od.cover SET - brand = NEW.brand, - cover_shape = new.cover_shape, - diameter = new.diameter, - fastening = new.fastening, - level = new.level, - material = new.cover_material, - positional_accuracy = new.positional_accuracy, - sludge_bucket = new.sludge_bucket, - venting = new.venting + brand = NEW.co_brand, + cover_shape = new.co_shape, + diameter = new.co_diameter, + fastening = new.co_fastening, + level = new.co_level, + material = new.co_material, + positional_accuracy = new.co_positional_accuracy, + sludge_bucket = new.co_sludge_bucket, + venting = new.co_venting WHERE cover.obj_id::text = OLD.co_obj_id::text; UPDATE qgep_od.structure_part SET identifier = new.co_identifier, - remark = new.remark, - renovation_demand = new.renovation_demand, + remark = new.co_remark, + renovation_demand = new.co_renovation_demand, last_modification = new.last_modification, fk_dataowner = new.fk_dataowner, fk_provider = new.fk_provider @@ -404,7 +410,7 @@ BEGIN inspection_interval = NEW.inspection_interval, location_name = NEW.location_name, records = NEW.records, - remark = NEW.ws_remark, + remark = NEW.remark, renovation_necessity = NEW.renovation_necessity, replacement_value = NEW.replacement_value, rv_base_year = NEW.rv_base_year, @@ -438,58 +444,58 @@ BEGIN WHEN NEW.ws_type = 'manhole' THEN UPDATE qgep_od.manhole SET - dimension1 = NEW.dimension1, - dimension2 = NEW.dimension2, - function = NEW.manhole_function, - material = NEW.material, - surface_inflow = NEW.surface_inflow + dimension1 = NEW.ma_dimension1, + dimension2 = NEW.ma_dimension2, + function = NEW.ma_function, + material = NEW.ma_material, + surface_inflow = NEW.ma_surface_inflow WHERE obj_id = OLD.obj_id; WHEN NEW.ws_type = 'special_structure' THEN UPDATE qgep_od.special_structure SET - bypass = NEW.bypass, - emergency_spillway = NEW.emergency_spillway, - function = NEW.special_structure_function, - stormwater_tank_arrangement = NEW.stormwater_tank_arrangement, - upper_elevation = NEW.upper_elevation + bypass = NEW.ss_bypass, + emergency_spillway = NEW.ss_emergency_spillway, + function = NEW.ss_function, + stormwater_tank_arrangement = NEW.ss_stormwater_tank_arrangement, + upper_elevation = NEW.ss_upper_elevation WHERE obj_id = OLD.obj_id; WHEN NEW.ws_type = 'discharge_point' THEN UPDATE qgep_od.discharge_point SET - highwater_level = NEW.highwater_level, - relevance = NEW.relevance, - terrain_level = NEW.terrain_level, - upper_elevation = NEW.upper_elevation, - waterlevel_hydraulic = NEW.waterlevel_hydraulic + highwater_level = NEW.dp_highwater_level, + relevance = NEW.dp_relevance, + terrain_level = NEW.dp_terrain_level, + upper_elevation = NEW.dp_upper_elevation, + waterlevel_hydraulic = NEW.dp_waterlevel_hydraulic WHERE obj_id = OLD.obj_id; WHEN NEW.ws_type = 'infiltration_installation' THEN UPDATE qgep_od.infiltration_installation SET - absorption_capacity = NEW.absorption_capacity, - defects = NEW.defects, - dimension1 = NEW.dimension1, - dimension2 = NEW.dimension2, - distance_to_aquifer = NEW.distance_to_aquifer, - effective_area = NEW.effective_area, - emergency_spillway = NEW.emergency_spillway, - kind = NEW.kind, - labeling = NEW.labeling, - seepage_utilization = NEW.seepage_utilization, - upper_elevation = NEW.upper_elevation, - vehicle_access = NEW.vehicle_access, - watertightness = NEW.watertightness + absorption_capacity = NEW.ii_absorption_capacity, + defects = NEW.ii_defects, + dimension1 = NEW.ii_dimension1, + dimension2 = NEW.ii_dimension2, + distance_to_aquifer = NEW.ii_distance_to_aquifer, + effective_area = NEW.ii_effective_area, + emergency_spillway = NEW.ii_emergency_spillway, + kind = NEW.ii_kind, + labeling = NEW.ii_labeling, + seepage_utilization = NEW.ii_seepage_utilization, + upper_elevation = NEW.ii_upper_elevation, + vehicle_access = NEW.ii_vehicle_access, + watertightness = NEW.ii_watertightness WHERE obj_id = OLD.obj_id; END CASE; UPDATE qgep_od.vw_wastewater_node NO1 SET - backflow_level = NEW.backflow_level - , bottom_level = NEW.bottom_level + backflow_level = NEW.wn_backflow_level + , bottom_level = NEW.wn_bottom_level -- , situation_geometry = NEW.situation_geometry -- Geometry is handled separately below - , identifier = NEW.identifier + , identifier = NEW.wn_identifier , remark = NEW.wn_remark -- , last_modification -- Handled by triggers , fk_dataowner = NEW.fk_dataowner @@ -506,11 +512,11 @@ BEGIN IF NOT ST_Equals( OLD.situation_geometry, NEW.situation_geometry) THEN dx = ST_XMin(NEW.situation_geometry) - ST_XMin(OLD.situation_geometry); dy = ST_YMin(NEW.situation_geometry) - ST_YMin(OLD.situation_geometry); - + -- Move wastewater node as well UPDATE qgep_od.wastewater_node WN SET situation_geometry = ST_TRANSLATE(WN.situation_geometry, dx, dy ) - WHERE obj_id IN + WHERE obj_id IN ( SELECT obj_id FROM qgep_od.wastewater_networkelement WHERE fk_wastewater_structure = NEW.obj_id @@ -527,13 +533,13 @@ BEGIN -- Move reach(es) as well UPDATE qgep_od.reach RE - SET progression_geometry = + SET progression_geometry = ST_ForceCurve (ST_SetPoint( ST_CurveToLine (RE.progression_geometry ), 0, -- SetPoint index is 0 based, PointN index is 1 based. ST_TRANSLATE(ST_PointN(RE.progression_geometry, 1), dx, dy ) ) ) - WHERE fk_reach_point_from IN + WHERE fk_reach_point_from IN ( SELECT RP.obj_id FROM qgep_od.reach_point RP LEFT JOIN qgep_od.wastewater_networkelement NE ON RP.fk_wastewater_networkelement = NE.obj_id @@ -541,13 +547,13 @@ BEGIN ); UPDATE qgep_od.reach RE - SET progression_geometry = + SET progression_geometry = ST_ForceCurve( ST_SetPoint( ST_CurveToLine( RE.progression_geometry ), ST_NumPoints(RE.progression_geometry) - 1, ST_TRANSLATE(ST_EndPoint(RE.progression_geometry), dx, dy ) ) ) - WHERE fk_reach_point_to IN + WHERE fk_reach_point_to IN ( SELECT RP.obj_id FROM qgep_od.reach_point RP LEFT JOIN qgep_od.wastewater_networkelement NE ON RP.fk_wastewater_networkelement = NE.obj_id