private void DetermineOrder(Plan plan) { Order = null; if (SourceNode.Order != null) { Schema.Order newOrder = new Schema.Order(); Schema.OrderColumn orderColumn; Schema.OrderColumn newOrderColumn; newOrder.InheritMetaData(SourceNode.Order.MetaData); newOrder.IsInherited = true; for (int index = 0; index < SourceNode.Order.Columns.Count; index++) { orderColumn = SourceNode.Order.Columns[index]; newOrderColumn = new Schema.OrderColumn ( TableVar.Columns[SourceTableVar.Columns.IndexOfName(orderColumn.Column.Name)], orderColumn.Ascending, orderColumn.IncludeNils ); newOrderColumn.Sort = orderColumn.Sort; newOrderColumn.IsDefaultSort = orderColumn.IsDefaultSort; Error.AssertWarn(newOrderColumn.Sort != null, "Sort is null"); if (newOrderColumn.IsDefaultSort) { plan.AttachDependency(newOrderColumn.Sort); } else { if (newOrderColumn.Sort.HasDependencies()) { plan.AttachDependencies(newOrderColumn.Sort.Dependencies); } } newOrder.Columns.Add(newOrderColumn); } Order = newOrder; } }
public override void DetermineDataType(Plan plan) { DetermineModifiers(plan); _dataType = new Schema.TableType(); _tableVar = new Schema.ResultTableVar(this); _tableVar.Owner = plan.User; _tableVar.InheritMetaData(SourceTableVar.MetaData); if (_expressions == null) { // This is a rename all expression, merge metadata and inherit columns _tableVar.MergeMetaData(_metaData); // Inherit columns Schema.TableVarColumn newColumn; foreach (Schema.TableVarColumn column in SourceTableVar.Columns) { newColumn = column.Inherit(_tableAlias); DataType.Columns.Add(newColumn.Column); TableVar.Columns.Add(newColumn); } } else { bool columnAdded; Schema.TableVarColumn column; int renameColumnIndex; for (int index = 0; index < SourceTableVar.Columns.Count; index++) { columnAdded = false; foreach (RenameColumnExpression renameColumn in _expressions) { renameColumnIndex = SourceTableVar.Columns.IndexOf(renameColumn.ColumnName); if (renameColumnIndex < 0) { throw new Schema.SchemaException(Schema.SchemaException.Codes.ObjectNotFound, renameColumn.ColumnName); } else if (renameColumnIndex == index) { if (columnAdded) { throw new CompilerException(CompilerException.Codes.DuplicateRenameColumn, renameColumn.ColumnName); } column = SourceTableVar.Columns[index].InheritAndRename(renameColumn.ColumnAlias); column.MergeMetaData(renameColumn.MetaData); DataType.Columns.Add(column.Column); TableVar.Columns.Add(column); columnAdded = true; } } if (!columnAdded) { column = SourceTableVar.Columns[index].Inherit(); DataType.Columns.Add(column.Column); TableVar.Columns.Add(column); } } } DetermineRemotable(plan); // Inherit keys Schema.Key newKey; foreach (Schema.Key key in SourceTableVar.Keys) { newKey = new Schema.Key(); newKey.InheritMetaData(key.MetaData); newKey.IsInherited = true; newKey.IsSparse = key.IsSparse; foreach (Schema.TableVarColumn keyColumn in key.Columns) { newKey.Columns.Add(TableVar.Columns[SourceTableVar.Columns.IndexOfName(keyColumn.Name)]); } TableVar.Keys.Add(newKey); } // Inherit orders Schema.Order newOrder; Schema.OrderColumn orderColumn; Schema.OrderColumn newOrderColumn; foreach (Schema.Order order in SourceTableVar.Orders) { newOrder = new Schema.Order(); newOrder.InheritMetaData(order.MetaData); newOrder.IsInherited = true; for (int index = 0; index < order.Columns.Count; index++) { orderColumn = order.Columns[index]; newOrderColumn = new Schema.OrderColumn ( TableVar.Columns[SourceTableVar.Columns.IndexOfName(orderColumn.Column.Name)], orderColumn.Ascending, orderColumn.IncludeNils ); newOrderColumn.Sort = orderColumn.Sort; newOrderColumn.IsDefaultSort = orderColumn.IsDefaultSort; Error.AssertWarn(newOrderColumn.Sort != null, "Sort is null"); if (newOrderColumn.IsDefaultSort) { plan.AttachDependency(newOrderColumn.Sort); } else { if (newOrderColumn.Sort.HasDependencies()) { plan.AttachDependencies(newOrderColumn.Sort.Dependencies); } } newOrder.Columns.Add(newOrderColumn); } TableVar.Orders.Add(newOrder); } DetermineOrder(plan); #if UseReferenceDerivation // Copy references #if UseElaborable if (plan.CursorContext.CursorCapabilities.HasFlag(CursorCapability.Elaborable)) #endif { if (SourceTableVar.HasReferences()) { foreach (Schema.ReferenceBase reference in SourceTableVar.References) { if (reference.SourceTable.Equals(SourceTableVar)) { Schema.JoinKey sourceKey = new Schema.JoinKey(); foreach (Schema.TableVarColumn column in reference.SourceKey.Columns) { sourceKey.Columns.Add(TableVar.Columns[SourceTableVar.Columns.IndexOfName(column.Name)]); } int newReferenceID = Schema.Object.GetNextObjectID(); string newReferenceName = DeriveSourceReferenceName(reference, newReferenceID, sourceKey); Schema.DerivedReference newReference = new Schema.DerivedReference(newReferenceID, newReferenceName, reference); newReference.IsExcluded = reference.IsExcluded; newReference.InheritMetaData(reference.MetaData); newReference.SourceTable = _tableVar; newReference.AddDependency(_tableVar); newReference.TargetTable = reference.TargetTable; newReference.AddDependency(reference.TargetTable); newReference.SourceKey.IsUnique = reference.SourceKey.IsUnique; foreach (Schema.TableVarColumn column in sourceKey.Columns) { newReference.SourceKey.Columns.Add(column); } newReference.TargetKey.IsUnique = reference.TargetKey.IsUnique; foreach (Schema.TableVarColumn column in reference.TargetKey.Columns) { newReference.TargetKey.Columns.Add(column); } //newReference.UpdateReferenceAction = reference.UpdateReferenceAction; //newReference.DeleteReferenceAction = reference.DeleteReferenceAction; _tableVar.References.Add(newReference); } else if (reference.TargetTable.Equals(SourceTableVar)) { Schema.JoinKey targetKey = new Schema.JoinKey(); foreach (Schema.TableVarColumn column in reference.TargetKey.Columns) { targetKey.Columns.Add(TableVar.Columns[SourceTableVar.Columns.IndexOfName(column.Name)]); } int newReferenceID = Schema.Object.GetNextObjectID(); string newReferenceName = DeriveTargetReferenceName(reference, newReferenceID, targetKey); Schema.DerivedReference newReference = new Schema.DerivedReference(newReferenceID, newReferenceName, reference); newReference.IsExcluded = reference.IsExcluded; newReference.InheritMetaData(reference.MetaData); newReference.SourceTable = reference.SourceTable; newReference.AddDependency(reference.SourceTable); newReference.TargetTable = _tableVar; newReference.AddDependency(_tableVar); newReference.SourceKey.IsUnique = reference.SourceKey.IsUnique; foreach (Schema.TableVarColumn column in reference.SourceKey.Columns) { newReference.SourceKey.Columns.Add(column); } newReference.TargetKey.IsUnique = reference.TargetKey.IsUnique; foreach (Schema.TableVarColumn column in targetKey.Columns) { newReference.TargetKey.Columns.Add(column); } //newReference.UpdateReferenceAction = reference.UpdateReferenceAction; //newReference.DeleteReferenceAction = reference.DeleteReferenceAction; _tableVar.References.Add(newReference); } } } } #endif }