예제 #1
0
        private SeriesDataCart getDataCartFromMetadata(SeriesMetadata series, DataServiceInfo waterOneFlowServiceInfo)
        {
            var  result = new SeriesDataCart();
            Site cSite  = series.Site;

            result.SiteName  = cSite.Name;
            result.SiteCode  = cSite.Code;
            result.Latitude  = cSite.Latitude;
            result.Longitude = cSite.Longitude;

            Variable v = series.Variable;

            result.VariableName = v.Name;
            result.VariableCode = v.Code;
            result.DataType     = v.DataType;
            result.ValueType    = v.ValueType;

            result.SampleMedium    = v.SampleMedium;
            result.TimeSupport     = Convert.ToDouble(v.TimeSupport, CultureInfo.InvariantCulture);
            result.GeneralCategory = v.GeneralCategory;
            result.TimeUnit        = v.TimeUnit.Name;

            result.BeginDate  = Convert.ToDateTime(series.BeginDateTime, CultureInfo.InvariantCulture);
            result.EndDate    = Convert.ToDateTime(series.EndDateTime, CultureInfo.InvariantCulture);
            result.ValueCount = series.ValueCount;

            result.ServURL  = waterOneFlowServiceInfo.EndpointURL;
            result.ServCode = titleTextbox.Text;

            return(result);
        }
예제 #2
0
        /// <summary>
        /// Retrieves data from WaterOneFlow services, persists a publicly-accessible copy as a CSV-formatted document
        /// (see <a href="http://www.ietf.org/rfc/rfc4180.txt">rfc-4180</a> and <a href="http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm">this discussion</a>),
        /// and returns a web-formatted response including a URI to the reference link.
        /// </summary>
        /// <param name="SeriesID"></param>
        /// <param name="lat"></param>
        /// <param name="lng"></param>
        /// <returns></returns>
        public async Task <SeriesData> Get(int SeriesID, double lat, double lng)
        {
            DateTimeOffset requestTime = DateTimeOffset.UtcNow;

            DataExportRequest cachedResult = await wdcStore.CheckIfSeriesExistsInStorage(CUAHSIDataStorage.LogHelper.GetCUAHSIDataStorage(), SeriesID, requestTime);

            if (cachedResult == null)
            {
                //get series from wateroneflow and return response
                Tuple <Stream, SeriesData> data = await discoveryService.GetSeriesDataObjectAndStreamFromSeriesTriple(SeriesID, lat, lng);

                string nameGuid = Guid.NewGuid().ToString();
                var    dl       = wdcStore.PersistSeriesData(data.Item2, nameGuid, requestTime);

                //fire and forget => no reason to require consistency with user download.
                var persist = wdcStore.PersistSeriesDocumentStream(data.Item1, SeriesID, nameGuid, DateTime.UtcNow);

                await Task.WhenAll(new List <Task>() { dl, persist });

                data.Item2.wdcCache = dl.Result.Uri;
                return(data.Item2);
            }
            else
            {
                //get series from cloud cache and return response
                ServerSideHydroDesktop.ObjectModel.Series dataResult = await wdcStore.GetWaterOneFlowFromCloudCache(SeriesID.ToString(), cachedResult.DownloadGuid, cachedResult.ServUrl);

                SeriesMetadata meta = await discoveryService.SeriesMetaDataOfSeriesID(SeriesID, lat, lng);

                IList <DataValue> dataValues = dataResult.DataValueList.OrderBy(a => a.DateTimeUTC).Select(aa => new DataValue(aa)).ToList();
                return(new SeriesData(meta.SeriesID, meta, dataResult.QualityControlLevel.IsValid, dataValues,
                                      dataResult.Variable.VariableUnit.Name, dataResult.Variable.VariableUnit.Abbreviation, dataResult.Site.VerticalDatum, dataResult.Site.Elevation_m));
            }
            // SeriesData data = await discoveryService.GetSeriesDataObjectFromSeriesTriple(SeriesID, lat, lng);
        }
