public void TestGetPODetailsID()
        {
            foreach (DbConnection connection in emptyConnections)
            {
                PredictedObservedDetails details = new PredictedObservedDetails();
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, "wheat.apsimx", details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, "wheat.apsimx", details));

                details.DatabaseTableName = "PredictedObserved";

                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, "wheat.apsimx", details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, "wheat.apsimx", details));
            }

            foreach (DbConnection connection in populousConnections)
            {
                PredictedObservedDetails details = new PredictedObservedDetails();
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, "wheat.apsimx", details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, "wheat.apsimx", details));

                details.DatabaseTableName = "PredictedObserved";

                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, null, details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 0, "wheat.apsimx", details));
                Assert.AreEqual(0, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, null, details));
                Assert.AreEqual(1, DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, 1, "wheat.apsimx", details));
            }
        }
Пример #2
0
        /// <summary>
        /// Searches the specified file and returns all instances of PredictedObserved data.
        /// </summary>
        /// <param name="fileName">Path to the .apsimx file to be searched.</param>
        private static List <PredictedObservedDetails> GetPredictedObservedDetails(string fullFileName)
        {
            List <Exception> errors;
            // note - if we get a badformat exception thrown here, it's because .net is trying to
            // load a 64-bit version of sqlite3.dll for some reason. To fix this, we need to
            // copy the 32-bit version from ApsimX/DeploymentSupport/Windows/Bin/sqlite3.dll to
            // APSIM.PerformanceTests.Collector/Bin/Debug/ (or release if building in release mode).
            Simulations sims = FileFormat.ReadFromFile <Simulations>(fullFileName, out errors);

            if (errors != null && errors.Count > 0)
            {
                // Write all errors except for the last to a log file, and throw the last error
                // to ensure that we don't proceed further.
                for (int i = 0; i < errors.Count; i++)
                {
                    if (i == errors.Count - 1)
                    {
                        throw errors[i];
                    }
                    WriteToLogFile(string.Format("    ERROR opening file {0}: {1}", fullFileName, errors[i].ToString()));
                }
            }

            List <PredictedObservedDetails> predictedObservedDetailList = new List <PredictedObservedDetails>();

            foreach (PredictedObserved poModel in Apsim.ChildrenRecursively(sims, typeof(PredictedObserved)))
            {
                PredictedObservedDetails instance = new PredictedObservedDetails()
                {
                    DatabaseTableName      = poModel.Name,
                    PredictedTableName     = poModel.PredictedTableName,
                    ObservedTableName      = poModel.ObservedTableName,
                    FieldNameUsedForMatch  = poModel.FieldNameUsedForMatch,
                    FieldName2UsedForMatch = poModel.FieldName2UsedForMatch ?? string.Empty,
                    FieldName3UsedForMatch = poModel.FieldName3UsedForMatch ?? string.Empty,
                };
                instance.Data = GetPredictedObservedDataTable(poModel.Name, Path.ChangeExtension(fullFileName, ".db"));

                // Only add this instance if there is data.
                if ((instance.Data != null) && (instance.Data.Rows.Count > 0))
                {
                    predictedObservedDetailList.Add(instance);
                }
                else
                {
                    WriteToLogFile(string.Format("    No PredictedObserved data was found for table {0} of file {1}", poModel.Name, fullFileName));
                }
            }

            return(predictedObservedDetailList);
        }
