public IEtlPipeline WriteTo(IBulkWriter <TOut> bulkWriter)
        {
            var step = new BulkWriterEtlPipelineStep <TOut>(this, bulkWriter);

            PipelineContext.AddStep(step);

            return(PipelineContext.Pipeline);
        }
        public IEtlPipelineStep <TOut, TNextOut> Project <TNextOut>(Func <TOut, TNextOut> projectionFunc)
        {
            if (projectionFunc == null)
            {
                throw new ArgumentNullException(nameof(projectionFunc));
            }

            var step = new ProjectEtlPipelineStep <TOut, TNextOut>(this, projectionFunc);

            PipelineContext.AddStep(step);

            return(step);
        }
        public IEtlPipelineStep <TOut, TNextOut> Pivot <TNextOut>(Func <TOut, IEnumerable <TNextOut> > pivotFunc)
        {
            if (pivotFunc == null)
            {
                throw new ArgumentNullException(nameof(pivotFunc));
            }

            var step = new PivotEtlPipelineStep <TOut, TNextOut>(this, pivotFunc);

            PipelineContext.AddStep(step);

            return(step);
        }
        public IEtlPipelineStep <TOut, TNextOut> Aggregate <TNextOut>(Func <IEnumerable <TOut>, TNextOut> aggregationFunc)
        {
            if (aggregationFunc == null)
            {
                throw new ArgumentNullException(nameof(aggregationFunc));
            }

            var step = new AggregateEtlPipelineStep <TOut, TNextOut>(this, aggregationFunc);

            PipelineContext.AddStep(step);

            return(step);
        }
        public IEtlPipelineStep <TOut, TOut> TransformInPlace(params Action <TOut>[] transformActions)
        {
            if (transformActions == null || transformActions.Any(t => t == null))
            {
                throw new ArgumentNullException(nameof(transformActions), @"No transformer may be null");
            }

            var step = new TransformEtlPipelineStep <TOut>(this, transformActions);

            PipelineContext.AddStep(step);

            return(step);
        }