private FilterJoinSqlModel(SourceEntitySqlModel rootModel, SourceGraphSqlModel sourceGraphModel, IDatabaseFactory factory) { _sourceGraph = sourceGraphModel; _rootEntity = rootModel; _factory = factory; FillEntitiesOnTheSameServer(); BuildLinkedEntities(); bool hasFilter = _linkedEntities.Any(x => x.Dbsh.Columns.Any(y => y.Filter != null)); if (!hasFilter) { _isValid = false; return; } _filteredEntities.AddRange(_linkedEntities); DetectUnusedEntities(); }
public SourceJoinSqlModel(TargetEntitySqlModel targetEntitySqlModel, SourceGraphSqlModel sourceGraph) { _targetEntitySqlModel = targetEntitySqlModel; _sourceGraph = sourceGraph; SourceToRefsJoin = new DmlfFromItem(); //foreach (var column in _targetEntitySqlModel.RequiredSourceColumns) //{ // if (Columns.ContainsKey(column.Alias)) continue; // Columns[column.Alias] = new SourceColumnSqlModel // { // Alias = column.Alias, // }; // bool addedEntity = false; // foreach (var ent in column.Entities) // { // if (ent.SingleKeyColumn == column.Alias) // { // AddEntity(ent); // addedEntity = true; // break; // } // } // if (addedEntity) continue; // AddEntity(column.Entities.First()); //} if (_sourceGraph == null) { // flat variant PrimarySource = _targetEntitySqlModel.DataSync.FlatSources.FirstOrDefault(x => x.Match(_targetEntitySqlModel.Dbsh.PrimarySource)); if (PrimarySource == null) { throw new IncorrectRdsDefinitionException($"DBSH-00000 Source not found for entity {_targetEntitySqlModel.LogName}"); } SourceToRefsJoin.Source = PrimarySource.QuerySource; foreach (var col in PrimarySource.Columns) { Columns[col.Alias] = col; } } else { _entityQueue.AddRange(_sourceGraph.Entities); DetectPrimarySource(); DetectUnusedEntities(); RebuildEntityList(); //queue.Add(_targetEntitySqlModel.KeySourceColumns.First().Entities.First()); //foreach (var ent in _targetEntitySqlModel.RequiredSourceColumns.SelectMany(x => x.Entities)) //{ // if (queue.Contains(ent)) continue; // queue.Add(ent); //} if (!_entityQueue.Any() && targetEntitySqlModel.Dbsh.Columns.Any(x => x.IsKey)) { throw new IncorrectRdsDefinitionException($"LGM-00000 None of source entities is used in {_targetEntitySqlModel.LogName} (try to set source column)"); } if (_entityQueue.Any()) { CreateSourceJoin(); AddRefsToJoin(); } foreach (var col in Columns.Values) col.CompileFilter(); } }
public static FilterJoinSqlModel Create(SourceEntitySqlModel rootTable, SourceGraphSqlModel sourceGraphModel, IDatabaseFactory factory) { var res = new FilterJoinSqlModel(rootTable, sourceGraphModel, factory); if (res._isValid) return res; return null; }
public DataSyncSqlModel(SyncModel model, IShellContext context, bool allowExternalSources, string providerString) { _model = model; _allowExternalSources = allowExternalSources; foreach(var param in model.Parameters) { Parameters.Add(new ParameterModel { DataType = context.Replace(param.DataType), DefaultValue = context.Replace(param.DefaultValue), Name = context.Replace(param.Name), }); } ProviderString = providerString; TargetStructure = context.GetDatabaseStructure(providerString); if (_model.IsFlatSync) { foreach (var src in _model.Sources) { var entity = new SourceEntitySqlModel(src, this); entity.LoadFlatColumns(); FlatSources.Add(entity); entity.SqlAlias = src.Alias ?? "src_" + FlatSources.Count; entity.InitializeQuerySource(src.DataSource, context, src.SourceTableVariable, src.SourceQueryVariable); entity.MaterializeIfNeeded(); } } else { SourceGraphModel = new SourceGraphSqlModel(model, context, this); foreach(var col in SourceGraphModel.Columns.Values) { col.CompileFilter(); } } foreach (var entity in model.Targets) { Entities.Add(new TargetEntitySqlModel(this, entity, context)); } foreach (var fk in model.TargetReferences) { var sourceReplaced = context.Replace(fk.Source); var sourceEntity = FindTarget(sourceReplaced); string targetReplaced = context.Replace(fk.Target); var targetEntity = FindTarget(targetReplaced); if (sourceEntity == null) throw new Exception($"DBSH-00000 Source entity {sourceReplaced} not found"); if (targetEntity == null) throw new Exception($"DBSH-00219 Target entity {targetReplaced} not found"); sourceEntity.AddReference(fk, targetEntity); } PartialSortEntitiesByRefs(); foreach (var entity in Entities) { entity.CreateJoinModel(); } foreach (var entity in Entities) { entity.TestCorrectness(); } }