Пример #3
0
        private ApsimFile GetSimpleApsimFile()
        {
            DataTable simsTable = TableFactory.CreateEmptyApsimSimulationsTable();

            simsTable.Rows.Add(1, "sim1");
            simsTable.Rows.Add(2, "sim2");

            DataTable poData = new DataTable("PredictedObserved");

            poData.Columns.Add("SimulationID", typeof(int));
            poData.Columns.Add("Predicted.GrainWt", typeof(double));
            poData.Columns.Add("Observed.GrainWt", typeof(double));
            poData.Columns.Add("xval", typeof(double));
            poData.Rows.Add(1, 0.9, 1.1, 0.1);
            poData.Rows.Add(2, 0.5, 1.0, 0.1);

            PredictedObservedDetails poDetails = new PredictedObservedDetails()
            {
                DatabaseTableName      = "PredictedObserved",
                PredictedTableName     = "Report",
                ObservedTableName      = "HarvestReport",
                FieldNameUsedForMatch  = "xval",
                FieldName2UsedForMatch = string.Empty,
                FieldName3UsedForMatch = string.Empty,
                Data = poData,
            };

            return(new ApsimFile()
            {
                ID = 1,
                AcceptedPullRequestId = -1,
                FileName = "wheat.apsimx",
                FullFileName = "~/wheat.apsimx",
                IsMerged = true,
                PullRequestId = 1,
                RunDate = new DateTime(2020, 1, 1),
                StatsAccepted = true,
                SubmitDetails = "submitdetails",
                Simulations = simsTable,
                PredictedObserved = new List <PredictedObservedDetails>()
                {
                    poDetails
                },
            });
        }
        public void TestGetApsimFilesRelatedPredictedObservedDetailsData()
        {
            foreach (DbConnection connection in emptyConnections)
            {
                List <ApsimFile> apsimFiles = DBFunctions.GetApsimFilesRelatedPredictedObservedData(connection, 1);
                Assert.AreEqual(0, apsimFiles.Count);
            }

            foreach (DbConnection connection in populousConnections)
            {
                Assert.AreEqual(0, DBFunctions.GetApsimFilesRelatedPredictedObservedData(connection, 0).Count);
                List <ApsimFile> apsimFiles = DBFunctions.GetApsimFilesRelatedPredictedObservedData(connection, 1);
                Assert.AreEqual(1, apsimFiles.Count);

                ApsimFile file = apsimFiles[0];
                Assert.AreEqual(-1, file.AcceptedPullRequestId);
                Assert.AreEqual("wheat.apsimx", file.FileName);
                Assert.AreEqual("~/wheat.apsimx", file.FullFileName);
                Assert.AreEqual(1, file.ID);
                Assert.AreEqual(true, file.IsMerged);
                Assert.AreEqual(1, file.PullRequestId);
                Assert.AreEqual(new DateTime(2020, 1, 1), file.RunDate);
                Assert.AreEqual(null, file.Simulations); // todo: should we implement this?
                Assert.AreEqual(false, file.StatsAccepted);
                Assert.AreEqual("submitdetails", file.SubmitDetails);

                Assert.AreEqual(1, file.PredictedObserved.Count());
                PredictedObservedDetails details = file.PredictedObserved.ElementAt(0);

                Assert.AreEqual(0, details.AcceptedPredictedObservedDetailsId);
                Assert.AreEqual(null, details.ApsimFile); // Not brave enough to change this yet
                Assert.AreEqual(1, details.ApsimID);
                Assert.AreEqual(null, details.Data);      // Not brave enough to change this yet
                Assert.AreEqual("PredictedObserved", details.DatabaseTableName);
                Assert.AreEqual("xval", details.FieldNameUsedForMatch);
                Assert.AreEqual(null, details.FieldName2UsedForMatch);
                Assert.AreEqual(null, details.FieldName3UsedForMatch);
                Assert.AreEqual(1, details.HasTests);
                Assert.AreEqual(1, details.ID);
                Assert.AreEqual("Observations", details.ObservedTableName);
                Assert.AreEqual(0, details.PassedTests);
                Assert.AreEqual("HarvestReport", details.PredictedTableName);
            }
        }
        /// <summary>
        /// Retrieves the ApsimFile details and related child Predicted Observed Details for a specific Pull Request
        /// </summary>
        /// <param name="connectStr"></param>
        /// <param name="pullRequestId"></param>
        /// <returns></returns>
        private List <ApsimFile> GetApsimFilesRelatedPredictedObservedData(SqlConnection sqlCon, int pullRequestId)
        {
            string           strSQL;
            List <ApsimFile> apsimFilesList = new List <ApsimFile>();

            try
            {
                strSQL = "SELECT * FROM ApsimFiles WHERE PullRequestId = @PullRequestId ORDER BY RunDate DESC";
                using (SqlCommand commandER = new SqlCommand(strSQL, sqlCon))
                {
                    commandER.CommandType = CommandType.Text;
                    commandER.Parameters.AddWithValue("@PullRequestId", pullRequestId);
                    //SqlDataReader reader = commandER.ExecuteReader();
                    //while (reader.Read())
                    //{
                    //    ApsimFile apsim = new ApsimFile
                    //    {
                    //        ID = reader.GetInt32(0),
                    //        PullRequestId = reader.GetInt32(1),
                    //        FileName = reader.GetString(2),
                    //        FullFileName = reader.GetString(3),
                    //        RunDate = reader.GetDateTime(4),
                    //        StatsAccepted = reader.GetBoolean(5),
                    //        IsMerged = reader.GetBoolean(6),
                    //        SubmitDetails = reader.GetString(7)
                    //    };
                    //    if (reader.IsDBNull(8))
                    //    {
                    //        apsim.AcceptedPullRequestId = 0;
                    //    }
                    //    else
                    //    {
                    //        apsim.AcceptedPullRequestId = reader.GetInt32(8);
                    //    }
                    //    apsimFilesList.Add(apsim);
                    //}
                    //reader.Close();
                    string response   = Comms.SendQuery(commandER, "reader");
                    var    jsonObject = JsonConvert.DeserializeObject(response);

                    DataTable dt = JsonConvert.DeserializeObject <DataTable>(jsonObject.ToString());
                    foreach (DataRow row in dt.Rows)
                    {
                        ApsimFile apsim = new ApsimFile
                        {
                            ID                    = Convert.ToInt32(row[0].ToString()),
                            PullRequestId         = Convert.ToInt32(row[1].ToString()),
                            FileName              = row[2].ToString(),
                            FullFileName          = row[3].ToString(),
                            RunDate               = Convert.ToDateTime(row[4].ToString()),
                            StatsAccepted         = Convert.ToBoolean(row[5].ToString()),
                            IsMerged              = Convert.ToBoolean(row[6].ToString()),
                            SubmitDetails         = row[7].ToString(),
                            AcceptedPullRequestId = Convert.ToInt32(row[8].ToString())
                        };
                        apsimFilesList.Add(apsim);
                    }
                }

                foreach (ApsimFile currentApsimFile in apsimFilesList)
                {
                    List <PredictedObservedDetails> currentPredictedObservedDetails = new List <PredictedObservedDetails>();
                    //retrieve the predicted observed details for this apsim file
                    strSQL = "SELECT * FROM PredictedObservedDetails WHERE ApsimFilesId = @ApsimFilesId ORDER BY ID";
                    using (SqlCommand commandER = new SqlCommand(strSQL, sqlCon))
                    {
                        commandER.CommandType = CommandType.Text;
                        commandER.Parameters.AddWithValue("@ApsimFilesId", currentApsimFile.ID);
                        //SqlDataReader reader = commandER.ExecuteReader();
                        //while (reader.Read())
                        //{
                        //    PredictedObservedDetails predictedObserved = new PredictedObservedDetails
                        //    {
                        //        ID = reader.GetInt32(0),
                        //        ApsimID = reader.GetInt32(1),
                        //        DatabaseTableName = reader.GetString(2),
                        //        PredictedTableName = reader.GetString(3),
                        //        ObservedTableName = reader.GetString(4),
                        //        FieldNameUsedForMatch = reader.GetString(5),
                        //        FieldName2UsedForMatch = reader.GetString(6),
                        //        FieldName3UsedForMatch = reader.GetString(7),
                        //        PassedTests = reader.GetDouble(8),
                        //        HasTests = reader.GetInt32(9)
                        //    };
                        //    if (reader.IsDBNull(10))
                        //    {
                        //        predictedObserved.AcceptedPredictedObservedDetailsId = 0;
                        //    }
                        //    else
                        //    {
                        //        predictedObserved.AcceptedPredictedObservedDetailsId = reader.GetInt32(10);
                        //    }
                        //    currentPredictedObservedDetails.Add(predictedObserved);
                        //}
                        //reader.Close();
                        string    response   = Comms.SendQuery(commandER, "reader");
                        var       jsonObject = JsonConvert.DeserializeObject(response);
                        DataTable dt         = JsonConvert.DeserializeObject <DataTable>(jsonObject.ToString());
                        foreach (DataRow row in dt.Rows)
                        {
                            PredictedObservedDetails predictedObserved = new PredictedObservedDetails
                            {
                                ID                     = (int)row[0],
                                ApsimID                = (int)row[1],
                                DatabaseTableName      = (string)row[2],
                                PredictedTableName     = (string)row[3],
                                ObservedTableName      = (string)row[4],
                                FieldNameUsedForMatch  = (string)row[5],
                                FieldName2UsedForMatch = (string)row[6],
                                FieldName3UsedForMatch = (string)row[7],
                                PassedTests            = (double)row[8],
                                HasTests               = (int)row[9]
                            };
                            if (row[10] == DBNull.Value)
                            {
                                predictedObserved.AcceptedPredictedObservedDetailsId = 0;
                            }
                            else
                            {
                                predictedObserved.AcceptedPredictedObservedDetailsId = (int)row[10];
                            }
                            currentPredictedObservedDetails.Add(predictedObserved);
                        }
                    }
                    currentApsimFile.PredictedObserved = currentPredictedObservedDetails;
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("ERROR:  Unable to retrieve Apsim Files and PredictedObservedDetails for Pull Request Id {0}: {1}", pullRequestId.ToString(), ex.Message.ToString()));
            }
            return(apsimFilesList);
        }
