Exemplo n.º 1
0
        private PredictionResult ProcessPrediction(QcRuleSetup qcSetup, string predictionURL, RuleModel rule)
        {
            PredictionResult result = new PredictionResult();

            try
            {
                var jsonString = JsonConvert.SerializeObject(qcSetup);
                var content    = new StringContent(jsonString, Encoding.UTF8, "application/json");
                HttpResponseMessage response = Client.PostAsync(predictionURL, content).Result;
                if (!response.IsSuccessStatusCode)
                {
                    result.Status = "Server error";
                    return(result);
                }
                using (HttpContent respContent = response.Content)
                {
                    string tr = respContent.ReadAsStringAsync().Result;
                    result = JsonConvert.DeserializeObject <PredictionResult>(tr);
                }
            }
            catch (Exception Ex)
            {
                //logger.LogWarning("ProcessDataObject: Problems with URL");
            }
            return(result);
        }
Exemplo n.º 2
0
        private string ProcessQcRule(QcRuleSetup qcSetup, RuleModel rule)
        {
            string returnResult = "Passed";
            var    jsonString   = JsonConvert.SerializeObject(qcSetup);
            var    content      = new StringContent(jsonString, Encoding.UTF8, "application/json");

            try
            {
                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = client.PostAsync(rule.RuleFunction, content).Result)
                    {
                        using (HttpContent respContent = response.Content)
                        {
                            var tr            = respContent.ReadAsStringAsync().Result;
                            var azureResponse = JsonConvert.DeserializeObject(tr);
                            returnResult = azureResponse.ToString();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Exception error = new Exception("DataQcWithProgressBar: Problems with URL: ", ex);
                throw error;
            }
            return(returnResult);
        }
Exemplo n.º 3
0
        public static PredictionResult PredictDepthUsingIDW(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            double?          depth  = null;
            PredictionResult result = new PredictionResult
            {
                Status = "Failed"
            };
            DataTable nb = RuleMethodUtilities.GetNeighbors(dbConn, qcSetup);

            if (nb != null)
            {
                depth = RuleMethodUtilities.CalculateDepthUsingIdw(nb, qcSetup);
            }

            if (depth != null)
            {
                RuleModel rule       = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
                JObject   dataObject = JObject.Parse(qcSetup.DataObject);
                dataObject[rule.DataAttribute] = depth;
                string remark = dataObject["REMARK"] + $";{rule.DataAttribute} has been predicted by QCEngine;";
                dataObject["REMARK"] = remark;
                result.DataObject    = dataObject.ToString();
                result.DataType      = rule.DataType;
                result.SaveType      = "Update";
                result.IndexId       = qcSetup.IndexId;
                result.Status        = "Passed";
            }

            return(result);
        }
Exemplo n.º 4
0
        public static string Completeness(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string    returnStatus = "Passed";
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject   dataObject   = JObject.Parse(qcSetup.DataObject);
            JToken    value        = dataObject.GetValue(rule.DataAttribute);

            if (value == null)
            {
                //log.Warning($"Attribute is Null");
            }
            else
            {
                string strValue = value.ToString();
                if (string.IsNullOrWhiteSpace(strValue))
                {
                    returnStatus = "Failed";
                }
                else
                {
                    double number;
                    bool   canConvert = double.TryParse(strValue, out number);
                    if (canConvert)
                    {
                        if (number == -99999)
                        {
                            returnStatus = "Failed";
                        }
                    }
                }
            }
            return(returnStatus);
        }
Exemplo n.º 5
0
        public static PredictionResult PredictLogDepthAttributes(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            PredictionResult result = new PredictionResult
            {
                Status = "Failed"
            };
            JObject   dataObject = JObject.Parse(qcSetup.DataObject);
            RuleModel rule       = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            string    jsonLog    = RuleMethodUtilities.GetLogCurveDepths(dbConn, qcSetup.DataObject);

            if (!string.IsNullOrEmpty(jsonLog))
            {
                JObject logObject = JObject.Parse(jsonLog);
                string  attribute = rule.DataAttribute;
                dataObject[attribute] = logObject[attribute];
                string remark = dataObject["REMARK"] + $";{attribute} was calculated from curve array;";
                dataObject["REMARK"] = remark;
                result.DataObject    = dataObject.ToString();
                result.DataType      = rule.DataType;
                result.SaveType      = "Update";
                result.IndexId       = qcSetup.IndexId;
                result.Status        = "Passed";
            }
            return(result);
        }
Exemplo n.º 6
0
        public static string Consistency(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string    returnStatus = "Passed";
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject   dataObject   = JObject.Parse(qcSetup.DataObject);
            JToken    value        = dataObject.GetValue(rule.DataAttribute);
            string    strValue     = value.ToString();

            if (Common.CompletenessCheck(strValue) == "Passed")
            {
                string     dataType = rule.DataType;
                IndexModel index    = Task.Run(() => indexData.GetIndex(qcSetup.IndexId, qcSetup.DataConnector)).GetAwaiter().GetResult();
                if (index != null)
                {
                    string         query           = " where " + index.DataKey;
                    DataAccessDef  dataAccessDef   = accessDefs.First(x => x.DataType == dataType);
                    string         sql             = dataAccessDef.Select + query;
                    IADODataAccess consistencyConn = new ADODataAccess();
                    DataTable      ct = consistencyConn.GetDataTable(sql, qcSetup.ConsistencyConnectorString);
                    Dictionary <string, string> columnTypes = ct.GetColumnTypes();
                    if (ct.Rows.Count > 0)
                    {
                        string strRefValue = ct.Rows[0][rule.DataAttribute].ToString();
                        string valueType   = columnTypes[rule.DataAttribute];
                        if (Common.CompletenessCheck(strRefValue) == "Passed")
                        {
                            returnStatus = RuleMethodUtilities.ConsistencyCheck(strValue, strRefValue, valueType);
                        }
                    }
                }
            }
            return(returnStatus);
        }
Exemplo n.º 7
0
        public static string CurveSpikes(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string               returnStatus = "Passed";
            string               error        = "";
            RuleModel            rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject              dataObject   = JObject.Parse(qcSetup.DataObject);
            double               nullValue    = Common.GetLogNullValue(dataObject.ToString());
            CurveSpikeParameters spikeParams  = new CurveSpikeParameters()
            {
                WindowSize   = 5,
                SeveritySize = 4
            };

            if (!string.IsNullOrEmpty(rule.RuleParameters))
            {
                try
                {
                    spikeParams = JsonConvert.DeserializeObject <CurveSpikeParameters>(rule.RuleParameters);
                    if (spikeParams.WindowSize == 0)
                    {
                        spikeParams.WindowSize = 5;
                    }
                    if (spikeParams.SeveritySize == 0)
                    {
                        spikeParams.SeveritySize = 4;
                    }
                }
                catch (Exception ex)
                {
                    error = $"Bad Json, {ex}";
                }
            }
            spikeParams.NullValue = nullValue;
            List <double> measuredValues = new List <double>();

            try
            {
                JToken value    = dataObject.GetValue("MEASURED_VALUE");
                string strValue = value.ToString();
                if (!string.IsNullOrEmpty(strValue))
                {
                    measuredValues = strValue.Split(',').Select(double.Parse).ToList();
                }
            }
            catch (Exception ex)
            {
                error = $"Problems with the log arrays, {ex}";
            }

            bool spike = RuleMethodUtilities.CurveHasSpikes(measuredValues, spikeParams);

            if (spike)
            {
                returnStatus = "Failed";
            }

            return(returnStatus);
        }
Exemplo n.º 8
0
        private async Task <List <int> > QualityCheckDataType(DbUtilities dbConn, RuleModel rule, ConnectParameters connector)
        {
            List <int>  failedObjects = new List <int>();
            QcRuleSetup qcSetup       = new QcRuleSetup();

            qcSetup.Database         = connector.Catalog;
            qcSetup.DatabasePassword = connector.Password;
            qcSetup.DatabaseServer   = connector.DatabaseServer;
            qcSetup.DatabaseUser     = connector.User;
            qcSetup.DataConnector    = connector.ConnectionString;
            string ruleFilter = rule.RuleFilter;
            string jsonRules  = JsonConvert.SerializeObject(rule);

            qcSetup.RuleObject = jsonRules;
            bool externalQcMethod = rule.RuleFunction.StartsWith("http");

            DataTable indexTable = manageQCFlags.GetIndexTable();

            if (rule.RuleFunction == "Uniqueness")
            {
                CalculateKey(rule, indexTable);
            }
            if (rule.RuleFunction == "Consistency")
            {
                qcSetup.ConsistencyConnectorString = await GetConsistencySource(rule.RuleParameters);
            }
            foreach (DataRow idxRow in indexTable.Rows)
            {
                string jsonData = idxRow["JSONDATAOBJECT"].ToString();
                if (!string.IsNullOrEmpty(jsonData))
                {
                    qcSetup.IndexId    = Convert.ToInt32(idxRow["INDEXID"]);
                    qcSetup.IndexNode  = idxRow["TextIndexNode"].ToString();
                    qcSetup.DataObject = jsonData;
                    string result = "Passed";
                    if (!Filter(jsonData, ruleFilter))
                    {
                        if (externalQcMethod)
                        {
                            result = ProcessQcRule(qcSetup, rule);
                        }
                        else
                        {
                            Type       type = typeof(QCMethods);
                            MethodInfo info = type.GetMethod(rule.RuleFunction);
                            result = (string)info.Invoke(null, new object[] { qcSetup, indexTable, _accessDefs, _indexData });
                        }
                        if (result == "Failed")
                        {
                            failedObjects.Add(qcSetup.IndexId);
                        }
                    }
                }
            }
            return(failedObjects);
        }
Exemplo n.º 9
0
        public static PredictionResult DeleteDataObject(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            PredictionResult result = new PredictionResult();

            result.SaveType = "Delete";
            result.Status   = "Passed";
            result.IndexId  = qcSetup.IndexId;

            return(result);
        }
        public static DataTable GetNeighbors(DbUtilities dbConn, QcRuleSetup qcSetup)
        {
            int       indexId      = qcSetup.IndexId;
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            string    failRule     = rule.FailRule;
            string    path         = $"$.{rule.DataAttribute}";
            string    strProcedure = $"EXEC spGetNeighborsNoFailuresDepth {indexId}, '%{failRule}%', '{path}'";
            DataTable nb           = dbConn.GetDataTable(strProcedure, "");

            return(nb);
        }
Exemplo n.º 11
0
        public static string Entirety(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string    returnStatus = "Passed";
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            string    indexNode    = qcSetup.IndexNode;
            string    dataName     = rule.RuleParameters;
            IEnumerable <IndexModel> indexModels = Task.Run(() => indexData.GetChildrenWithName(qcSetup.DataConnector, indexNode, dataName)).GetAwaiter().GetResult();

            if (indexModels.Count() == 0)
            {
                returnStatus = "Failed";
            }
            return(returnStatus);
        }
Exemplo n.º 12
0
        public static string StringLength(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string    returnStatus = "Failed";
            string    error        = "";
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject   dataObject   = JObject.Parse(qcSetup.DataObject);
            JToken    value        = dataObject.GetValue(rule.DataAttribute);
            StringLengthParameters stringParams = new StringLengthParameters()
            {
                Min = 20,
                Max = 20
            };

            if (!string.IsNullOrEmpty(rule.RuleParameters))
            {
                try
                {
                    stringParams = JsonConvert.DeserializeObject <StringLengthParameters>(rule.RuleParameters);
                    if (stringParams.Min == 0)
                    {
                        stringParams.Min = 20;
                    }
                    if (stringParams.Max == 0)
                    {
                        stringParams.Max = stringParams.Min;
                    }
                }
                catch (Exception ex)
                {
                    error = $"Bad parameter Json, {ex}";
                }
            }
            string strValue = value.ToString();

            strValue = strValue.Trim();
            int stringLength = strValue.Length;

            if (stringLength >= stringParams.Min & stringLength <= stringParams.Max)
            {
                returnStatus = "Passed";
            }
            else
            {
                returnStatus = "Failed";
            }
            return(returnStatus);
        }
Exemplo n.º 13
0
        private async Task MakePredictions(RuleModel rule, ConnectParameters connector)
        {
            QcRuleSetup qcSetup = new QcRuleSetup();

            qcSetup.Database         = connector.Catalog;
            qcSetup.DatabasePassword = connector.Password;
            qcSetup.DatabaseServer   = connector.DatabaseServer;
            qcSetup.DatabaseUser     = connector.User;
            string jsonRules = JsonConvert.SerializeObject(rule);

            qcSetup.RuleObject = jsonRules;
            string predictionURL = rule.RuleFunction;

            bool externalQcMethod = rule.RuleFunction.StartsWith("http");

            indexTable = manageIndexTable.GetIndexTable();
            foreach (DataRow idxRow in indexTable.Rows)
            {
                string jsonData = idxRow["JSONDATAOBJECT"].ToString();
                if (!string.IsNullOrEmpty(jsonData))
                {
                    qcSetup.IndexId    = Convert.ToInt32(idxRow["INDEXID"]);
                    qcSetup.IndexNode  = idxRow["TextIndexNode"].ToString();
                    qcSetup.DataObject = jsonData;
                    PredictionResult result;
                    if (externalQcMethod)
                    {
                        result = ProcessPrediction(qcSetup, predictionURL, rule);
                        if (result.Status == "Server error")
                        {
                            break;
                        }
                    }
                    else
                    {
                        Type       type = typeof(PredictionMethods);
                        MethodInfo info = type.GetMethod(rule.RuleFunction);
                        result = (PredictionResult)info.Invoke(null, new object[] { qcSetup, _dbConn });
                    }
                    await ProcessResult(result, rule);
                }
            }
        }
Exemplo n.º 14
0
        public static string ValidityRange(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string returnStatus = "Passed";

            bool      canConvert;
            double    minRange;
            double    maxRange;
            RuleModel rule            = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject   parameterObject = JObject.Parse(rule.RuleParameters);
            JToken    jMinRangeValue  = parameterObject.GetValue("MinRange");

            canConvert = double.TryParse(jMinRangeValue.ToString(), out minRange);
            if (!canConvert)
            {
                minRange = -99999.0;
            }
            JToken jMaxRangeValue = parameterObject.GetValue("MaxRange");

            canConvert = double.TryParse(jMaxRangeValue.ToString(), out maxRange);
            if (!canConvert)
            {
                maxRange = 99999.0;
            }

            JObject dataObject = JObject.Parse(qcSetup.DataObject);
            JToken  value      = dataObject.GetValue(rule.DataAttribute);
            double? number     = value.GetNumberFromJToken();

            if (number != null)
            {
                if (number >= minRange & number <= maxRange)
                {
                    returnStatus = "Passed";
                }
                else
                {
                    returnStatus = "Failed";
                }
            }

            return(returnStatus);
        }
Exemplo n.º 15
0
        public static PredictionResult PredictMissingDataObjects(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            PredictionResult result = new PredictionResult
            {
                Status = "Failed"
            };
            RuleModel rule          = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            string    rulePar       = rule.RuleParameters;
            JObject   ruleParObject = JObject.Parse(rulePar);
            string    dataType      = ruleParObject["DataType"].ToString();

            if (string.IsNullOrEmpty(rulePar))
            {
                throw new NullReferenceException("Rule parameter is null.");
            }
            string emptyJson = RuleMethodUtilities.GetJsonForMissingDataObject(rulePar, dbConn);

            if (emptyJson == "Error")
            {
                throw new NullReferenceException("Could not create an empty json data object, maybe you are missing Datatype in parameters");
            }
            string json = RuleMethodUtilities.PopulateJsonForMissingDataObject(rulePar, emptyJson, qcSetup.DataObject);

            if (json == "Error")
            {
                throw new NullReferenceException("Could not create an json data object, problems with keys in parameters");
            }
            json = RuleMethodUtilities.AddDefaultsForMissingDataObjects(rulePar, json);
            if (json == "Error")
            {
                throw new NullReferenceException("Could not create an json data object, problems with defaults in parameters");
            }
            result.DataObject = json;
            result.DataType   = dataType;
            result.SaveType   = "Insert";
            result.IndexId    = qcSetup.IndexId;
            result.Status     = "Passed";
            return(result);
        }
Exemplo n.º 16
0
        public static string Uniqueness(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string returnStatus = "Passed";

            string query = $"INDEXID = '{qcSetup.IndexId}'";

            DataRow[] idxRows = dt.Select(query);
            if (idxRows.Length == 1)
            {
                string key = idxRows[0]["UNIQKEY"].ToString();
                if (!string.IsNullOrEmpty(key))
                {
                    query = $"UNIQKEY = '{key}'";
                    DataRow[] dtRows = dt.Select(query);
                    if (dtRows.Length > 1)
                    {
                        returnStatus = "Failed";
                    }
                }
            }

            return(returnStatus);
        }
Exemplo n.º 17
0
        public static string IsNumber(QcRuleSetup qcSetup, DataTable dt, List <DataAccessDef> accessDefs, IIndexDBAccess indexData)
        {
            string    returnStatus = "Passed";
            RuleModel rule         = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
            JObject   dataObject   = JObject.Parse(qcSetup.DataObject);
            JToken    value        = dataObject.GetValue(rule.DataAttribute);

            if (value == null)
            {
                //log.Warning($"Attribute is Null");
            }
            else
            {
                string strValue = value.ToString();
                bool   isValid  = false;
                isValid = isNumberTest.IsMatch(strValue);
                if (!isValid)
                {
                    returnStatus = "Failed";
                }
            }
            return(returnStatus);
        }
Exemplo n.º 18
0
        public static PredictionResult PredictDominantLithology(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            PredictionResult result = new PredictionResult
            {
                Status = "Failed"
            };

            JObject dataObject = JObject.Parse(qcSetup.DataObject);
            string  uwi        = dataObject["UWI"].ToString();
            string  curveName  = "GR";
            JToken  value      = dataObject.GetValue("PICK_DEPTH");
            double? pickDepth  = value.GetNumberFromJToken();

            if (pickDepth == null || pickDepth == -99999.0)
            {
                result.Status = "Failed";
            }
            else
            {
                string    select = "SELECT JSONDATAOBJECT from pdo_qc_index";
                string    query  = " where IndexNode = '/'";
                DataTable idx    = dbConn.GetDataTable(select, query);
                if (idx.Rows.Count == 1)
                {
                    string               jsondata   = idx.Rows[0]["JSONDATAOBJECT"].ToString();
                    ConnectParameters    source     = JsonConvert.DeserializeObject <ConnectParameters>(jsondata);
                    List <DataAccessDef> accessDefs = JsonConvert.DeserializeObject <List <DataAccessDef> >(source.DataAccessDefinition);

                    DataAccessDef logType = accessDefs.First(x => x.DataType == "Log");
                    select = logType.Select;
                    query  = $" where CURVE_ID = '{curveName}' and UWI = '{uwi}'";
                    DataTable lc = dbConn.GetDataTable(select, query);
                    if (lc.Rows.Count == 1)
                    {
                        double logNullValue = Common.GetDataRowNumber(lc.Rows[0], "NULL_REPRESENTATION");

                        DataAccessDef logCurvedType = accessDefs.First(x => x.DataType == "LogCurve");
                        select = logCurvedType.Select;
                        query  = $" where CURVE_ID = '{curveName}' and UWI = '{uwi}'";
                        DataTable lg          = dbConn.GetDataTable(select, query);
                        DataTable sortedCurve = RuleMethodUtilities.GetSortedLogCurve(lg, uwi);

                        if (sortedCurve.Rows.Count > 0)
                        {
                            int rowNumber = RuleMethodUtilities.GetRowNumberForPickDepth(sortedCurve, (double)pickDepth);

                            double?smoothLogValue = RuleMethodUtilities.GetSmoothLogValue(sortedCurve, logNullValue, rowNumber);

                            string rock;
                            if (smoothLogValue >= 0 & smoothLogValue < 10)
                            {
                                rock = "Salt";
                            }
                            if (smoothLogValue >= 10 & smoothLogValue < 20)
                            {
                                rock = "Limestone";
                            }
                            else if (smoothLogValue >= 20 & smoothLogValue < 55)
                            {
                                rock = "Sandstone";
                            }
                            else if (smoothLogValue >= 55 & smoothLogValue < 150)
                            {
                                rock = "Shale";
                            }
                            else
                            {
                                rock = "Unknown";
                            }

                            dataObject["DOMINANT_LITHOLOGY"] = rock;
                            string remark = dataObject["REMARK"] + $";Pick depth has been predicted by QCEngine";
                            dataObject["REMARK"] = remark;

                            RuleModel rule = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
                            result.DataObject = dataObject.ToString();
                            result.DataType   = rule.DataType;
                            result.SaveType   = "Update";
                            result.IndexId    = qcSetup.IndexId;
                            result.Status     = "Passed";
                        }
                    }
                }
            }

            return(result);
        }
Exemplo n.º 19
0
        public static PredictionResult PredictFormationOrder(QcRuleSetup qcSetup, DbUtilities dbConn)
        {
            List <StratUnits> inv    = new List <StratUnits>();
            PredictionResult  result = new PredictionResult
            {
                Status = "Failed"
            };
            string formation;
            string tempTable = "#MinMaxAllFormationPick";

            DataTable idx = new DataTable();

            try
            {
                string select = "select * from #MinMaxAllFormationPick";
                string query  = "";
                idx = dbConn.GetDataTable(select, query);
            }
            catch (Exception ex)
            {
                if (ex.InnerException.Message.Contains("Invalid object name"))
                {
                    string select = $"EXEC spGetMinMaxAllFormationPick";
                    string query  = "";
                    idx = dbConn.GetDataTable(select, query);
                    string SQLCreateTempTable = Common.GetCreateSQLFromDataTable(tempTable, idx);
                    dbConn.SQLExecute(SQLCreateTempTable);
                    dbConn.BulkCopy(idx, tempTable);
                }
                else
                {
                    throw;
                }
            }

            JObject dataObject = JObject.Parse(qcSetup.DataObject);

            formation = dataObject["STRAT_UNIT_ID"].ToString();
            string tmpFormation = Common.FixAposInStrings(formation);
            string condition    = $"STRAT_UNIT_ID = '{tmpFormation}'";
            var    rows         = idx.Select(condition);

            if (rows.Length == 1)
            {
                RuleModel rule = JsonConvert.DeserializeObject <RuleModel>(qcSetup.RuleObject);
                int       age  = Convert.ToInt32(rows[0]["AGE"]);
                dataObject[rule.DataAttribute] = age;
                string remark = dataObject["REMARK"] + $";{rule.DataAttribute} has been predicted by QCEngine;";
                dataObject["REMARK"] = remark;
                result.DataObject    = dataObject.ToString();
                result.DataType      = rule.DataType;
                result.SaveType      = "Update";
                result.IndexId       = qcSetup.IndexId;
                result.Status        = "Passed";
            }
            else if (rows.Length > 1)
            {
                throw new Exception("PredictFormationOrder: Multiple occurences of formation not allowed");
            }

            return(result);
        }
        public static double?CalculateDepthUsingIdw(DataTable nb, QcRuleSetup qcSetup)
        {
            double?depth = null;

            double prevLat = -99999.0;
            double prevLon = -99999.0;

            for (int k = 0; k < nb.Rows.Count; k++)
            {
                double currLat  = Common.GetDataRowNumber(nb.Rows[k], "LATITUDE");
                double currLon  = Common.GetDataRowNumber(nb.Rows[k], "LONGITUDE");
                double distance = 99999.0;
                if (nb.Columns.Contains("DISTANCE"))
                {
                    distance = Convert.ToDouble(nb.Rows[k]["DISTANCE"]);
                }

                Boolean deleteRow = false;
                if (currLat == -99999.0 && currLon == -99999.0)
                {
                    deleteRow = true;
                }
                if (Math.Abs(prevLat - currLat) < 0.0001 & Math.Abs(prevLon - currLon) < 0.0001)
                {
                    deleteRow = true;
                }
                if (distance < 0.1)
                {
                    deleteRow = true;
                }
                if (deleteRow)
                {
                    nb.Rows[k].Delete();
                }

                prevLat = currLat;
                prevLon = currLon;
            }
            nb.AcceptChanges();

            JObject         ruleObject     = JObject.Parse(qcSetup.RuleObject);
            string          depthAttribute = ruleObject["DataAttribute"].ToString();
            List <IdwPoint> idwPoints      = new List <IdwPoint>();

            foreach (DataRow row in nb.Rows)
            {
                double distance = Common.GetDataRowNumber(row, "DISTANCE");
                double number   = Common.GetDataRowNumber(row, "DEPTH");
                if (number != -99999.0)
                {
                    idwPoints.Add(new IdwPoint
                    {
                        Distance = distance,
                        Depth    = number
                    });
                }
            }

            if (idwPoints.Count > 2)
            {
                depth = IdwCalculate(idwPoints);
            }

            return(depth);
        }