예제 #3
0
        public async Task <Tuple <Stream, SeriesData> > GetSeriesDataObjectAndStreamFromSeriesID(int seriesId)
        {
            SeriesMetadata meta = getSeriesMetadata(seriesId);

            // SeriesMetadata meta = await QueryHelpers.QueryHelpers.SeriesMetaDataOfSeriesID(SeriesID);
            if (meta == null)
            {
                throw new NullReferenceException();
            }
            else
            {
                Tuple <Stream, IList <ServerSideHydroDesktop.ObjectModel.Series> > data = await this.SeriesAndStreamOfSeriesID(meta);

                if (data == null || data.Item2.FirstOrDefault() == null)
                {
                    throw new KeyNotFoundException();
                }
                else
                {
                    var dataResult = data.Item2.FirstOrDefault();
                    IList <DataValue> dataValues = dataResult.DataValueList.OrderBy(a => a.DateTimeUTC).Select(aa => new DataValue(aa)).ToList();
                    return(new Tuple <Stream, SeriesData>(data.Item1, new SeriesData(meta.SeriesID, meta, dataResult.QualityControlLevel.IsValid, dataValues,
                                                                                     dataResult.Variable.VariableUnit.Name, dataResult.Variable.VariableUnit.Abbreviation, dataResult.Site.VerticalDatum, dataResult.Site.Elevation_m)));
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Parses a WaterML SiteInfo XML file
        /// </summary>
        /// <param name="xmlFile"></param>
        /// <returns></returns>
        public IList <SeriesMetadata> ParseGetSiteInfo(string xmlFile)
        {
            IList <SeriesMetadata> seriesList = new List <SeriesMetadata>();
            Site site = null;

            using (var reader = XmlReader.Create(xmlFile, _readerSettings))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        string readerName = reader.Name.ToLower();

                        if (readerName == "siteinfo")
                        {
                            //Read the site information
                            site = ReadSite(reader);
                        }
                        else if (site != null && readerName == "series")
                        {
                            SeriesMetadata newSeries = ReadSeriesFromSiteInfo(reader, site);
                            seriesList.Add(newSeries);
                        }
                    }
                }
            }
            return(seriesList);
        }
예제 #5
0
        public SeriesData(int seriesId, SeriesMetadata myMeta, IList<DataValue> dataValues, Variable variable, 
            List<Source> sources, List<Method> methods, List<QualityControlLevel> qualityControlLevels)
            : this()
        {
            myMetadata = myMeta;
            SeriesID = seriesId;
            HasConfirmedTimeStamp = true;
            TimeStampMessage = string.Empty;
            myVariable = variable;
            values = dataValues.ToList();
            ontology = new List<OntologyItem>();
            tags = new List<HydroTag>();
            if (null != sources)
            {
                mySources = sources;
            }

            if (null != methods)
            {
                myMethods = methods;
            }

            if (null != qualityControlLevels)
            {
                myQualityControlLevels = qualityControlLevels;
            }
        }
예제 #6
0
        private SeriesMetadata ReadSeriesFromSiteInfo(XmlReader r, Site site)
        {
            SeriesMetadata series = new SeriesMetadata();

            series.Site = site;

            while (r.Read())
            {
                if (r.NodeType == XmlNodeType.Element)
                {
                    string nodeName = r.Name.ToLower();
                    if (nodeName == "variable")
                    {
                        series.Variable = ReadVariable(r);
                    }
                    else if (nodeName == "valuecount")
                    {
                        r.Read();
                        series.ValueCount = Convert.ToInt32(r.Value);
                    }
                    else if (nodeName == "begindatetime")
                    {
                        r.Read();
                        series.BeginDateTime    = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                        series.BeginDateTimeUTC = series.BeginDateTime;
                    }
                    else if (nodeName == "enddatetime")
                    {
                        r.Read();
                        series.EndDateTime    = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                        series.EndDateTimeUTC = series.EndDateTime;
                    }
                    else if (nodeName == "method")
                    {
                        series.Method = ReadMethod(r);
                    }
                    else if (nodeName == "source")
                    {
                        series.Source = ReadSource(r);
                    }
                    else if (nodeName == "qualitycontrollevel")
                    {
                        //TODO: Read QualityControlLevel
                    }
                }
                else
                {
                    if (r.NodeType == XmlNodeType.EndElement && r.Name == "series")
                    {
                        return(series);
                    }
                }
            }
            return(series);
        }
예제 #7
0
 private static void ValidateSeriesMetadata(
     string expectedSeriesInstanceUid,
     string expectedModality,
     DateTime?expectedPerformedProcedureStepStartDate,
     SeriesMetadata actual)
 {
     Assert.NotNull(actual);
     Assert.Equal(expectedSeriesInstanceUid, actual.SeriesInstanceUid);
     Assert.Equal(expectedModality, actual.Modality);
     Assert.Equal(expectedPerformedProcedureStepStartDate, actual.PerformedProcedureStepStartDate);
 }
