private bool CoverAttributes(
            ref Tile <FragmentQuery> rewriting,
            Dictionary <MemberPath, FragmentQuery> attributeConditions)
        {
            foreach (FragmentQuery view in new HashSet <FragmentQuery>(rewriting.GetNamedQueries()))
            {
                foreach (MemberPath nonKey in QueryRewriter.NonKeys((IEnumerable <MemberPath>)view.Attributes))
                {
                    this.CoverAttribute(nonKey, view, attributeConditions);
                }
                if (attributeConditions.Count == 0)
                {
                    return(true);
                }
            }
            Tile <FragmentQuery> tile = (Tile <FragmentQuery>)null;

            foreach (FragmentQuery fragmentQuery in this._fragmentQueries)
            {
                foreach (MemberPath nonKey in QueryRewriter.NonKeys((IEnumerable <MemberPath>)fragmentQuery.Attributes))
                {
                    if (this.CoverAttribute(nonKey, fragmentQuery, attributeConditions))
                    {
                        tile = tile == null ? (Tile <FragmentQuery>)QueryRewriter.CreateTile(fragmentQuery) : this._qp.Union(tile, (Tile <FragmentQuery>)QueryRewriter.CreateTile(fragmentQuery));
                    }
                }
                if (attributeConditions.Count == 0)
                {
                    break;
                }
            }
            if (attributeConditions.Count != 0)
            {
                return(false);
            }
            rewriting = this._qp.Join(rewriting, tile);
            return(true);
        }
        private bool RewriteQuery(
            Tile <FragmentQuery> toFill,
            Tile <FragmentQuery> toAvoid,
            out Tile <FragmentQuery> rewriting,
            out IEnumerable <MemberPath> notCoveredAttributes,
            bool isRelaxed)
        {
            notCoveredAttributes = (IEnumerable <MemberPath>) new List <MemberPath>();
            FragmentQuery query1 = toFill.Query;

            if (this._context.TryGetCachedRewriting(query1, out rewriting))
            {
                return(true);
            }
            IEnumerable <Tile <FragmentQuery> > relevantViews = this.GetRelevantViews(query1);
            FragmentQuery query2 = query1;

            if (!this.RewriteQueryCached((Tile <FragmentQuery>)QueryRewriter.CreateTile(FragmentQuery.Create(query1.Condition)), toAvoid, relevantViews, out rewriting))
            {
                if (!isRelaxed)
                {
                    return(false);
                }
                query1 = FragmentQuery.Create((IEnumerable <MemberPath>)query1.Attributes, BoolExpression.CreateAndNot(query1.Condition, rewriting.Query.Condition));
                if (this._qp.IsEmpty((Tile <FragmentQuery>)QueryRewriter.CreateTile(query1)) || !this.RewriteQueryCached((Tile <FragmentQuery>)QueryRewriter.CreateTile(FragmentQuery.Create(query1.Condition)), toAvoid, relevantViews, out rewriting))
                {
                    return(false);
                }
            }
            if (query1.Attributes.Count == 0)
            {
                return(true);
            }
            Dictionary <MemberPath, FragmentQuery> attributeConditions = new Dictionary <MemberPath, FragmentQuery>();

            foreach (MemberPath nonKey in QueryRewriter.NonKeys((IEnumerable <MemberPath>)query1.Attributes))
            {
                attributeConditions[nonKey] = query1;
            }
            if (attributeConditions.Count == 0 || this.CoverAttributes(ref rewriting, attributeConditions))
            {
                this.GetUsedViewsAndRemoveTrueSurrogate(ref rewriting);
                this._context.SetCachedRewriting(query2, rewriting);
                return(true);
            }
            if (isRelaxed)
            {
                foreach (MemberPath nonKey in QueryRewriter.NonKeys((IEnumerable <MemberPath>)query1.Attributes))
                {
                    FragmentQuery fragmentQuery;
                    attributeConditions[nonKey] = !attributeConditions.TryGetValue(nonKey, out fragmentQuery) ? query1 : FragmentQuery.Create(BoolExpression.CreateAndNot(query1.Condition, fragmentQuery.Condition));
                }
                if (this.CoverAttributes(ref rewriting, attributeConditions))
                {
                    this.GetUsedViewsAndRemoveTrueSurrogate(ref rewriting);
                    this._context.SetCachedRewriting(query2, rewriting);
                    return(true);
                }
            }
            notCoveredAttributes = (IEnumerable <MemberPath>)attributeConditions.Keys;
            return(false);
        }