Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / QueryRewriting / RewritingPass.cs / 1305376 / RewritingPass.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- 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. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PrtTicket_Public_Simple.cs
- ItemsPanelTemplate.cs
- PointLight.cs
- WindowsRebar.cs
- PageMediaSize.cs
- HttpModuleActionCollection.cs
- ContractHandle.cs
- ItemChangedEventArgs.cs
- PerfProviderCollection.cs
- PenContext.cs
- SocketPermission.cs
- documentation.cs
- UpdateManifestForBrowserApplication.cs
- LinkTarget.cs
- ValueQuery.cs
- TrustManagerMoreInformation.cs
- CharEnumerator.cs
- SharedPersonalizationStateInfo.cs
- TdsParserHelperClasses.cs
- GPRECTF.cs
- indexingfiltermarshaler.cs
- TextBox.cs
- Transform3DGroup.cs
- TypeForwardedToAttribute.cs
- MsmqIntegrationInputMessage.cs
- CacheChildrenQuery.cs
- FormsAuthenticationModule.cs
- PropertyGridEditorPart.cs
- SafeTimerHandle.cs
- WebHostedComPlusServiceHost.cs
- ErrorHandler.cs
- DataBindEngine.cs
- XmlSerializerFactory.cs
- StrongNameKeyPair.cs
- BrowserInteropHelper.cs
- wgx_commands.cs
- RowSpanVector.cs
- QilNode.cs
- RuntimeHelpers.cs
- hresults.cs
- TreeNodeStyleCollection.cs
- CodePageEncoding.cs
- Classification.cs
- listitem.cs
- HttpCachePolicy.cs
- SqlCachedBuffer.cs
- BitmapData.cs
- Style.cs
- ConvertTextFrag.cs
- DropShadowEffect.cs
- TcpSocketManager.cs
- Decorator.cs
- SHA256Cng.cs
- NamespaceList.cs
- FileSecurity.cs
- DesignerOptionService.cs
- OverlappedAsyncResult.cs
- ToolStripLabel.cs
- BitmapMetadataBlob.cs
- PeerNameRegistration.cs
- EntityTypeBase.cs
- ExpressionBuilder.cs
- GiveFeedbackEventArgs.cs
- PermissionSetEnumerator.cs
- XmlSchemaType.cs
- FtpCachePolicyElement.cs
- ListMarkerSourceInfo.cs
- XPathNodePointer.cs
- SafeHandles.cs
- SubclassTypeValidatorAttribute.cs
- NCryptSafeHandles.cs
- MessagePropertyDescriptionCollection.cs
- StateWorkerRequest.cs
- SyndicationSerializer.cs
- BaseCodeDomTreeGenerator.cs
- DataMemberFieldEditor.cs
- ProxySimple.cs
- MessageSecurityOverMsmq.cs
- QilTernary.cs
- XmlAnyAttributeAttribute.cs
- Visual3D.cs
- Pens.cs
- DocumentCollection.cs
- Point.cs
- ReadOnlyAttribute.cs
- BinaryReader.cs
- entityreference_tresulttype.cs
- PromptStyle.cs
- ConnectionProviderAttribute.cs
- WebBrowserDocumentCompletedEventHandler.cs
- HeaderedContentControl.cs
- Control.cs
- AttributeData.cs
- RSAPKCS1KeyExchangeFormatter.cs
- ImageAnimator.cs
- ArgumentsParser.cs
- JapaneseCalendar.cs
- ResourceAssociationType.cs
- RawUIStateInputReport.cs
- GeometryGroup.cs