예제 #8
0
        private static FilteredTimeSeries ReadTimeSeries(
            byte version,
            BinaryReader reader,
            SeriesMetadata seriesMetadata,
            Dictionary <int, string> stringTable,
            Dictionary <int, SeriesMetadata> metadataTable)
        {
            if (version >= 3)
            {
                var index = (int)SerializationUtils.ReadUInt32FromBase128(reader);
                seriesMetadata = metadataTable[index];
            }

            var metricIdentifier = seriesMetadata.MetricIdentifier;
            var dimensionNames   = seriesMetadata.DimensionNames;

            var dimensionsCount = dimensionNames.Length;
            var dimensionList   = new KeyValuePair <string, string> [dimensionsCount];

            for (int k = 0; k < dimensionsCount; k++)
            {
                dimensionList[k] = new KeyValuePair <string, string>(dimensionNames[k], DeserializeStringByIndex(reader, stringTable));
            }

            var propertiesCount = reader.ReadByte();
            var evaluatedValues = new KeyValuePair <string, double> [propertiesCount];

            for (int k = 0; k < propertiesCount; k++)
            {
                evaluatedValues[k] = new KeyValuePair <string, double>(DeserializeStringByIndex(reader, stringTable), reader.ReadDouble());
            }

            var samplingTypesCount = reader.ReadByte();
            var timeSeriesData     = new KeyValuePair <SamplingType, double[]> [samplingTypesCount];

            for (int k = 0; k < samplingTypesCount; k++)
            {
                var samplingTypeString = DeserializeStringByIndex(reader, stringTable);
                var samplingType       = SamplingType.BuiltInSamplingTypes.ContainsKey(samplingTypeString)
                    ? SamplingType.BuiltInSamplingTypes[samplingTypeString]
                    : new SamplingType(samplingTypeString);
                timeSeriesData[k] = new KeyValuePair <SamplingType, double[]>(samplingType, DoubleValueSerializer.Deserialize(reader));
            }

            double evaluatedResult = propertiesCount == 0 ? double.NaN : evaluatedValues[0].Value;

            return(new FilteredTimeSeries(metricIdentifier, dimensionList, evaluatedResult, timeSeriesData));
        }
예제 #9
0
        /// <summary>
        /// Format: <servicecode>-<sitename>-<variablename>.<extension>
        /// </summary>
        /// <param name="meta"></param>
        /// <param name="timeSeriesFormat"></param>
        /// <returns></returns>
        public static string GenerateFileName(SeriesMetadata meta, TimeSeriesFormat timeSeriesFormat = TimeSeriesFormat.CSV)
        {
            string fileName  = string.Format("{0}-{1}-{2}", meta.ServCode.SanitizeForFilename(), meta.SiteName.SanitizeForFilename(), meta.VariableName.SanitizeForFilename());
            string extension = String.Empty;

            if (TimeSeriesFormat.WaterOneFlow == timeSeriesFormat)
            {
                extension = ".xml";
            }
            else if (TimeSeriesFormat.CSV == timeSeriesFormat)
            {
                //NOTE: Microsoft Excel restricts file path + name + extension to 218 characters max.  Truncate file name if indicated...

                extension = ".csv";

                while (218 < (fileName.Length + extension.Length))
                {
                    fileName = fileName.Substring(0, (fileName.Length - 1));
                }
            }

            return(string.Format("{0}{1}", fileName, extension));
        }
예제 #10
0
        public void CanSaveOneSeries()
        {
            Random random = new Random();
            string url    = @"http://his.crwr.utexas.edu/TXEvap/cuahsi_1_0.asmx";

            MetadataCacheManagerSQL manager = TestConfig.MetadataCacheManager;

            WaterOneFlowClient client = new WaterOneFlowClient(url);

            IList <Site> sites = client.GetSites();

            IList <SeriesMetadata> seriesList = client.GetSiteInfo(sites[0].Code);

            SeriesMetadata firstSeries = seriesList[0];

            DataServiceInfo service = GeDatatService(random.Next());

            manager.SaveDataService(service);

            firstSeries.DataService = service;

            manager.SaveSeries(firstSeries, service);
        }
예제 #11
0
        protected virtual SeriesMetadata ReadSeriesFromSiteInfo(XmlReader r, Site site)
        {
            var series = new SeriesMetadata {
                Site = site
            };

            while (r.Read())
            {
                if (r.NodeType == XmlNodeType.Element)
                {
                    if (XmlContext.AdvanceReaderPastEmptyElement(r))
                    {
                        //Empty element - advance and continue...
                        continue;
                    }

                    string nodeName = r.Name.ToLower();
                    if (nodeName == "variable")
                    {
                        series.Variable = ReadVariable(r);
                    }
                    else if (nodeName == "valuecount")
                    {
                        r.Read();
                        series.ValueCount = Convert.ToInt32(r.Value);
                    }
                    else if (nodeName == "begindatetime")
                    {
                        r.Read();
                        series.BeginDateTime    = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                        series.BeginDateTimeUTC = series.BeginDateTime;
                    }
                    else if (nodeName == "enddatetime")
                    {
                        r.Read();
                        series.EndDateTime    = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                        series.EndDateTimeUTC = series.EndDateTime;
                    }
                    else if (nodeName == "begindatetimeutc")
                    {
                        r.Read();
                        series.BeginDateTimeUTC = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                    }
                    else if (nodeName == "enddatetimeutc")
                    {
                        r.Read();
                        series.EndDateTimeUTC = Convert.ToDateTime(r.Value, CultureInfo.InvariantCulture);
                    }
                    else if (nodeName == "method")
                    {
                        series.Method = ReadMethod(r);
                    }
                    else if (nodeName == "source")
                    {
                        series.Source = ReadSource(r);
                    }
                    else if (nodeName == "qualitycontrollevel")
                    {
                        series.QualityControlLevel = ReadQualityControlLevel(r);
                    }
                }
                else
                {
                    if (r.NodeType == XmlNodeType.EndElement && r.Name == "series")
                    {
                        return(series);
                    }
                }
            }
            return(series);
        }
