/// <summary> /// Validates the SDMX V20. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <param name="format"> /// The format. /// </param> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException"> /// This dataflow uses SDMX v2.0 only /// DataStructureDefinition. /// </exception> private static void ValidateSdmxV20(IBaseDataQuery dataQuery, BaseConstantType <BaseDataFormatEnumType> format) { if (!dataQuery.DataStructure.IsCompatible(SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo))) { // TODO check java message/error in this case throw new SdmxNoResultsException("This dataflow uses SDMX v2.1 only DataStructureDefinition."); } switch (format.EnumType) { case BaseDataFormatEnumType.Null: break; case BaseDataFormatEnumType.Generic: case BaseDataFormatEnumType.Compact: case BaseDataFormatEnumType.Utility: case BaseDataFormatEnumType.Edi: ValidateSdmxV20TimeSeries(dataQuery); break; case BaseDataFormatEnumType.CrossSectional: ValidateErrors(Validator.ValidateForCrossSectional(dataQuery.DataStructure)); break; default: throw new SdmxSemmanticException("SDMX v2.0 Unsupported format " + format); } }
/// <summary> /// Visits the specified data query. /// </summary> /// <param name="dataQuery">The data query.</param> public void Visit(IBaseDataQuery dataQuery) { foreach (var visitor in this._dataQueryVisitors) { visitor.Visit(dataQuery); } }
/// <summary> /// Validates the specified data query. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <exception cref="SdmxSemmanticException"> /// Unsupported format or validation error. /// </exception> /// <exception cref="ArgumentNullException"><paramref name="dataQuery"/> is <see langword="null" />.</exception> public void Validate(IBaseDataQuery dataQuery) { if (dataQuery == null) { throw new ArgumentNullException("dataQuery"); } switch (this._schema.EnumType) { case SdmxSchemaEnumType.Null: break; case SdmxSchemaEnumType.VersionOne: break; case SdmxSchemaEnumType.VersionTwo: ValidateSdmxV20(dataQuery, this._format); break; case SdmxSchemaEnumType.VersionTwoPointOne: ValidateSdmxV21(dataQuery); break; case SdmxSchemaEnumType.Edi: ValidateSdmxV20TimeSeries(dataQuery); break; case SdmxSchemaEnumType.Ecv: break; case SdmxSchemaEnumType.Csv: break; case SdmxSchemaEnumType.Json: break; default: throw new SdmxSemmanticException(string.Format("Unsupported format {0}", this._schema.ToEnglishString())); } }
/// <summary> /// Validates the SDMX V21. /// </summary> /// <param name="query"> /// The query. /// </param> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException"> /// This dataflow uses SDMX v2.0 only /// DataStructureDefinition. /// </exception> private static void ValidateSdmxV21(IBaseDataQuery query) { // ReSharper restore UnusedParameter.Local // TODO check java message/error in this case if (query.DataStructure is ICrossSectionalDataStructureObject) { throw new SdmxSemmanticException("This dataflow uses SDMX v2.0 only DataStructureDefinition."); } }
/// <summary> /// Visits the specified data query. /// </summary> /// <param name="dataQuery">The data query.</param> public void Visit(IBaseDataQuery dataQuery) { if (dataQuery == null) { throw new ArgumentNullException("dataQuery"); } this.Authorize(dataQuery.Dataflow); }
/// <summary> /// Validates the specified data query. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <exception cref="SdmxSemmanticException"> /// Unsupported format or validation error. /// </exception> public void Validate(IBaseDataQuery dataQuery) { if (dataQuery == null) { throw new ArgumentNullException("dataQuery"); } switch (this._schema.EnumType) { case SdmxSchemaEnumType.Null: break; case SdmxSchemaEnumType.VersionOne: break; case SdmxSchemaEnumType.VersionTwo: ValidateSdmxV20(dataQuery, this._format); break; case SdmxSchemaEnumType.VersionTwoPointOne: ValidateSdmxV21(dataQuery); break; case SdmxSchemaEnumType.Edi: ValidateSdmxV20TimeSeries(dataQuery); break; case SdmxSchemaEnumType.Ecv: break; case SdmxSchemaEnumType.Csv: break; case SdmxSchemaEnumType.Json: break; default: throw new SdmxSemmanticException(string.Format("Unsupported format {0}", this._schema.ToEnglishString())); } }
/// <summary> /// Validates a SDMX V20 <paramref name="dataQuery"/> if it is valid for Time Series data. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <exception cref="DataRetrieverException"> /// It is not compatible with time series /// </exception> private static void ValidateSdmxV20TimeSeries(IBaseDataQuery dataQuery) { var errors = Validator.ValidateForCompact(dataQuery.DataStructure); ValidateErrors(errors); }
/// <summary> /// Visits the specified data query. /// </summary> /// <param name="dataQuery">The data query.</param> public void Visit(IBaseDataQuery dataQuery) { this._dataflowLogManager.Log(dataQuery.Dataflow); }
/// <summary> /// Validates the SDMX V20. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <param name="format"> /// The format. /// </param> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException"> /// This dataflow uses SDMX v2.0 only /// DataStructureDefinition. /// </exception> private static void ValidateSdmxV20(IBaseDataQuery dataQuery, BaseConstantType<BaseDataFormatEnumType> format) { if (!dataQuery.DataStructure.IsCompatible(SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo))) { // TODO check java message/error in this case throw new SdmxNoResultsException("This dataflow uses SDMX v2.1 only DataStructureDefinition."); } switch (format.EnumType) { case BaseDataFormatEnumType.Null: break; case BaseDataFormatEnumType.Generic: case BaseDataFormatEnumType.Compact: case BaseDataFormatEnumType.Utility: case BaseDataFormatEnumType.Edi: ValidateSdmxV20TimeSeries(dataQuery); break; case BaseDataFormatEnumType.CrossSectional: ValidateErrors(Validator.ValidateForCrossSectional(dataQuery.DataStructure)); break; default: throw new SdmxSemmanticException("SDMX v2.0 Unsupported format " + format); } }
/// <summary> /// Validates the specified data query. /// </summary> /// <param name="dataQuery"> /// The data query. /// </param> /// <exception cref="SdmxSemmanticException"> /// Unsupported format or validation error. /// </exception> //public void Validate(IBaseDataQuery dataQuery) //{ // if (dataQuery == null) // { // throw new ArgumentNullException("dataQuery"); // } // switch (this._schema.EnumType) // { // case SdmxSchemaEnumType.Null: // break; // case SdmxSchemaEnumType.VersionOne: // break; // case SdmxSchemaEnumType.VersionTwo: // ValidateSdmxV20(dataQuery, this._format); // break; // case SdmxSchemaEnumType.VersionTwoPointOne: // ValidateSdmxV21(dataQuery); // break; // case SdmxSchemaEnumType.Edi: // ValidateSdmxV20TimeSeries(dataQuery); // break; // case SdmxSchemaEnumType.Ecv: // break; // case SdmxSchemaEnumType.Csv: // break; // case SdmxSchemaEnumType.Json: // break; // default: // throw new SdmxSemmanticException(string.Format("Unsupported format {0}", this._schema.ToEnglishString())); // } //} public void Validate(IBaseDataQuery dataQuery) { if (dataQuery == null) { throw new ArgumentNullException("dataQuery"); } ValidateSdmxV21(dataQuery); }
/// <summary> /// Visits the specified data query. /// </summary> /// <param name="dataQuery">The data query.</param> public void Visit(IBaseDataQuery dataQuery) { this._validator.Validate(dataQuery); }
/// <summary> /// Validates the specified data query. /// </summary> /// <param name="dataQuery">The data query.</param> /// <param name="dataWriter">The data writer.</param> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException">0 observations found (SDMX v2.1 behavior)</exception> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxResponseTooLargeException">Emulating default limit</exception> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxResponseSizeExceedsLimitException">Emulating server side limit</exception> /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxSemmanticException">Invalid component in query</exception> private void Validate(IBaseDataQuery dataQuery, IDataWriterEngine dataWriter) { switch (dataQuery.Dataflow.Id) { case Dataflows.NoResults: if (this._sdmxSchema == SdmxSchemaEnumType.VersionTwoPointOne) { throw new SdmxNoResultsException("0 observations found (SDMX v2.1 behavior)"); } break; case Dataflows.ResponseTooLarge: WriteData(dataQuery, dataWriter); throw new SdmxResponseTooLargeException("Emulating default limit"); case Dataflows.ResponseExceedsLimit: WriteData(dataQuery, dataWriter); throw new SdmxResponseSizeExceedsLimitException("Emulating server side limit"); case Dataflows.Semantic: throw new SdmxSemmanticException("Invalid component in query"); } }
/// <summary> /// Writes the data. /// </summary> /// <param name="dataQuery">The data query.</param> /// <param name="dataWriter">The data writer.</param> private static void WriteData(IBaseDataQuery dataQuery, IDataWriterEngine dataWriter) { if (dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.NoData || dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.Full) { if (dataQuery.Dataflow.Id.Equals("TEST_GROUPS")) { dataWriter.StartGroup("Sibling"); dataWriter.WriteGroupKeyValue("REF_AREA", "LU"); dataWriter.WriteGroupKeyValue("ADJUSTMENT", "N"); dataWriter.WriteGroupKeyValue("STS_INDICATOR", "PROD"); dataWriter.WriteGroupKeyValue("STS_ACTIVITY", "NS0030"); dataWriter.WriteGroupKeyValue("STS_INSTITUTION", "1"); dataWriter.WriteGroupKeyValue("STS_BASE_YEAR", "2000"); dataWriter.WriteAttributeValue("DECIMALS", "1"); dataWriter.WriteAttributeValue("UNIT", "UNIT"); } } // TODO support dimension at observation != TIME_PERIOD dataWriter.StartSeries(); dataWriter.WriteSeriesKeyValue("FREQ", "M"); dataWriter.WriteSeriesKeyValue("REF_AREA", "LU"); dataWriter.WriteSeriesKeyValue("ADJUSTMENT", "N"); dataWriter.WriteSeriesKeyValue("STS_INDICATOR", "PROD"); dataWriter.WriteSeriesKeyValue("STS_ACTIVITY", "NS0030"); dataWriter.WriteSeriesKeyValue("STS_INSTITUTION", "1"); dataWriter.WriteSeriesKeyValue("STS_BASE_YEAR", "2000"); if (dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.NoData || dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.Full) { dataWriter.WriteAttributeValue("TIME_FORMAT", "P1M"); } var startDate = new DateTime(2010, 01, 01); if (dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.Full || dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.DataOnly) { int firstObsCount = 5; if (dataQuery.FirstNObservations.HasValue) { firstObsCount = Math.Min(firstObsCount, dataQuery.FirstNObservations.Value); } for (int i = 0; i < firstObsCount; i++) { dataWriter.WriteObservation(startDate.AddMonths(i), "1.0", TimeFormat.GetFromEnum(TimeFormatEnumType.Month)); if (dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.Full) { dataWriter.WriteAttributeValue("OBS_STATUS", "A"); } } if (dataQuery.LastNObservations.HasValue) { int lastObsStart = Math.Max(5 - dataQuery.LastNObservations.Value, firstObsCount); for (int i = lastObsStart; i < 5; i++) { dataWriter.WriteObservation(startDate.AddMonths(i), "1.0", TimeFormat.GetFromEnum(TimeFormatEnumType.Month)); if (dataQuery.DataQueryDetail.EnumType == DataQueryDetailEnumType.Full) { dataWriter.WriteAttributeValue("OBS_STATUS", "A"); } } } } }