protected override void ProduceBinaryQueryPlan(PlanNode left, PlanNode right)
        {
            var node = new JoinPlanNode(
                left, right, this,
                typeof(TLeft), typeof(TRight), typeof(TLeft), typeof(TKey),
                JoinKind.LeftAntiSemiJoin,
                false, null);

            node.AddJoinExpression("key comparer", this.keyComparer);
            node.AddJoinExpression("left key comparer", this.leftComparer);
            this.Observer.ProduceQueryPlan(node);
        }
示例#2
0
        protected override void ProduceBinaryQueryPlan(PlanNode left, PlanNode right)
        {
            var node = new JoinPlanNode(
                left, right, this,
                typeof(TLeft), typeof(TRight), typeof(TResult), typeof(TKey),
                JoinKind.StartEdgeEquijoin,
                false, this.errorMessages);

            node.AddJoinExpression("selector", this.selectorExpr);
            node.AddJoinExpression("key comparer", this.keyComparerExpr);
            this.Observer.ProduceQueryPlan(node);
        }
        protected override void ProduceBinaryQueryPlan(PlanNode left, PlanNode right)
        {
            var node = new JoinPlanNode(
                left, right, this,
                typeof(TLeft), typeof(TRight), typeof(TResult), typeof(TKey),
                JoinKind.IncreasingOrderEquiJoin,
                false, this.errorMessages, false);

            node.AddJoinExpression("selector", this.selectorExpr);
            node.AddJoinExpression("join key order comparer", this.joinKeyOrderComparerExpression);
            this.Observer.ProduceQueryPlan(node);
        }
        protected override void ProduceBinaryQueryPlan(PlanNode left, PlanNode right)
        {
            var node = new JoinPlanNode(
                left, right, this,
                typeof(TLeft), typeof(TRight), typeof(TLeft), typeof(PartitionKey <TPartitionKey>),
                JoinKind.FixedIntervalEquiJoin,
                false, null, false);

            node.AddJoinExpression("key comparer", this.keyComparer);
            node.AddJoinExpression("left key comparer", this.leftComparer);
            node.AddJoinExpression("right key comparer", this.rightComparer);
            this.Observer.ProduceQueryPlan(node);
        }
示例#5
0
        private BinaryPipe <TKey, TLeft, TRight, TLeft> GetPipe(IStreamObserver <TKey, TLeft> observer)
        {
            var lookupKey = CacheKey.Create(this.Properties.KeyEqualityComparer.GetEqualsExpr().ToString(), this.LeftComparer.GetEqualsExpr().ToString());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => ClipJoinTemplate.Generate(this));
            Func <PlanNode, PlanNode, IBinaryObserver, BinaryPlanNode> planNode = ((PlanNode left, PlanNode right, IBinaryObserver o) =>
            {
                var node = new JoinPlanNode(
                    left, right, o,
                    typeof(TLeft), typeof(TRight), typeof(TLeft), typeof(TKey),
                    JoinKind.Clip, true, generatedPipeType.Item2, false);
                node.AddJoinExpression("left comparer", this.LeftComparer.GetEqualsExpr());
                node.AddJoinExpression("key comparer", this.Properties.KeyComparer.GetCompareExpr());
                return(node);
            });

            var instance    = Activator.CreateInstance(generatedPipeType.Item1, this, observer, this.Properties.KeyEqualityComparer, this.LeftComparer, planNode);
            var returnValue = (BinaryPipe <TKey, TLeft, TRight, TLeft>)instance;

            return(returnValue);
        }
示例#6
0
        private BinaryPipe <TKey, TLeft, TRight, TResult> GetPipe(IStreamObserver <TKey, TResult> observer)
        {
            var lookupKey = CacheKey.Create(this.joinKind, this.Properties.KeyEqualityComparer.GetEqualsExpr().ExpressionToCSharp(), this.Left.Properties.PayloadEqualityComparer.GetEqualsExpr().ExpressionToCSharp(), this.Right.Properties.PayloadEqualityComparer.GetEqualsExpr().ExpressionToCSharp(), this.Selector.ExpressionToCSharp());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, this.columnarGenerator);
            Func <PlanNode, PlanNode, IBinaryObserver, BinaryPlanNode> planNode = ((PlanNode left, PlanNode right, IBinaryObserver o) =>
            {
                var node = new JoinPlanNode(
                    left, right, o,
                    typeof(TLeft), typeof(TRight), typeof(TLeft), typeof(TKey), this.joinKind, true, generatedPipeType.Item2, false);
                node.AddJoinExpression("key comparer", this.Properties.KeyEqualityComparer.GetEqualsExpr());
                node.AddJoinExpression("left payload comparer", this.Left.Properties.PayloadEqualityComparer.GetEqualsExpr());
                node.AddJoinExpression("right payload comparer", this.Right.Properties.PayloadEqualityComparer.GetEqualsExpr());
                node.AddJoinExpression("left key comparer", this.Left.Properties.KeyComparer.GetCompareExpr());
                node.AddJoinExpression("right key comparer", this.Right.Properties.KeyComparer.GetCompareExpr());
                return(node);
            });

            var instance    = Activator.CreateInstance(generatedPipeType.Item1, this, observer, planNode);
            var returnValue = (BinaryPipe <TKey, TLeft, TRight, TResult>)instance;

            return(returnValue);
        }