/// <summary> /// Initializes a new instance of the <see cref="MaxObsStatus"/> class. /// </summary> /// <param name="info"> /// The info. /// </param> /// <param name="writeObsFunc"> /// The write observation method. /// </param> public MaxObsStatus(DataRetrievalInfoSeries info, Func<DataRetrievalInfoSeries, string, string, IEnumerable<ComponentValue>, int> writeObsFunc) { this._info = info; this._writeObsFunc = writeObsFunc; this._limit = info.Limit; var firstNObservations = info.FirstNObservations; this._lastNObservations = info.LastNObservations; this._lastObsQueue = new Queue<Tuple<string, string, IEnumerable<ComponentValue>>>(Math.Max(this._lastNObservations, 0)); if (info.HasFirstAndLastNObservations) { this._queueLastObsAction = func => { var val = this.WriteOrSkip(firstNObservations, func); if (val != 0) { return val; } this._lastObsQueue.Enqueue(func); if (this._lastObsQueue.Count > this._lastNObservations) { this._lastObsQueue.Dequeue(); } return 0; }; } else if (info.HasFirstNObservations) { this._queueLastObsAction = func => this.WriteOrSkip(firstNObservations, func); } else if (info.HasLastNObservations) { // NOTE Assume that we have "DESC". this._queueLastObsAction = func => this.WriteOrSkip(this._lastNObservations, func); } else { this._queueLastObsAction = this.WriteObs; } }
/// <summary> /// This method generates the SQL SELECT statement for the dissemination database that will return the data for the incoming Query. /// </summary> /// <param name="info"> /// The current state of the data retrieval which containts the current query and mapping set /// </param> private static void GenerateDataSetSql(DataRetrievalInfoSeries info) { if (!info.DataSetAttributes.Any(mapping => mapping.Mapping.Columns.Count > 0)) { return; } MappingSetEntity mappingSet = info.MappingSet; Logger.Info(Resources.InfoBeginGenerateSql); SqlQuery sqlQuery = new SqlQuery(); try { // Generate Query subparts string sql = GenerateSelect(true, ConvertToMapping(info.DataSetAttributes)); sqlQuery.appendSql(sql); sqlQuery.appendSql(GenerateFrom(mappingSet)); if (string.IsNullOrEmpty(info.SqlWhereCache)) { info.SqlWhereCache = GenerateWhere(info); } sqlQuery.appendSql(info.SqlWhereCache); } catch (Exception ex) { Logger.Error(ex.ToString()); throw new DataRetrieverException(ex, SdmxErrorCode.GetFromEnum(SdmxErrorCodeEnumType.SemanticError), Resources.ErrorUnableToGenerateSQL); //ErrorTypes.QUERY_PARSING_ERROR, Resources.ErrorUnableToGenerateSQL, ex); } info.DataSetSqlString = sqlQuery.getSql(); // log for easy debug Logger.Info(string.Format(CultureInfo.InvariantCulture, Resources.InfoGeneratedSQLFormat1, info.DataSetSqlString)); Logger.Info(Resources.InfoEndGenerateSql); }
/// <summary> /// Appends the cached where to <paramref name="sql"/> from <see cref="DataRetrievalInfoSeries.SqlWhereCache"/> if it is not null or from <see cref="SqlBuilderBase.GenerateWhere"/> /// </summary> /// <param name="info"> /// The current DataRetrieval state /// </param> /// <param name="sql"> /// The SQL String buffer to /// </param> private static void AppendCachedWhere(DataRetrievalInfoSeries info, SqlQuery sqq) { if (string.IsNullOrEmpty(info.SqlWhereCache)) { info.SqlWhereCache = GenerateWhere(info); } sqq.appendSql(info.SqlWhereCache); }
/// <summary> /// This method generates the SQL SELECT statement for the dissemination database that will return the data for the incoming Query. /// </summary> /// <param name="groupBean"> /// The group Bean. /// </param> /// <param name="info"> /// The current data retrieval state /// </param> /// <returns> /// The string containing the SQL query that needs to be executed on the dissemination database, in order to return the data required by the input query /// </returns> private static string GenerateGroupSql(GroupInformation groupBean, DataRetrievalInfoSeries info) { MappingSetEntity mappingSet = info.MappingSet; Logger.Info(Resources.InfoBeginGenerateSql); SqlQuery sqlQuery = new SqlQuery(); string sql = string.Empty; try { // Generate Query subparts sql = GenerateSelect(true, ConvertToMapping(groupBean.ComponentMappings)); sqlQuery.appendSql(sql); sqlQuery.appendSql(GenerateFrom(mappingSet)); if (string.IsNullOrEmpty(info.SqlWhereCache)) { info.SqlWhereCache = GenerateWhere(info); } sqlQuery.appendSql(info.SqlWhereCache); // In SDMX Group we don't care if it is flat or not. sqlQuery.appendSql(GenerateOrderBy(info, groupBean.ThisGroup.Dimensions)); } catch (Exception ex) { Logger.Error(ex.ToString()); throw new DataRetrieverException(ex, SdmxErrorCode.GetFromEnum(SdmxErrorCodeEnumType.SemanticError), Resources.ErrorUnableToGenerateSQL); //ErrorTypes.QUERY_PARSING_ERROR, Resources.ErrorUnableToGenerateSQL, ex); } // log for easy debug Logger.Info(string.Format(CultureInfo.InvariantCulture, Resources.InfoGeneratedSQLFormat1, sql)); Logger.Info(Resources.InfoEndGenerateSql); return sqlQuery.getSql(); }
/// <summary> /// This method generates the SQL SELECT statement for the dissemination database that will return the data for the incoming Query. /// </summary> /// <param name="groupBean"> /// The group Bean. /// </param> /// <param name="info"> /// The current data retrieval state /// </param> /// <returns> /// The string containing the SQL query that needs to be executed on the dissemination database, in order to return the data required by the input query /// </returns> private static string GenerateGroupSql(GroupInformation groupBean, DataRetrievalInfoSeries info) { MappingSetEntity mappingSet = info.MappingSet; Logger.Info(Resources.InfoBeginGenerateSql); SqlQuery sqlQuery = new SqlQuery(); string sql = string.Empty; try { // Generate Query subparts sql = GenerateSelect(true, ConvertToMapping(groupBean.ComponentMappings)); sqlQuery.appendSql(sql); sqlQuery.appendSql(GenerateFrom(mappingSet)); if (string.IsNullOrEmpty(info.SqlWhereCache)) { info.SqlWhereCache = GenerateWhere(info); } sqlQuery.appendSql(info.SqlWhereCache); bool bFlat = false; var allDimensions = DimensionAtObservation.GetFromEnum(DimensionAtObservationEnumType.All).Value; IBaseDataQuery baseDataQuery = (IBaseDataQuery)info.ComplexQuery ?? info.Query; //the Flat option will be read only when we have flat aka AllDimensions if (baseDataQuery.DimensionAtObservation.Equals(allDimensions)) Boolean.TryParse(ConfigurationManager.AppSettings["QueryFlatFormat"], out bFlat); if (!bFlat) sqlQuery.appendSql(GenerateOrderBy(info, groupBean.ThisGroup.Dimensions)); } catch (Exception ex) { Logger.Error(ex.ToString()); throw new DataRetrieverException(ex, SdmxErrorCode.GetFromEnum(SdmxErrorCodeEnumType.SemanticError), Resources.ErrorUnableToGenerateSQL); //ErrorTypes.QUERY_PARSING_ERROR, Resources.ErrorUnableToGenerateSQL, ex); } // log for easy debug Logger.Info(string.Format(CultureInfo.InvariantCulture, Resources.InfoGeneratedSQLFormat1, sql)); Logger.Info(Resources.InfoEndGenerateSql); return sqlQuery.getSql(); }