예제 #12
0
        private SeriesMetadata SeriesFromDataRow(DataRow row)
        {
            Site site = new Site();
            site.Name = Convert.ToString(row["SiteName"]);
            site.Code = Convert.ToString(row["SiteCode"]);
            site.Latitude = Convert.ToDouble(row["Latitude"]);
            site.Longitude = Convert.ToDouble(row["Longitude"]);

            Variable v = new Variable();
            v.Name = Convert.ToString(row["VariableName"]);
            v.Code = Convert.ToString(row["VariableCode"]);
            v.DataType = Convert.ToString(row["DataType"]);
            v.ValueType = Convert.ToString(row["ValueType"]);
            v.Speciation = Convert.ToString(row["Speciation"]);
            v.SampleMedium = Convert.ToString(row["SampleMedium"]);
            v.TimeSupport = Convert.ToDouble(row["TimeSupport"]);
            v.GeneralCategory = Convert.ToString(row["GeneralCategory"]);
            v.VariableUnit = Unit.Unknown;
            v.VariableUnit.Name = Convert.ToString(row["VariableUnitsName"]);
            v.TimeUnit = Unit.UnknownTimeUnit;
            v.TimeUnit.Name = Convert.ToString(row["TimeUnitsName"]);

            Method m = Method.Unknown;
            //m.Description = Convert.ToString(row["MethodDescription"]);

            Source src = Source.Unknown;
            //src.Description = Convert.ToString(row["SourceDescription"]);
            src.Organization = Convert.ToString(row["Organization"]);
            src.Citation = Convert.ToString(row["Citation"]);

            QualityControlLevel qc = QualityControlLevel.Unknown;
            //qc.Code = Convert.ToString(row["QualityControlLevelCode"]);
            //qc.Definition = Convert.ToString(row["QualityControlLevelDefinition"]);

            SeriesMetadata newSeries = new SeriesMetadata(site, v, m, qc, src);
            newSeries.BeginDateTime = Convert.ToDateTime(row["BeginDateTime"]);
            newSeries.EndDateTime = Convert.ToDateTime(row["EndDateTime"]);
            newSeries.BeginDateTimeUTC = Convert.ToDateTime(row["BeginDateTimeUTC"]);
            newSeries.EndDateTimeUTC = Convert.ToDateTime(row["EndDateTimeUTC"]);
            newSeries.ValueCount = Convert.ToInt32(row["ValueCount"]);

            DataServiceInfo servInfo = new DataServiceInfo();
            servInfo.EndpointURL = Convert.ToString(row["ServiceEndpointURL"]);
            //servInfo.ServiceCode = Convert.ToString(row["ServiceCode"]);
            newSeries.DataService = servInfo;

            return newSeries;
        }
