public void MaterializeIfNeeded() { if (IsExternal) return; if (!_dbsh.Materialize) return; _materializedName = new NameWithSchema("#" + SqlAlias.Replace(".", "_")); _materializeSelect = new DmlfSelect(); _materializeSelect.SingleFrom.Source = QuerySource; _materializeSelect.SelectIntoTable = _materializedName; _materializeSelect.SelectAll = true; QuerySource = new DmlfSource { Alias = SqlAlias, TableOrView = _materializedName, }; }
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 DmlfUpdate CompileMarkDeleted() { var res = new DmlfUpdate(); res.UpdateTarget = new DmlfSource { Alias = "target" }; res.SingleFrom.Source = new DmlfSource { Alias = "target", TableOrView = TargetTableSqlName, LinkedInfo = TargetLinkedInfo, }; var existSelect = new DmlfSelect(); res.AddAndCondition(new DmlfNotExistCondition { Select = existSelect, }); existSelect.SelectAll = true; existSelect.From.Add(SourceJoinModel.SourceToRefsJoin); CreateKeyCondition(existSelect, "target"); CreateRestrictionCondition(res, "target"); CreateLifetimeConditions(res, "target"); CreateFilterConditions(existSelect); _dbsh.LifetimeHandler.CreateSetDeletedUpdateFields(res, "target", this); return res; }
private DmlfDelete CompileDelete() { var res = new DmlfDelete(); res.DeleteTarget = new DmlfSource { Alias = "target" }; res.SingleFrom.Source = new DmlfSource { Alias = "target", TableOrView = TargetTableSqlName, LinkedInfo = TargetLinkedInfo, }; var existSelect = new DmlfSelect(); res.AddAndCondition(new DmlfNotExistCondition { Select = existSelect, }); existSelect.SelectAll = true; existSelect.From.Add(SourceJoinModel.SourceToRefsJoin); CreateKeyCondition(existSelect, "target"); CreateRestrictionCondition(res, "target", false); CreateLifetimeConditions(res, "target"); CreateReferenceRestrictionsCodition(res, "target"); CreateFilterConditions(existSelect); return res; }
private DmlfInsertSelect CompileInsert() { var res = new DmlfInsertSelect(); res.TargetTable = TargetTableSqlName; res.LinkedInfo = TargetLinkedInfo; res.Select = new DmlfSelect(); res.Select.From.Add(SourceJoinModel.SourceToRefsJoin); foreach (var col in TargetColumns) { res.TargetColumns.Add(col.Name); var expr = col.CreateSourceExpression(SourceJoinModel, RequiresGrouping && !col.IsKey && !col.IsRestriction); res.Select.Columns.Add(new DmlfResultField { Expr = expr, }); } if (RequiresGrouping) { res.Select.GroupBy = new DmlfGroupByCollection(); foreach (var col in TargetColumns.Where(x => x.IsKey || (x.IsRestriction && x.IsReference))) { var expr = col.CreateSourceExpression(SourceJoinModel, false); res.Select.GroupBy.Add(new DmlfGroupByItem { Expr = expr, }); } } CreateNotNullConditions(res.Select); var existSelect = new DmlfSelect(); existSelect.SingleFrom.Source = new DmlfSource { TableOrView = TargetTableSqlName, Alias = "tested", LinkedInfo = TargetLinkedInfo, }; existSelect.SelectAll = true; CreateKeyCondition(existSelect, "tested"); CreateLifetimeConditions(existSelect, "tested"); CreateFilterConditions(res.Select); res.Select.AddAndCondition(new DmlfNotExistCondition { Select = existSelect }); return res; }