Пример #6
0
        /// <summary>
        /// Returns the PredictedObservedTests data for 'Accepted' data set, based on matching 'Current' Details
        /// </summary>
        /// <param name="conStr"></param>
        /// <param name="currentApsimID"></param>
        /// <param name="currentApsim"></param>
        /// <param name="poDetail"></param>
        /// <param name="predictedObservedId"></param>
        /// <param name="acceptedPredictedObservedDetailsID"></param>
        /// <returns></returns>
        private static DataTable RetrieveAcceptedStatsData(DbConnection connection, int currentApsimID, ApsimFile currentApsim, PredictedObservedDetails poDetail, int predictedObservedId, ref int acceptedPredictedObservedDetailsID)
        {
            DataTable acceptedStats = new DataTable();
            ApsimFile acceptedApsim = new ApsimFile();

            try
            {
                string strSQL = "SELECT * FROM ApsimFiles WHERE StatsAccepted = 1 AND PullRequestId != @PullRequestId ORDER BY RunDate DESC";
                strSQL = Utilities.Limit(connection, strSQL, 1);
                using (DbCommand command = connection.CreateCommand(strSQL))
                {
                    command.CommandType = CommandType.Text;
                    command.AddParamWithValue("@PullRequestId", currentApsim.PullRequestId);

                    using (DbDataReader sdReader = command.ExecuteReader())
                    {
                        while (sdReader.Read())
                        {
                            acceptedApsim.ID                    = sdReader.GetInt32(0);
                            acceptedApsim.PullRequestId         = sdReader.GetInt32(1);
                            acceptedApsim.FileName              = sdReader.GetString(2);
                            acceptedApsim.FullFileName          = sdReader.GetString(3);
                            acceptedApsim.RunDate               = sdReader.GetDateTime(4);
                            acceptedApsim.StatsAccepted         = sdReader.GetBoolean(5);
                            acceptedApsim.IsMerged              = sdReader.GetBoolean(6);
                            acceptedApsim.SubmitDetails         = sdReader.GetString(7);
                            acceptedApsim.AcceptedPullRequestId = sdReader.IsDBNull(8) ? 0 : sdReader.GetInt32(8);
                        }
                    }
                }

                if (acceptedApsim.PullRequestId > 0)
                {
                    DBFunctions.UpdateApsimFileAcceptedDetails(connection, currentApsim.PullRequestId, acceptedApsim.PullRequestId, acceptedApsim.RunDate);

                    ////get the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
                    acceptedPredictedObservedDetailsID = DBFunctions.GetAcceptedPredictedObservedDetailsId(connection, acceptedApsim.PullRequestId, currentApsim.FileName, poDetail);
                    ////Now retreieve the matching tests data for our predicted observed details
                    acceptedStats = DBFunctions.GetPredictedObservedTestsData(connection, acceptedPredictedObservedDetailsID);
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("    ERROR:  Unable to RetrieveAcceptedStatsData for ApsimFile {0}: Pull Request Id {1}: {2}.", currentApsim.FileName, currentApsim.PullRequestId, ex.Message.ToString()));
            }
            return(acceptedStats);
        }
