コード例 #1
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStructConstantChildren(this, visitor);
 }
コード例 #2
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitClassFieldChildren(this, visitor);
 }
コード例 #3
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitInterfaceReferenceChildren(this, visitor);
 }
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStaticClassAutoPropertyAccessorChildren(this, visitor);
 }
コード例 #5
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitClassNestedClassChildren(this, visitor);
 }
コード例 #6
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStructEventChildren(this, visitor);
 }
コード例 #7
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitTypeChildren(this, visitor);
 }
コード例 #8
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitIndexerChildren(this, visitor);
 }
コード例 #9
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStructCollectionChildren(this, visitor);
 }
コード例 #10
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStaticTypeChildren(this, visitor);
 }
コード例 #11
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitSealedClassIndexerCollectionChildren(this, visitor);
 }
コード例 #12
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitClassConstructorChildren(this, visitor);
 }
コード例 #13
0
        protected virtual JoinQuery CreateJoinQuery(IExecutionContext context, [NotNull] IMultiPartQuery query, Expression joinFilter)
        {
            var filterParts = (query.FilterExpression == null ? joinFilter : Expression.AndAlso(query.GetFilter(context), joinFilter)).SplitByAndExpressions();

            // Get all parts of the query that contain fields from both sources.
            var joinParts = filterParts.OfType <CompareExpression>()
                            .Where(comparison =>
            {
                var fields = comparison.GetFields().Select(f => f.SourceAlias).ToArray();
                return(fields.Intersect(this.Left.Aliases).Any() && fields.Intersect(this.Right.Aliases).Any());
            })
                            .ToArray();

            // What's left are the filters for only one source. These we can split in a left part, a right part, and a filter part over the result.
            var filter         = filterParts.Except(joinParts, new ExpressionComparer()).DefaultIfEmpty().Aggregate(Expression.AndAlso);
            var leftFilter     = filter.RemoveAllPartsThatAreNotInSource(this.Left);
            var rightFilter    = filter.RemoveAllPartsThatAreNotInSource(this.Right);
            var resultFilter   = filter.Except(leftFilter, rightFilter);
            var joinExpression = joinParts.OrderBy(p => p, new MostSpecificComparer()).First().MoveFieldsToTheLeft(this.Left);
            var ascending      = joinExpression.CompareType != ExpressionType.GreaterThan && joinExpression.CompareType != ExpressionType.GreaterThanOrEqual;

            var leftQuery = new MultiPartQuery
            {
                Fields = query.Fields
                         .Where(f => this.Left.Aliases.Contains(f.SourceAlias))
                         .Concat(joinParts.SelectMany(l => l.GetDataSourceFields(this.Left)))
                         .Concat(resultFilter.GetDataSourceFields(this.Left))
                         .Distinct(),
                FilterExpression   = leftFilter,
                OrderByExpressions = new[]
                {
                    new OrderByExpression(joinExpression.Left, ascending)
                },
            };

            var rightQuery = new MultiPartQuery
            {
                Fields = query.Fields
                         .Where(f => this.Right.Aliases.Contains(f.SourceAlias))
                         .Concat(joinParts.SelectMany(l => l.GetDataSourceFields(this.Right)))
                         .Concat(resultFilter.GetDataSourceFields(this.Right))
                         .Distinct(),
                FilterExpression   = rightFilter,
                OrderByExpressions = new[]
                {
                    new OrderByExpression(joinExpression.Right, ascending)
                },
            };

            var exraJoinFilter = GenericVisitor.Visit(
                (ExecutionContextExpression e) => Expression.Constant(context),
                joinParts.Skip(1).DefaultIfEmpty().Aggregate <Expression>(Expression.AndAlso));

            return(new JoinQuery(
                       leftQuery,
                       rightQuery,
                       joinExpression.Left.GetRowExpression <Row>(),
                       joinExpression.CompareType,
                       joinExpression.Right.GetRowExpression <Row>(),
                       joinParts.DefaultIfEmpty <Expression>().Aggregate(Expression.AndAlso),
                       exraJoinFilter.GetJoinFunction(this.Left),
                       query.OrderByExpressions,
                       resultFilter));
        }
コード例 #14
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitSealedClassPropertyChildren(this, visitor);
 }
コード例 #15
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitParameterChildren(this, visitor);
 }
コード例 #16
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStaticClassNestedStructChildren(this, visitor);
 }
コード例 #17
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitConstantGroupChildren(this, visitor);
 }
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStructNestedAbstractPartialClassChildren(this, visitor);
 }
コード例 #19
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitSealedClassMethodCollectionChildren(this, visitor);
 }
コード例 #20
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitPartialStructChildren(this, visitor);
 }
コード例 #21
0
 public Task AcceptChildrenAsync(IGenericVisitor visitor)
 {
     return(GenericVisitor.VisitDocumentChildrenAsync(this, visitor));
 }
コード例 #22
0
ファイル: Destructor.cs プロジェクト: jeremybeavon/CSharpDom
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitDestructor(this, visitor);
 }
コード例 #23
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitClassIndexerChildren(this, visitor);
 }
コード例 #24
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitStaticClassEventCollectionChildren(this, visitor);
 }
コード例 #25
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitNestedEnumMemberChildren(this, visitor);
 }
コード例 #26
0
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitAbstractAccessorChildren(this, visitor);
 }
コード例 #27
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitAbstractClassIndexerCollectionChildren(this, visitor);
 }
コード例 #28
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitConversionOperatorChildren(this, visitor);
 }
 public override void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitAbstractPartialClassMethodCollectionChildren(this, visitor);
 }
コード例 #30
0
 public void AcceptChildren(IGenericVisitor visitor)
 {
     GenericVisitor.VisitNestedDelegateChildren(this, visitor);
 }