Code:
                         / 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / QueryRewriting / Tile.cs / 1305376 / Tile.cs
                        
                        
                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
//  
// 
// @owner [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 
using System; 
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel; 
using System.Linq;
using System.Globalization; 
 
namespace System.Data.Mapping.ViewGeneration.QueryRewriting
{ 
    internal enum TileOpKind
    {
        Union,
        Join, 
        AntiSemiJoin,
        // Project, 
        Named 
    }
 
    internal interface ITileQuery
    {
        string Description { get; }
    } 
    internal abstract class TileQueryProcessor where T_Query : ITileQuery 
    { 
        internal abstract T_Query Intersect(T_Query arg1, T_Query arg2);
        internal abstract T_Query Difference(T_Query arg1, T_Query arg2); 
        internal abstract T_Query Union(T_Query arg1, T_Query arg2);
        internal abstract bool IsSatisfiable(T_Query query);
        internal abstract T_Query CreateDerivedViewBySelectingConstantAttributes(T_Query query);
    } 
    internal class DefaultTileProcessor : TileProcessor> where T_Query : ITileQuery 
    { 
        private readonly TileQueryProcessor _tileQueryProcessor;
 
        internal DefaultTileProcessor(TileQueryProcessor tileQueryProcessor)
        {
            _tileQueryProcessor = tileQueryProcessor;
        } 
        internal TileQueryProcessor QueryProcessor 
        { 
            get { return _tileQueryProcessor; }
        } 
        internal override bool IsEmpty(Tile tile)
        {
            return false == _tileQueryProcessor.IsSatisfiable(tile.Query); 
        }
 
        internal override Tile Union(Tile arg1, Tile arg2) 
        {
            return new TileBinaryOperator(arg1, arg2, TileOpKind.Union, _tileQueryProcessor.Union(arg1.Query, arg2.Query)); 
        }
        internal override Tile Join(Tile arg1, Tile arg2)
        { 
            return new TileBinaryOperator(arg1, arg2, TileOpKind.Join, _tileQueryProcessor.Intersect(arg1.Query, arg2.Query));
        } 
 
        internal override Tile AntiSemiJoin(Tile arg1, Tile arg2)
        { 
            return new TileBinaryOperator(arg1, arg2, TileOpKind.AntiSemiJoin, _tileQueryProcessor.Difference(arg1.Query, arg2.Query));
        }
        internal override Tile GetArg1(Tile tile) 
        {
            return tile.Arg1; 
        } 
        internal override Tile GetArg2(Tile tile) 
        {
            return tile.Arg2;
        }
 
        internal override TileOpKind GetOpKind(Tile tile)
        { 
            return tile.OpKind; 
        }
 
        internal bool IsContainedIn(Tile arg1, Tile arg2)
        {
            return IsEmpty(AntiSemiJoin(arg1, arg2));
        } 
        internal bool IsEquivalentTo(Tile arg1, Tile arg2) 
        { 
            return IsContainedIn(arg1, arg2) && IsContainedIn(arg2, arg1);
        } 
    }
    internal abstract class Tile where T_Query : ITileQuery
    { 
        private readonly T_Query m_query;
        private readonly TileOpKind m_opKind; 
 
        protected Tile(TileOpKind opKind, T_Query query)
        { 
            m_opKind = opKind;
            m_query = query;
        }
 
        public T_Query Query
        { 
            get { return m_query; } 
        }
 
        public abstract string Description { get; }
        // multiple occurrences possible
        public IEnumerable GetNamedQueries() 
        {
            return GetNamedQueries(this); 
        } 
        private static IEnumerable GetNamedQueries(Tile rewriting)
        { 
            if (rewriting != null)
            {
                if (rewriting.OpKind == TileOpKind.Named)
                { 
                    yield return ((TileNamed)rewriting).NamedQuery;
                } 
                else 
                {
                    foreach (T_Query query in GetNamedQueries(rewriting.Arg1)) 
                    {
                        yield return query;
                    }
                    foreach (T_Query query in GetNamedQueries(rewriting.Arg2)) 
                    {
                        yield return query; 
                    } 
                }
            } 
        }
        public override string ToString()
        { 
            string formattedQuery = this.Description;
            if (formattedQuery != null) 
            { 
                return String.Format(CultureInfo.InvariantCulture, "{0}: [{1}]", this.Description, this.Query);
            } 
            else
            {
                return String.Format(CultureInfo.InvariantCulture, "[{0}]", this.Query);
            } 
        }
 
