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); } }
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; }
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); } }
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; }
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); }