internal static bool TryRewrite(
            DbQueryCommandTree tree,
            Span span,
            MergeOption mergeOption,
            AliasGenerator aliasGenerator,
            out DbExpression newQuery,
            out SpanIndex spanInfo)
        {
            newQuery = (DbExpression)null;
            spanInfo = (SpanIndex)null;
            ObjectSpanRewriter objectSpanRewriter = (ObjectSpanRewriter)null;
            bool flag = Span.RequiresRelationshipSpan(mergeOption);

            if (span != null && span.SpanList.Count > 0)
            {
                objectSpanRewriter = (ObjectSpanRewriter) new ObjectFullSpanRewriter((DbCommandTree)tree, tree.Query, span, aliasGenerator);
            }
            else if (flag)
            {
                objectSpanRewriter = new ObjectSpanRewriter((DbCommandTree)tree, tree.Query, aliasGenerator);
            }
            if (objectSpanRewriter != null)
            {
                objectSpanRewriter.RelationshipSpan = flag;
                newQuery = objectSpanRewriter.RewriteQuery();
                if (newQuery != null)
                {
                    spanInfo = objectSpanRewriter.SpanIndex;
                }
            }
            return(spanInfo != null);
        }
 private void AddSpanMap(RowType rowType, Dictionary <int, AssociationEndMember> columnMap)
 {
     if (this._spanIndex == null)
     {
         this._spanIndex = new SpanIndex();
     }
     this._spanIndex.AddSpanMap(rowType, columnMap);
 }
 private void AddSpannedRowType(RowType spannedType, TypeUsage originalType)
 {
     if (this._spanIndex == null)
     {
         this._spanIndex = new SpanIndex();
     }
     this._spanIndex.AddSpannedRowType(spannedType, originalType);
 }
        private void AddSpanMap(RowType rowType, Dictionary <int, AssociationEndMember> columnMap)
        {
            if (null == _spanIndex)
            {
                _spanIndex = new SpanIndex();
            }

            _spanIndex.AddSpanMap(rowType, columnMap);
        }
        private void AddSpannedRowType(RowType spannedType, TypeUsage originalType)
        {
            if (null == _spanIndex)
            {
                _spanIndex = new SpanIndex();
            }

            _spanIndex.AddSpannedRowType(spannedType, originalType);
        }
        internal static bool TryRewrite(
            DbQueryCommandTree tree, Span span, MergeOption mergeOption, AliasGenerator aliasGenerator, out DbExpression newQuery,
            out SpanIndex spanInfo)
        {
            newQuery = null;
            spanInfo = null;

            ObjectSpanRewriter rewriter  = null;
            var requiresRelationshipSpan = Span.RequiresRelationshipSpan(mergeOption);

            // Potentially perform a rewrite for span.
            // Note that the public 'Span' property is NOT used to retrieve the Span instance
            // since this forces creation of a Span object that may not be required.
            if (span != null &&
                span.SpanList.Count > 0)
            {
                rewriter = new ObjectFullSpanRewriter(tree, tree.Query, span, aliasGenerator);
            }
            else if (requiresRelationshipSpan)
            {
                rewriter = new ObjectSpanRewriter(tree, tree.Query, aliasGenerator);
            }

            if (rewriter != null)
            {
                rewriter.RelationshipSpan = requiresRelationshipSpan;
                newQuery = rewriter.RewriteQuery();
                if (newQuery != null)
                {
                    Debug.Assert(
                        rewriter.SpanIndex != null || tree.Query.ResultType.EdmEquals(newQuery.ResultType),
                        "Query was rewritten for Span but no SpanIndex was created?");
                    spanInfo = rewriter.SpanIndex;
                }
            }

            return(spanInfo != null);
        }