예제 #13
0
        /// <summary>
        /// Saves the series metadata to the metadata cache database.
        /// This method also automatically saves the site, variable,
        /// method, source and quality control level of the series.
        /// </summary>
        /// <param name="series">The series to be saved</param>
        /// <param name="dataService">The web service containing the series</param>
        public void SaveSeries(SeriesMetadata series, DataServiceInfo dataService)
        {
            string sqlSite = "SELECT SiteID FROM SitesCache WHERE SiteCode = ?";
            string sqlVariable = "SELECT VariableID FROM VariablesCache WHERE VariableCode = ?";
            string sqlMethod = "SELECT MethodID FROM MethodsCache WHERE MethodDescription = ?";
            string sqlSource = "SELECT SourceID FROM SourcesCache WHERE Organization = ?";
            string sqlQuality = "SELECT QualityControlLevelID FROM QualityControlLevelsCache WHERE Definition = ?";
            string sqlRowID = "; SELECT LAST_INSERT_ROWID();";

            string sqlSaveSite = "INSERT INTO SitesCache(SiteCode, SiteName, Latitude, Longitude, LatLongDatumSRSID, LatLongDatumName, " +
                "Elevation_m, VerticalDatum, LocalX, LocalY, LocalProjectionSRSID, LocalProjectionName, " +
                "PosAccuracy_m, State, County, Comments, ServiceID) " +
                "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sqlRowID;

            string sqlSaveVariable = "INSERT INTO variablesCache(VariableCode, VariableName, Speciation, " +
                "SampleMedium, ValueType, DataType, GeneralCategory, NoDataValue, VariableUnitsName, VariableUnitsType, VariableUnitsAbbreviation, " +
                "IsRegular, TimeSupport, TimeUnitsName, TimeUnitsType, TimeUnitsAbbreviation, ServiceID) " +
                "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sqlRowID;

            string sqlSaveMethod = "INSERT INTO MethodsCache(OriginMethodID, MethodDescription, MethodLink, ServiceID) VALUES(?, ?, ?, ?)" + sqlRowID;

            string sqlSaveQualityControl = "INSERT INTO QualityControlLevelsCache(OriginQualityControlLevelID, QualityControlLevelCode, Definition, Explanation) " +
                "VALUES(?,?,?,?)" + sqlRowID;

            string sqlSaveSource = "INSERT INTO SourcesCache(OriginSourceID, Organization, SourceDescription, SourceLink, ContactName, Phone, " +
                                   "Email, Address, City, State, ZipCode, Citation, MetadataID) " +
                                   "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sqlRowID;

            string sqlSaveISOMetadata = "INSERT INTO ISOMetadataCache(TopicCategory, Title, Abstract, ProfileVersion, MetadataLink) " +
                                    "VALUES(?, ?, ?, ?, ?)" + sqlRowID;

            string sqlSaveSeries = "INSERT INTO DataSeriesCache(SiteID, VariableID, MethodID, SourceID, QualityControlLevelID, " +
                "BeginDateTime, EndDateTime, BeginDateTimeUTC, EndDateTimeUTC, ValueCount, ServiceID) " +
                "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sqlRowID;

            int siteID = 0;
            int variableID = 0;

            int methodID = 0;
            int qualityControlLevelID = 0;
            int sourceID = 0;
            int isoMetadataID = 0;
            int seriesID = 0;

            //check the ServiceID (must be already set)
            if (dataService.Id <= 0)
            {
                throw new ArgumentException("The DataServiceID must be set.");
            }

            //Step 1 Begin Transaction
            using (DbConnection conn = _db.CreateConnection())
            {
                conn.Open();

                using (DbTransaction tran = conn.BeginTransaction())
                {
                    //****************************************************************
                    //*** Step 2 Site
                    //****************************************************************
                    object siteIDResult = null;
                    using (DbCommand cmd01 = conn.CreateCommand())
                    {
                        cmd01.CommandText = sqlSite;
                        cmd01.Parameters.Add(_db.CreateParameter(DbType.String, series.Site.Code));
                        siteIDResult = cmd01.ExecuteScalar();
                        if (siteIDResult != null)
                        {
                            siteID = Convert.ToInt32(siteIDResult);
                        }
                    }

                    if (siteID == 0) //New Site needs to be created
                    {
                        //Insert the site to the database
                        using (DbCommand cmd04 = conn.CreateCommand())
                        {
                            Site site = series.Site;

                            cmd04.CommandText = sqlSaveSite;
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.Code));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.Name));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.Latitude));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.Longitude));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Int32, site.SpatialReference.SRSID));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.SpatialReference.SRSName));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.Elevation_m));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.VerticalDatum));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.LocalX));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.LocalY));
                            if (site.LocalProjection != null)
                            {
                                cmd04.Parameters.Add(_db.CreateParameter(DbType.Int32, site.LocalProjection.SRSID));
                                cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.LocalProjection.SRSName));
                            }
                            else
                            {
                                cmd04.Parameters.Add(_db.CreateParameter(DbType.Int32, 0));
                                cmd04.Parameters.Add(_db.CreateParameter(DbType.String, "unknown"));
                            }
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Double, site.PosAccuracy_m));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.State));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.County));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.String, site.Comments));
                            cmd04.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));

                            siteIDResult = cmd04.ExecuteScalar();
                            siteID = Convert.ToInt32(siteIDResult);
                        }
                    }

                    //****************************************************************
                    //*** Step 3 Variable
                    //****************************************************************
                    Variable variable = series.Variable;

                    object variableIDResult = null;
                    using (DbCommand cmd05 = conn.CreateCommand())
                    {
                        cmd05.CommandText = sqlVariable;
                        cmd05.Parameters.Add(_db.CreateParameter(DbType.String, variable.Code));
                        cmd05.Parameters[0].Value = variable.Code;
                        variableIDResult = cmd05.ExecuteScalar();
                        if (variableIDResult != null)
                        {
                            variableID = Convert.ToInt32(variableIDResult);
                        }
                    }

                    if (variableID == 0) //New variable needs to be created
                    {
                        //Insert the variable to the database
                        using (DbCommand cmd09 = conn.CreateCommand())
                        {
                            cmd09.CommandText = sqlSaveVariable;
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.Code));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.Name));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.Speciation));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.SampleMedium));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.ValueType));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.DataType));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.GeneralCategory));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.Double, variable.NoDataValue));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.VariableUnit.Name));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.VariableUnit.UnitsType));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.VariableUnit.Abbreviation));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.Boolean, variable.IsRegular));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.Double, variable.TimeSupport));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.TimeUnit.Name));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.TimeUnit.UnitsType));
                            cmd09.Parameters.Add(_db.CreateParameter(DbType.String, variable.TimeUnit.Abbreviation));

                            cmd09.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));

                            variableIDResult = cmd09.ExecuteScalar();
                            variableID = Convert.ToInt32(variableIDResult);
                        }
                    }

                    //****************************************************************
                    //*** Step 4 Method
                    //****************************************************************
                    Method method = series.Method;

                    object methodIDResult = null;
                    using (DbCommand cmd10 = conn.CreateCommand())
                    {
                        cmd10.CommandText = sqlMethod;
                        cmd10.Parameters.Add(_db.CreateParameter(DbType.String, method.Description));
                        methodIDResult = cmd10.ExecuteScalar();
                        if (methodIDResult != null)
                        {
                            methodID = Convert.ToInt32(methodIDResult);
                        }
                    }

                    if (methodID == 0)
                    {
                        using (DbCommand cmd11 = conn.CreateCommand())
                        {
                            cmd11.CommandText = sqlSaveMethod;
                            cmd11.Parameters.Add(_db.CreateParameter(DbType.Int32, method.Code));
                            cmd11.Parameters.Add(_db.CreateParameter(DbType.String, method.Description));
                            cmd11.Parameters.Add(_db.CreateParameter(DbType.String, method.Link));
                            cmd11.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));
                            methodIDResult = cmd11.ExecuteScalar();
                            methodID = Convert.ToInt32(methodIDResult);
                        }
                    }

                    //****************************************************************
                    //*** Step 5 Quality Control Level
                    //****************************************************************
                    QualityControlLevel qc = series.QualityControlLevel;

                    object qualityControlLevelIDResult = null;
                    using (DbCommand cmd12 = conn.CreateCommand())
                    {
                        cmd12.CommandText = sqlQuality;
                        cmd12.Parameters.Add(_db.CreateParameter(DbType.String, qc.Definition));
                        qualityControlLevelIDResult = cmd12.ExecuteScalar();
                        if (qualityControlLevelIDResult != null)
                        {
                            qualityControlLevelID = Convert.ToInt32(qualityControlLevelIDResult);
                        }
                    }

                    if (qualityControlLevelID == 0)
                    {
                        //to set the code
                        int qcCode = 0;
                        int.TryParse(qc.Code, out qcCode);

                        using (DbCommand cmd13 = conn.CreateCommand())
                        {
                            cmd13.CommandText = sqlSaveQualityControl;
                            cmd13.Parameters.Add(_db.CreateParameter(DbType.Int32, qcCode));
                            cmd13.Parameters.Add(_db.CreateParameter(DbType.String, qc.Code));
                            cmd13.Parameters.Add(_db.CreateParameter(DbType.String, qc.Definition));
                            cmd13.Parameters.Add(_db.CreateParameter(DbType.String, qc.Explanation));
                            cmd13.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));
                            qualityControlLevelIDResult = cmd13.ExecuteScalar();
                            qualityControlLevelID = Convert.ToInt32(qualityControlLevelIDResult);
                        }
                    }

                    //****************************************************************
                    //*** Step 6 Source
                    //****************************************************************
                    Source source = series.Source;

                    object sourceIDResult = null;
                    using (DbCommand cmd14 = conn.CreateCommand())
                    {
                        cmd14.CommandText = sqlSource;
                        cmd14.Parameters.Add(_db.CreateParameter(DbType.String, source.Organization));
                        sourceIDResult = cmd14.ExecuteScalar();
                        if (sourceIDResult != null)
                        {
                            sourceID = Convert.ToInt32(sourceIDResult);
                        }
                    }

                    if (sourceID == 0)
                    {
                        using (DbCommand cmd17 = conn.CreateCommand())
                        {
                            cmd17.CommandText = sqlSaveSource;
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.Int32, source.OriginId));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Organization));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Description));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Link));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.ContactName));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Phone));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Email));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Address));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.City));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.State));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.Int32, source.ZipCode));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, source.Citation));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.String, isoMetadataID));
                            cmd17.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));
                            sourceIDResult = cmd17.ExecuteScalar();
                            sourceID = Convert.ToInt32(sourceIDResult);
                        }
                    }

                    //****************************************************************
                    //*** Step 7 Series
                    //****************************************************************
                    using (DbCommand cmd18 = conn.CreateCommand())
                    {
                        cmd18.CommandText = sqlSaveSeries;
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, siteID));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, variableID));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, methodID));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, sourceID));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, qualityControlLevelID));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.DateTime, series.BeginDateTime));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.DateTime, series.EndDateTime));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.DateTime, series.BeginDateTimeUTC));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.DateTime, series.EndDateTimeUTC));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, series.ValueCount));
                        cmd18.Parameters.Add(_db.CreateParameter(DbType.Int32, dataService.Id));

                        object seriesIDResult = cmd18.ExecuteScalar();
                        seriesID = Convert.ToInt32(seriesIDResult);
                    }

                    //Commit Transaction
                    tran.Commit();
                }
                conn.Close();
            }
        }
