如何使用KDB实现动态订阅服务器?

如何使用KDB实现动态订阅服务器?,kdb,Kdb,我试图在kdb tick系统中实现动态订阅者,通过该系统,事件的子集将根据消费者提供的查询传递给给定的消费者 例如,给定一批事件,即: flip `source`channel`value!(10?`a`b`c;10?`a`b`c;10?10) source channel value -------------------- a a 4 b b 5 a c 4 b a 2 c c 7

我试图在kdb tick系统中实现动态订阅者,通过该系统,事件的子集将根据消费者提供的查询传递给给定的消费者

例如,给定一批事件,即:

flip `source`channel`value!(10?`a`b`c;10?`a`b`c;10?10)

source channel value
--------------------
a      a       4
b      b       5
a      c       4
b      a       2
c      c       7
c      b       8
c      a       5
a      c       6
b      a       4
b      a       1
tickerplant应仅发送没有“c.e.频道”的事件

source channel value
--------------------
a      a       4
b      b       5 
b      a       2 
c      b       8
c      a       5 
b      a       4
b      a       1
我试图通过解析动态条件来实现这一点,如下所示:

q).tp.subscribers

hp        | host isOpen port   h   subs
----------| --------------------------------------------------
:test:5000| test 0      5000   6   "enlist(not;(in;`channel;enlist`c))"
其中subs是函数select语句的条件参数,该语句在以下代码中使用:

.tp.send:{neg[x] y};

.tp.reval:{[batch;subscriber]
  .tp.send[raze .subscriber`h] reval[parse["?[batch;",raze[subscriber`subs],";0b;()]"]]
  };

// Called with event batch 
.tp.broadcast:{[batch]
   .tp.reval[batch]'[select from .tp.subscribers where isOpen] 
  };
由于批在非全局上下文中无法通过函数select语句寻址,因此此操作失败。 我想知道如何有效地实现这一功能

是否有人可以就此问题陈述的解决方案向我提供建议或向我指出相关信息。 非常感谢你的建议。 如果这是一个新手问题,我道歉。
谢谢

我认为您需要条件参数的字符串形式这一事实是您问题的一部分(这反过来要求您
解析
一个字符串化的函数选择,并且该解析假定为全局的)

为什么不使用条件参数的列表形式呢?这样就不需要解析,您可以创建一个本地函数select。例如

.tp.subscribers:([hp:1#`:test:5000]subs:enlist(not;(in;`channel;1#`c)))

q){[batch] reval ?[batch;(0!.tp.subscribers)`subs;0b;()]}flip `source`channel`value!(10?`a`b`c;10?`a`b`c;10?10)
source channel value
--------------------
a      a       4
b      b       5
b      a       2
c      b       8
c      a       5
b      a       4
b      a       1
或者让用户指定一个lambda并运行它(尽管我猜在这种情况下您将失去使用
reval
的能力):


嗨@terrylynch,谢谢你的回答。这两种情况都应该是可行的,尽管如您所述,使用
reval
(考虑用户输入)第一种情况会更好。有没有什么方法可以简洁地将一个字符串版本的enlist(not;(in;
channel;1#
c))即“enlist(not;(in;
channel;1#
c))”转换为它在q中的类似表示?我在使用
parse
时遇到问题,例如:?[batch;include(not;(in;
channel;1#
c));0b;()]?[batch;parse[subs];0b;()]其中subs=“include(not;(in;
channel;1#
c))”。Thanksq)解析“登记(not;(in;
channel;1#
c))”=登记(登记;~:;(登记;in;,
channel;(#;1;,
c)))我相信您应该能够
value
字符串,也称为
value“登记(not;(in;`channel;登记`c))”
.tp.subscribers:([hp:1#`:test:5000]subs:enlist{select from x where not channel=`c})

q){[batch] @[first(0!.tp.subscribers)`subs;batch;()]}flip `source`channel`value!(10?`a`b`c;10?`a`b`c;10?10)
source channel value
--------------------
a      b       9
c      b       0
b      b       0
b      a       9
b      a       3
b      a       9