/// <summary> /// Obtiene las relaciones /// </summary> internal List <DimensionRelationModel> GetRelations() { List <DimensionRelationModel> relations = new List <DimensionRelationModel>(); // Añade las relaciones foreach (DimensionRelationViewModel dimensionRelation in ListRelations) { DimensionRelationModel relation = new DimensionRelationModel(DataSource.DataWarehouse); // Asigna las propiedades relation.DimensionId = dimensionRelation.GetDimension().Id; // Asigna las claves foráneas foreach (ListItemForeignKeyViewModel foreignKeyViewModel in dimensionRelation.ForeignKeys) { DataSourceColumnModel relatedColumn = foreignKeyViewModel.GetRelatedColumn(); if (relatedColumn != null) { relation.ForeignKeys.Add(new RelationForeignKey { ColumnId = foreignKeyViewModel.SourceColumn.Id, TargetColumnId = relatedColumn.Id } ); } } // Añade la relación a la colección relations.Add(relation); } // Devuelve las relaciones return(relations); }
public DimensionRelationViewModel(ReportingSolutionViewModel reportingSolutionViewModel, BaseDataSourceModel dataSource, DimensionRelationModel relation) { // Inicializa los objetos ReportingSolutionViewModel = reportingSolutionViewModel; DataSource = dataSource; Relation = relation; // Inicializa las propiedades InitViewModel(); // Inicializa el manejador de eventos sobre el combo ComboDimensions.PropertyChanged += (sender, args) => { if (args.PropertyName.Equals(nameof(ComboDimensions.SelectedItem))) { LoadListForeignKeys(); } }; }
/// <summary> /// Obtiene un nodo de relación /// </summary> private MLNode GetNodeRelation(DimensionRelationModel relation) { MLNode rootML = new MLNode(TagRelation); // Añade los atributos rootML.Attributes.Add(TagSourceId, relation.Dimension.Id); // Añade las claves foráneas foreach (RelationForeignKey foreignKey in relation.ForeignKeys) { MLNode nodeML = rootML.Nodes.Add(TagForeignKey); nodeML.Attributes.Add(TagColumn, foreignKey.ColumnId); nodeML.Attributes.Add(TagDimensionColumn, foreignKey.TargetColumnId); } // Devuelve el nodo return(rootML); }
/// <summary> /// Carga los datos de una dimension relacionada /// </summary> private DimensionRelationModel LoadRelatedDimension(MLNode rootML, DataWarehouseModel dataWarehouse) { DimensionRelationModel relation = new DimensionRelationModel(dataWarehouse); // Carga los datos de la dimensión relation.DimensionId = rootML.Attributes[TagSourceId].Value.TrimIgnoreNull(); // Carga las columnas foreach (MLNode nodeML in rootML.Nodes) { if (nodeML.Name == TagForeignKey) { relation.ForeignKeys.Add(new RelationForeignKey { ColumnId = nodeML.Attributes[TagColumn].Value.TrimIgnoreNull(), TargetColumnId = nodeML.Attributes[TagDimensionColumn].Value.TrimIgnoreNull() } ); } } // Devuelve la relación return(relation); }
/// <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); }