r3550 - trunk/src/main/java/fr/ifremer/isisfish/datastore/migration
Author: echatellier Date: 2011-12-01 15:43:36 +0100 (Thu, 01 Dec 2011) New Revision: 3550 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3550 Log: Migration automatique des ogive de maturit?\195?\169 et du taux de reproduction Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/migration/MigrationV33V40.java Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/migration/MigrationV33V40.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/migration/MigrationV33V40.java 2011-12-01 13:19:20 UTC (rev 3549) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/migration/MigrationV33V40.java 2011-12-01 14:43:36 UTC (rev 3550) @@ -27,11 +27,14 @@ import static org.nuiton.i18n.I18n._; +import java.math.BigInteger; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.SQLQuery; +import org.hibernate.Session; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; @@ -40,6 +43,8 @@ import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.entities.Equation; +import fr.ifremer.isisfish.entities.Population; +import fr.ifremer.isisfish.entities.PopulationImpl; import fr.ifremer.isisfish.ui.input.EquationEditorPaneUI; import fr.ifremer.isisfish.util.EvaluatorHelper; @@ -73,24 +78,57 @@ protected void prepareMigrationScript(TopiaContextImplementor tx, List<String> queries, boolean showSql, boolean showProgression) throws TopiaException { + + Session session = tx.getHibernate(); + + // get capturability value + SQLQuery query = session.createSQLQuery("SELECT p.topiaid as pop, g.topiaid as popgroup, g.id, (select count(*) FROM POPULATIONGROUP WHERE population = p.topiaid) as c FROM POPULATION p, POPULATIONGROUP g WHERE p.MATURITYGROUP = g.TOPIAID"); + List<Object[]> maturityGroupResult = query.list(); + + // get reproduction rate value + query = session.createSQLQuery("SELECT population, id, REPRODUCTIONRATE FROM POPULATIONGROUP"); + List<Object[]> reproductionResults = query.list(); + // remove maturity group - queries.add("alter table POPULATIONGROUP drop column REPRODUCTIONRATE;"); - queries.add("alter table POPULATION drop column MATURITYGROUP;"); + tx.executeSQL("alter table POPULATIONGROUP drop column REPRODUCTIONRATE;"); + tx.executeSQL("alter table POPULATION drop column MATURITYGROUP;"); // new equation - queries.add("alter table POPULATION add column MATURITYOGIVEEQUATION VARCHAR(255);"); - queries.add("alter table POPULATION add column REPRODUCTIONRATEEQUATION VARCHAR(255);"); + tx.executeSQL("alter table POPULATION add column MATURITYOGIVEEQUATION VARCHAR(255);"); + tx.executeSQL("alter table POPULATION add column REPRODUCTIONRATEEQUATION VARCHAR(255);"); // date > step - queries.add("alter table Result ALTER COLUMN resultdate RENAME TO resultstep;"); - queries.add("alter table ActiveRule ALTER COLUMN activeruledate RENAME TO activerulestep;"); + tx.executeSQL("alter table Result ALTER COLUMN resultdate RENAME TO resultstep;"); + tx.executeSQL("alter table ActiveRule ALTER COLUMN activeruledate RENAME TO activerulestep;"); // capturability equation - queries.add("alter table POPULATION add column CAPTURABILITYEQUATION VARCHAR(255);"); - queries.add("alter table POPULATION add column CAPTURABILITYEQUATIONUSED BIT default false;"); + tx.executeSQL("alter table POPULATION add column CAPTURABILITYEQUATION VARCHAR(255);"); + tx.executeSQL("alter table POPULATION add column CAPTURABILITYEQUATIONUSED BIT default false;"); + // build new equation for maturity group + for (Object[] maturityRow : maturityGroupResult) { + String population = (String)maturityRow[0]; + String populationgroup = (String)maturityRow[1]; + int groupId = (Integer)maturityRow[2]; + int groupCount = ((BigInteger)maturityRow[3]).intValue(); + if (populationgroup != null) { + Population pop = (Population)tx.findByTopiaId(population); + String content = getMaturityEquationContent(groupId, groupCount); + ((PopulationImpl)pop).setMaturityOgiveEquationContent(content); + pop.update(); + } + } + + // build new equation for maturity group and reproduction rate + List<Population> pops = tx.find("from " + Population.class.getName()); + for (Population pop : pops) { + String content = getReproductionRateContent(pop, reproductionResults); + ((PopulationImpl)pop).setReproductionRateEquationContent(content); + pop.update(); + } + + // start equation migration if (IsisFish.config.isLaunchUI()) { - // start equation migration List<Equation> equations = tx.find("from " + Equation.class.getName()); for (Equation equation : equations) { @@ -105,6 +143,7 @@ if (ok != 0) { content = StringUtils.replace(content, "Date ", "TimeStep "); content = StringUtils.replace(content, ".getDate()", ".getStep()"); + content = StringUtils.replace(content, "new Date(", "new TimeStep("); // second compilation ok = EvaluatorHelper.check(equation.getJavaInterface(), content, null); if (ok == 0) { @@ -133,4 +172,57 @@ } } } + + /** + * Return reproduction rate equation content generated from previous group + * reproduction rate fields (v3). + * + * @param pop pop + * @param reproductionResults v3 reproduction rate (gtopiaid, rate); + * @return equation content + */ + protected String getReproductionRateContent(Population pop, List<Object[]> reproductionResults) { + + StringBuffer b = new StringBuffer(); + b.append("if (group == null) return 0;\n"); + b.append("switch (group.getId()) {\n"); + for (Object[] reproContent : reproductionResults) { + String popid = (String)reproContent[0]; + int gid = (Integer)reproContent[1]; + double rate = (Double)reproContent[2]; + if (pop.getTopiaId().equals(popid)) { // take care of current pop only + b.append(" case " + gid + ": return " + rate + ";\n"); + } + } + b.append(" default: return 0;\n"); + b.append("}\n"); + + return b.toString(); + } + + /** + * Return maturity equation content generated from previous + * maturity group (v3) value. + * + * @param groupId previous group id + * @param groupCount population group count + * @return equation content + */ + protected String getMaturityEquationContent(int groupId, int groupCount) { + + StringBuffer b = new StringBuffer(); + b.append("if (group == null) return 0;\n"); + b.append("switch (group.getId()) {\n"); + for (int i = 0 ; i < groupCount; ++i) { + if (i > groupId) { + b.append(" case " + i + ": return 0;\n"); + } else { + b.append(" case " + i + ": return 1;\n"); + } + } + b.append(" default: return 0;\n"); + b.append("}\n"); + + return b.toString(); + } }
participants (1)
-
echatellier@users.forge.codelutin.com