Change mapping between SumChargedEffort and OrderElement

A database refactoring has been added to make this change keep working and avoid
lose any data.

It was needed to use specific procedures for PostgreSQL and MySQL.

FEA: ItEr76S14ConcurrencyProblemWorkReports
This commit is contained in:
Manuel Rego Casasnovas 2012-03-28 16:20:20 +02:00
parent fcf8d44340
commit 7f5184b78d
4 changed files with 90 additions and 8 deletions

View file

@ -108,7 +108,7 @@ public abstract class OrderElement extends IntegrationEntity implements
private Boolean dirtyLastAdvanceMeasurementForSpreading = true;
private SumChargedEffort sumChargedEffort = SumChargedEffort.create();
private SumChargedEffort sumChargedEffort;
public OrderElementTemplate getTemplate() {
return template;

View file

@ -3,7 +3,7 @@
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
* Copyright (C) 2010-2012 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
@ -33,6 +33,8 @@ import org.libreplan.business.workingday.EffortDuration;
*/
public class SumChargedEffort extends BaseEntity {
private OrderElement orderElement;
private EffortDuration directChargedEffort = EffortDuration.zero();
private EffortDuration indirectChargedEffort = EffortDuration.zero();
@ -43,6 +45,10 @@ public class SumChargedEffort extends BaseEntity {
return create(new SumChargedEffort());
}
public OrderElement getOrderElement() {
return orderElement;
}
public void addDirectChargedEffort(EffortDuration directChargedEffort) {
this.directChargedEffort = this.directChargedEffort
.plus(directChargedEffort);

View file

@ -92,4 +92,81 @@
columnName="budget" defaultValueNumeric="0" />
</changeSet>
<changeSet id="change-mapping-order-element-and-sum-charged-effort-postgresql"
author="mrego">
<preConditions onFail="MARK_RAN">
<dbms type="postgresql" />
</preConditions>
<comment>Change mapping between OrderElement and SumChargedEffort in MySQL</comment>
<addColumn tableName="sum_charged_effort">
<column name="order_element" type="BIGINT" />
</addColumn>
<createProcedure>
CREATE OR REPLACE FUNCTION chageMappingBetweenOrderElementAndSumChargedEffort() RETURNS VOID AS $$
DECLARE
sce RECORD;
BEGIN
FOR sce IN SELECT sum_charged_effort_id AS id FROM order_element
LOOP
EXECUTE 'UPDATE sum_charged_effort '
|| 'SET order_element '
|| ' = (SELECT id FROM order_element '
|| 'WHERE sum_charged_effort_id '
|| ' = '
|| quote_literal(sce.id)
|| ') '
|| 'WHERE id '
|| ' = '
|| quote_literal(sce.id);
END LOOP;
END;
$$ LANGUAGE plpgsql;
</createProcedure>
<sql>SELECT chageMappingBetweenOrderElementAndSumChargedEffort()</sql>
<addForeignKeyConstraint constraintName="sum_charged_effort_order_element_fkey"
baseTableName="sum_charged_effort" baseColumnNames="order_element"
referencedTableName="order_element" referencedColumnNames="id" />
<dropColumn tableName="order_element" columnName="sum_charged_effort_id"/>
</changeSet>
<changeSet id="change-mapping-order-element-and-sum-charged-effort-mysql"
author="mrego">
<preConditions onFail="MARK_RAN">
<dbms type="mysql" />
</preConditions>
<comment>Change mapping between OrderElement and SumChargedEffort in PostgreSQL</comment>
<addColumn tableName="sum_charged_effort">
<column name="order_element" type="BIGINT" />
</addColumn>
<sql>DROP PROCEDURE IF EXISTS chageMappingBetweenOrderElementAndSumChargedEffort</sql>
<sql splitStatements="false">
CREATE PROCEDURE chageMappingBetweenOrderElementAndSumChargedEffort()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE sce_id INT;
DECLARE cursor_sce_ids CURSOR FOR SELECT sum_charged_effort_id AS id FROM order_element;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_sce_ids;
ids_loop: LOOP
FETCH cursor_sce_ids INTO sce_id;
IF done THEN
LEAVE ids_loop;
END IF;
UPDATE sum_charged_effort SET order_element = (SELECT id FROM order_element WHERE sum_charged_effort_id = sce_id) WHERE id = sce_id;
END LOOP;
CLOSE cursor_sce_ids;
END;
</sql>
<sql>CALL chageMappingBetweenOrderElementAndSumChargedEffort()</sql>
<addForeignKeyConstraint constraintName="sum_charged_effort_order_element_fkey"
baseTableName="sum_charged_effort" baseColumnNames="order_element"
referencedTableName="order_element" referencedColumnNames="id" />
<dropColumn tableName="order_element" columnName="sum_charged_effort_id"/>
</changeSet>
</databaseChangeLog>

View file

@ -74,12 +74,8 @@
column="scheduling_state_for_version_id" />
</map>
<many-to-one name="sumChargedEffort"
class="SumChargedEffort"
column="sum_charged_effort_id"
cascade="save-update, delete"
unique="true"
lazy="false" />
<one-to-one name="sumChargedEffort" class="SumChargedEffort"
cascade="delete" property-ref="orderElement" />
<joined-subclass name="OrderLineGroup" table="order_line_group">
<key column="order_element_id"></key>
@ -246,6 +242,9 @@
</id>
<version name="version" access="property" type="long" />
<many-to-one name="orderElement" column="order_element"
class="OrderElement" cascade="none" unique="true" />
<property name="directChargedEffort" access="field"
column="direct_charged_effort"
type="org.libreplan.business.workingday.hibernate.EffortDurationType" />