Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / CellPartitioner.cs / 1 / CellPartitioner.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Data.Common.Utils; using System.Data.Mapping.ViewGeneration.Structures; using System.Collections.Generic; using System.Data.Mapping.ViewGeneration.Validation; using System.Text; using System.Data.Mapping.Update.Internal; using System.Collections.ObjectModel; using System.Data.Metadata.Edm; namespace System.Data.Mapping.ViewGeneration { using CellGroup = Set; // This class is responsible for partitioning cells into groups of cells // that are related and for which view generation needs to be done together internal class CellPartitioner : InternalBase { #region Constructor // effects: Creates a partitioner for cells with extra information // about foreign key constraints internal CellPartitioner(IEnumerable | cells, IEnumerable | foreignKeyConstraints) { m_foreignKeyConstraints = foreignKeyConstraints; m_cells = cells; } #endregion #region Fields private IEnumerable m_cells; private IEnumerable | m_foreignKeyConstraints; #endregion #region Available Methods // effects: Given a list of cells, segments them into multiple // "groups" such that view generation (including validation) of one // group can be done independently of another group. Returns the // groups as a list (uses the foreign key information as well) internal List GroupRelatedCells() { // If two cells share the same C or S, we place them in the same group // For each cell, determine the Cis and Sis that it refers // to. For every Ci (Si), keep track of the cells that Ci is // contained in. At the end, run through the Cis and Sis and do a // "connected components" algorithm to determine partitions // Now form a graph between different cells -- then compute the connected // components in it UndirectedGraph graph = new UndirectedGraph | (EqualityComparer | .Default); List | alreadyAddedCells = new List | (); // For each extent, add an edge between it and all previously // added extents with which it overlaps foreach (Cell cell in m_cells) { graph.AddVertex(cell); // Add an edge from this cell to the already added cells EntitySetBase firstCExtent = cell.CQuery.Extent; EntitySetBase firstSExtent = cell.SQuery.Extent; foreach (Cell existingCell in alreadyAddedCells) { EntitySetBase secondCExtent = existingCell.CQuery.Extent; EntitySetBase secondSExtent = existingCell.SQuery.Extent; // Add an edge between cell and existingCell if // * They have the same C or S extent // * They are linked via a foreign key between the S extents // * They are linked via a relationship bool sameExtent = secondCExtent.Equals(firstCExtent) || secondSExtent.Equals(firstSExtent); bool linkViaForeignKey = OverlapViaForeignKeys(cell, existingCell); bool linkViaRelationship = AreCellsConnectedViaRelationship(cell, existingCell); if (sameExtent || linkViaForeignKey || linkViaRelationship) { graph.AddEdge(existingCell, cell); } } alreadyAddedCells.Add(cell); } // Now determine the connected components of this graph List | result = GenerateConnectedComponents(graph); return result; } #endregion #region Private Methods // effects: Returns true iff cell1 is an extent at the end of cell2's // relationship set or vice versa private static bool AreCellsConnectedViaRelationship(Cell cell1, Cell cell2) { AssociationSet cRelationSet1 = cell1.CQuery.Extent as AssociationSet; AssociationSet cRelationSet2 = cell2.CQuery.Extent as AssociationSet; if (cRelationSet1 != null && MetadataHelper.IsExtentAtSomeRelationshipEnd(cRelationSet1, cell2.CQuery.Extent)) { return true; } if (cRelationSet2 != null && MetadataHelper.IsExtentAtSomeRelationshipEnd(cRelationSet2, cell1.CQuery.Extent)) { return true; } return false; } // effects: Given a graph of cell groups, returns a list of cellgroup // such that each cellgroup contains all the cells that are in the // same connected component private static List GenerateConnectedComponents(UndirectedGraph graph) { KeyToListMap | groupMap = graph.GenerateConnectedComponents(); // Run through the list of groups and generate the merged groups List result = new List (); foreach (int setNum in groupMap.Keys) { ReadOnlyCollection cellsInComponent = groupMap.ListForKey(setNum); CellGroup component = new CellGroup(cellsInComponent); result.Add(component); } return result; } // effects: Returns true iff there is a foreign key constraint // between cell1 and cell2's S extents private bool OverlapViaForeignKeys(Cell cell1, Cell cell2) { EntitySetBase sExtent1 = cell1.SQuery.Extent; EntitySetBase sExtent2 = cell2.SQuery.Extent; foreach (ForeignConstraint constraint in m_foreignKeyConstraints) { if (sExtent1.Equals(constraint.ParentTable) && sExtent2.Equals(constraint.ChildTable) || sExtent2.Equals(constraint.ParentTable) && sExtent1.Equals(constraint.ChildTable)) { return true; } } return false; } #endregion internal override void ToCompactString(StringBuilder builder) { Cell.CellsToBuilder(builder, m_cells); } } } // 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.Data.Mapping.ViewGeneration.Structures; using System.Collections.Generic; using System.Data.Mapping.ViewGeneration.Validation; using System.Text; using System.Data.Mapping.Update.Internal; using System.Collections.ObjectModel; using System.Data.Metadata.Edm; namespace System.Data.Mapping.ViewGeneration { using CellGroup = Set; // This class is responsible for partitioning cells into groups of cells // that are related and for which view generation needs to be done together internal class CellPartitioner : InternalBase { #region Constructor // effects: Creates a partitioner for cells with extra information // about foreign key constraints internal CellPartitioner(IEnumerable | cells, IEnumerable | foreignKeyConstraints) { m_foreignKeyConstraints = foreignKeyConstraints; m_cells = cells; } #endregion #region Fields private IEnumerable m_cells; private IEnumerable | m_foreignKeyConstraints; #endregion #region Available Methods // effects: Given a list of cells, segments them into multiple // "groups" such that view generation (including validation) of one // group can be done independently of another group. Returns the // groups as a list (uses the foreign key information as well) internal List GroupRelatedCells() { // If two cells share the same C or S, we place them in the same group // For each cell, determine the Cis and Sis that it refers // to. For every Ci (Si), keep track of the cells that Ci is // contained in. At the end, run through the Cis and Sis and do a // "connected components" algorithm to determine partitions // Now form a graph between different cells -- then compute the connected // components in it UndirectedGraph graph = new UndirectedGraph | (EqualityComparer | .Default); List | alreadyAddedCells = new List | (); // For each extent, add an edge between it and all previously // added extents with which it overlaps foreach (Cell cell in m_cells) { graph.AddVertex(cell); // Add an edge from this cell to the already added cells EntitySetBase firstCExtent = cell.CQuery.Extent; EntitySetBase firstSExtent = cell.SQuery.Extent; foreach (Cell existingCell in alreadyAddedCells) { EntitySetBase secondCExtent = existingCell.CQuery.Extent; EntitySetBase secondSExtent = existingCell.SQuery.Extent; // Add an edge between cell and existingCell if // * They have the same C or S extent // * They are linked via a foreign key between the S extents // * They are linked via a relationship bool sameExtent = secondCExtent.Equals(firstCExtent) || secondSExtent.Equals(firstSExtent); bool linkViaForeignKey = OverlapViaForeignKeys(cell, existingCell); bool linkViaRelationship = AreCellsConnectedViaRelationship(cell, existingCell); if (sameExtent || linkViaForeignKey || linkViaRelationship) { graph.AddEdge(existingCell, cell); } } alreadyAddedCells.Add(cell); } // Now determine the connected components of this graph List | result = GenerateConnectedComponents(graph); return result; } #endregion #region Private Methods // effects: Returns true iff cell1 is an extent at the end of cell2's // relationship set or vice versa private static bool AreCellsConnectedViaRelationship(Cell cell1, Cell cell2) { AssociationSet cRelationSet1 = cell1.CQuery.Extent as AssociationSet; AssociationSet cRelationSet2 = cell2.CQuery.Extent as AssociationSet; if (cRelationSet1 != null && MetadataHelper.IsExtentAtSomeRelationshipEnd(cRelationSet1, cell2.CQuery.Extent)) { return true; } if (cRelationSet2 != null && MetadataHelper.IsExtentAtSomeRelationshipEnd(cRelationSet2, cell1.CQuery.Extent)) { return true; } return false; } // effects: Given a graph of cell groups, returns a list of cellgroup // such that each cellgroup contains all the cells that are in the // same connected component private static List GenerateConnectedComponents(UndirectedGraph graph) { KeyToListMap | groupMap = graph.GenerateConnectedComponents(); // Run through the list of groups and generate the merged groups List result = new List (); foreach (int setNum in groupMap.Keys) { ReadOnlyCollection cellsInComponent = groupMap.ListForKey(setNum); CellGroup component = new CellGroup(cellsInComponent); result.Add(component); } return result; } // effects: Returns true iff there is a foreign key constraint // between cell1 and cell2's S extents private bool OverlapViaForeignKeys(Cell cell1, Cell cell2) { EntitySetBase sExtent1 = cell1.SQuery.Extent; EntitySetBase sExtent2 = cell2.SQuery.Extent; foreach (ForeignConstraint constraint in m_foreignKeyConstraints) { if (sExtent1.Equals(constraint.ParentTable) && sExtent2.Equals(constraint.ChildTable) || sExtent2.Equals(constraint.ParentTable) && sExtent1.Equals(constraint.ChildTable)) { return true; } } return false; } #endregion internal override void ToCompactString(StringBuilder builder) { Cell.CellsToBuilder(builder, m_cells); } } } // 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
- ObjectDisposedException.cs
- BinaryFormatter.cs
- RepeatInfo.cs
- Calendar.cs
- AutoGeneratedField.cs
- ProxyHwnd.cs
- TdsParserStaticMethods.cs
- StylusCaptureWithinProperty.cs
- DefaultAuthorizationContext.cs
- InterleavedZipPartStream.cs
- Enum.cs
- LazyTextWriterCreator.cs
- MethodImplAttribute.cs
- TextTreeRootNode.cs
- SQLByte.cs
- NullPackagingPolicy.cs
- Lasso.cs
- WebConfigurationHostFileChange.cs
- Visual3DCollection.cs
- Activator.cs
- ApplicationManager.cs
- BindingBase.cs
- SiteMapDataSourceView.cs
- ADMembershipUser.cs
- SessionStateUtil.cs
- ObjectCloneHelper.cs
- __FastResourceComparer.cs
- EmptyCollection.cs
- DBDataPermission.cs
- InfoCardRSACryptoProvider.cs
- EntryIndex.cs
- HitTestParameters3D.cs
- SimpleWebHandlerParser.cs
- OracleCommandSet.cs
- XamlReaderHelper.cs
- TraceEventCache.cs
- PropertyPathWorker.cs
- ArcSegment.cs
- StylusShape.cs
- ValidationHelpers.cs
- GrabHandleGlyph.cs
- RootBrowserWindowProxy.cs
- ClientType.cs
- Compilation.cs
- DataGridViewSelectedColumnCollection.cs
- WmlTextBoxAdapter.cs
- WebPartExportVerb.cs
- WebPartCloseVerb.cs
- PeerTransportListenAddressValidator.cs
- SecurityDocument.cs
- GiveFeedbackEvent.cs
- SecurityUtils.cs
- ControlEvent.cs
- ManagementQuery.cs
- X509CertificateChain.cs
- SystemNetHelpers.cs
- ColumnMapProcessor.cs
- DataGridViewCellStateChangedEventArgs.cs
- ClientSettingsSection.cs
- RoleService.cs
- SqlStatistics.cs
- XmlValidatingReader.cs
- SqlBulkCopyColumnMapping.cs
- DictionaryItemsCollection.cs
- HeaderedItemsControl.cs
- GifBitmapDecoder.cs
- DynamicDataExtensions.cs
- XmlSchemaSimpleTypeRestriction.cs
- Exceptions.cs
- PrePrepareMethodAttribute.cs
- SchemaImporterExtensionElementCollection.cs
- ThemeableAttribute.cs
- WindowsProgressbar.cs
- RuntimeConfigurationRecord.cs
- SmtpFailedRecipientException.cs
- Propagator.JoinPropagator.JoinPredicateVisitor.cs
- Identity.cs
- ServiceOperationListItemList.cs
- IgnoreFlushAndCloseStream.cs
- ISAPIApplicationHost.cs
- ReadOnlyCollectionBase.cs
- EdmRelationshipRoleAttribute.cs
- ScriptingAuthenticationServiceSection.cs
- AbandonedMutexException.cs
- ObjectMemberMapping.cs
- XmlSchemaExporter.cs
- ReadonlyMessageFilter.cs
- NativeMethods.cs
- TabPanel.cs
- _RequestCacheProtocol.cs
- XmlEncoding.cs
- SqlTypeSystemProvider.cs
- EmptyReadOnlyDictionaryInternal.cs
- RefreshEventArgs.cs
- SqlGatherProducedAliases.cs
- XPathArrayIterator.cs
- DataRow.cs
- SynchronizationContext.cs
- SymmetricAlgorithm.cs
- HostingEnvironment.cs