Пример #7
0
        public void TestPostSimpleApsimFile()
        {
            foreach (DbConnection connection in emptyConnections)
            {
                // Create a simple apsim file.
                ApsimFile file = GetSimpleApsimFile();
                PredictedObservedDetails poDetails = file.PredictedObserved.ElementAt(0);

                // Insert it into the database.
                ApsimFilesController.InsertApsimFile(connection, file, out string err, out int id);

                // Verify results.
                DataTable result = new DataTable();

                // Check ApsimFiles table.
                using (DbCommand command = connection.CreateCommand("SELECT * FROM ApsimFiles"))
                    using (DbDataReader reader = command.ExecuteReader())
                        result.Load(reader);

                Assert.NotNull(result);
                Assert.AreEqual(1, result.Rows.Count);
                Assert.AreEqual(10, result.Columns.Count);
                DataRow row = result.Rows[0];

                Assert.AreEqual(file.ID, row["ID"]);
                Assert.AreEqual(1, row["PullRequestID"]);
                Assert.AreEqual(file.FileName, row["FileName"]);
                Assert.AreEqual(file.FullFileName, row["FullFileName"]);
                if (connection is SQLiteConnection) // fixme - change sql server implementation to use varchar for dates????
                {
                    Assert.AreEqual(file.RunDate.ToString("yyyy-MM-dd HH:mm:ss"), row["RunDate"]);
                }
                else
                {
                    Assert.AreEqual(file.RunDate, row["RunDate"]);
                }
                Assert.AreEqual(file.IsMerged, row["IsMerged"]);
                Assert.AreEqual(file.StatsAccepted, row["StatsAccepted"]);
                Assert.AreEqual(file.SubmitDetails, row["SubmitDetails"]);
                Assert.AreEqual(file.AcceptedPullRequestId, row["AcceptedPullRequestId"]);
                //Assert.AreEqual("", row["AcceptedRunDate"]);//fixme

                // Check Simulations table.
                result = new DataTable();
                using (DbCommand command = connection.CreateCommand("SELECT * FROM Simulations"))
                    using (DbDataReader reader = command.ExecuteReader())
                        result.Load(reader);

                Assert.AreEqual(2, result.Rows.Count);
                Assert.AreEqual(4, result.Columns.Count);

                row = result.Rows[0];
                Assert.AreEqual(1, row["ID"]);
                Assert.AreEqual(1, row["ApsimFilesID"]);
                Assert.AreEqual("sim1", row["Name"]);
                Assert.AreEqual(1, row["OriginalSimulationID"]);

                row = result.Rows[1];
                Assert.AreEqual(2, row["ID"]);
                Assert.AreEqual(1, row["ApsimFilesID"]);
                Assert.AreEqual("sim2", row["Name"]);
                Assert.AreEqual(2, row["OriginalSimulationID"]);

                // Check PredictedObservedDetails.
                result = new DataTable();
                using (DbCommand command = connection.CreateCommand("SELECT * FROM PredictedObservedDetails"))
                    using (DbDataReader reader = command.ExecuteReader())
                        result.Load(reader);

                Assert.AreEqual(1, result.Rows.Count);
                Assert.AreEqual(11, result.Columns.Count);

                row = result.Rows[0];
                Assert.AreEqual(1, row["ID"]);
                Assert.AreEqual(file.ID, row["ApsimFilesID"]);
                Assert.AreEqual(poDetails.DatabaseTableName, row["TableName"]);
                Assert.AreEqual(poDetails.PredictedTableName, row["PredictedTableName"]);
                Assert.AreEqual(poDetails.ObservedTableName, row["ObservedTableName"]);
                Assert.AreEqual(poDetails.FieldNameUsedForMatch, row["FieldNameUsedForMatch"]);
                Assert.AreEqual(poDetails.FieldName2UsedForMatch, row["FieldName2UsedForMatch"]);
                Assert.AreEqual(poDetails.FieldName3UsedForMatch, row["FieldName3UsedForMatch"]);

                // todo: test the last 3 columns after implementing tests
                Assert.AreEqual(0, row["PassedTests"]);
                Assert.AreEqual(1, row["HasTests"]);
                Assert.AreEqual(DBNull.Value, row["AcceptedPredictedObservedDetailsID"]);

                // Check PredictedObservedValues.
                result = new DataTable();
                using (DbCommand command = connection.CreateCommand("SELECT * FROM PredictedObservedValues"))
                    using (DbDataReader reader = command.ExecuteReader())
                        result.Load(reader);

                // #Rows = #Sims * #Variables * #PredictedObservedTables
                // Note that this isn't a general rule, because not every simulation
                // will necessarily generate predicted data for this p/o table.
                int nSims   = file.Simulations.Rows.Count;
                int nVars   = poDetails.Data.Columns.Cast <DataColumn>().Where(c => c.ColumnName.StartsWith("Predicted.")).Count();
                int nTables = file.PredictedObserved.Count();
                int nRows   = nSims * nVars * nTables;

                Assert.AreEqual(nRows, result.Rows.Count);
                Assert.AreEqual(12, result.Columns.Count);

                for (int i = 0; i < result.Rows.Count; i++)
                {
                    row = result.Rows[i];
                    Assert.AreEqual(i + 1, row["ID"]);
                    Assert.AreEqual(1, row["PredictedObservedDetailsID"]);

                    // Note: this will not always be true in the more general case.
                    Assert.AreEqual(poDetails.Data.Rows[i]["SimulationID"], row["SimulationsID"]);

                    Assert.AreEqual(poDetails.FieldNameUsedForMatch, row["MatchName"]);

                    // Match value column will be of type string, to allow for matching on stage name.
                    Assert.AreEqual(poDetails.Data.Rows[i][poDetails.FieldNameUsedForMatch].ToString(), row["MatchValue"]);

                    Assert.AreEqual(poDetails.FieldName2UsedForMatch, row["MatchName2"]);
                    if (!string.IsNullOrEmpty(poDetails.FieldName2UsedForMatch))
                    {
                        Assert.AreEqual(poDetails.Data.Rows[i][poDetails.FieldName2UsedForMatch].ToString(), row["MatchValue2"]);
                    }
                    Assert.AreEqual(poDetails.FieldName3UsedForMatch, row["MatchName3"]);
                    if (!string.IsNullOrEmpty(poDetails.FieldName3UsedForMatch))
                    {
                        Assert.AreEqual(poDetails.Data.Rows[i][poDetails.FieldName3UsedForMatch].ToString(), row["MatchValue3"]);
                    }

                    Assert.AreEqual("GrainWt", row["ValueName"]);
                    Assert.AreEqual(poDetails.Data.Rows[i]["Predicted.GrainWt"], row["PredictedValue"]);
                    Assert.AreEqual(poDetails.Data.Rows[i]["Observed.GrainWt"], row["ObservedValue"]);
                }

                // Check PredictedObservedTests.
                result = new DataTable();
                using (DbCommand command = connection.CreateCommand("SELECT * FROM PredictedObservedTests"))
                    using (DbDataReader reader = command.ExecuteReader())
                        result.Load(reader);

                string[] variables = new[]
                {
                    "n",
                    "Slope",
                    "Intercept",
                    "SEslope",
                    "SEintercept",
                    "R2",
                    "RMSE",
                    "NSE",
                    "ME",
                    "MAE",
                    "RSR",
                };

                Assert.AreEqual(variables.Length, result.Rows.Count);
                Assert.AreEqual(12, result.Columns.Count);

                List <string> actualVariables = new List <string>();
                for (int i = 0; i < result.Rows.Count; i++)
                {
                    row = result.Rows[i];

                    Assert.AreEqual(i + 1, row["ID"]);
                    Assert.AreEqual(1, row["PredictedObservedDetailsID"]);
                    Assert.AreEqual("GrainWt", row["Variable"]);
                    actualVariables.Add(row["Test"].ToString());

                    Assert.AreEqual(DBNull.Value, row["Accepted"]);
                }
                Assert.AreEqual(variables, actualVariables);

                Assert.AreEqual(2, GetCurrentValue(result, "n"), 1e-10);
                Assert.AreEqual(4, GetCurrentValue(result, "Slope"), 1e-10);
                Assert.AreEqual(-3.5, GetCurrentValue(result, "Intercept"), 1e-10);
                Assert.AreEqual(0, GetCurrentValue(result, "SEslope"), 1e-10);
                Assert.AreEqual(0, GetCurrentValue(result, "SEintercept"), 1e-10);
                Assert.AreEqual(1, GetCurrentValue(result, "R2"), 1e-10);
                Assert.AreEqual(0.380789, GetCurrentValue(result, "RMSE"), 1e-10);
                Assert.AreEqual(-57, GetCurrentValue(result, "NSE"), 1e-10);
                Assert.AreEqual(-0.35, GetCurrentValue(result, "ME"), 1e-10);
                Assert.AreEqual(0.35, GetCurrentValue(result, "MAE"), 1e-10);
                Assert.AreEqual(5.385165, GetCurrentValue(result, "RSR"), 1e-10);
            }
        }
