Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / Structures / Cell.cs / 2 / Cell.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Data.Common.Utils;
using System.Collections.Generic;
using System.Data.Mapping.ViewGeneration.Validation;
using System.Text;
using System.Diagnostics;
using System.Data.Metadata.Edm;
namespace System.Data.Mapping.ViewGeneration.Structures {
///
/// This class contains a pair of cell queries which is essentially a
/// constraint that they are equal. A cell is initialized with a C or an
/// S Query which it exposes as properties but it also has the notion of
/// "Left" and "Right" queries -- left refers to the side for which a
/// view is being generated
/// For example, to
/// specify a mapping for CPerson to an SPerson table, we have
///
/// [(p type Person) in P : SPerson]
/// (p.pid, pid)
/// (p.name, name)
///
/// This really denotes the equality of two queries:
/// (C) SELECT (p type Person) AS D1, p.pid, p.name FROM p in P WHERE D1
/// (S) SELECT True AS D1, pid, name FROM SPerson WHERE D1
///
/// For more details, see the design doc
///
internal class Cell : InternalBase {
#region Constructor
// effects: Creates a cell with the C and S queries
private Cell(CellQuery cQuery, CellQuery sQuery, CellLabel label, int cellNumber ) {
Debug.Assert(label != null, "Cell lacks label");
m_cQuery = cQuery;
m_sQuery = sQuery;
m_label = label;
m_cellNumber = cellNumber;
Debug.Assert(m_sQuery.NumProjectedSlots == m_cQuery.NumProjectedSlots,
"Cell queries disagree on the number of projected fields");
}
///
/// Copy Constructor
///
internal Cell(Cell source)
{
m_cQuery = new CellQuery(source.m_cQuery);
m_sQuery = new CellQuery(source.m_sQuery);
m_label = new CellLabel(source.m_label);
m_cellNumber = source.m_cellNumber;
}
#endregion
#region Fields
private CellQuery m_cQuery;
private CellQuery m_sQuery;
private int m_cellNumber; // cell number that identifies this cell
private CellLabel m_label; // The File and Path Info for the CSMappingFragment
// that the Cell was constructed over.
// The view cell relation for all projected slots in this
private ViewCellRelation m_viewCellRelation;
#endregion
#region Properties
// effects: Returns the C query
internal CellQuery CQuery {
get { return m_cQuery; }
}
// effects: Returns the S query
internal CellQuery SQuery {
get { return m_sQuery; }
}
// effects: Returns the CSMappingFragment (if any)
// that the Cell was constructed over.
internal CellLabel CellLabel {
get { return m_label; }
}
// effects: Returns the cell label (if any)
internal int CellNumber {
get { return m_cellNumber; }
}
internal string CellNumberAsString {
get { return StringUtil.FormatInvariant("V{0}", CellNumber); }
}
#endregion
#region Methods
// effects: Determines all the identifiers used in this and adds them to identifiers
internal void GetIdentifiers(CqlIdentifiers identifiers) {
m_cQuery.GetIdentifiers(identifiers);
m_sQuery.GetIdentifiers(identifiers);
}
// effects: Given a cell, determines the paths to which the paths in
// columns map to in the C-space and returns them. If some columns
// are not projected in the cell, or if the corresponding properties
// are not mapped into C-space, returns null
internal Set GetCSlotsForTableColumns(IEnumerable columns) {
List fieldNums = SQuery.GetProjectedPositions(columns);
if (fieldNums == null) {
return null;
}
// The fields are mapped -- see if they are mapped on the
// cSide and they correspond to the primary key of the
// entity set
Set cSideMembers = new Set();
foreach (int fieldNum in fieldNums) {
ProjectedSlot projectedSlot = CQuery.ProjectedSlotAt(fieldNum);
JoinTreeSlot slot = projectedSlot as JoinTreeSlot;
if (slot != null) {
// We can call LastMember since columns do not map to
// extents or memberEnds. Can cast to EdmProperty since it
// cannot be an association end
cSideMembers.Add((EdmProperty)slot.MemberPath.LastMember);
} else {
return null;
}
}
return cSideMembers;
}
// effects: Returns the C query for ViewTarget.QueryView and S query for ViewTarget.UpdateView
internal CellQuery GetLeftQuery(ViewTarget side) {
return side == ViewTarget.QueryView ? m_cQuery : m_sQuery;
}
// effects: Returns the S query for ViewTarget.QueryView and C query for ViewTarget.UpdateView
internal CellQuery GetRightQuery(ViewTarget side) {
return side == ViewTarget.QueryView ? m_sQuery : m_cQuery;
}
// effects: Returns the relation that contains all the slots being
// projected in this cell
internal ViewCellRelation CreateViewCellRelation(int cellNumber) {
if (m_viewCellRelation != null) {
return m_viewCellRelation;
}
GenerateCellRelations(cellNumber);
return m_viewCellRelation;
}
private void GenerateCellRelations(int cellNumber) {
// Generate the view cell relation
List projectedSlots = new List();
// construct a ViewCellSlot for each slot
Debug.Assert(CQuery.NumProjectedSlots == SQuery.NumProjectedSlots,
"Cell queries in cell have a different number of slots");
for (int i = 0; i < CQuery.NumProjectedSlots; i++) {
ProjectedSlot cSlot = CQuery.ProjectedSlotAt(i);
ProjectedSlot sSlot = SQuery.ProjectedSlotAt(i);
Debug.Assert(cSlot != null, "Has cell query been normalized?");
Debug.Assert(sSlot != null, "Has cell query been normalized?");
// These slots better be JoinTreeSlots. We do not have constants etc at this point
// The code below should crash if they are not
JoinTreeSlot cJoinSlot = (JoinTreeSlot)cSlot;
JoinTreeSlot sJoinSlot = (JoinTreeSlot)sSlot;
ViewCellSlot slot = new ViewCellSlot(i, cJoinSlot, sJoinSlot);
projectedSlots.Add(slot);
}
m_viewCellRelation = new ViewCellRelation(this, projectedSlots, cellNumber);
}
internal override void ToCompactString(StringBuilder builder) {
CQuery.ToCompactString(builder);
builder.Append(" = ");
SQuery.ToCompactString(builder);
}
internal override void ToFullString(StringBuilder builder) {
CQuery.ToFullString(builder);
builder.Append(" = ");
SQuery.ToFullString(builder);
}
public override string ToString() {
return ToFullString();
}
// effects: Prints the cells in some human-readable form
internal static void CellsToBuilder(StringBuilder builder, IEnumerable cells) {
// Print mapping
builder.AppendLine();
builder.AppendLine("=========================================================================");
foreach (Cell cell in cells) {
builder.AppendLine();
StringUtil.FormatStringBuilder(builder, "Mapping Cell V{0}:", cell.CellNumber);
builder.AppendLine();
builder.Append("C: ");
cell.CQuery.ToFullString(builder);
builder.AppendLine();
builder.AppendLine();
builder.Append("S: ");
cell.SQuery.ToFullString(builder);
builder.AppendLine();
}
}
// effects: Validates the incoming cells -- throws an exception if
// the data structure is corrupted
internal override bool CheckRepInvariant() {
// Just ask one of the queries to validate itself w.r.t. the other
m_cQuery.CheckRepInvariant(m_sQuery);
return true;
}
#endregion
#region Factory methods
internal static Cell CreateCS(CellQuery cQuery, CellQuery sQuery, CellLabel label, int cellNumber) {
return new Cell(cQuery, sQuery, label, cellNumber);
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Data.Common.Utils;
using System.Collections.Generic;
using System.Data.Mapping.ViewGeneration.Validation;
using System.Text;
using System.Diagnostics;
using System.Data.Metadata.Edm;
namespace System.Data.Mapping.ViewGeneration.Structures {
///
/// This class contains a pair of cell queries which is essentially a
/// constraint that they are equal. A cell is initialized with a C or an
/// S Query which it exposes as properties but it also has the notion of
/// "Left" and "Right" queries -- left refers to the side for which a
/// view is being generated
/// For example, to
/// specify a mapping for CPerson to an SPerson table, we have
///
/// [(p type Person) in P : SPerson]
/// (p.pid, pid)
/// (p.name, name)
///
/// This really denotes the equality of two queries:
/// (C) SELECT (p type Person) AS D1, p.pid, p.name FROM p in P WHERE D1
/// (S) SELECT True AS D1, pid, name FROM SPerson WHERE D1
///
/// For more details, see the design doc
///
internal class Cell : InternalBase {
#region Constructor
// effects: Creates a cell with the C and S queries
private Cell(CellQuery cQuery, CellQuery sQuery, CellLabel label, int cellNumber ) {
Debug.Assert(label != null, "Cell lacks label");
m_cQuery = cQuery;
m_sQuery = sQuery;
m_label = label;
m_cellNumber = cellNumber;
Debug.Assert(m_sQuery.NumProjectedSlots == m_cQuery.NumProjectedSlots,
"Cell queries disagree on the number of projected fields");
}
///
/// Copy Constructor
///
internal Cell(Cell source)
{
m_cQuery = new CellQuery(source.m_cQuery);
m_sQuery = new CellQuery(source.m_sQuery);
m_label = new CellLabel(source.m_label);
m_cellNumber = source.m_cellNumber;
}
#endregion
#region Fields
private CellQuery m_cQuery;
private CellQuery m_sQuery;
private int m_cellNumber; // cell number that identifies this cell
private CellLabel m_label; // The File and Path Info for the CSMappingFragment
// that the Cell was constructed over.
// The view cell relation for all projected slots in this
private ViewCellRelation m_viewCellRelation;
#endregion
#region Properties
// effects: Returns the C query
internal CellQuery CQuery {
get { return m_cQuery; }
}
// effects: Returns the S query
internal CellQuery SQuery {
get { return m_sQuery; }
}
// effects: Returns the CSMappingFragment (if any)
// that the Cell was constructed over.
internal CellLabel CellLabel {
get { return m_label; }
}
// effects: Returns the cell label (if any)
internal int CellNumber {
get { return m_cellNumber; }
}
internal string CellNumberAsString {
get { return StringUtil.FormatInvariant("V{0}", CellNumber); }
}
#endregion
#region Methods
// effects: Determines all the identifiers used in this and adds them to identifiers
internal void GetIdentifiers(CqlIdentifiers identifiers) {
m_cQuery.GetIdentifiers(identifiers);
m_sQuery.GetIdentifiers(identifiers);
}
// effects: Given a cell, determines the paths to which the paths in
// columns map to in the C-space and returns them. If some columns
// are not projected in the cell, or if the corresponding properties
// are not mapped into C-space, returns null
internal Set GetCSlotsForTableColumns(IEnumerable columns) {
List fieldNums = SQuery.GetProjectedPositions(columns);
if (fieldNums == null) {
return null;
}
// The fields are mapped -- see if they are mapped on the
// cSide and they correspond to the primary key of the
// entity set
Set cSideMembers = new Set();
foreach (int fieldNum in fieldNums) {
ProjectedSlot projectedSlot = CQuery.ProjectedSlotAt(fieldNum);
JoinTreeSlot slot = projectedSlot as JoinTreeSlot;
if (slot != null) {
// We can call LastMember since columns do not map to
// extents or memberEnds. Can cast to EdmProperty since it
// cannot be an association end
cSideMembers.Add((EdmProperty)slot.MemberPath.LastMember);
} else {
return null;
}
}
return cSideMembers;
}
// effects: Returns the C query for ViewTarget.QueryView and S query for ViewTarget.UpdateView
internal CellQuery GetLeftQuery(ViewTarget side) {
return side == ViewTarget.QueryView ? m_cQuery : m_sQuery;
}
// effects: Returns the S query for ViewTarget.QueryView and C query for ViewTarget.UpdateView
internal CellQuery GetRightQuery(ViewTarget side) {
return side == ViewTarget.QueryView ? m_sQuery : m_cQuery;
}
// effects: Returns the relation that contains all the slots being
// projected in this cell
internal ViewCellRelation CreateViewCellRelation(int cellNumber) {
if (m_viewCellRelation != null) {
return m_viewCellRelation;
}
GenerateCellRelations(cellNumber);
return m_viewCellRelation;
}
private void GenerateCellRelations(int cellNumber) {
// Generate the view cell relation
List projectedSlots = new List();
// construct a ViewCellSlot for each slot
Debug.Assert(CQuery.NumProjectedSlots == SQuery.NumProjectedSlots,
"Cell queries in cell have a different number of slots");
for (int i = 0; i < CQuery.NumProjectedSlots; i++) {
ProjectedSlot cSlot = CQuery.ProjectedSlotAt(i);
ProjectedSlot sSlot = SQuery.ProjectedSlotAt(i);
Debug.Assert(cSlot != null, "Has cell query been normalized?");
Debug.Assert(sSlot != null, "Has cell query been normalized?");
// These slots better be JoinTreeSlots. We do not have constants etc at this point
// The code below should crash if they are not
JoinTreeSlot cJoinSlot = (JoinTreeSlot)cSlot;
JoinTreeSlot sJoinSlot = (JoinTreeSlot)sSlot;
ViewCellSlot slot = new ViewCellSlot(i, cJoinSlot, sJoinSlot);
projectedSlots.Add(slot);
}
m_viewCellRelation = new ViewCellRelation(this, projectedSlots, cellNumber);
}
internal override void ToCompactString(StringBuilder builder) {
CQuery.ToCompactString(builder);
builder.Append(" = ");
SQuery.ToCompactString(builder);
}
internal override void ToFullString(StringBuilder builder) {
CQuery.ToFullString(builder);
builder.Append(" = ");
SQuery.ToFullString(builder);
}
public override string ToString() {
return ToFullString();
}
// effects: Prints the cells in some human-readable form
internal static void CellsToBuilder(StringBuilder builder, IEnumerable| cells) {
// Print mapping
builder.AppendLine();
builder.AppendLine("=========================================================================");
foreach (Cell cell in cells) {
builder.AppendLine();
StringUtil.FormatStringBuilder(builder, "Mapping Cell V{0}:", cell.CellNumber);
builder.AppendLine();
builder.Append("C: ");
cell.CQuery.ToFullString(builder);
builder.AppendLine();
builder.AppendLine();
builder.Append("S: ");
cell.SQuery.ToFullString(builder);
builder.AppendLine();
}
}
// effects: Validates the incoming cells -- throws an exception if
// the data structure is corrupted
internal override bool CheckRepInvariant() {
// Just ask one of the queries to validate itself w.r.t. the other
m_cQuery.CheckRepInvariant(m_sQuery);
return true;
}
#endregion
#region Factory methods
internal static Cell CreateCS(CellQuery cQuery, CellQuery sQuery, CellLabel label, int cellNumber) {
return new Cell(cQuery, sQuery, label, cellNumber);
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
| |
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XMLSyntaxException.cs
- SignerInfo.cs
- WebScriptMetadataMessageEncoderFactory.cs
- InternalControlCollection.cs
- FontNameEditor.cs
- ModelFactory.cs
- AVElementHelper.cs
- XComponentModel.cs
- PixelFormats.cs
- ListViewVirtualItemsSelectionRangeChangedEvent.cs
- TableCellCollection.cs
- DataGridClipboardHelper.cs
- ToolStripPanelSelectionGlyph.cs
- HttpModuleAction.cs
- WebServiceParameterData.cs
- HtmlTextBoxAdapter.cs
- MsmqInputMessagePool.cs
- DataGridTablesFactory.cs
- RedirectionProxy.cs
- TemplateParser.cs
- StylusPlugInCollection.cs
- DeviceContext.cs
- Win32Exception.cs
- HttpDictionary.cs
- ConditionalAttribute.cs
- ElementNotAvailableException.cs
- Misc.cs
- ReadingWritingEntityEventArgs.cs
- PenThreadPool.cs
- SqlVersion.cs
- UnsafeNativeMethods.cs
- GridViewRowEventArgs.cs
- httpapplicationstate.cs
- Button.cs
- TextServicesHost.cs
- ApplicationBuildProvider.cs
- TableCellCollection.cs
- COM2PropertyDescriptor.cs
- StateManagedCollection.cs
- IntPtr.cs
- GridViewColumn.cs
- SessionStateItemCollection.cs
- TextBox.cs
- MenuItemBinding.cs
- BevelBitmapEffect.cs
- RangeValidator.cs
- SharedUtils.cs
- Color.cs
- IApplicationTrustManager.cs
- HashAlgorithm.cs
- ColorTransform.cs
- _UriTypeConverter.cs
- documentation.cs
- WebServiceTypeData.cs
- ContentHostHelper.cs
- ToolStripPanel.cs
- AnnotationResourceChangedEventArgs.cs
- FixedPageAutomationPeer.cs
- AncillaryOps.cs
- MetaTableHelper.cs
- TextEditorContextMenu.cs
- DbParameterHelper.cs
- RemoteWebConfigurationHost.cs
- safePerfProviderHandle.cs
- CodeVariableDeclarationStatement.cs
- XamlVector3DCollectionSerializer.cs
- XPathArrayIterator.cs
- GridSplitter.cs
- ToolStripDropDownButton.cs
- CodeDirectionExpression.cs
- MenuItemCollectionEditor.cs
- OleDbDataAdapter.cs
- AnonymousIdentificationSection.cs
- SubMenuStyle.cs
- IDQuery.cs
- SizeConverter.cs
- DbProviderServices.cs
- CmsInterop.cs
- SystemMulticastIPAddressInformation.cs
- EventTask.cs
- InterleavedZipPartStream.cs
- EventBuilder.cs
- WeakRefEnumerator.cs
- WebDisplayNameAttribute.cs
- CommandConverter.cs
- ManifestResourceInfo.cs
- RepeatButtonAutomationPeer.cs
- SaveLedgerEntryRequest.cs
- PageCodeDomTreeGenerator.cs
- GridViewPageEventArgs.cs
- DataSvcMapFile.cs
- WindowHideOrCloseTracker.cs
- Add.cs
- ReachPageContentCollectionSerializerAsync.cs
- EncodingStreamWrapper.cs
- WindowsComboBox.cs
- TextReader.cs
- SmtpReplyReaderFactory.cs
- securestring.cs
- AnimationLayer.cs