Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / QueryRewriting / FragmentQueryProcessor.cs / 1305376 / FragmentQueryProcessor.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
using System.Data.Common.Utils;
using System.Data.Common.Utils.Boolean;
using System.Data.Mapping.ViewGeneration.Structures;
using System.Data.Metadata.Edm;
using System.Linq;
using System.Globalization;
namespace System.Data.Mapping.ViewGeneration.QueryRewriting
{
using BoolDomainConstraint = DomainConstraint;
internal class FragmentQueryProcessor : TileQueryProcessor
{
private FragmentQueryKB _kb;
public FragmentQueryProcessor(FragmentQueryKB kb)
{
_kb = kb;
}
internal static FragmentQueryProcessor Merge(FragmentQueryProcessor qp1, FragmentQueryProcessor qp2)
{
FragmentQueryKB mergedKB = new FragmentQueryKB();
mergedKB.AddKnowledgeBase(qp1.KnowledgeBase);
mergedKB.AddKnowledgeBase(qp2.KnowledgeBase);
return new FragmentQueryProcessor(mergedKB);
}
internal FragmentQueryKB KnowledgeBase
{
get { return _kb; }
}
// resulting query contains an intersection of attributes
internal override FragmentQuery Union(FragmentQuery q1, FragmentQuery q2)
{
HashSet attributes = new HashSet(q1.Attributes);
attributes.IntersectWith(q2.Attributes);
BoolExpression condition = BoolExpression.CreateOr(q1.Condition, q2.Condition);
return FragmentQuery.Create(attributes, condition);
}
internal bool IsDisjointFrom(FragmentQuery q1, FragmentQuery q2)
{
return !IsSatisfiable(Intersect(q1, q2));
}
internal bool IsContainedIn(FragmentQuery q1, FragmentQuery q2)
{
return !IsSatisfiable(Difference(q1, q2));
}
internal bool IsEquivalentTo(FragmentQuery q1, FragmentQuery q2)
{
return IsContainedIn(q1, q2) && IsContainedIn(q2, q1);
}
internal override FragmentQuery Intersect(FragmentQuery q1, FragmentQuery q2)
{
HashSet attributes = new HashSet(q1.Attributes);
attributes.IntersectWith(q2.Attributes);
BoolExpression condition = BoolExpression.CreateAnd(q1.Condition, q2.Condition);
return FragmentQuery.Create(attributes, condition);
}
internal override FragmentQuery Difference(FragmentQuery qA, FragmentQuery qB)
{
return FragmentQuery.Create(qA.Attributes, BoolExpression.CreateAndNot(qA.Condition, qB.Condition));
}
internal override bool IsSatisfiable(FragmentQuery query)
{
return IsSatisfiable(query.Condition);
}
private bool IsSatisfiable(BoolExpression condition)
{
// instantiate conversion context for each check - gives better performance
BoolExpression conditionUnderKB = condition.Create(
new AndExpr(_kb.KbExpression, condition.Tree));
var context = IdentifierService.Instance.CreateConversionContext();
var converter = new Converter(conditionUnderKB.Tree, context);
bool isSatisfiable = converter.Vertex.IsZero() == false;
return isSatisfiable;
}
// creates "derived" views that may be helpful for answering the query
// for example, view = SELECT ID WHERE B=2, query = SELECT ID,B WHERE B=2
// Created derived view: SELECT ID,B WHERE B=2 by adding the attribute whose value is determined by the where clause to projected list
internal override FragmentQuery CreateDerivedViewBySelectingConstantAttributes(FragmentQuery view)
{
HashSet newProjectedAttributes = new HashSet();
// collect all variables from the view
IEnumerable> variables = view.Condition.Variables;
foreach (DomainVariable var in variables)
{
MemberRestriction variableCondition = var.Identifier as MemberRestriction;
if (variableCondition != null)
{
// Is this attribute not already projected?
MemberPath conditionMember = variableCondition.RestrictedMemberSlot.MemberPath;
// Iterating through the variable domain var.Domain could be wasteful
// Instead, consider the actual condition values on the variable. Usually, they don't get repeated (if not, we could cache and check)
Domain conditionValues = variableCondition.Domain;
if ((false == view.Attributes.Contains(conditionMember))
&& !(conditionValues.AllPossibleValues.Any(it => it.HasNotNull()))) //Don't add member to the projected list if the condition involves a
{
foreach (Constant value in conditionValues.Values)
{
// construct constraint: X = value
DomainConstraint constraint = new DomainConstraint(var,
new Set(new Constant[] { value }, Constant.EqualityComparer));
// is this constraint implied by the where clause?
BoolExpression exclusion = view.Condition.Create(
new AndExpr>(view.Condition.Tree,
new NotExpr>(new TermExpr>(constraint))));
bool isImplied = false == IsSatisfiable(exclusion);
if (isImplied)
{
// add this variable to the projection, if it is used in the query
newProjectedAttributes.Add(conditionMember);
}
}
}
}
}
if (newProjectedAttributes.Count > 0)
{
newProjectedAttributes.UnionWith(view.Attributes);
FragmentQuery derivedView = new FragmentQuery(String.Format(CultureInfo.InvariantCulture, "project({0})", view.Description), view.FromVariable,
newProjectedAttributes, view.Condition);
return derivedView;
}
return null;
}
public override string ToString()
{
return _kb.ToString();
}
#region Private class AttributeSetComparator
private class AttributeSetComparator : IEqualityComparer>
{
internal static readonly AttributeSetComparator DefaultInstance = new AttributeSetComparator();
#region IEqualityComparer> Members
public bool Equals(HashSet x, HashSet y)
{
return x.SetEquals(y);
}
public int GetHashCode(HashSet attrs)
{
int hashCode = 123;
foreach (MemberPath attr in attrs)
{
hashCode += MemberPath.EqualityComparer.GetHashCode(attr) * 7;
}
return hashCode;
}
#endregion
}
#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
- DataGridViewSelectedCellCollection.cs
- BuildManagerHost.cs
- iisPickupDirectory.cs
- Site.cs
- CalendarBlackoutDatesCollection.cs
- ProgressBar.cs
- OleDbInfoMessageEvent.cs
- ObfuscateAssemblyAttribute.cs
- DataGridViewAutoSizeColumnsModeEventArgs.cs
- SafeThreadHandle.cs
- OdbcCommandBuilder.cs
- GeneralTransform3DGroup.cs
- EasingFunctionBase.cs
- TextBox.cs
- BitmapCodecInfo.cs
- SmtpCommands.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- BaseServiceProvider.cs
- FigureParagraph.cs
- NetCodeGroup.cs
- ListViewUpdateEventArgs.cs
- QueryOperator.cs
- X509Extension.cs
- UserMapPath.cs
- ServiceMemoryGates.cs
- QueryOperator.cs
- NameValuePair.cs
- WebBrowsableAttribute.cs
- ToolStripStatusLabel.cs
- UmAlQuraCalendar.cs
- AsyncPostBackErrorEventArgs.cs
- EntityDataSourceContextDisposingEventArgs.cs
- Decimal.cs
- DependencyObjectPropertyDescriptor.cs
- SQLInt64Storage.cs
- HtmlElement.cs
- MetafileHeaderWmf.cs
- safelinkcollection.cs
- RepeatButton.cs
- ListItemCollection.cs
- ObjectListFieldsPage.cs
- ValidationErrorEventArgs.cs
- HttpCacheParams.cs
- SystemWebExtensionsSectionGroup.cs
- DataSvcMapFile.cs
- DynamicDiscoSearcher.cs
- Byte.cs
- IChannel.cs
- HttpHostedTransportConfiguration.cs
- VectorCollection.cs
- DataGridViewUtilities.cs
- ApplicationContext.cs
- SymbolMethod.cs
- ValidationEventArgs.cs
- PrefixQName.cs
- IgnoreDataMemberAttribute.cs
- IssuedTokenParametersElement.cs
- DataServiceRequestOfT.cs
- ScrollItemPatternIdentifiers.cs
- localization.cs
- LogExtentCollection.cs
- GraphicsPathIterator.cs
- EntityParameterCollection.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- ServerReliableChannelBinder.cs
- TableCellCollection.cs
- DSASignatureFormatter.cs
- HostingEnvironmentWrapper.cs
- RouteItem.cs
- SimpleTypesSurrogate.cs
- Int32RectValueSerializer.cs
- ArithmeticException.cs
- WebPartMovingEventArgs.cs
- PageThemeParser.cs
- HwndSourceKeyboardInputSite.cs
- SoapEnumAttribute.cs
- DataExpression.cs
- CommandID.cs
- DomNameTable.cs
- TdsParserSafeHandles.cs
- SecurityProtocolFactory.cs
- SharedRuntimeState.cs
- _LoggingObject.cs
- OverrideMode.cs
- SubtreeProcessor.cs
- FtpCachePolicyElement.cs
- SerializationStore.cs
- CheckBoxFlatAdapter.cs
- XmlRootAttribute.cs
- BuildProviderCollection.cs
- Command.cs
- SoapEnvelopeProcessingElement.cs
- SplineKeyFrames.cs
- ObjectDataSourceDisposingEventArgs.cs
- Gdiplus.cs
- XPathSingletonIterator.cs
- KeyValuePairs.cs
- AdapterUtil.cs
- SpeakProgressEventArgs.cs
- ApplicationDirectoryMembershipCondition.cs