Пример #8
0
        /// <summary>
        /// Gets the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
        /// </summary>
        /// <param name="connectStr"></param>
        /// <param name="acceptedPullRequestID"></param>
        /// <param name="currentApsimFileFileName"></param>
        /// <param name="currentPODetails"></param>
        /// <returns></returns>
        public static int GetAcceptedPredictedObservedDetailsId(SqlConnection sqlCon, int acceptedPullRequestID, string currentApsimFileFileName, PredictedObservedDetails currentPODetails)
        {
            int acceptedPredictedObservedDetailsID = 0;

            try
            {
                string strSQL = "SELECT p.ID  "
                                + " FROM PredictedObservedDetails p INNER JOIN ApsimFiles a ON p.ApsimFilesID = a.ID "
                                + " WHERE a.PullRequestId = @pullRequestId "
                                + "    AND a.FileName = @filename "
                                + "    AND p.TableName = @tablename "
                                + "    AND p.PredictedTableName = @predictedTableName "
                                + "    AND p.ObservedTableName = @observedTableName "
                                + "    AND p.FieldNameUsedForMatch = @fieldNameUsedForMatch ";

                if ((currentPODetails.FieldName2UsedForMatch != null) && (currentPODetails.FieldName2UsedForMatch.Length > 0))
                {
                    strSQL = strSQL + "    AND p.FieldName2UsedForMatch = @fieldName2UsedForMatch ";
                }

                if ((currentPODetails.FieldName3UsedForMatch != null) && (currentPODetails.FieldName3UsedForMatch.Length > 0))
                {
                    strSQL = strSQL + "    AND p.FieldName3UsedForMatch = @fieldName3UsedForMatch ";
                }

                using (SqlCommand commandES = new SqlCommand(strSQL, sqlCon))
                {
                    commandES.CommandType = CommandType.Text;
                    commandES.Parameters.AddWithValue("@PullRequestId", acceptedPullRequestID);
                    commandES.Parameters.AddWithValue("@filename", currentApsimFileFileName);
                    commandES.Parameters.AddWithValue("@tablename", currentPODetails.DatabaseTableName);
                    commandES.Parameters.AddWithValue("@predictedTableName", currentPODetails.PredictedTableName);
                    commandES.Parameters.AddWithValue("@observedTableName", currentPODetails.ObservedTableName);
                    commandES.Parameters.AddWithValue("@fieldNameUsedForMatch", currentPODetails.FieldNameUsedForMatch);

                    if ((currentPODetails.FieldName2UsedForMatch != null) && (currentPODetails.FieldName2UsedForMatch.Length > 0))
                    {
                        commandES.Parameters.AddWithValue("@fieldName2UsedForMatch", currentPODetails.FieldName2UsedForMatch);
                    }

                    if ((currentPODetails.FieldName3UsedForMatch != null) && (currentPODetails.FieldName3UsedForMatch.Length > 0))
                    {
                        commandES.Parameters.AddWithValue("@fieldName3UsedForMatch", currentPODetails.FieldName3UsedForMatch);
                    }

                    //object obj = commandES.ExecuteScalar();
                    string response = Comms.SendQuery(commandES, "scalar");
                    object obj      = JsonConvert.DeserializeObject(response);

                    if (obj != null)
                    {
                        acceptedPredictedObservedDetailsID = int.Parse(obj.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("    ERROR in GetAcceptedPredictedObservedDetailsId: Unable to retrieve 'Accepted' PredictedObservedDetailsID for Pull Request {0}: {1}", acceptedPullRequestID, ex.Message.ToString()));
            }
            return(acceptedPredictedObservedDetailsID);
        }
Пример #9
0
        /// <summary>
        /// Gets the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
        /// </summary>
        /// <param name="connectStr"></param>
        /// <param name="acceptedPullRequestID"></param>
        /// <param name="currentApsimFileFileName"></param>
        /// <param name="currentPODetails"></param>
        /// <returns></returns>
        public static int GetAcceptedPredictedObservedDetailsId(DbConnection connection, int acceptedPullRequestID, string currentApsimFileFileName, PredictedObservedDetails currentPODetails)
        {
            int acceptedPredictedObservedDetailsID = 0;

            try
            {
                string strSQL = "SELECT p.ID  "
                                + " FROM PredictedObservedDetails p INNER JOIN ApsimFiles a ON p.ApsimFilesID = a.ID "
                                + " WHERE a.PullRequestId = @pullRequestId "
                                + "    AND a.FileName = @filename "
                                + "    AND p.TableName = @tablename ";

                //modLCM - 22/02/2018 - As per instructions from Dean, remove matching on extra columns in PO Details Table

                //+ "    AND p.PredictedTableName = @predictedTableName "
                //+ "    AND p.ObservedTableName = @observedTableName "
                //+ "    AND p.FieldNameUsedForMatch = @fieldNameUsedForMatch ";

                //if ((currentPODetails.FieldName2UsedForMatch != null) &&  (currentPODetails.FieldName2UsedForMatch.Length > 0))
                //{
                //    strSQL = strSQL + "    AND p.FieldName2UsedForMatch = @fieldName2UsedForMatch ";
                //}

                //if ((currentPODetails.FieldName3UsedForMatch != null) && (currentPODetails.FieldName3UsedForMatch.Length > 0))
                //{
                //    strSQL = strSQL + "    AND p.FieldName3UsedForMatch = @fieldName3UsedForMatch ";
                //}

                using (DbCommand commandES = connection.CreateCommand(strSQL))
                {
                    commandES.CommandType = CommandType.Text;
                    commandES.AddParamWithValue("@PullRequestId", acceptedPullRequestID);
                    commandES.AddParamWithValue("@filename", currentApsimFileFileName);
                    commandES.AddParamWithValue("@tablename", currentPODetails.DatabaseTableName);
                    //commandES.Parameters.AddWithValue("@predictedTableName", currentPODetails.PredictedTableName);
                    //commandES.Parameters.AddWithValue("@observedTableName", currentPODetails.ObservedTableName);
                    //commandES.Parameters.AddWithValue("@fieldNameUsedForMatch", currentPODetails.FieldNameUsedForMatch);

                    //if ((currentPODetails.FieldName2UsedForMatch != null) && (currentPODetails.FieldName2UsedForMatch.Length > 0))
                    //{
                    //    commandES.Parameters.AddWithValue("@fieldName2UsedForMatch", currentPODetails.FieldName2UsedForMatch);
                    //}

                    //if ((currentPODetails.FieldName3UsedForMatch != null) && (currentPODetails.FieldName3UsedForMatch.Length > 0))
                    //{
                    //    commandES.Parameters.AddWithValue("@fieldName3UsedForMatch", currentPODetails.FieldName3UsedForMatch);
                    //}

                    object obj = commandES.ExecuteScalar();

                    if (obj != null)
                    {
                        acceptedPredictedObservedDetailsID = int.Parse(obj.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("    ERROR in GetAcceptedPredictedObservedDetailsId: Unable to retrieve 'Accepted' PredictedObservedDetailsID for Pull Request {0}: {1}", acceptedPullRequestID, ex.Message.ToString()));
            }
            return(acceptedPredictedObservedDetailsID);
        }
Пример #10
0
        /// <summary>
        /// Retrieves the ApsimFile details and related child Predicted Observed Details for a specific Pull Request
        /// </summary>
        /// <param name="connectStr"></param>
        /// <param name="pullRequestId"></param>
        /// <returns></returns>
        public static List <ApsimFile> GetApsimFilesRelatedPredictedObservedData(DbConnection sqlCon, int pullRequestId)
        {
            List <ApsimFile> apsimFilesList = new List <ApsimFile>();

            try
            {
                string sql = "SELECT * FROM ApsimFiles WHERE PullRequestId = @PullRequestId ORDER BY RunDate DESC";
                using (DbCommand commandER = sqlCon.CreateCommand(sql))
                {
                    commandER.CommandType = CommandType.Text;
                    commandER.AddParamWithValue("@PullRequestId", pullRequestId);
                    DbDataReader reader = commandER.ExecuteReader();
                    while (reader.Read())
                    {
                        ApsimFile apsim = new ApsimFile
                        {
                            ID            = reader.GetInt32(0),
                            PullRequestId = reader.GetInt32(1),
                            FileName      = reader.GetString(2),
                            FullFileName  = reader.GetString(3),
                            RunDate       = reader.GetDateTime(4),
                            StatsAccepted = reader.GetBoolean(5),
                            IsMerged      = reader.GetBoolean(6),
                            SubmitDetails = reader.GetString(7)
                        };
                        if (reader.IsDBNull(8))
                        {
                            apsim.AcceptedPullRequestId = 0;
                        }
                        else
                        {
                            apsim.AcceptedPullRequestId = reader.GetInt32(8);
                        }

                        apsimFilesList.Add(apsim);
                    }
                    reader.Close();
                }

                foreach (ApsimFile currentApsimFile in apsimFilesList)
                {
                    List <PredictedObservedDetails> currentPredictedObservedDetails = new List <PredictedObservedDetails>();
                    //retrieve the predicted observed details for this apsim file
                    sql = "SELECT * FROM PredictedObservedDetails WHERE ApsimFilesId = @ApsimFilesId ORDER BY ID";
                    using (DbCommand commandER = sqlCon.CreateCommand(sql))
                    {
                        commandER.CommandType = CommandType.Text;
                        commandER.AddParamWithValue("@ApsimFilesId", currentApsimFile.ID);
                        DbDataReader reader = commandER.ExecuteReader();
                        while (reader.Read())
                        {
                            PredictedObservedDetails predictedObserved = new PredictedObservedDetails()
                            {
                                ID                     = reader.GetInt32(0),
                                ApsimID                = reader.GetInt32(1),
                                DatabaseTableName      = reader.GetString(2),
                                PredictedTableName     = reader.GetString(3),
                                ObservedTableName      = reader.GetString(4),
                                FieldNameUsedForMatch  = reader.GetString(5),
                                FieldName2UsedForMatch = reader.GetNullOrString(6),
                                FieldName3UsedForMatch = reader.GetNullOrString(7),
                                PassedTests            = reader.GetDouble(8),
                                HasTests               = reader.GetInt32(9),
                            };
                            if (reader.IsDBNull(10))
                            {
                                predictedObserved.AcceptedPredictedObservedDetailsId = 0;
                            }
                            else
                            {
                                predictedObserved.AcceptedPredictedObservedDetailsId = reader.GetInt32(10);
                            }
                            currentPredictedObservedDetails.Add(predictedObserved);
                        }
                        reader.Close();
                    }
                    currentApsimFile.PredictedObserved = currentPredictedObservedDetails;
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("ERROR:  Unable to retrieve Apsim Files and PredictedObservedDetails for Pull Request Id {0}: {1}", pullRequestId.ToString(), ex.Message.ToString()));
            }
            return(apsimFilesList);
        }
Пример #11
0
        /// <summary>
        // Returns the PredictedObservedTests data for 'Accepted' data set, based on matching 'Current' Details
        /// </summary>
        /// <param name="conStr"></param>
        /// <param name="currentApsimID"></param>
        /// <param name="currentApsim"></param>
        /// <param name="poDetail"></param>
        /// <param name="predictedObservedId"></param>
        /// <param name="acceptedPredictedObservedDetailsID"></param>
        /// <returns></returns>
        private static DataTable RetrieveAcceptedStatsData(SqlConnection sqlCon, int currentApsimID, ApsimFile currentApsim, PredictedObservedDetails poDetail, int predictedObservedId, ref int acceptedPredictedObservedDetailsID)
        {
            DataTable acceptedStats = new DataTable();
            ApsimFile acceptedApsim = new ApsimFile();

            try
            {
                string strSQL = "SELECT TOP 1 * FROM ApsimFiles WHERE StatsAccepted = 1 AND PullRequestId != @PullRequestId ORDER BY RunDate DESC";
                using (SqlCommand commandER = new SqlCommand(strSQL, sqlCon))
                {
                    commandER.CommandType = CommandType.Text;
                    commandER.Parameters.AddWithValue("@PullRequestId", currentApsim.PullRequestId);

                    //SqlDataReader sdReader = commandER.ExecuteReader();
                    //while (sdReader.Read())
                    //{
                    //    acceptedApsim.ID = sdReader.GetInt32(0);
                    //    acceptedApsim.PullRequestId = sdReader.GetInt32(1);
                    //    acceptedApsim.FileName = sdReader.GetString(2);
                    //    acceptedApsim.FullFileName = sdReader.GetString(3);
                    //    acceptedApsim.RunDate = sdReader.GetDateTime(4);
                    //    acceptedApsim.StatsAccepted = sdReader.GetBoolean(5);
                    //    acceptedApsim.IsMerged = sdReader.GetBoolean(6);
                    //    acceptedApsim.SubmitDetails = sdReader.GetString(7);
                    //    if (sdReader.IsDBNull(8))
                    //    {
                    //        acceptedApsim.AcceptedPullRequestId = 0;
                    //    }
                    //    else
                    //    {
                    //        acceptedApsim.AcceptedPullRequestId = sdReader.GetInt32(8);
                    //    }
                    //}
                    //sdReader.Close();
                    string response   = Comms.SendQuery(commandER, "reader");
                    var    jsonObject = JsonConvert.DeserializeObject(response);

                    DataTable dt = JsonConvert.DeserializeObject <DataTable>(jsonObject.ToString());
                    foreach (DataRow row in dt.Rows)
                    {
                        acceptedApsim.ID            = Convert.ToInt32(row[0].ToString());
                        acceptedApsim.PullRequestId = Convert.ToInt32(row[1].ToString());
                        acceptedApsim.FileName      = row[2].ToString();
                        acceptedApsim.FullFileName  = row[3].ToString();
                        acceptedApsim.RunDate       = Convert.ToDateTime(row[4].ToString());
                        acceptedApsim.StatsAccepted = Convert.ToBoolean(row[5].ToString());
                        acceptedApsim.IsMerged      = Convert.ToBoolean(row[6].ToString());
                        acceptedApsim.SubmitDetails = row[7].ToString();
                        if (row[8] == DBNull.Value)
                        {
                            acceptedApsim.AcceptedPullRequestId = 0;
                        }
                        else
                        {
                            acceptedApsim.AcceptedPullRequestId = Convert.ToInt32(row[8].ToString());
                        }
                    }
                }

                if (acceptedApsim.PullRequestId > 0)
                {
                    DBFunctions.UpdateApsimFileAcceptedDetails(sqlCon, currentApsim.PullRequestId, acceptedApsim.PullRequestId, acceptedApsim.RunDate);

                    ////get the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
                    acceptedPredictedObservedDetailsID = DBFunctions.GetAcceptedPredictedObservedDetailsId(sqlCon, acceptedApsim.PullRequestId, currentApsim.FileName, poDetail);
                    ////Now retreieve the matching tests data for our predicted observed details
                    acceptedStats = DBFunctions.GetPredictedObservedTestsData(sqlCon, acceptedPredictedObservedDetailsID);
                }
            }
            catch (Exception ex)
            {
                Utilities.WriteToLogFile(string.Format("    ERROR:  Unable to RetrieveAcceptedStatsData for ApsimFile {0}: Pull Request Id {1}: {2}.", currentApsim.FileName, currentApsim.PullRequestId, ex.Message.ToString()));
            }
            return(acceptedStats);
        }