        public abstract Tile Arg1 
        {
            get; 
        }
        public abstract Tile Arg2
        { 
            get;
        } 
 
        public TileOpKind OpKind
        { 
            get { return m_opKind; }
        }
        internal abstract Tile Replace(Tile oldTile, Tile newTile); 
    }
 
    internal class TileNamed : Tile where T_Query : ITileQuery 
    {
        public TileNamed(T_Query namedQuery) 
            : base(TileOpKind.Named, namedQuery)
        {
            Debug.Assert(namedQuery != null);
        } 
        public T_Query NamedQuery 
        { 
            get { return this.Query; }
        } 
        public override Tile Arg1 { get { return null; } }
        public override Tile Arg2 { get { return null; } }
 
        public override string Description
        { 
            get { return this.Query.Description; } 
        }
 
        public override string ToString()
        {
            return this.Query.ToString();
        } 
        internal override Tile Replace(Tile oldTile, Tile newTile) 
        { 
            return (this == oldTile) ? newTile : this;
        } 
    }
    internal class TileBinaryOperator : Tile where T_Query : ITileQuery
    { 
        private readonly Tile m_arg1;
        private readonly Tile m_arg2; 
 
        public TileBinaryOperator(Tile arg1, Tile arg2, TileOpKind opKind, T_Query query)
            : base(opKind, query) 
        {
            Debug.Assert(arg1 != null && arg2 != null);
            m_arg1 = arg1;
            m_arg2 = arg2; 
        }
 
        public override Tile Arg1 { get { return m_arg1; } } 
        public override Tile Arg2 { get { return m_arg2; } }
 
        public override string Description
        {
            get
            { 
                string descriptionFormat = null;
                switch (OpKind) 
                { 
                    case TileOpKind.Join: descriptionFormat = "({0} & {1})"; break;
                    case TileOpKind.AntiSemiJoin: descriptionFormat = "({0} - {1})"; break; 
                    case TileOpKind.Union: descriptionFormat = "({0} | {1})"; break;
                    default: Debug.Fail("Unexpected binary operator"); break;
                }
                return String.Format(CultureInfo.InvariantCulture, descriptionFormat, this.Arg1.Description, this.Arg2.Description); 
            }
        } 
 
        internal override Tile Replace(Tile oldTile, Tile newTile)
        { 
            Tile newArg1 = Arg1.Replace(oldTile, newTile);
            Tile newArg2 = Arg2.Replace(oldTile, newTile);
            if (newArg1 != Arg1 || newArg2 != Arg2)
            { 
                return new TileBinaryOperator(newArg1, newArg2, OpKind, Query);
            } 
            return this; 
        }
    } 
}
// 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.Collections.ObjectModel; 
using System.Linq;
using System.Globalization; 
 
namespace System.Data.Mapping.ViewGeneration.QueryRewriting
{ 
    internal enum TileOpKind
    {
        Union,
        Join, 
        AntiSemiJoin,
        // Project, 
        Named 
    }
 
    internal interface ITileQuery
    {
        string Description { get; }
    } 
    internal abstract class TileQueryProcessor where T_Query : ITileQuery 
    { 
        internal abstract T_Query Intersect(T_Query arg1, T_Query arg2);
        internal abstract T_Query Difference(T_Query arg1, T_Query arg2); 
        internal abstract T_Query Union(T_Query arg1, T_Query arg2);
        internal abstract bool IsSatisfiable(T_Query query);
        internal abstract T_Query CreateDerivedViewBySelectingConstantAttributes(T_Query query);
    } 
    internal class DefaultTileProcessor : TileProcessor> where T_Query : ITileQuery 
    { 
        private readonly TileQueryProcessor _tileQueryProcessor;
 
        internal DefaultTileProcessor(TileQueryProcessor tileQueryProcessor)
        {
            _tileQueryProcessor = tileQueryProcessor;
        } 
        internal TileQueryProcessor QueryProcessor 
        { 
            get { return _tileQueryProcessor; }
        } 
        internal override bool IsEmpty(Tile tile)
        {
            return false == _tileQueryProcessor.IsSatisfiable(tile.Query); 
        }
 
        internal override Tile Union(Tile arg1, Tile arg2) 
        {
            return new TileBinaryOperator(arg1, arg2, TileOpKind.Union, _tileQueryProcessor.Union(arg1.Query, arg2.Query)); 
        }
        internal override Tile Join(Tile arg1, Tile arg2)
        { 
            return new TileBinaryOperator(arg1, arg2, TileOpKind.Join, _tileQueryProcessor.Intersect(arg1.Query, arg2.Query));
        } 
 
