123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- #include "list_builtin.h"
- using namespace NYql;
- namespace NSQLTranslationV1 {
- TAstNode* TListBuiltin::Translate(TContext& ctx) const {
- Y_DEBUG_ABORT_UNLESS(Node);
- return Node->Translate(ctx);
- }
- TNodePtr TListBuiltin::GetIdentityLambda() {
- return BuildLambda(Pos, Y("arg"), Y(), "arg");
- }
- bool TListSortBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (Args.size() < 1 || Args.size() > 2) {
- ctx.Error(Pos) << OpName << " requires one or two parameters.";
- return false;
- }
- if (!Args[0]->Init(ctx, src)) {
- return false;
- }
- if (Args.size() == 2) {
- if (!Args[1]->Init(ctx, src)) {
- return false;
- }
- } else {
- Args.push_back(GetIdentityLambda());
- }
- Node = Y(OpName, Args[0], Y("Bool", Q(Asc ? "true" : "false")), Args[1]);
- return true;
- }
- bool TListExtractBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (Args.size() != 2) {
- ctx.Error(Pos) << OpName << " requires exactly two parameters.";
- return false;
- }
- for (const auto& arg : Args) {
- if (!arg->Init(ctx, src)) {
- return false;
- }
- }
- Args[1] = MakeAtomFromExpression(Pos, ctx, Args[1]).Build();
- Node = Y(OpName, Args[0], Args[1]);
- return true;
- }
- bool TListProcessBuiltin::CheckArgs(TContext& ctx, ISource* src) {
- if (Args.size() != 2 ) {
- ctx.Error(Pos) << OpName << " requires exactly two parameters";
- return false;
- }
- for (const auto& arg : Args) {
- if (!arg->Init(ctx, src)) {
- return false;
- }
- }
- return true;
- }
- bool TListMapBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (!CheckArgs(ctx, src)) {
- return false;
- };
- Node = Y(OpName, Args[0], Args[1]);
- return true;
- }
- bool TListFilterBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (!CheckArgs(ctx, src)) {
- return false;
- };
- Node = Y(OpName, Args[0], GetFilterLambda());
- return true;
- }
- TNodePtr TListFilterBuiltin::GetFilterLambda() {
- return BuildLambda(Pos, Y("item"), Y("Coalesce", Y("Apply", Args[1], "item"), Y("Bool", Q("false"))));
- }
- bool TListCreateBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (Args.size() != 1) {
- ctx.Error(Pos) << OpName << " requires only one parameter";
- return false;
- }
- if (!Args[0]->Init(ctx, src)) {
- return false;
- }
- Node = Y("List", Y("ListType", Args[0]));
- return true;
- }
- void TListCreateBuiltin::DoUpdateState() const {
- State.Set(ENodeState::Const);
- }
- bool TDictCreateBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (Args.size() != 2) {
- ctx.Error(Pos) << OpName << " requires two parameters";
- return false;
- }
- for (ui32 i = 0; i < 2; ++i) {
- if (!Args[i]->Init(ctx, src)) {
- return false;
- }
- }
- Node = Y("Dict", Y("DictType", Args[0], Args[1]));
- return true;
- }
- void TDictCreateBuiltin::DoUpdateState() const {
- State.Set(ENodeState::Const);
- }
- bool TSetCreateBuiltin::DoInit(TContext& ctx, ISource* src) {
- if (Args.size() != 1) {
- ctx.Error(Pos) << OpName << " requires one parameter";
- return false;
- }
- if (!Args[0]->Init(ctx, src)) {
- return false;
- }
- Node = Y("Dict", Y("DictType", Args[0], Y("VoidType")));
- return true;
- }
- void TSetCreateBuiltin::DoUpdateState() const {
- State.Set(ENodeState::Const);
- }
- } // namespace NSQLTranslationV1
|