//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Data.Metadata.Edm;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
namespace System.Data.Mapping.Update.Internal
{
///
/// This class encapsulates changes propagated to a node in an update mapping view.
/// It contains lists of deleted and inserted rows. Key intersections betweens rows
/// in the two sets are treated as updates in the store.
///
///
///
/// Additional tags indicating the roles of particular values (e.g., concurrency, undefined,
/// etc.) are stored within each row: where appropriate, constants appearing
/// within a row are associated with a through the .
///
///
/// The 'leaves' of an update mapping view (UMV) are extent expressions. A change node
/// associated with an extent expression is simply the list of changes to the C-Space
/// requested by a caller. As changes propagate 'up' the UMV expression tree, we recursively
/// apply transformations such that the change node associated with the root of the UMV
/// represents changes to apply in the S-Space.
///
///
internal class ChangeNode
{
#region Constructors
///
/// Constructs a change node containing changes belonging to the specified collection
/// schema definition.
///
/// Sets property.
internal ChangeNode(TypeUsage elementType)
{
m_elementType = elementType;
}
#endregion
#region Fields
private TypeUsage m_elementType;
private List m_inserted = new List();
private List m_deleted = new List();
private PropagatorResult m_placeholder;
#endregion
#region Properties
///
/// Gets the type of the rows contained in this node. This type corresponds (not coincidentally)
/// to the type of an expression in an update mapping view.
///
internal TypeUsage ElementType { get { return m_elementType; } }
///
/// Gets a list of rows to be inserted.
///
internal List Inserted { get { return m_inserted; } }
///
/// Gets a list of rows to be deleted.
///
internal List Deleted { get { return m_deleted; } }
///
/// Gets or sets a version of a record at this node with default record. The record has the type
/// of the node we are visiting.
///
internal PropagatorResult Placeholder
{
get { return m_placeholder; }
set { m_placeholder = value; }
}
#endregion
#if DEBUG
public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("{");
builder.AppendFormat(CultureInfo.InvariantCulture, " ElementType = {0}", ElementType).AppendLine();
builder.AppendLine(" Inserted = {");
foreach (PropagatorResult insert in Inserted)
{
builder.Append(" ").AppendLine(insert.ToString());
}
builder.AppendLine(" }");
builder.AppendLine(" Deleted = {");
foreach (PropagatorResult delete in Deleted)
{
builder.Append(" ").AppendLine(delete.ToString());
}
builder.AppendLine(" }");
builder.AppendFormat(CultureInfo.InvariantCulture, " PlaceHolder = {0}", Placeholder).AppendLine();
builder.Append("}");
return builder.ToString();
}
#endif
}
}