예제 #14
0
 /// <summary>
 /// Check if the series with the same site, variable, method,
 /// source, quality control level and data service already
 /// exists in the database.
 /// </summary>
 /// <param name="seriesToCheck">the series to be checked</param>
 /// <returns>The series from the db, or NULL if it doesn't exist</returns>
 /// <remarks>Not implemented</remarks>
 private SeriesMetadata CheckIfSeriesExists(SeriesMetadata seriesToCheck)
 {
     throw new NotImplementedException();
 }
예제 #15
0
        // writes the results to a list of data series objects (which is a theme)
        private void WriteDataSeriesResults(Object resultObj, PropertyInfo[] properties, IList <SeriesMetadata> lst)
        {
            if (resultObj == null)
            {
                return;
            }

            //we need to get the data service information as well.
            IList <DataServiceInfo> servicesList = GetServicesInBox(-179, -89, 179, 89);
            Dictionary <string, DataServiceInfo> servicesLookup = new Dictionary <string, DataServiceInfo>();

            foreach (DataServiceInfo servInfo in servicesList)
            {
                if (!servicesLookup.ContainsKey(servInfo.EndpointURL))
                {
                    servicesLookup.Add(servInfo.EndpointURL, servInfo);
                }
            }

            //to prevent duplicate search results - each site code / variable code combination
            //is added to the 'uniqueCode' list

            Array arr = resultObj as Array;

            if (arr != null)
            {
                foreach (object obj in arr)
                {
                    SeriesMetadata sm = new SeriesMetadata();
                    sm.Site        = new Site();
                    sm.Variable    = new Variable();
                    sm.DataService = new DataServiceInfo();

                    foreach (PropertyInfo pi in properties)
                    {
                        object val = pi.GetValue(obj, null);
                        if (val != null)
                        {
                            string propertyName = pi.Name.ToLower();

                            switch (propertyName)
                            {
                            case "location":
                                sm.Site.Code = val.ToString();
                                break;

                            case "varcode":
                                sm.Variable.Code = val.ToString();
                                break;

                            case "servcode":
                                string servCode = val.ToString();
                                sm.Site.NetworkPrefix        = servCode;
                                sm.Variable.VocabularyPrefix = servCode;
                                sm.DataService.ServiceCode   = servCode;
                                break;

                            case "latitude":
                                sm.Site.Latitude = Convert.ToDouble(val);
                                break;

                            case "longitude":
                                sm.Site.Longitude = Convert.ToDouble(val);
                                break;

                            case "sitename":
                                sm.Site.Name = Convert.ToString(val);
                                break;

                            case "varname":
                                sm.Variable.Name = Convert.ToString(val);
                                break;

                            case "servurl":
                                string url = Convert.ToString(val).ToLower().Trim();
                                if (url.EndsWith("?wsdl"))
                                {
                                    url = url.Replace("?wsdl", "");
                                }
                                sm.DataService.EndpointURL = url;
                                break;

                            case "valuecount":
                                sm.ValueCount = Convert.ToInt32(val);
                                break;

                            case "begindate":
                                sm.BeginDateTime = Convert.ToDateTime(val);
                                break;

                            case "enddate":
                                sm.EndDateTime = Convert.ToDateTime(val);
                                break;

                            case "datatype":
                                sm.Variable.DataType = val.ToString();
                                break;

                            case "valuetype":
                                sm.Variable.ValueType = val.ToString();
                                break;

                            case "samplemedium":
                                sm.Variable.SampleMedium = val.ToString();
                                break;

                            case "timeunits":
                                sm.Variable.TimeUnit = new Unit(val.ToString(), "time", val.ToString());
                                break;

                            case "gencategory":
                                sm.Variable.GeneralCategory = val.ToString();
                                break;

                            case "timesupport":
                                sm.Variable.TimeSupport = Convert.ToDouble(val);
                                break;
                            }
                        }
                    }
                    if (String.IsNullOrEmpty(sm.Variable.Code))
                    {
                        continue;
                    }

                    string compoundCode = sm.Site.Code + "|" + sm.Variable.Code;
                    if (_uniqueCodeList.Contains(compoundCode) == false)
                    {
                        sm.Source.Organization = ((DataServiceInfo)servicesLookup[sm.DataService.EndpointURL]).ServiceName;
                        sm.Source.Description  = ((DataServiceInfo)servicesLookup[sm.DataService.EndpointURL]).ServiceTitle;

                        lst.Add(sm);
                        _uniqueCodeList.Add(compoundCode);
                    }
                }
            }
        }
