Как я могу преобразовать этот оператор выбора в функциональную форму? - PullRequest
1 голос
/ 06 ноября 2019

У меня есть пара проблем, чтобы перевести это в функциональный формат.

select from tableName where i=fby[(last;i);([]column_one;column_two)]

Вот что я получил:

?[tableName;fby;enlist(=;`i;(enlist;last;`i);(+:;(!;enlist`column_one`column_two;(enlist;`column_one;`column_two))));0b;()]

, но я получаю ошибку type.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

Рад, что вам удалось решить проблему с преобразованием запроса в функциональную форму.

Как правило, когда вы используете синтаксический анализ с fby в своем выражении, q преобразует эту функцию вего к определению. Обычно вы должны просто иметь возможность заменить этот k-код самой функцией q (т.е. изменить (k){stuff} на fby), и она должна работать правильно при преобразовании запроса в функциональную форму.

Кроме того, если выпроверьте https://code.kx.com/v2/wp/parse-trees/, это более подробно рассказывает о деревьях разбора и функциональной форме. Кроме того, он содержит скрипт под названием buildQuery, который возвращает функциональную форму интересующего запроса в виде строки, которая может быть очень удобной и экономит время, когда функциональная форма сложна.

1 голос
/ 06 ноября 2019

Рассмотрите возможность использования следующей функции, отрегулируйте ее с помощью функции buildQuery, приведенной в техническом документе на Parse Trees . Это довольно полезный инструмент для быстрой разработки в q, эта версия является улучшением по сравнению с приведенной в связанном техническом описании, она была расширена до обрабатывать обновления по ссылке (то есть update x:3 from `tab)

\c 30 200
tidy:{ssr/[;("\"~~";"~~\"");("";"")] $[","=first x;1_x;x]};
strBrk:{y,(";" sv x),z};
//replace k representation with equivalent q keyword
kreplace:{[x] $[`=qval:.q?x;x;"~~",string[qval],"~~"]};
funcK:{$[0=t:type x;.z.s each x;t<100h;x;kreplace x]};

//replace eg ,`FD`ABC`DEF with "enlist`FD`ABC`DEF"
ereplace:{"~~enlist",(.Q.s1 first x),"~~"};
ereptest:{((0=type x) & (1=count x) & (11=type first x)) | ((11=type x)&(1=count x))};
funcEn:{$[ereptest x;ereplace x;0=type x;.z.s each x;x]};
basic:{tidy .Q.s1 funcK funcEn x};
addbraks:{"(",x,")"};

//where clause needs to be a list of where clauses, so if only one whereclause need to enlist.
stringify:{$[(0=type x) & 1=count x;"enlist ";""],basic x};
//if a dictionary apply to both, keys and values
ab:{$[(0=count x) | -1=type x;.Q.s1 x;99=type x;(addbraks stringify key x),"!",stringify value x;stringify x]};
inner:{[x]
    idxs:2 3 4 5 6 inter ainds:til count x;
    x:@[x;idxs;'[ab;eval]];
    if[6 in idxs;x[6]:ssr/[;("hopen";"hclose");("iasc";"idesc")] x[6]];
    //for select statements within select statements
 //This line has been adjusted
    x[1]:$[-11=type x 1;x 1;$[11h=type x 1;[idxs,:1;"`",string first x 1];[idxs,:1;.z.s x 1]]];
    x:@[x;ainds except idxs;string];
    x[0],strBrk[1_x;"[";"]"]
    };
buildSelect:{[x]
    inner parse x
 };

Мы можем использовать это для создания функционального запроса, который будет работать

q)n:1000
q)tab:([]sym:n?`3;col1:n?100.0;col2:n?10.0)
q)buildSelect "select from tab where i=fby[(last;i);([]col1;col2)]"
"?[tab;enlist (=;`i;(fby;(enlist;last;`i);(flip;(lsq;enlist`col1`col2;(enlist;`col1;`col2)))));0b;()]"

Таким образом, у нас есть следующее в качестве функциональной формы

?[tab;enlist (=;`i;(fby;(enlist;last;`i);(flip;(lsq;enlist`col1`col2;(enlist;`col1;`col2)))));0b;()]

// Applying this
q)?[tab;enlist (=;`i;(fby;(enlist;last;`i);(flip;(lsq;enlist`col1`col2;(enlist;`col1;`col2)))));0b;()]
sym col1     col2
----------------------
bah 18.70281 3.927524
jjb 35.95293 5.170911
ihm 48.09078 5.159796
...
0 голосов
/ 06 ноября 2019

Я на самом деле получил это сам ->

?[tableName;((=;`i;(fby;(enlist;last;`i);(+:;(!;enlist`column_one`column_two;(enlist;`column_one;`column_two)))));(in;`venue;enlist`venueone`venuetwo));0b;()]

Проблемы были () пропущены в заявлении. Теперь работает нормально.

**, если кто-то хочет добавить более подробное объяснение о том, как создаются деревья синтаксического анализа вручную и как универсальная функция (k){} может быть заменена фактической функцией в q, не стесняйтесьдобавь свой ответ и я приму и проголосую

...