добавить новый столбец со стороны клиента в KX - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть такая таблица на сервере

col0  col1  col2  col3  col4  
-----------------------------
42034 64878 62076 3716  51556 
76279 27763 61893 56680 34261
54345 39819 44585 42108 83936 
88150 17032 58679 35727 56002 
22830 77292 56069 58333 31837

Я пытаюсь добавить новый столбец со стороны клиента, используя один из существующих столбцов + 1. Пользователь введет номер существующего столбца.

#cat add_cols.q

N:.z.x
h: hopen 5010;
h "update newcol1:N+1 from `t"
res:h "t";
show res
exit 1
#q ./add_cols.q col1 

Результат как

col0  col1  col2  col3  col4  newcol1
-------------------------------------
42034 64878 62076 3716  51556 6
76279 27763 61893 56680 34261 6
54345 39819 44585 42108 83936 6
88150 17032 58679 35727 56002 6
22830 77292 56069 58333 31837 6

1 Ответ

2 голосов
/ 03 февраля 2020
h "update newcol1:N+1 from `t"

Это не сработает, так как будет использовать любое значение N, определенное для процесса сервера, которое должно быть 5.

Вы хотите что-то вроде этого:

//so.q
N:.Q.opt[.z.x]; // better to use flags and convert into a dictionary with .Q.opt
h:hopen 5010;
h raze "update newcol1:",N[`myCol],"+1 from `t";
show h"t";
exit 0; // generally anything other than exit 0 indicates a failure in execution

// creilly solution - avoids the user from feeding problematic code to the server process
N:.Q.opt[.z.x]; h:hopen 5010;
col:first`$N`myCol; 
h(!;`t;();0b;enlist[`newCol1]!enlist(+;col;1));
show h"t"; exit 0;

// This could also be defined on the server as a function e.g.:
myFunc:{[col] ![`t;();0b;enlist[`newCol1]!enlist(+;col;1)] }
// And called from the client with h(`myFunc;col)


q so.q -myCol col1
col0 col1 col2 col3 col4 newcol1
--------------------------------
370  45   804  829  660  46
481  851  12   503  926  852
564  487  481  120  418  488
578  94   732  710  126  95
920  392  995  506  77   393

t:([]col0:5?1000;col1:5?1000;col2:5?1000;col3:5?1000;col4:5?1000)
...