        internal override Tile AntiSemiJoin(Tile arg1, Tile arg2)
        { 
            return new TileBinaryOperator(arg1, arg2, TileOpKind.AntiSemiJoin, _tileQueryProcessor.Difference(arg1.Query, arg2.Query));
        }
        internal override Tile GetArg1(Tile tile) 
        {
            return tile.Arg1; 
        } 
        internal override Tile GetArg2(Tile tile) 
        {
            return tile.Arg2;
        }
 
        internal override TileOpKind GetOpKind(Tile tile)
        { 
            return tile.OpKind; 
        }
 
        internal bool IsContainedIn(Tile arg1, Tile arg2)
        {
            return IsEmpty(AntiSemiJoin(arg1, arg2));
        } 
        internal bool IsEquivalentTo(Tile arg1, Tile arg2) 
        { 
            return IsContainedIn(arg1, arg2) && IsContainedIn(arg2, arg1);
        } 
    }
    internal abstract class Tile where T_Query : ITileQuery
    { 
        private readonly T_Query m_query;
        private readonly TileOpKind m_opKind; 
 
        protected Tile(TileOpKind opKind, T_Query query)
        { 
            m_opKind = opKind;
            m_query = query;
        }
 
        public T_Query Query
        { 
            get { return m_query; } 
        }
 
        public abstract string Description { get; }
        // multiple occurrences possible
        public IEnumerable GetNamedQueries() 
        {
            return GetNamedQueries(this); 
        } 
        private static IEnumerable GetNamedQueries(Tile rewriting)
        { 
            if (rewriting != null)
            {
                if (rewriting.OpKind == TileOpKind.Named)
                { 
                    yield return ((TileNamed)rewriting).NamedQuery;
                } 
                else 
                {
                    foreach (T_Query query in GetNamedQueries(rewriting.Arg1)) 
                    {
                        yield return query;
                    }
                    foreach (T_Query query in GetNamedQueries(rewriting.Arg2)) 
                    {
                        yield return query; 
                    } 
                }
            } 
        }
        public override string ToString()
        { 
            string formattedQuery = this.Description;
            if (formattedQuery != null) 
            { 
                return String.Format(CultureInfo.InvariantCulture, "{0}: [{1}]", this.Description, this.Query);
            } 
            else
            {
                return String.Format(CultureInfo.InvariantCulture, "[{0}]", this.Query);
            } 
        }
 
        public abstract Tile Arg1 
        {
            get; 
        }
        public abstract Tile Arg2
        { 
            get;
        } 
 
        public TileOpKind OpKind
        { 
            get { return m_opKind; }
        }
        internal abstract Tile Replace(Tile oldTile, Tile newTile); 
    }
 
    internal class TileNamed : Tile where T_Query : ITileQuery 
    {
        public TileNamed(T_Query namedQuery) 
            : base(TileOpKind.Named, namedQuery)
        {
            Debug.Assert(namedQuery != null);
        } 
        public T_Query NamedQuery 
        { 
            get { return this.Query; }
        } 
        public override Tile Arg1 { get { return null; } }
        public override Tile Arg2 { get { return null; } }
 
        public override string Description
        { 
            get { return this.Query.Description; } 
        }
 
        public override string ToString()
        {
            return this.Query.ToString();
        } 
        internal override Tile Replace(Tile oldTile, Tile newTile) 
        { 
            return (this == oldTile) ? newTile : this;
        } 
    }
    internal class TileBinaryOperator : Tile where T_Query : ITileQuery
    { 
        private readonly Tile m_arg1;
        private readonly Tile m_arg2; 
 
        public TileBinaryOperator(Tile arg1, Tile arg2, TileOpKind opKind, T_Query query)
            : base(opKind, query) 
        {
            Debug.Assert(arg1 != null && arg2 != null);
            m_arg1 = arg1;
            m_arg2 = arg2; 
        }
 
        public override Tile Arg1 { get { return m_arg1; } } 
        public override Tile Arg2 { get { return m_arg2; } }
 
