// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.IO; using Ringtoets.HydraRing.Calculation.Data.Output; using Ringtoets.HydraRing.Calculation.Exceptions; using Ringtoets.HydraRing.IO; namespace Ringtoets.HydraRing.Calculation.Parsers { /// /// Parser for the output of Hydra-Ring calculations that compute a probability of failure. /// public class ExceedanceProbabilityCalculationParser : IHydraRingFileParser { private const string betaResultQuery = "SELECT BetaId, RingCombinMethod, PresentationSectionId, MainMechanismId, MainMechanismCombinMethod, MechanismId, LayerId, AlternativeId, Beta " + "FROM BetaResults " + "WHERE SectionId = @SectionId " + "ORDER BY BetaId DESC LIMIT 0,1;"; private const string alphaResultsQuery = "SELECT RingCombinMethod, PresentationSectionId, MainMechanismId, MainMechanismCombinMethod, MechanismId, LayerId, AlternativeId, VariableId, LoadVariableId, Alpha " + "FROM AlphaResults " + "WHERE BetaId = @BetaId " + "ORDER BY BetaId, VariableId, LoadVariableId;"; /// /// Gets the output of a successful parse of the output file. /// /// A corresponding to the section id if executed /// successfully; or null otherwise. public ExceedanceProbabilityCalculationOutput Output { get; private set; } public void Parse(string workingDirectory, int sectionId) { try { Output = DoParse(Path.Combine(workingDirectory, HydraRingFileConstants.WorkingDatabaseFileName), sectionId); } catch { throw new HydraRingFileParserException(); } } private static ExceedanceProbabilityCalculationOutput DoParse(string outputFilePath, int sectionId) { using (var sqLiteConnection = CreateConnection(outputFilePath)) { sqLiteConnection.Open(); int betaId; var exceedanceProbabilityCalculationOutput = ReadExceedanceProbabilityCalculationOutput(sectionId, sqLiteConnection, out betaId); foreach (var alpha in ReadExceedanceProbabilityCalculationAlphaOutput(sectionId, betaId, sqLiteConnection)) { exceedanceProbabilityCalculationOutput.Alphas.Add(alpha); } return exceedanceProbabilityCalculationOutput; } } private static SQLiteDataReader CreateDataReader(SQLiteConnection connection, string queryString, params SQLiteParameter[] parameters) { using (var query = new SQLiteCommand(connection) { CommandText = queryString }) { query.Parameters.AddRange(parameters); return query.ExecuteReader(); } } private static SQLiteConnection CreateConnection(string databaseFile) { var connectionStringBuilder = new SQLiteConnectionStringBuilder { FailIfMissing = true, DataSource = databaseFile, ReadOnly = true }.ConnectionString; return new SQLiteConnection(connectionStringBuilder); } #region Read AlphaResults private static IList ReadExceedanceProbabilityCalculationAlphaOutput(int sectionId, int betaId, SQLiteConnection sqLiteConnection) { var sectionIdParameter = new SQLiteParameter { DbType = DbType.String, ParameterName = "@sectionId", Value = sectionId }; var betaIdParameter = new SQLiteParameter { DbType = DbType.String, ParameterName = "@BetaId", Value = betaId }; using (var sqLiteDataReader = CreateDataReader(sqLiteConnection, alphaResultsQuery, sectionIdParameter, betaIdParameter)) { return ReadAlphaResults(sectionId, sqLiteDataReader); } } private static IList ReadAlphaResults(int sectionId, SQLiteDataReader sqLiteDataReader) { var alphaResults = new List(); while (sqLiteDataReader.Read()) { alphaResults.Add(ReadExceedanceProbabilityCalculationAlphaOutput(sectionId, sqLiteDataReader)); } return alphaResults; } private static ExceedanceProbabilityCalculationAlphaOutput ReadExceedanceProbabilityCalculationAlphaOutput(int sectionId, SQLiteDataReader sqLiteDataReader) { var ringCombinMethod = Convert.ToInt32(sqLiteDataReader["RingCombinMethod"]); var presentationSectionId = Convert.ToInt32(sqLiteDataReader["PresentationSectionId"]); var mainMechanismId = Convert.ToInt32(sqLiteDataReader["MainMechanismId"]); var mainMechanismCombinMethod = Convert.ToInt32(sqLiteDataReader["MainMechanismCombinMethod"]); var mechanismId = Convert.ToInt32(sqLiteDataReader["MechanismId"]); var layerId = Convert.ToInt32(sqLiteDataReader["LayerId"]); var alternativeId = Convert.ToInt32(sqLiteDataReader["AlternativeId"]); var variableId = Convert.ToInt32(sqLiteDataReader["VariableId"]); var loadVariableId = Convert.ToInt32(sqLiteDataReader["LoadVariableId"]); var alpha = Convert.ToDouble(sqLiteDataReader["Alpha"]); return new ExceedanceProbabilityCalculationAlphaOutput( ringCombinMethod, presentationSectionId, mainMechanismId, mainMechanismCombinMethod, mechanismId, sectionId, layerId, alternativeId, variableId, loadVariableId, alpha); } #endregion #region Read BetaResults private static ExceedanceProbabilityCalculationOutput ReadExceedanceProbabilityCalculationOutput(int sectionId, SQLiteConnection sqLiteConnection, out int betaId) { var sectionIdParameter = new SQLiteParameter { DbType = DbType.String, ParameterName = "@sectionId", Value = sectionId }; using (var sqLiteDataReader = CreateDataReader(sqLiteConnection, betaResultQuery, sectionIdParameter)) { if (!sqLiteDataReader.Read()) { throw new HydraRingFileParserException(); } betaId = ReadBetaId(sqLiteDataReader); return ReadExceedanceProbabilityCalculationOutput(sectionId, sqLiteDataReader); } } private static int ReadBetaId(SQLiteDataReader sqLiteDataReader) { return Convert.ToInt32(sqLiteDataReader["BetaId"]); } private static ExceedanceProbabilityCalculationOutput ReadExceedanceProbabilityCalculationOutput(int sectionId, SQLiteDataReader sqLiteDataReader) { var ringCombinMethod = Convert.ToInt32(sqLiteDataReader["RingCombinMethod"]); var presentationSectionId = Convert.ToInt32(sqLiteDataReader["PresentationSectionId"]); var mainMechanismId = Convert.ToInt32(sqLiteDataReader["MainMechanismId"]); var mainMechanismCombinMethod = Convert.ToInt32(sqLiteDataReader["MainMechanismCombinMethod"]); var mechanismId = Convert.ToInt32(sqLiteDataReader["MechanismId"]); var layerId = Convert.ToInt32(sqLiteDataReader["LayerId"]); var alternativeId = Convert.ToInt32(sqLiteDataReader["AlternativeId"]); var beta = Convert.ToDouble(sqLiteDataReader["Beta"]); return new ExceedanceProbabilityCalculationOutput( ringCombinMethod, presentationSectionId, mainMechanismId, mainMechanismCombinMethod, mechanismId, sectionId, layerId, alternativeId, beta); } #endregion } }