public void AddReferenceJoins(DmlfCommandBase command)
        {
            foreach (var qitem in _queue)
            {
                var relation = new DmlfRelation
                {
                    JoinType = DmlfJoinType.Inner,
                    Reference = new DmlfSource
                    {
                        Alias = qitem.RefAlias,
                        TableOrView = qitem.RefEntity.TargetTable,
                    },
                };

                foreach (var col in qitem.BaseEntity.TargetColumns)
                {
                    if (col.UnderlyingReference != qitem.Fk) continue;

                    var refColumn = new DmlfColumnRefExpression
                    {
                        Column = new DmlfColumnRef
                        {
                            Source = new DmlfSource { Alias = qitem.RefAlias },
                            ColumnName = col.RefColumnName,
                        }
                    };

                    relation.Conditions.Add(new DmlfEqualCondition
                    {
                        LeftExpr = col.CreateTargetExpression(qitem.BaseAlias),
                        RightExpr = refColumn,
                        CollateSpec = col.UseCollate(qitem.BaseEntity.SourceJoinModel) ? "DATABASE_DEFAULT" : null,
                    });
                }

                command.SingleFrom.Relations.Add(relation);

                qitem.RefEntity.CreateLifetimeConditions(command, qitem.RefAlias);
                qitem.RefEntity.CreateRestrictionCondition(command, qitem.RefAlias, false);
            }
        }
Example #2
0
        private DmlfSelect BuildSelect()
        {
            var select = new DmlfSelect();
            var from = select.SingleFrom;
            from.Source = new DmlfSource
            {
                TableOrView = EntityFullName(_rootEntity),
                Alias = EntityAlias(_rootEntity),
            };

            var added = new List<SourceEntitySqlModel>();
            added.Add(_rootEntity);

            foreach (var entity in _filteredEntities)
            {
                if (added.Contains(entity)) continue;
                var relation = new DmlfRelation
                {
                    JoinType = DmlfJoinType.Left,
                    Reference = new DmlfSource
                    {
                        TableOrView = EntityFullName(entity),
                        Alias = EntityAlias(entity),
                    },
                };


                foreach (var column in entity.Columns)
                {
                    foreach (var ent2 in added)
                    {
                        if (ent2.Columns.Any(x => x.Alias == column.Alias))
                        {
                            relation.Conditions.Add(new DmlfEqualCondition
                            {
                                LeftExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                    {
                                        ColumnName = entity.GetColumnName(column.Alias),
                                        Source = new DmlfSource { Alias = EntityAlias(entity) },
                                    }
                                },
                                RightExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                    {
                                        ColumnName = ent2.GetColumnName(column.Alias),
                                        Source = new DmlfSource { Alias = EntityAlias(ent2) },
                                    }
                                },
                            });
                        }
                    }
                }

                added.Add(entity);
                from.Relations.Add(relation);
            }

            foreach(var col in _rootEntity.Dbsh.Columns)
            {
                select.Columns.Add(DmlfResultField.BuildFromColumn(col.Name, new DmlfSource { Alias = EntityAlias(_rootEntity) }));
            }

            foreach(var entity in _filteredEntities)
            {
                foreach(var col in entity.Dbsh.Columns)
                {
                    if (col.Filter == null) continue;
                    var orCond = new DmlfOrCondition();
                    orCond.Conditions.Add(SourceColumnSqlModel.CompileSingleFilter(col, EntityAlias(entity)));
                    if (entity.SingleKeyColumnOriginalName != null)
                    {
                        orCond.Conditions.Add(new DmlfIsNullCondition
                        {
                            Expr = new DmlfColumnRefExpression
                            {
                                Column = new DmlfColumnRef
                                {
                                    ColumnName = entity.SingleKeyColumnOriginalName,
                                    Source = new DmlfSource { Alias = EntityAlias(entity) },
                                }
                            }
                        });
                    }
                    select.AddAndCondition(orCond);
                }
            }

            return select;
        }
