root_to_blocks.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "root_to_blocks.h"
  2. #include <yql/essentials/public/purecalc/common/transformations/utils.h>
  3. #include <yql/essentials/core/yql_expr_type_annotation.h>
  4. using namespace NYql;
  5. using namespace NYql::NPureCalc;
  6. namespace {
  7. class TRootToBlocks: public TSyncTransformerBase {
  8. private:
  9. bool AcceptsBlocks_;
  10. EProcessorMode ProcessorMode_;
  11. bool Wrapped_;
  12. public:
  13. explicit TRootToBlocks(bool acceptsBlocks, EProcessorMode processorMode)
  14. : AcceptsBlocks_(acceptsBlocks)
  15. , ProcessorMode_(processorMode)
  16. , Wrapped_(false)
  17. {
  18. }
  19. public:
  20. void Rewind() override {
  21. Wrapped_ = false;
  22. }
  23. TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
  24. if (Wrapped_ || !AcceptsBlocks_) {
  25. return IGraphTransformer::TStatus::Ok;
  26. }
  27. const TTypeAnnotationNode* returnItemType;
  28. const TTypeAnnotationNode* returnType = input->GetTypeAnn();
  29. if (ProcessorMode_ == EProcessorMode::PullList) {
  30. Y_ENSURE(returnType->GetKind() == ETypeAnnotationKind::List);
  31. returnItemType = returnType->Cast<TListExprType>()->GetItemType();
  32. } else {
  33. Y_ENSURE(returnType->GetKind() == ETypeAnnotationKind::Stream);
  34. returnItemType = returnType->Cast<TStreamExprType>()->GetItemType();
  35. }
  36. Y_ENSURE(returnItemType->GetKind() == ETypeAnnotationKind::Struct);
  37. const TStructExprType* structType = returnItemType->Cast<TStructExprType>();
  38. const auto blocksLambda = NodeToBlocks(input->Pos(), structType, ctx);
  39. bool wrapLMap = ProcessorMode_ == EProcessorMode::PullList;
  40. output = ApplyToIterable(input->Pos(), input, blocksLambda, wrapLMap, ctx);
  41. Wrapped_ = true;
  42. return IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
  43. }
  44. };
  45. } // namespace
  46. TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeRootToBlocks(
  47. bool acceptsBlocks,
  48. EProcessorMode processorMode
  49. ) {
  50. return new TRootToBlocks(acceptsBlocks, processorMode);
  51. }