utils.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "utils.h"
  2. #include <yql/essentials/public/purecalc/common/names.h>
  3. #include <yql/essentials/core/yql_expr_type_annotation.h>
  4. using namespace NYql;
  5. using namespace NYql::NPureCalc;
  6. TExprNode::TPtr NYql::NPureCalc::NodeFromBlocks(
  7. const TPositionHandle& pos,
  8. const TStructExprType* structType,
  9. TExprContext& ctx
  10. ) {
  11. const auto items = structType->GetItems();
  12. Y_ENSURE(items.size() > 0);
  13. return ctx.Builder(pos)
  14. .Lambda()
  15. .Param("stream")
  16. .Callable(0, "FromFlow")
  17. .Callable(0, "NarrowMap")
  18. .Callable(0, "ToFlow")
  19. .Callable(0, "WideFromBlocks")
  20. .Callable(0, "FromFlow")
  21. .Callable(0, "ExpandMap")
  22. .Callable(0, "ToFlow")
  23. .Arg(0, "stream")
  24. .Seal()
  25. .Lambda(1)
  26. .Param("item")
  27. .Do([&](TExprNodeBuilder& lambda) -> TExprNodeBuilder& {
  28. ui32 i = 0;
  29. for (const auto& item : items) {
  30. lambda.Callable(i++, "Member")
  31. .Arg(0, "item")
  32. .Atom(1, item->GetName())
  33. .Seal();
  34. }
  35. lambda.Callable(i, "Member")
  36. .Arg(0, "item")
  37. .Atom(1, PurecalcBlockColumnLength)
  38. .Seal();
  39. return lambda;
  40. })
  41. .Seal()
  42. .Seal()
  43. .Seal()
  44. .Seal()
  45. .Seal()
  46. .Lambda(1)
  47. .Params("fields", items.size())
  48. .Callable("AsStruct")
  49. .Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& {
  50. ui32 i = 0;
  51. for (const auto& item : items) {
  52. parent.List(i)
  53. .Atom(0, item->GetName())
  54. .Arg(1, "fields", i++)
  55. .Seal();
  56. }
  57. return parent;
  58. })
  59. .Seal()
  60. .Seal()
  61. .Seal()
  62. .Seal()
  63. .Seal()
  64. .Build();
  65. }
  66. TExprNode::TPtr NYql::NPureCalc::NodeToBlocks(
  67. const TPositionHandle& pos,
  68. const TStructExprType* structType,
  69. TExprContext& ctx
  70. ) {
  71. const auto items = structType->GetItems();
  72. Y_ENSURE(items.size() > 0);
  73. return ctx.Builder(pos)
  74. .Lambda()
  75. .Param("stream")
  76. .Callable("FromFlow")
  77. .Callable(0, "NarrowMap")
  78. .Callable(0, "WideToBlocks")
  79. .Callable(0, "ExpandMap")
  80. .Callable(0, "ToFlow")
  81. .Arg(0, "stream")
  82. .Seal()
  83. .Lambda(1)
  84. .Param("item")
  85. .Do([&](TExprNodeBuilder& lambda) -> TExprNodeBuilder& {
  86. ui32 i = 0;
  87. for (const auto& item : items) {
  88. lambda.Callable(i++, "Member")
  89. .Arg(0, "item")
  90. .Atom(1, item->GetName())
  91. .Seal();
  92. }
  93. return lambda;
  94. })
  95. .Seal()
  96. .Seal()
  97. .Seal()
  98. .Lambda(1)
  99. .Params("fields", items.size() + 1)
  100. .Callable("AsStruct")
  101. .Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& {
  102. ui32 i = 0;
  103. for (const auto& item : items) {
  104. parent.List(i)
  105. .Atom(0, item->GetName())
  106. .Arg(1, "fields", i++)
  107. .Seal();
  108. }
  109. parent.List(i)
  110. .Atom(0, PurecalcBlockColumnLength)
  111. .Arg(1, "fields", i)
  112. .Seal();
  113. return parent;
  114. })
  115. .Seal()
  116. .Seal()
  117. .Seal()
  118. .Seal()
  119. .Seal()
  120. .Build();
  121. }
  122. TExprNode::TPtr NYql::NPureCalc::ApplyToIterable(
  123. const TPositionHandle& pos,
  124. const TExprNode::TPtr iterable,
  125. const TExprNode::TPtr lambda,
  126. bool wrapLMap,
  127. TExprContext& ctx
  128. ) {
  129. if (wrapLMap) {
  130. return ctx.Builder(pos)
  131. .Callable("LMap")
  132. .Add(0, iterable)
  133. .Lambda(1)
  134. .Param("stream")
  135. .Apply(lambda)
  136. .With(0, "stream")
  137. .Seal()
  138. .Seal()
  139. .Seal()
  140. .Build();
  141. } else {
  142. return ctx.Builder(pos)
  143. .Apply(lambda)
  144. .With(0, iterable)
  145. .Seal()
  146. .Build();
  147. }
  148. }
  149. const TStructExprType* NYql::NPureCalc::WrapBlockStruct(
  150. const TStructExprType* structType,
  151. TExprContext& ctx
  152. ) {
  153. TVector<const TItemExprType*> members;
  154. for (const auto& item : structType->GetItems()) {
  155. const auto blockItemType = ctx.MakeType<TBlockExprType>(item->GetItemType());
  156. members.push_back(ctx.MakeType<TItemExprType>(item->GetName(), blockItemType));
  157. }
  158. const auto scalarItemType = ctx.MakeType<TScalarExprType>(ctx.MakeType<TDataExprType>(EDataSlot::Uint64));
  159. members.push_back(ctx.MakeType<TItemExprType>(PurecalcBlockColumnLength, scalarItemType));
  160. return ctx.MakeType<TStructExprType>(members);
  161. }
  162. const TStructExprType* NYql::NPureCalc::UnwrapBlockStruct(
  163. const TStructExprType* structType,
  164. TExprContext& ctx
  165. ) {
  166. TVector<const TItemExprType*> members;
  167. for (const auto& item : structType->GetItems()) {
  168. if (item->GetName() == PurecalcBlockColumnLength) {
  169. continue;
  170. }
  171. bool isScalarUnused;
  172. const auto blockItemType = GetBlockItemType(*item->GetItemType(), isScalarUnused);
  173. members.push_back(ctx.MakeType<TItemExprType>(item->GetName(), blockItemType));
  174. }
  175. return ctx.MakeType<TStructExprType>(members);
  176. }