/// <summary> /// Retrieve annotations for the specified SDMX <paramref name="annotable"/> object /// </summary> /// <param name="sysId">The artefact primary key value.</param> /// <param name="annotable">The SDMX object.</param> public void RetrieveAnnotations(long sysId, IAnnotableMutableObject annotable) { using (var command = this._annotationCommandBuilder.Build(new PrimaryKeySqlQuery(this._annotationSqlQueryInfo, sysId))) using (var dataReader = this._mappingStoreDb.ExecuteReader(command)) { int annIdIdx = dataReader.GetOrdinal("ANN_ID"); int idIdx = dataReader.GetOrdinal("ID"); int txtIdx = dataReader.GetOrdinal("TEXT"); int langIdx = dataReader.GetOrdinal("LANGUAGE"); int typeIdx = dataReader.GetOrdinal("TYPE"); int titleIdx = dataReader.GetOrdinal("TITLE"); int urlIdx = dataReader.GetOrdinal("URL"); IDictionary <long, IAnnotationMutableObject> annotationMap = new Dictionary <long, IAnnotationMutableObject>(); while (dataReader.Read()) { var annId = dataReader.GetInt64(annIdIdx); IAnnotationMutableObject annotation; if (!annotationMap.TryGetValue(annId, out annotation)) { annotation = new AnnotationMutableCore { Id = DataReaderHelper.GetString(dataReader, idIdx), Title = DataReaderHelper.GetString(dataReader, titleIdx), Type = DataReaderHelper.GetString(dataReader, typeIdx) }; var url = DataReaderHelper.GetString(dataReader, urlIdx); Uri uri; if (!string.IsNullOrWhiteSpace(url) && Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri)) { annotation.Uri = uri; } annotable.AddAnnotation(annotation); } var text = DataReaderHelper.GetString(dataReader, txtIdx); if (!string.IsNullOrWhiteSpace(text)) { annotation.AddText(DataReaderHelper.GetString(dataReader, langIdx), text); } } } }
/// <summary> /// Retrieve annotations for all specified <paramref name="annotateables"/> with parent /// </summary> /// <typeparam name="T">The sub type of <see cref="IAnnotableMutableObject"/></typeparam> /// <param name="parentSysId">The parent primary key value.</param> /// <param name="annotateables">The SDMX objects that accept annotations.</param> public void RetrieveAnnotations <T>(long parentSysId, IDictionary <long, T> annotateables) where T : IAnnotableMutableObject { using (var command = this._annotationCommandBuilder.Build(new PrimaryKeySqlQuery(this._annotationSqlQueryInfo, parentSysId))) { _log.InfoFormat(CultureInfo.InvariantCulture, "Executing query for identifiable annotations : {0}", command.CommandText); using (var dataReader = this._mappingStoreDb.ExecuteReader(command)) { int sysIdIdx = dataReader.GetOrdinal("SYSID"); int annIdIdx = dataReader.GetOrdinal("ANN_ID"); int idIdx = dataReader.GetOrdinal("ID"); int txtIdx = dataReader.GetOrdinal("TEXT"); int langIdx = dataReader.GetOrdinal("LANGUAGE"); int typeIdx = dataReader.GetOrdinal("TYPE"); int titleIdx = dataReader.GetOrdinal("TITLE"); int urlIdx = dataReader.GetOrdinal("URL"); IDictionary <long, IAnnotationMutableObject> annotationMap = new Dictionary <long, IAnnotationMutableObject>(); while (dataReader.Read()) { var annId = dataReader.GetInt64(annIdIdx); IAnnotationMutableObject annotation; if (!annotationMap.TryGetValue(annId, out annotation)) { annotation = new AnnotationMutableCore { Id = DataReaderHelper.GetString(dataReader, idIdx), Title = DataReaderHelper.GetString(dataReader, titleIdx), Type = DataReaderHelper.GetString(dataReader, typeIdx) }; var url = DataReaderHelper.GetString(dataReader, urlIdx); Uri uri; if (!string.IsNullOrWhiteSpace(url) && Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri)) { annotation.Uri = uri; } var sysId = dataReader.GetInt64(sysIdIdx); T annotable; if (annotateables.TryGetValue(sysId, out annotable)) { annotable.AddAnnotation(annotation); } else { _log.WarnFormat(CultureInfo.InvariantCulture, "Possible bug detected while retrieving annotations. Could not find SDMX object of type ({0}) with primary key value {1}", typeof(T), sysId); } } var text = DataReaderHelper.GetString(dataReader, txtIdx); if (!string.IsNullOrWhiteSpace(text)) { annotation.AddText(DataReaderHelper.GetString(dataReader, langIdx), text); } } this._mappingStoreDb.CancelSafe(command); } } }