Последовательное разветвление / разветвленный последовательный конвейер

Мне нужна помощь с конвейером среды Rhino ETL.

Требуется вид операции цепочки, которая,

  1. Позволяет ветвление,
  2. Работает последовательно (строка за строкой),
  3. Возвращает исходную строку ввода в конвейер, который вошел в ветвь.
        A - B
      / | \
    A - A - C - A
      \ | /
        A - D []

1. Регистрация / Частичное. Регистрация

Требование b.) Покрывается обычной инициализацией Register(...) и Partial.Register(...), но по замыслу это возвращает преобразованную строку в конвейер.

Register(new ExampleProduce<ClassA>());

Register(Partial
   .Register(new ExampleConvertTo<ClassB>())
   .Register(new ExampleOperateWith<ClassB>()));

// wrong row: B
Register(Partial
    .Register(new ExampleConvertTo<ClassC>())
   .Register(new ExampleOperateWith<ClassC>()));

// wrong row: C
Register(Partial
    .Register(new ExampleConvertTo<IList<ClassD>>())
    .Register(new ExampleOperateWith<IList<ClassD>>()));

// completely other row context, multiple rows of type D             
Register(new ExampleOperateWith<ClassA>());

2. Операция ветвления

Требование a.) Распространяется на использование BranchingOperation, но каждая ветвь обрабатывает все строки до того, как конвейер переключается на другой, и никогда не возвращается к исходному конвейеру.

Register(new ExampleProduce<ClassA>());

// runs every branch for all rows before switching to the next one
Register(new BranchingOperation()
    .Add(Partial.Register(new ExampleConvertTo<ClassB>())
         .Register(new ExampleOperateWith<ClassB>()))
    .Add(Partial.Register(new ExampleConvertTo<ClassC>())
         .Register(new ExampleOperateWith<ClassC>()))
    .Add(Partial.Register(new ExampleConvertTo<IList<ClassD>>())
         .Register(new ExampleOperateWith<IList<ClassD>>())));

// never reaches
Register(new Deploy<ClassA>());

3. Кэширование строк

Грязнаяне работающая в моем сценарии) возможность решить эту проблему: сохранение текущей строки в столбце перед "веткой" и восстановление после нее. Это будет зависеть от того, что каждая операция в ветви не меняет столбец, в котором хранится исходная строка, по крайней мере, в последней ветви примера это невозможно.

Register(new ExampleProduce<ClassA>());

Register(new StoreToRow<ClassA>());

Register(Partial
   .Register(new ExampleConvertTo<ClassB>())
   .Register(new ExampleOperateWith<ClassB>()));

Register(new RestoreFromRow<ClassA>());
Register(new StoreToRow<ClassA>());

Register(Partial
    .Register(new ExampleConvertTo<ClassC>())
    .Register(new ExampleOperateWith<ClassC>()));

Register(new RestoreFromRow<ClassA>());
Register(new StoreToRow<ClassA>());

Register(Partial
    .Register(new ExampleConvertTo<IList<ClassD>>())
    .Register(new ExampleOperateWith<IList<ClassD>>()));

Register(new RestoreFromRow<ClassA>());

// completely other "row context", multiple rows of type D             
Register(new ExampleOperateWith<ClassA>());

Существует ли какая-либо реализация BranchingOperation (например, SequentialBranchingOperation...?), Которая отвечает этим требованиям? Или любая другая идея, как решить эту проблему?

0 ответов

Другие вопросы по тегам