Exemplo n.º 1
0
        public SourceGraphSqlModel(SyncModel model, IShellContext context, DataSyncSqlModel dataSync)
        {
            _model = model;

            if (!model.Sources.Any())
            {
                throw new IncorrectRdsDefinitionException("LGM-00000 There are no available sources entities. Try to add source.");
            }

            foreach (var item in model.Sources)
            {
                var src = new SourceEntitySqlModel(item, dataSync);
                Entities.Add(src);
                src.SqlAlias = item.Alias ?? "src_" + Entities.Count;
                src.InitializeQuerySource(item.DataSource, context, context.Replace(item.SourceTableVariable), context.Replace(item.SourceQueryVariable));
                src.MaterializeIfNeeded();

                foreach (var colItem in item.Columns)
                {
                    string alias = colItem.AliasOrName;
                    if (!Columns.ContainsKey(alias))
                    {
                        Columns[alias] = new SourceColumnSqlModel
                        {
                            Alias = alias,
                        };
                    }
                    Columns[alias].DbshColumns.Add(colItem);
                    Columns[alias].Entities.Add(src);
                    src.Columns.Add(Columns[alias]);
                    if (!String.IsNullOrEmpty(colItem.Filter))
                    {
                        Columns[alias].Filters.Add(colItem.Filter);
                        if (colItem.FilterType != Driver.Common.FilterParser.FilterParser.ExpressionType.None)
                        {
                            Columns[alias].FilterType = colItem.FilterType;
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
 private string EntityAlias(SourceEntitySqlModel entity)
 {
     return "src_" + _filteredEntities.IndexOf(entity);
 }
Exemplo n.º 4
0
 private NameWithSchema EntityFullName(SourceEntitySqlModel entity)
 {
     return EntityTable(entity).GetFullName(null);
 }
Exemplo n.º 5
0
 private DbShell.Core.Utility.TableOrView EntityTable(SourceEntitySqlModel entity)
 {
     return (DbShell.Core.Utility.TableOrView)entity.Dbsh.DataSource;
 }
Exemplo n.º 6
0
 public static FilterJoinSqlModel Create(SourceEntitySqlModel rootTable, SourceGraphSqlModel sourceGraphModel, IDatabaseFactory factory)
 {
     var res = new FilterJoinSqlModel(rootTable, sourceGraphModel, factory);
     if (res._isValid) return res;
     return null;
 }
Exemplo n.º 7
0
 private void AddEntity(SourceEntitySqlModel sourceEntity)
 {
     var src = new SourceEntitySqlModel(sourceEntity.Dbsh, _sourceGraph.DataSync);
     Entities.Add(src);
     src.SqlAlias = sourceEntity.SqlAlias;
     src.QuerySource = sourceEntity.QuerySource;
     src.TableName = sourceEntity.TableName;
     src.IsExternal = sourceEntity.IsExternal;
     foreach (var colItem in sourceEntity.Dbsh.Columns)
     {
         string alias = colItem.AliasOrName;
         if (!Columns.ContainsKey(alias))
         {
             Columns[alias] = new SourceColumnSqlModel
             {
                 Alias = alias,
             };
         }
         Columns[alias].DbshColumns.Add(colItem);
         Columns[alias].Entities.Add(src);
         Columns[alias].FilterType = colItem.FilterType;
         if (!String.IsNullOrEmpty(colItem.Filter))
         {
             Columns[alias].Filters.Add(colItem.Filter);
         }
         src.Columns.Add(Columns[alias]);
     }
 }
Exemplo n.º 8
0
        private bool EntityHasKey(SourceEntitySqlModel entity)
        {
            return _targetEntitySqlModel.KeySourceColumns.Any(x => entity.Columns.Any(y => y.Alias == x.Alias));
            //return _targetEntitySqlModel.TargetColumns.Where(x => x.IsKey).Any(x => x.Sources.Any(y => entity.Columns.Any(z => z.Alias == y.Alias)));

        }
Exemplo n.º 9
0
        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();
            }
        }
Exemplo n.º 10
0
        private void DetectPrimarySource()
        {
            PrimarySource = null;

            if (!String.IsNullOrWhiteSpace(_targetEntitySqlModel.Dbsh.PrimarySource))
            {
                if (_sourceGraph != null)
                {
                    PrimarySource = _sourceGraph.Entities.FirstOrDefault(x => x.Match(_targetEntitySqlModel.Dbsh.PrimarySource));
                    if (PrimarySource == null)
                    {
                        throw new Exception($"DBSH-00216 Primary source {_targetEntitySqlModel.Dbsh.PrimarySource} for target {_targetEntitySqlModel.TargetTable} not found");
                    }
                }
            }
            else
            {
                foreach (var entity in _sourceGraph.Entities)
                {
                    var keyColumns = entity.KeyColumns;
                    keyColumns = keyColumns.Where(x => x.Entities.Count == 1).ToList();
                    if (!keyColumns.Any()) continue;
                    if (_targetEntitySqlModel.KeySourceColumns.Any(x => keyColumns.Any(y => y.Alias == x.Alias)))
                    {
                        PrimarySource = entity;
                        // primary source is found
                        return;
                    }
                }
            }
        }
Exemplo n.º 11
0
        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();
            }
        }
Exemplo n.º 12
0
        //private void RunScript(DbConnection conn, IDatabaseFactory factory, Action<SqlScriptCompiler> prolog, Action<SqlScriptCompiler> epilog, IShellContext context, string procname, bool useTransaction)
        //{
        //    var cmp = new SqlScriptCompiler(factory, this, context, name.ToString());

        //    var sw = new StringWriter();
        //    var so = new SqlOutputStream(factory.CreateDialect(), sw, new SqlFormatProperties());
        //    so.OverrideCommandDelimiter(";");
        //    var dmp = factory.CreateDumper(so, new SqlFormatProperties());
        //    var cmp = new SqlScriptCompiler(dmp, this, context, procname);

        //    if (prolog != null) prolog(cmp);

        //    DumpScript(cmp, useTransaction);

        //    if (epilog != null) epilog(cmp);

        //    using (var cmd = conn.CreateCommand())
        //    {
        //        cmd.CommandText = sw.ToString();
        //        cmd.ExecuteNonQuery();
        //    }
        //}

        public void AddExternalSource(SourceEntitySqlModel sourceEntity)
        {
            if (!_allowExternalSources) throw new Exception("DBSH-00214 External sources not supported in this context");
            _externalSources.Add(sourceEntity);
        }