예제 #16
0
        private bool ReadPreamble(
            BinaryReader reader,
            out byte version,
            out uint resultTimeSeriesCount,
            out Dictionary <int, string> stringTable,
            out long stringTableLengthInByte,
            out SeriesMetadata seriesMetadata,
            out Dictionary <int, SeriesMetadata> metadataTable,
            out long metadataTableLengthInByte)
        {
            resultTimeSeriesCount     = 0;
            stringTable               = null;
            stringTableLengthInByte   = 0;
            seriesMetadata            = null;
            metadataTable             = null;
            metadataTableLengthInByte = 0;

            version = reader.ReadByte();

            if (version == 0)
            {
                throw new MetricsClientException(
                          $"The server didn't respond with the right version of serialization - the initial version is 1 but the server responds with version 0.");
            }

            this.DiagnosticInfo = new DiagnosticInfo();
            if (version == VersionToIndicateCompleteFailure)
            {
                this.ErrorCode = (FilteredTimeSeriesQueryResponseErrorCode)reader.ReadInt16();

                // The trace ID and others will be filled in by callers.
                this.DiagnosticInfo.ErrorMessage = reader.ReadString();

                bool returnRequestObjectOnFailure = reader.ReadBoolean();
                if (returnRequestObjectOnFailure)
                {
                    this.QueryRequest = JsonConvert.DeserializeObject <FilteredTimeSeriesQueryRequest>(reader.ReadString());
                }

                return(false);
            }

            if (version > NextVersion)
            {
                throw new MetricsClientException(
                          $"The server didn't respond with the right version of serialization. CurrentVersion : {CurrentVersion}, NextVersion : {NextVersion}, Responded: {version}.");
            }

            var hasDataQualityInfo = reader.ReadBoolean();

            if (hasDataQualityInfo)
            {
                var queryResultQualityInfo = new QueryResultQualityInfo();
                queryResultQualityInfo.Deserialize(reader);
            }

            this.StartTimeUtc = new DateTime(
                (long)SerializationUtils.ReadUInt64FromBase128(reader) * TimeSpan.TicksPerMinute,
                DateTimeKind.Utc);
            this.EndTimeUtc = this.StartTimeUtc.AddMinutes(SerializationUtils.ReadUInt32FromBase128(reader));
            this.TimeResolutionInMinutes = (int)SerializationUtils.ReadUInt32FromBase128(reader);
            resultTimeSeriesCount        = SerializationUtils.ReadUInt32FromBase128(reader);

            /* Read string table. */
            var currentPosition             = reader.BaseStream.Position;
            var stringTableRelativePosition = reader.ReadUInt64();

            reader.BaseStream.Position = currentPosition + (long)stringTableRelativePosition;

            var stringTableStartPostion = reader.BaseStream.Position;
            var stringTableSize         = SerializationUtils.ReadUInt32FromBase128(reader);

            stringTable = new Dictionary <int, string>((int)stringTableSize);
            for (int i = 0; i < stringTableSize; i++)
            {
                stringTable.Add(i, reader.ReadString());
            }

            stringTableLengthInByte = reader.BaseStream.Position - stringTableStartPostion;

            // + sizeof (double) since we just read the stringTableRelativePosition as double.
            reader.BaseStream.Position = currentPosition + sizeof(double);

            if (version >= 3)
            {
                /* Read metadata table */
                currentPosition = reader.BaseStream.Position;
                var metadataTableRelativePosition = reader.ReadUInt64();
                reader.BaseStream.Position = currentPosition + (long)metadataTableRelativePosition;

                var metadataTableStartPostion = reader.BaseStream.Position;
                var metadataTableSize         = SerializationUtils.ReadUInt32FromBase128(reader);

                metadataTable = new Dictionary <int, SeriesMetadata>((int)metadataTableSize);
                for (var i = 0; i < metadataTableSize; i++)
                {
                    metadataTable.Add(i, DeserializeTimeSeriesMetadata(reader, stringTable));
                }

                metadataTableLengthInByte = reader.BaseStream.Position - metadataTableStartPostion;

                // + sizeof (double) since we just read the metadataTableRelativePosition as double.
                reader.BaseStream.Position = currentPosition + sizeof(double);
            }

            if (resultTimeSeriesCount > 0)
            {
                if (version < 3)
                {
                    seriesMetadata    = DeserializeTimeSeriesMetadata(reader, stringTable);
                    this.QueryRequest = new FilteredTimeSeriesQueryRequest(seriesMetadata.MetricIdentifier);
                }
                else
                {
                    this.QueryRequest = new FilteredTimeSeriesQueryRequest(metadataTable.Values.First().MetricIdentifier);
                }
            }

            return(true);
        }
예제 #17
0
        private static string GetSeriesXml(SeriesBase series)
        {
            var metadata = new SeriesMetadata(series);

            return(metadata.AsXml());
        }
예제 #18
0
        public async Task <Tuple <Stream, IList <ServerSideHydroDesktop.ObjectModel.Series> > > SeriesAndStreamOfSeriesID(SeriesMetadata meta)
        {
            WaterOneFlowClient client = new WaterOneFlowClient(meta.ServURL);

            return(await client.GetValuesAndRawStreamAsync(
                       meta.SiteCode,
                       meta.VarCode,
                       meta.StartDate,
                       DateTime.UtcNow,
                       Convert.ToInt32(10000)));
        }