Последовательное разветвление / разветвленный последовательный конвейер
Мне нужна помощь с конвейером среды Rhino ETL.
Требуется вид операции цепочки, которая,
- Позволяет ветвление,
- Работает последовательно (строка за строкой),
- Возвращает исходную строку ввода в конвейер, который вошел в ветвь.
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...?), Которая отвечает этим требованиям? Или любая другая идея, как решить эту проблему?