Цепные входные операции в Rhino-Etl

Я только недавно начал использовать Rhino-Etl для очень простых процессов ETL и добился большого успеха в этом. Сейчас у меня есть несколько более сложный сценарий, и я не обнаружил, что ConventionInputCommandOperation ведет себя так, как я ожидал.

Я сделал очень упрощенный пример того, что я пытаюсь сделать. По сути, у меня задействованы две системы, и я не знаю, что я хочу получить от системы 2, пока я не выполню первый запрос к системе 1. Я подумал, что регистрация InputOperation сразу же после другой InputOperation будет вести себя как цикл. Таким образом, каждая строка в операции 1 будет передана в операцию 2. Приведенный ниже код завершается с ошибкой "Не удалось выполнить операцию DetailReader: необходимо объявить скалярную переменную @PlanetAbbrv". Итак, мой вопрос: как вы собираетесь обрабатывать ситуации, когда операция ввода зависит от предыдущей операции ввода?

Спасибо Брайан

using System;
using Rhino.Etl.Core;
using Rhino.Etl.Core.ConventionOperations;

namespace ETLTest
{
    class Program
    {
        static void Main()
        {
            new MainProcess().Execute();
            Console.ReadLine();
        }
    }

    public class MainProcess : EtlProcess
    {
        protected override void Initialize()
        {
            Register(new MainReader());
            Register(new DetailReader());
        }

        protected override void PostProcessing()
        {
            foreach (var exception in GetAllErrors())
            {
                throw exception;
            }
        }
    }

    public class MainReader : ConventionInputCommandOperation
    {
        public MainReader() : base("Galactic1")
        {
            Command = @"select * from Planet";
        }
    }

    public class DetailReader : ConventionInputCommandOperation
    {
        public DetailReader() : base("Galactic2")
        {
            Command = @"select * from Delivery where DeliveryPlanetAbbrv = @PlanetAbbrv";
        }
    }
}

1 ответ

Вам нужно, чтобы ваш DetailReader выделил все строки (исключите операцию where). Затем используйте JoinOperation, чтобы сопоставить детали с основной информацией.

Register(new JoinPlanets()
                     .Right(new MainReader())
                     .Left(new DetailReader()));


public class JoinPlanets: JoinOperation
{
    protected override Row MergeRows(Row leftRow, Row rightRow)
    {
        Row row = leftRow.Clone();
        foreach (var column in leftRow.Columns)
            row[column] = leftRow[column];
        return row;
    }

    protected override void SetupJoinConditions()
    {
        FullOuterJoin.Left("PlanetAbbrv")
                     .Right("DeliveryPlanetAbbrv");
    }
}
Другие вопросы по тегам