Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / QueryRewriting / RewritingPass.cs / 1 / RewritingPass.cs
using System; using System.Diagnostics; using System.Collections.Generic; using System.Text; using System.Linq; namespace System.Data.Mapping.ViewGeneration.QueryRewriting { // Goal: use the next view to get rewritingSoFar to be closer to the goal internal class RewritingPasswhere T_Tile : class { // region that rewriting needs to cover private readonly T_Tile m_toFill; // region that rewriting needs to be disjoint with private readonly T_Tile m_toAvoid; private readonly List m_views; private readonly RewritingProcessor m_qp; private readonly Dictionary m_usedViews = new Dictionary (); public RewritingPass(T_Tile toFill, T_Tile toAvoid, List views, RewritingProcessor qp) { m_toFill = toFill; m_toAvoid = toAvoid; m_views = views; m_qp = qp; } public static bool RewriteQuery(T_Tile toFill, T_Tile toAvoid, out T_Tile rewriting, List views, RewritingProcessor qp) { RewritingPass rewritingPass = new RewritingPass (toFill, toAvoid, views, qp); if (rewritingPass.RewriteQuery(out rewriting)) { RewritingSimplifier .TrySimplifyUnionRewriting(ref rewriting, toFill, toAvoid, qp); return true; } return false; } private static bool RewriteQueryInternal(T_Tile toFill, T_Tile toAvoid, out T_Tile rewriting, List views, HashSet recentlyUsedViews, RewritingProcessor qp) { if (qp.REORDER_VIEWS && recentlyUsedViews.Count > 0) { // move recently used views toward the end List reorderedViews = new List (); foreach (T_Tile view in views) { if (false == recentlyUsedViews.Contains(view)) { reorderedViews.Add(view); } } reorderedViews.AddRange(recentlyUsedViews); views = reorderedViews; } RewritingPass rewritingPass = new RewritingPass (toFill, toAvoid, views, qp); return rewritingPass.RewriteQuery(out rewriting); } private bool RewriteQuery(out T_Tile rewriting) { rewriting = m_toFill; T_Tile rewritingSoFar; if (false == FindRewritingByIncludedAndDisjoint(out rewritingSoFar)) { if (false == FindContributingView(out rewritingSoFar)) { return false; } } bool hasExtraTuples = !m_qp.IsDisjointFrom(rewritingSoFar, m_toAvoid); // try to cut off extra tuples using joins if (hasExtraTuples) { foreach (T_Tile view in AvailableViews) { if (TryJoin(view, ref rewritingSoFar)) { hasExtraTuples = false; break; } } } // try to cut off extra tuples using anti-semijoins if (hasExtraTuples) { foreach (T_Tile view in AvailableViews) { if (TryAntiSemiJoin(view, ref rewritingSoFar)) { hasExtraTuples = false; break; } } } if (hasExtraTuples) { return false; // won't be able to cut off extra tuples } // remove redundant joins and anti-semijoins RewritingSimplifier .TrySimplifyJoinRewriting(ref rewritingSoFar, m_toAvoid, m_usedViews, m_qp); // find rewriting for missing tuples, if any T_Tile missingTuples = m_qp.AntiSemiJoin(m_toFill, rewritingSoFar); if (!m_qp.IsEmpty(missingTuples)) { T_Tile rewritingForMissingTuples; if (false == RewritingPass .RewriteQueryInternal(missingTuples, m_toAvoid, out rewritingForMissingTuples, m_views, new HashSet (m_usedViews.Keys), m_qp)) { rewriting = rewritingForMissingTuples; return false; // failure } else { // Although a more general optimization for UNIONs will handle this case, // adding this check reduces the overall number of containment tests if (m_qp.IsContainedIn(rewritingSoFar, rewritingForMissingTuples)) { rewritingSoFar = rewritingForMissingTuples; } else { rewritingSoFar = m_qp.Union(rewritingSoFar, rewritingForMissingTuples); } } } // if we reached this point, we have a successful rewriting rewriting = rewritingSoFar; return true; } // returns true if no more extra tuples are left private bool TryJoin(T_Tile view, ref T_Tile rewriting) { T_Tile newRewriting = m_qp.Join(rewriting, view); if (!m_qp.IsEmpty(newRewriting)) { m_usedViews[view] = TileOpKind.Join; rewriting = newRewriting; return m_qp.IsDisjointFrom(rewriting, m_toAvoid); } return false; } // returns true if no more extra tuples are left private bool TryAntiSemiJoin(T_Tile view, ref T_Tile rewriting) { T_Tile newRewriting = m_qp.AntiSemiJoin(rewriting, view); if (!m_qp.IsEmpty(newRewriting)) { m_usedViews[view] = TileOpKind.AntiSemiJoin; rewriting = newRewriting; return m_qp.IsDisjointFrom(rewriting, m_toAvoid); } return false; } // Try to find a rewriting by intersecting all views which contain the query // and subtracting all views that are disjoint from the query private bool FindRewritingByIncludedAndDisjoint(out T_Tile rewritingSoFar) { // intersect all views in which m_toFill is contained rewritingSoFar = null; foreach (T_Tile view in AvailableViews) { if (m_qp.IsContainedIn(m_toFill, view)) // query <= view { if (rewritingSoFar == null) { rewritingSoFar = view; m_usedViews[view] = TileOpKind.Join; } else { T_Tile newRewriting = m_qp.Join(rewritingSoFar, view); if (!m_qp.IsContainedIn(rewritingSoFar, newRewriting)) { rewritingSoFar = newRewriting; m_usedViews[view] = TileOpKind.Join; // it is a useful join } else { continue; // useless join } } if (m_qp.IsContainedIn(rewritingSoFar, m_toFill)) { return true; } } } // subtract all views that are disjoint from m_toFill if (rewritingSoFar != null) { foreach (T_Tile view in AvailableViews) { if (m_qp.IsDisjointFrom(m_toFill, view)) // query ^ view = {} { if (!m_qp.IsDisjointFrom(rewritingSoFar, view)) { rewritingSoFar = m_qp.AntiSemiJoin(rewritingSoFar, view); m_usedViews[view] = TileOpKind.AntiSemiJoin; if (m_qp.IsContainedIn(rewritingSoFar, m_toFill)) { return true; } } } } } return rewritingSoFar != null; } private bool FindContributingView(out T_Tile rewriting) { // find some view that helps reduce toFill foreach (T_Tile view in AvailableViews) { if(false == m_qp.IsDisjointFrom(view, m_toFill)) { rewriting = view; m_usedViews[view] = TileOpKind.Join; // positive, intersected return true; } } rewriting = null; return false; } private IEnumerable AvailableViews { get { return m_views.Where(view => !m_usedViews.ContainsKey(view)); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Diagnostics; using System.Collections.Generic; using System.Text; using System.Linq; namespace System.Data.Mapping.ViewGeneration.QueryRewriting { // Goal: use the next view to get rewritingSoFar to be closer to the goal internal class RewritingPass where T_Tile : class { // region that rewriting needs to cover private readonly T_Tile m_toFill; // region that rewriting needs to be disjoint with private readonly T_Tile m_toAvoid; private readonly List m_views; private readonly RewritingProcessor m_qp; private readonly Dictionary m_usedViews = new Dictionary (); public RewritingPass(T_Tile toFill, T_Tile toAvoid, List views, RewritingProcessor qp) { m_toFill = toFill; m_toAvoid = toAvoid; m_views = views; m_qp = qp; } public static bool RewriteQuery(T_Tile toFill, T_Tile toAvoid, out T_Tile rewriting, List views, RewritingProcessor qp) { RewritingPass rewritingPass = new RewritingPass (toFill, toAvoid, views, qp); if (rewritingPass.RewriteQuery(out rewriting)) { RewritingSimplifier .TrySimplifyUnionRewriting(ref rewriting, toFill, toAvoid, qp); return true; } return false; } private static bool RewriteQueryInternal(T_Tile toFill, T_Tile toAvoid, out T_Tile rewriting, List views, HashSet recentlyUsedViews, RewritingProcessor qp) { if (qp.REORDER_VIEWS && recentlyUsedViews.Count > 0) { // move recently used views toward the end List reorderedViews = new List (); foreach (T_Tile view in views) { if (false == recentlyUsedViews.Contains(view)) { reorderedViews.Add(view); } } reorderedViews.AddRange(recentlyUsedViews); views = reorderedViews; } RewritingPass rewritingPass = new RewritingPass (toFill, toAvoid, views, qp); return rewritingPass.RewriteQuery(out rewriting); } private bool RewriteQuery(out T_Tile rewriting) { rewriting = m_toFill; T_Tile rewritingSoFar; if (false == FindRewritingByIncludedAndDisjoint(out rewritingSoFar)) { if (false == FindContributingView(out rewritingSoFar)) { return false; } } bool hasExtraTuples = !m_qp.IsDisjointFrom(rewritingSoFar, m_toAvoid); // try to cut off extra tuples using joins if (hasExtraTuples) { foreach (T_Tile view in AvailableViews) { if (TryJoin(view, ref rewritingSoFar)) { hasExtraTuples = false; break; } } } // try to cut off extra tuples using anti-semijoins if (hasExtraTuples) { foreach (T_Tile view in AvailableViews) { if (TryAntiSemiJoin(view, ref rewritingSoFar)) { hasExtraTuples = false; break; } } } if (hasExtraTuples) { return false; // won't be able to cut off extra tuples } // remove redundant joins and anti-semijoins RewritingSimplifier .TrySimplifyJoinRewriting(ref rewritingSoFar, m_toAvoid, m_usedViews, m_qp); // find rewriting for missing tuples, if any T_Tile missingTuples = m_qp.AntiSemiJoin(m_toFill, rewritingSoFar); if (!m_qp.IsEmpty(missingTuples)) { T_Tile rewritingForMissingTuples; if (false == RewritingPass .RewriteQueryInternal(missingTuples, m_toAvoid, out rewritingForMissingTuples, m_views, new HashSet (m_usedViews.Keys), m_qp)) { rewriting = rewritingForMissingTuples; return false; // failure } else { // Although a more general optimization for UNIONs will handle this case, // adding this check reduces the overall number of containment tests if (m_qp.IsContainedIn(rewritingSoFar, rewritingForMissingTuples)) { rewritingSoFar = rewritingForMissingTuples; } else { rewritingSoFar = m_qp.Union(rewritingSoFar, rewritingForMissingTuples); } } } // if we reached this point, we have a successful rewriting rewriting = rewritingSoFar; return true; } // returns true if no more extra tuples are left private bool TryJoin(T_Tile view, ref T_Tile rewriting) { T_Tile newRewriting = m_qp.Join(rewriting, view); if (!m_qp.IsEmpty(newRewriting)) { m_usedViews[view] = TileOpKind.Join; rewriting = newRewriting; return m_qp.IsDisjointFrom(rewriting, m_toAvoid); } return false; } // returns true if no more extra tuples are left private bool TryAntiSemiJoin(T_Tile view, ref T_Tile rewriting) { T_Tile newRewriting = m_qp.AntiSemiJoin(rewriting, view); if (!m_qp.IsEmpty(newRewriting)) { m_usedViews[view] = TileOpKind.AntiSemiJoin; rewriting = newRewriting; return m_qp.IsDisjointFrom(rewriting, m_toAvoid); } return false; } // Try to find a rewriting by intersecting all views which contain the query // and subtracting all views that are disjoint from the query private bool FindRewritingByIncludedAndDisjoint(out T_Tile rewritingSoFar) { // intersect all views in which m_toFill is contained rewritingSoFar = null; foreach (T_Tile view in AvailableViews) { if (m_qp.IsContainedIn(m_toFill, view)) // query <= view { if (rewritingSoFar == null) { rewritingSoFar = view; m_usedViews[view] = TileOpKind.Join; } else { T_Tile newRewriting = m_qp.Join(rewritingSoFar, view); if (!m_qp.IsContainedIn(rewritingSoFar, newRewriting)) { rewritingSoFar = newRewriting; m_usedViews[view] = TileOpKind.Join; // it is a useful join } else { continue; // useless join } } if (m_qp.IsContainedIn(rewritingSoFar, m_toFill)) { return true; } } } // subtract all views that are disjoint from m_toFill if (rewritingSoFar != null) { foreach (T_Tile view in AvailableViews) { if (m_qp.IsDisjointFrom(m_toFill, view)) // query ^ view = {} { if (!m_qp.IsDisjointFrom(rewritingSoFar, view)) { rewritingSoFar = m_qp.AntiSemiJoin(rewritingSoFar, view); m_usedViews[view] = TileOpKind.AntiSemiJoin; if (m_qp.IsContainedIn(rewritingSoFar, m_toFill)) { return true; } } } } } return rewritingSoFar != null; } private bool FindContributingView(out T_Tile rewriting) { // find some view that helps reduce toFill foreach (T_Tile view in AvailableViews) { if(false == m_qp.IsDisjointFrom(view, m_toFill)) { rewriting = view; m_usedViews[view] = TileOpKind.Join; // positive, intersected return true; } } rewriting = null; return false; } private IEnumerable AvailableViews { get { return m_views.Where(view => !m_usedViews.ContainsKey(view)); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- serverconfig.cs
- DynamicHyperLink.cs
- ColumnResizeUndoUnit.cs
- ChangeInterceptorAttribute.cs
- HttpModulesSection.cs
- UIServiceHelper.cs
- ScriptResourceInfo.cs
- CryptoApi.cs
- XmlIgnoreAttribute.cs
- TrackingLocationCollection.cs
- TdsParserStaticMethods.cs
- XPathSelfQuery.cs
- BasicCellRelation.cs
- SplitterCancelEvent.cs
- UnaryNode.cs
- EntityDescriptor.cs
- ListViewTableRow.cs
- Restrictions.cs
- InfoCardRSAPKCS1SignatureDeformatter.cs
- FileRecordSequence.cs
- HtmlFormWrapper.cs
- BindingList.cs
- GridViewDeletedEventArgs.cs
- KeyMatchBuilder.cs
- ElementUtil.cs
- AccessDataSourceView.cs
- SymmetricSecurityProtocolFactory.cs
- SqlNotificationRequest.cs
- ObservableDictionary.cs
- UpdatePanel.cs
- ArcSegment.cs
- LongPath.cs
- TransportConfigurationTypeElement.cs
- QueueException.cs
- _SSPISessionCache.cs
- SchemaContext.cs
- ComponentDispatcher.cs
- Win32Native.cs
- CommonGetThemePartSize.cs
- ChannelProtectionRequirements.cs
- CacheRequest.cs
- MILUtilities.cs
- Message.cs
- ToolStripDropDownClosedEventArgs.cs
- ActivityMarkupSerializationProvider.cs
- BackgroundFormatInfo.cs
- CacheOutputQuery.cs
- Vertex.cs
- TimerElapsedEvenArgs.cs
- ReadOnlyDataSource.cs
- QilBinary.cs
- PageEventArgs.cs
- FormViewDeleteEventArgs.cs
- DelegatingTypeDescriptionProvider.cs
- WebPartDisplayModeEventArgs.cs
- ModelService.cs
- Transaction.cs
- ListDictionaryInternal.cs
- PackWebRequestFactory.cs
- StrongTypingException.cs
- ApplicationActivator.cs
- DataGridViewRowsRemovedEventArgs.cs
- WindowsListViewSubItem.cs
- WebEvents.cs
- SHA1CryptoServiceProvider.cs
- AssemblyFilter.cs
- WindowsFont.cs
- InfoCardSymmetricAlgorithm.cs
- EntityViewGenerationConstants.cs
- ListViewTableRow.cs
- WorkflowDefinitionContext.cs
- Empty.cs
- LockedAssemblyCache.cs
- WpfXamlLoader.cs
- UIPropertyMetadata.cs
- ContainerSelectorBehavior.cs
- COM2PictureConverter.cs
- TwoPhaseCommit.cs
- DbMetaDataFactory.cs
- Metadata.cs
- HttpResponseMessageProperty.cs
- Stackframe.cs
- XmlQueryCardinality.cs
- DataMember.cs
- ParameterCollectionEditorForm.cs
- MasterPage.cs
- CodeGeneratorOptions.cs
- CodeMemberEvent.cs
- CannotUnloadAppDomainException.cs
- DeleteBookmarkScope.cs
- ObjectCacheHost.cs
- WebResourceAttribute.cs
- SQLInt16Storage.cs
- UserThread.cs
- BinarySerializer.cs
- CodeEntryPointMethod.cs
- AdCreatedEventArgs.cs
- GridViewColumnHeaderAutomationPeer.cs
- Selection.cs
- ColumnMap.cs