Example #3
0
        private void CreateSourceJoin()
        {
            var ent0 = PopEntityFromQueue();

            SourceToRefsJoin.Source = ent0.QuerySource;
            _processedEntities.Add(ent0);

            while (_entityQueue.Any())
            {
                var ent = PopEntityFromQueue();

                var relation = new DmlfRelation
                {
                    JoinType = PrimarySource == null ? DmlfJoinType.Outer : DmlfJoinType.Left,
                    Reference = ent.QuerySource,
                };

                foreach (var column in ent.Columns)
                {
                    foreach (var ent2 in _processedEntities)
                    {
                        if (ent2.Columns.Any(x => x.Alias == column.Alias))
                        {
                            relation.Conditions.Add(new DmlfEqualCondition
                            {
                                LeftExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                    {
                                        ColumnName = ent.GetColumnName(column.Alias),
                                        Source = ent.QuerySource,
                                    }
                                },
                                RightExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                    {
                                        ColumnName = ent2.GetColumnName(column.Alias),
                                        Source = ent2.QuerySource,
                                    }
                                },
                            });
                        }
                    }
                }

                SourceToRefsJoin.Relations.Add(relation);
                _processedEntities.Add(ent);
            }
        }
Example #4
0
        public DmlfSource GetRefSource(DmlfFromItem from, SourceJoinSqlModel joinModel)
        {
            var res = from.FindSourceWithAlias(SqlAlias);
            if (res != null) return res;
            res = new DmlfSource
            {
                Alias = SqlAlias,
                TableOrView = TargetTableSqlName,
                LinkedInfo = TargetLinkedInfo,
            };
            var rel = new DmlfRelation
            {
                JoinType = DmlfJoinType.Left,
                Reference = res,
            };

            foreach (var keycol in TargetColumns.Where(x => x.IsKey || x.IsRestriction))
            {
                rel.Conditions.Add(new DmlfEqualCondition
                {
                    LeftExpr = keycol.CreateSourceExpression(joinModel, false),
                    RightExpr = keycol.CreateTargetExpression(res),
                    CollateSpec = keycol.UseCollate(joinModel) ? "DATABASE_DEFAULT" : null,
                });
            }

            from.Relations.Add(rel);

            return res;
        }
Example #5
0
        private DmlfSource DoAddOrFindRelation(DmlfSource baseSource, NameWithSchema baseTable, StructuredIdentifier relationJoined, StructuredIdentifier relationToJoin, DatabaseInfo db, DmlfJoinType joinType)
        {
            if (relationToJoin.IsEmpty) return baseSource;
            string relName = relationToJoin.First;
            string alias = String.Format("_REF{0}_{1}", relationJoined.NameItems.Select(x => "_" + x).CreateDelimitedText(""), relName);
            var source = FindSourceByAlias(alias);
            if (source == null)
            {
                var baseTableInfo = db.FindTable(baseTable);
                var fk = baseTableInfo.ForeignKeys.FirstOrDefault(x => System.String.Compare(x.ConstraintName, relName, StringComparison.OrdinalIgnoreCase) == 0);
                if (fk == null)
                {
                    var column = baseTableInfo.FindColumn(relName);
                    if (column != null) fk = column.GetForeignKeys().FirstOrDefault(x => x.Columns.Count == 1);
                }
                if (fk == null) return null;

                source = new DmlfSource
                    {
                        TableOrView = fk.RefTableFullName,
                        Alias = alias,
                    };
                var relation = new DmlfRelation
                    {
                        Reference = source,
                        JoinType = joinType,
                    };
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    relation.Conditions.Add(new DmlfEqualCondition
                        {
                            LeftExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                        {
                                            ColumnName = fk.Columns[0].RefColumnName,
                                            Source = baseSource,
                                        }
                                },
                            RightExpr = new DmlfColumnRefExpression
                                {
                                    Column = new DmlfColumnRef
                                        {
                                            ColumnName = fk.RefColumns[0].RefColumnName,
                                            Source = source,
                                        }
                                },
                        });
                    Relations.Add(relation);
                }
            }
            if (relationToJoin.IsEmpty) return source;
            return DoAddOrFindRelation(source, source.TableOrView, relationJoined/relationToJoin.First, relationToJoin.WithoutFirst, db, joinType);
        }