/// <summary> /// Obtiene la consulta para una dimensión del informe /// </summary> internal QueryModel GetQuery(DimensionRequestModel dimensionRequest) { List <QueryModel> childsQueries = new List <QueryModel>(); DimensionModel dimension = GetDimension(dimensionRequest); QueryModel query = GetChildQuery(dimensionRequest); // Obtiene las consultas de las dimensiones hija: si hay algún campo solicitado de alguna dimensión hija, // necesitaremos también la consulta de esta dimensión para poder hacer el JOIN posterior, por eso las // calculamos antes que la consulta de esta dimensión foreach (DimensionRequestModel childDimension in dimensionRequest.Childs) { QueryModel childQuery = GetQuery(childDimension); // Añade la query si realmente hay algo que añadir if (childQuery != null) { childsQueries.Add(childQuery); } } // Añade las consultas con las dimensiones hija if (childsQueries.Count > 0) { foreach (QueryModel childQuery in childsQueries) { QueryJoinModel join = new QueryJoinModel(QueryJoinModel.JoinType.Inner, childQuery, $"child_{childQuery.Alias}"); // Asigna las relaciones foreach (DimensionRelationModel relation in dimension.Relations) { if (relation.Dimension.Id.Equals(childQuery.SourceId, StringComparison.CurrentCultureIgnoreCase)) { foreach (RelationForeignKey foreignKey in relation.ForeignKeys) { join.Relations.Add(new QueryRelationModel(foreignKey.ColumnId, childQuery.FromAlias, foreignKey.TargetColumnId)); } } } // Añade la unión query.Joins.Add(join); } } // Devuelve la consulta return(query); }
/// <summary> /// Crea un JOIN con una dimensión /// </summary> private QueryJoinModel CreateJoin(DimensionModel dimension, DimensionRelationModel relation, List <QueryModel> dimensionQueries) { QueryModel query = new QueryModel(dimension.Id, QueryModel.QueryType.Dimension, dimension.Id); QueryJoinModel join = new QueryJoinModel(QueryJoinModel.JoinType.Inner, query, dimension.Id); QueryModel relatedQuery = dimensionQueries.FirstOrDefault(item => item.SourceId.Equals(dimension.Id, StringComparison.CurrentCultureIgnoreCase)); // Asigna los datos apropiados a la consulta (sólo necesitamos los nombres de tabla) query.Prepare(dimension.Id, dimension.Id); // Añade las relaciones if (relatedQuery != null) { foreach (RelationForeignKey column in relation.ForeignKeys) { QueryFieldModel relatedField = relatedQuery.Fields.FirstOrDefault(item => item.Field.Equals(column.TargetColumnId, StringComparison.CurrentCultureIgnoreCase)); if (relatedField != null) { join.Relations.Add(new QueryRelationModel(column.ColumnId, relatedQuery.Alias, relatedField.Alias)); } } } // Devuelve el join return(join); }