        public override string Description
        {
            get
            { 
                string descriptionFormat = null;
                switch (OpKind) 
                { 
                    case TileOpKind.Join: descriptionFormat = "({0} & {1})"; break;
                    case TileOpKind.AntiSemiJoin: descriptionFormat = "({0} - {1})"; break; 
                    case TileOpKind.Union: descriptionFormat = "({0} | {1})"; break;
                    default: Debug.Fail("Unexpected binary operator"); break;
                }
                return String.Format(CultureInfo.InvariantCulture, descriptionFormat, this.Arg1.Description, this.Arg2.Description); 
            }
        } 
 
        internal override Tile Replace(Tile oldTile, Tile newTile)
        { 
            Tile newArg1 = Arg1.Replace(oldTile, newTile);
            Tile newArg2 = Arg2.Replace(oldTile, newTile);
            if (newArg1 != Arg1 || newArg2 != Arg2)
            { 
                return new TileBinaryOperator(newArg1, newArg2, OpKind, Query);
            } 
            return this; 
        }
    } 
}
// 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
- XmlElementList.cs
 - XsltConvert.cs
 - SizeAnimationBase.cs
 - TrustManagerPromptUI.cs
 - ClientData.cs
 - XmlReturnWriter.cs
 - ToolStripTextBox.cs
 - SoapExtensionReflector.cs
 - HTTPNotFoundHandler.cs
 - TdsParserSafeHandles.cs
 - thaishape.cs
 - NameNode.cs
 - ObjectContext.cs
 - ButtonBase.cs
 - FormClosedEvent.cs
 - ToolStripMenuItemCodeDomSerializer.cs
 - Control.cs
 - NonClientArea.cs
 - MediaScriptCommandRoutedEventArgs.cs
 - AnimationStorage.cs
 - CacheMemory.cs
 - ButtonFieldBase.cs
 - ColumnBinding.cs
 - XhtmlStyleClass.cs
 - Misc.cs
 - RequestUriProcessor.cs
 - DeferredReference.cs
 - HtmlTableRowCollection.cs
 - DbConnectionOptions.cs
 - ByteStream.cs
 - HierarchicalDataBoundControlAdapter.cs
 - ConfigXmlAttribute.cs
 - DataServiceClientException.cs
 - TailCallAnalyzer.cs
 - IpcClientManager.cs
 - FormsAuthentication.cs
 - SessionIDManager.cs
 - FontWeight.cs
 - EntityDataSourceView.cs
 - XamlToRtfWriter.cs
 - DescendantQuery.cs
 - TextSchema.cs
 - Lasso.cs
 - Codec.cs
 - WebPartDeleteVerb.cs
 - PolyBezierSegment.cs
 - MailBnfHelper.cs
 - CollectionViewGroupInternal.cs
 - PropertyPath.cs
 - QuaternionAnimation.cs
 - ApplicationInfo.cs
 - FileUtil.cs
 - SR.cs
 - DesignerVerbToolStripMenuItem.cs
 - ScaleTransform.cs
 - EditorAttribute.cs
 - ArrayItemReference.cs
 - BindingNavigator.cs
 - PortCache.cs
 - mediaeventshelper.cs
 - thaishape.cs
 - XmlEntity.cs
 - FontResourceCache.cs
 - ImagingCache.cs
 - Int16.cs
 - TextFindEngine.cs
 - ScrollItemPattern.cs
 - TimeoutConverter.cs
 - DataGridViewBindingCompleteEventArgs.cs
 - NumericExpr.cs
 - DataGridViewRow.cs
 - StateElementCollection.cs
 - TypeInfo.cs
 - KeyValuePairs.cs
 - RetriableClipboard.cs
 - DbDataAdapter.cs
 - TemplateApplicationHelper.cs
 - ApplicationFileCodeDomTreeGenerator.cs
 - VolatileResourceManager.cs
 - AutomationAttributeInfo.cs
 - SingleAnimation.cs
 - XhtmlBasicFormAdapter.cs
 - FieldNameLookup.cs
 - EventLogPermissionEntryCollection.cs
 - SortedList.cs
 - SerializationInfo.cs
 - ConfigXmlAttribute.cs
 - AnimatedTypeHelpers.cs
 - RoleGroup.cs
 - TextParagraphCache.cs
 - WizardPanel.cs
 - SpellerHighlightLayer.cs
 - DbDataSourceEnumerator.cs
 - PageParserFilter.cs
 - WebPartEditorCancelVerb.cs
 - ConsumerConnectionPointCollection.cs
 - BinaryNegotiation.cs
 - Attributes.cs
 - ClientRoleProvider.cs
 - XamlParser.cs