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 / FragmentQuery.cs / 1 / FragmentQuery.cs
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 QueryKnowledgeBase = KnowledgeBase>;
internal class FragmentQuery : ITileQuery
{
private BoolExpression m_fromVariable; // optional
private string m_label; // optional
private HashSet m_attributes;
private BoolExpression m_condition;
public HashSet Attributes
{
get { return m_attributes; }
}
public BoolExpression Condition
{
get { return m_condition; }
}
public static FragmentQuery Create(BoolExpression fromVariable, CellQuery cellQuery)
{
BoolExpression whereClause = cellQuery.WhereClause;
whereClause = whereClause.MakeCopy();
whereClause.ExpensiveSimplify();
return new FragmentQuery(null /*label*/, fromVariable, new HashSet(cellQuery.GetProjectedMembers()), whereClause);
}
public static FragmentQuery Create(string label, RoleBoolean roleBoolean, CellQuery cellQuery)
{
BoolExpression whereClause = cellQuery.WhereClause.Create(roleBoolean);
whereClause = BoolExpression.CreateAnd(whereClause, cellQuery.WhereClause);
//return new FragmentQuery(label, null /* fromVariable */, new HashSet(cellQuery.GetProjectedMembers()), whereClause);
// don't need any attributes
whereClause = whereClause.MakeCopy();
whereClause.ExpensiveSimplify();
return new FragmentQuery(label, null /* fromVariable */, new HashSet(), whereClause);
}
public static FragmentQuery Create(IEnumerable attrs, BoolExpression whereClause)
{
return new FragmentQuery(null /* no name */, null /* no fromVariable*/, attrs, whereClause);
}
public static FragmentQuery Create(BoolExpression whereClause)
{
return new FragmentQuery(null /* no name */, null /* no fromVariable*/, new MemberPath[] {}, whereClause);
}
internal FragmentQuery(string label, BoolExpression fromVariable, IEnumerable attrs, BoolExpression condition)
{
m_label = label;
m_fromVariable = fromVariable;
m_condition = condition;
m_attributes = new HashSet(attrs);
}
public BoolExpression FromVariable
{
get { return m_fromVariable; }
}
public string Description
{
get
{
string label = m_label;
if (label == null && m_fromVariable != null)
{
label = m_fromVariable.ToString();
}
return label;
}
}
public override string ToString()
{
// attributes
StringBuilder b = new StringBuilder();
foreach (MemberPath value in this.Attributes)
{
if (b.Length > 0) { b.Append(','); }
b.Append(value.ToString());
}
if (Description != null && Description != b.ToString())
{
return String.Format(CultureInfo.InvariantCulture, "{0}: [{1} where {2}]", Description, b, this.Condition);
}
else
{
return String.Format(CultureInfo.InvariantCulture, "[{0} where {1}]", b, this.Condition);
}
}
#region Static methods
// creates a condition member=value
internal static BoolExpression CreateMemberCondition(MemberPath path, CellConstant domainValue, MemberDomainMap domainMap, MetadataWorkspace workspace)
{
if (domainValue is TypeConstant)
{
return BoolExpression.CreateLiteral(new OneOfTypeConst(CreateSlot(path, workspace),
new CellConstantDomain(domainValue, domainMap.GetDomain(path))), domainMap);
}
else
{
return BoolExpression.CreateLiteral(new OneOfScalarConst(CreateSlot(path, workspace),
new CellConstantDomain(domainValue, domainMap.GetDomain(path))), domainMap);
}
}
// creates a fake join tree slot so we can construct a BoolExpression
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Data.Mapping.ViewGeneration.Structures.ExtentJoinTreeNode")]
internal static JoinTreeSlot CreateSlot(MemberPath path, MetadataWorkspace workspace)
{
IList members = path.Members;
if (members.Count > 0)
{
MemberJoinTreeNode leaf = new MemberJoinTreeNode(members[members.Count - 1], false, new MemberJoinTreeNode[] { }, workspace);
MemberJoinTreeNode node = leaf;
for (int i = members.Count - 2; i >= 0; i--)
{
node = new MemberJoinTreeNode(members[i], false, new MemberJoinTreeNode[] { node }, workspace);
}
ExtentJoinTreeNode extentNode = new ExtentJoinTreeNode(path.Extent, new MemberJoinTreeNode[] { node }, workspace);
return new JoinTreeSlot(leaf);
}
else
{
ExtentJoinTreeNode extentNode = new ExtentJoinTreeNode(path.Extent, new MemberJoinTreeNode[] { }, workspace);
return new JoinTreeSlot(extentNode);
}
}
internal static IEqualityComparer GetEqualityComparer(FragmentQueryProcessor qp)
{
return new FragmentQueryEqualityComparer(qp);
}
//internal static IComparer GetComparer(IEnumerable attributes)
//{
// return new FragmentQueryComparer(attributes);
//}
#endregion
#region Equality Comparer
// Two queries are "equal" if they project the same set of attributes
// and their WHERE clauses are equivalent
private class FragmentQueryEqualityComparer : IEqualityComparer
{
FragmentQueryProcessor _qp;
internal FragmentQueryEqualityComparer(FragmentQueryProcessor qp)
{
_qp = qp;
}
#region IEqualityComparer Members
public bool Equals(FragmentQuery x, FragmentQuery y)
{
if (!x.Attributes.SetEquals(y.Attributes))
{
return false;
}
return _qp.IsEquivalentTo(x, y);
}
// Hashing a bit naive: it exploits syntactic properties,
// i.e., some semantically equivalent queries may produce different hash codes
// But that's fine for usage scenarios in QueryRewriter.cs
public int GetHashCode(FragmentQuery q)
{
int attrHashCode = 0;
foreach (MemberPath member in q.Attributes)
{
attrHashCode ^= MemberPath.EqualityComparer.GetHashCode(member);
}
int varHashCode = 0;
int constHashCode = 0;
foreach (OneOfConst oneOf in q.Condition.OneOfConstVariables)
{
varHashCode ^= MemberPath.EqualityComparer.GetHashCode(oneOf.Slot.MemberPath);
foreach (CellConstant constant in oneOf.Values.Values)
{
constHashCode ^= CellConstant.EqualityComparer.GetHashCode(constant);
}
}
return attrHashCode * 13 + varHashCode * 7 + constHashCode;
}
#endregion
}
#endregion
//#region Comparer
//// queries with largest attribute overlap go first
//private class FragmentQueryComparer : IComparer
//{
// private HashSet _attributes;
// internal FragmentQueryComparer(IEnumerable attributes)
// {
// _attributes = new HashSet(attributes);
// }
// #region IComparer Members
// public int Compare(FragmentQuery x, FragmentQuery y)
// {
// HashSet xAttr = new HashSet(x.Attributes);
// HashSet yAttr = new HashSet(y.Attributes);
// xAttr.IntersectWith(_attributes);
// yAttr.IntersectWith(_attributes);
// if (xAttr.Count > yAttr.Count)
// {
// return -1;
// }
// else if (xAttr.Count < yAttr.Count)
// {
// return 1;
// }
// return 0;
// }
// #endregion
//}
//#endregion
}
}
// 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.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 QueryKnowledgeBase = KnowledgeBase>;
internal class FragmentQuery : ITileQuery
{
private BoolExpression m_fromVariable; // optional
private string m_label; // optional
private HashSet m_attributes;
private BoolExpression m_condition;
public HashSet Attributes
{
get { return m_attributes; }
}
public BoolExpression Condition
{
get { return m_condition; }
}
public static FragmentQuery Create(BoolExpression fromVariable, CellQuery cellQuery)
{
BoolExpression whereClause = cellQuery.WhereClause;
whereClause = whereClause.MakeCopy();
whereClause.ExpensiveSimplify();
return new FragmentQuery(null /*label*/, fromVariable, new HashSet(cellQuery.GetProjectedMembers()), whereClause);
}
public static FragmentQuery Create(string label, RoleBoolean roleBoolean, CellQuery cellQuery)
{
BoolExpression whereClause = cellQuery.WhereClause.Create(roleBoolean);
whereClause = BoolExpression.CreateAnd(whereClause, cellQuery.WhereClause);
//return new FragmentQuery(label, null /* fromVariable */, new HashSet(cellQuery.GetProjectedMembers()), whereClause);
// don't need any attributes
whereClause = whereClause.MakeCopy();
whereClause.ExpensiveSimplify();
return new FragmentQuery(label, null /* fromVariable */, new HashSet(), whereClause);
}
public static FragmentQuery Create(IEnumerable attrs, BoolExpression whereClause)
{
return new FragmentQuery(null /* no name */, null /* no fromVariable*/, attrs, whereClause);
}
public static FragmentQuery Create(BoolExpression whereClause)
{
return new FragmentQuery(null /* no name */, null /* no fromVariable*/, new MemberPath[] {}, whereClause);
}
internal FragmentQuery(string label, BoolExpression fromVariable, IEnumerable attrs, BoolExpression condition)
{
m_label = label;
m_fromVariable = fromVariable;
m_condition = condition;
m_attributes = new HashSet(attrs);
}
public BoolExpression FromVariable
{
get { return m_fromVariable; }
}
public string Description
{
get
{
string label = m_label;
if (label == null && m_fromVariable != null)
{
label = m_fromVariable.ToString();
}
return label;
}
}
public override string ToString()
{
// attributes
StringBuilder b = new StringBuilder();
foreach (MemberPath value in this.Attributes)
{
if (b.Length > 0) { b.Append(','); }
b.Append(value.ToString());
}
if (Description != null && Description != b.ToString())
{
return String.Format(CultureInfo.InvariantCulture, "{0}: [{1} where {2}]", Description, b, this.Condition);
}
else
{
return String.Format(CultureInfo.InvariantCulture, "[{0} where {1}]", b, this.Condition);
}
}
#region Static methods
// creates a condition member=value
internal static BoolExpression CreateMemberCondition(MemberPath path, CellConstant domainValue, MemberDomainMap domainMap, MetadataWorkspace workspace)
{
if (domainValue is TypeConstant)
{
return BoolExpression.CreateLiteral(new OneOfTypeConst(CreateSlot(path, workspace),
new CellConstantDomain(domainValue, domainMap.GetDomain(path))), domainMap);
}
else
{
return BoolExpression.CreateLiteral(new OneOfScalarConst(CreateSlot(path, workspace),
new CellConstantDomain(domainValue, domainMap.GetDomain(path))), domainMap);
}
}
// creates a fake join tree slot so we can construct a BoolExpression
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Data.Mapping.ViewGeneration.Structures.ExtentJoinTreeNode")]
internal static JoinTreeSlot CreateSlot(MemberPath path, MetadataWorkspace workspace)
{
IList members = path.Members;
if (members.Count > 0)
{
MemberJoinTreeNode leaf = new MemberJoinTreeNode(members[members.Count - 1], false, new MemberJoinTreeNode[] { }, workspace);
MemberJoinTreeNode node = leaf;
for (int i = members.Count - 2; i >= 0; i--)
{
node = new MemberJoinTreeNode(members[i], false, new MemberJoinTreeNode[] { node }, workspace);
}
ExtentJoinTreeNode extentNode = new ExtentJoinTreeNode(path.Extent, new MemberJoinTreeNode[] { node }, workspace);
return new JoinTreeSlot(leaf);
}
else
{
ExtentJoinTreeNode extentNode = new ExtentJoinTreeNode(path.Extent, new MemberJoinTreeNode[] { }, workspace);
return new JoinTreeSlot(extentNode);
}
}
internal static IEqualityComparer GetEqualityComparer(FragmentQueryProcessor qp)
{
return new FragmentQueryEqualityComparer(qp);
}
//internal static IComparer GetComparer(IEnumerable attributes)
//{
// return new FragmentQueryComparer(attributes);
//}
#endregion
#region Equality Comparer
// Two queries are "equal" if they project the same set of attributes
// and their WHERE clauses are equivalent
private class FragmentQueryEqualityComparer : IEqualityComparer
{
FragmentQueryProcessor _qp;
internal FragmentQueryEqualityComparer(FragmentQueryProcessor qp)
{
_qp = qp;
}
#region IEqualityComparer Members
public bool Equals(FragmentQuery x, FragmentQuery y)
{
if (!x.Attributes.SetEquals(y.Attributes))
{
return false;
}
return _qp.IsEquivalentTo(x, y);
}
// Hashing a bit naive: it exploits syntactic properties,
// i.e., some semantically equivalent queries may produce different hash codes
// But that's fine for usage scenarios in QueryRewriter.cs
public int GetHashCode(FragmentQuery q)
{
int attrHashCode = 0;
foreach (MemberPath member in q.Attributes)
{
attrHashCode ^= MemberPath.EqualityComparer.GetHashCode(member);
}
int varHashCode = 0;
int constHashCode = 0;
foreach (OneOfConst oneOf in q.Condition.OneOfConstVariables)
{
varHashCode ^= MemberPath.EqualityComparer.GetHashCode(oneOf.Slot.MemberPath);
foreach (CellConstant constant in oneOf.Values.Values)
{
constHashCode ^= CellConstant.EqualityComparer.GetHashCode(constant);
}
}
return attrHashCode * 13 + varHashCode * 7 + constHashCode;
}
#endregion
}
#endregion
//#region Comparer
//// queries with largest attribute overlap go first
//private class FragmentQueryComparer : IComparer
//{
// private HashSet _attributes;
// internal FragmentQueryComparer(IEnumerable attributes)
// {
// _attributes = new HashSet(attributes);
// }
// #region IComparer Members
// public int Compare(FragmentQuery x, FragmentQuery y)
// {
// HashSet xAttr = new HashSet(x.Attributes);
// HashSet yAttr = new HashSet(y.Attributes);
// xAttr.IntersectWith(_attributes);
// yAttr.IntersectWith(_attributes);
// if (xAttr.Count > yAttr.Count)
// {
// return -1;
// }
// else if (xAttr.Count < yAttr.Count)
// {
// return 1;
// }
// return 0;
// }
// #endregion
//}
//#endregion
}
}
// 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
- AccessDataSourceDesigner.cs
- SwitchCase.cs
- WindowsRichEditRange.cs
- UpdateCommandGenerator.cs
- DataGridViewButtonCell.cs
- ToolStripDropDownButton.cs
- Vector3D.cs
- TransactionInformation.cs
- ResourceReader.cs
- DiagnosticEventProvider.cs
- HorizontalAlignConverter.cs
- CodeConditionStatement.cs
- KeysConverter.cs
- _SslStream.cs
- ConnectionOrientedTransportChannelFactory.cs
- Rect3DValueSerializer.cs
- DataProviderNameConverter.cs
- StandardToolWindows.cs
- PropertyValidationContext.cs
- StoragePropertyMapping.cs
- InputLanguageSource.cs
- LinkConverter.cs
- ipaddressinformationcollection.cs
- ThreadAttributes.cs
- X509SecurityToken.cs
- QueryStringParameter.cs
- handlecollector.cs
- MulticastDelegate.cs
- RewritingProcessor.cs
- SessionSymmetricTransportSecurityProtocolFactory.cs
- DeviceFiltersSection.cs
- HtmlSelect.cs
- GetPageNumberCompletedEventArgs.cs
- WmlValidationSummaryAdapter.cs
- SymLanguageType.cs
- ExpressionBinding.cs
- ConstrainedDataObject.cs
- VBIdentifierNameEditor.cs
- Convert.cs
- RayMeshGeometry3DHitTestResult.cs
- RenderDataDrawingContext.cs
- RenderingBiasValidation.cs
- SqlCachedBuffer.cs
- StringWriter.cs
- DurableInstancingOptions.cs
- JsonCollectionDataContract.cs
- MailAddress.cs
- SchemaUtility.cs
- DataBindingCollectionConverter.cs
- SizeConverter.cs
- UrlMappingCollection.cs
- ImageUrlEditor.cs
- FieldNameLookup.cs
- EtwTrackingBehavior.cs
- StrokeRenderer.cs
- KeyboardInputProviderAcquireFocusEventArgs.cs
- ProcessManager.cs
- ExecutionEngineException.cs
- SqlDataReaderSmi.cs
- KerberosSecurityTokenProvider.cs
- Maps.cs
- PageRouteHandler.cs
- BindingExpression.cs
- mediaeventshelper.cs
- LayoutExceptionEventArgs.cs
- MouseActionConverter.cs
- ChangePasswordDesigner.cs
- Span.cs
- TraceSource.cs
- EditingMode.cs
- XmlDataProvider.cs
- FormViewRow.cs
- activationcontext.cs
- EventProviderWriter.cs
- SafeViewOfFileHandle.cs
- MergePropertyDescriptor.cs
- DispatcherProcessingDisabled.cs
- CultureInfo.cs
- PtsPage.cs
- MenuCommandService.cs
- HttpStaticObjectsCollectionBase.cs
- COAUTHIDENTITY.cs
- QilInvokeLateBound.cs
- DecoratedNameAttribute.cs
- ResolveMatchesMessage11.cs
- Converter.cs
- EdmValidator.cs
- ConfigXmlReader.cs
- XXXOnTypeBuilderInstantiation.cs
- CodeDomExtensionMethods.cs
- PolicyStatement.cs
- FontFamilyConverter.cs
- SetMemberBinder.cs
- FontSourceCollection.cs
- ApplicationFileCodeDomTreeGenerator.cs
- ControlUtil.cs
- IpcChannelHelper.cs
- ValidateNames.cs
- DataGridViewTopRowAccessibleObject.cs
- IMembershipProvider.cs