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
- KeyEventArgs.cs
- TextTrailingWordEllipsis.cs
- IsolatedStorage.cs
- TextSimpleMarkerProperties.cs
- ParagraphResult.cs
- LicenseContext.cs
- Floater.cs
- SmtpException.cs
- SizeIndependentAnimationStorage.cs
- XmlDocumentSerializer.cs
- LocalizationComments.cs
- UiaCoreProviderApi.cs
- FormsAuthenticationUser.cs
- WizardPanel.cs
- SubclassTypeValidatorAttribute.cs
- DbConnectionClosed.cs
- XmlValidatingReader.cs
- ByteStorage.cs
- ParagraphVisual.cs
- GroupBoxAutomationPeer.cs
- PowerModeChangedEventArgs.cs
- VisualStyleElement.cs
- CriticalHandle.cs
- NumberFormatInfo.cs
- TdsParser.cs
- ArrayElementGridEntry.cs
- EncoderParameters.cs
- StreamInfo.cs
- LinqDataSourceInsertEventArgs.cs
- PropertyCollection.cs
- WebPartConnectionsConnectVerb.cs
- LiteralLink.cs
- FrugalMap.cs
- QueryAccessibilityHelpEvent.cs
- InstanceKeyCompleteException.cs
- DiffuseMaterial.cs
- DatePickerDateValidationErrorEventArgs.cs
- ThreadWorkerController.cs
- XmlNodeChangedEventArgs.cs
- Graph.cs
- XmlSchemaSimpleType.cs
- OracleException.cs
- FileIOPermission.cs
- GatewayIPAddressInformationCollection.cs
- XmlObjectSerializerReadContextComplex.cs
- MaxValueConverter.cs
- SimpleLine.cs
- MergablePropertyAttribute.cs
- _CommandStream.cs
- XmlSchemaException.cs
- ArgumentException.cs
- FindCriteriaElement.cs
- WebPartDisplayModeEventArgs.cs
- PagesSection.cs
- TransactionCache.cs
- TextElementCollection.cs
- FormsIdentity.cs
- WebMessageEncoderFactory.cs
- GPPOINT.cs
- IRCollection.cs
- CreateUserErrorEventArgs.cs
- Configuration.cs
- UrlAuthorizationModule.cs
- DataBindingList.cs
- ShaderEffect.cs
- BooleanSwitch.cs
- SpeechSynthesizer.cs
- HighContrastHelper.cs
- SerializationInfoEnumerator.cs
- CodeGeneratorOptions.cs
- CodeObject.cs
- UpWmlPageAdapter.cs
- TextEditorSelection.cs
- ReliabilityContractAttribute.cs
- Invariant.cs
- SizeChangedInfo.cs
- HelpEvent.cs
- JournalEntry.cs
- ArrayExtension.cs
- figurelength.cs
- ExtensionQuery.cs
- Pen.cs
- AlignmentYValidation.cs
- MarkupCompilePass2.cs
- DefaultPropertiesToSend.cs
- GeneralTransform3D.cs
- MbpInfo.cs
- DragCompletedEventArgs.cs
- Win32Exception.cs
- TextSpan.cs
- IconHelper.cs
- DataGrid.cs
- ApplyTemplatesAction.cs
- SqlServer2KCompatibilityAnnotation.cs
- NameSpaceExtractor.cs
- GlobalizationSection.cs
- WinCategoryAttribute.cs
- DataGridCommandEventArgs.cs
- MethodImplAttribute.cs
- TTSEngineProxy.cs