运行 .z.pg 和 .z.ps 基于 q 中的客户端处理请求

running .z.pg and .z.ps based on client handle request in q

我喜欢编写一个脚本,根据客户端选择的文件句柄在 .z.pg 和 .z.ps 之间进行选择,并将结果插入以下 table:

.ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Np;`;0Ni;`;::;::;0b)

我使用了以下逻辑:

.ipc.logQuery:{[event;x]
        start:.z.p; r:get x;end:.z.p-start; 0b; //suc:{0b<>@[value;x;0b]};
        `.ipc.history insert (start;end;event;.z.w;.z.u;x;r;0b);r}

.z.pg:.ipc.logQuery`.z.pg;
.z.ps:.ipc.logQuery`.z.ps;

我在听:

q queryHistory2.q -p 5050

但是当客户端连接命令时,我得到`type error:

q)h:hopen 5050
q)h"2+2"
'type

类型错误来自 'end' 列。您已将其定义为时间戳,但是当您减去 2 个时间戳时,Q returns 时间跨度类型。

q)  a: .z.p
q)  b: a -1000
q)  type 0N!a-b 
q) (0D00:00:00.000003000 ;-16h)

要解决此问题,您需要将列的类型更改为时间跨度。

q) .ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Nn;`;0Ni;`;::;::;0b)

q) `.ipc.history insert(a;.z.p-a;`.z.pg;.z.w;.z.u;"2+2";get "2+2";0b)
startTime                     endTime              event handle user        query result success
------------------------------------------------------------------------------------------------
                                                                            ::    ::     0      
2019.02.12D15:15:55.009781000 0D00:06:21.092914000 .z.pg 0      user "2+2" 4      0 

其他选项是在结束列中存储纳秒(或毫秒)而不是时间跨度。

您可以简单地将时间跨度转换为纳秒,只需将其转换为 long。

 q)`long$end

为此,将您的列类型更改为 long。

 q) .ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Nj;`;0Ni;`;::;::;0b)