我想对某些EDB进行更改,然后了解IDB如何因此而改变。
docs表示查询阶段在最后阶段之后,“可以访问阶段FINAL的效果”。但如果我跑
p.name
(等级是IDB)我得到了
Null Exception
我也尝试过关注diff predicate example。但是这个
query '_(id) <- ^level(id; _).'
导致语法错误:
block block_1Z7PZ61E: line 2: error: predicate level is an IDB, therefore deltas for it will not be available until stage final. (code: STAGE_INITIAL_IDB_DELTA)
^level(id; _).
^^^^^^^^^^^^^
1 ERROR
BloxCompiler reported 1 error in block 'block_1Z7PZ61E'
答案 0 :(得分:0)
不幸的是,差异谓词功能尚未发布(截至2016年12月)。我们已经注意到这是一个需要修复的文档错误。该功能预计在2017年第一季度的LB 4.4。
这是在更改EDB后打印或查询IDB谓词中的值的简单示例。在这种情况下,您不需要使用增量逻辑。
[dan@glycerine Fri Dec 30 09:55:54 ~/Temp]
$ cat foo.logic
foo(x), foo_id(x: y) -> int(y).
edb[x] = y -> foo(x), int(y).
idb[x] = y -> foo(x), int(y).
idb[x] = y <- edb[x] + 10 = y.
[dan@glycerine Fri Dec 30 09:56:33 ~/Temp]
$ lb create --overwrite foo && lb addblock foo --name foo --file foo.logic && lb exec foo '+foo(x), +foo_id[x] = 1, +edb[x] = 5.'
created workspace 'foo'
added block 'foo'
[dan@glycerine Fri Dec 30 09:57:23 ~/Temp]
$ lb print foo edb
[10000000005] 1 5
[dan@glycerine Fri Dec 30 09:57:28 ~/Temp]
$ lb print foo idb
[10000000005] 1 15
[dan@glycerine Fri Dec 30 09:57:32 ~/Temp]
$ lb exec foo '^edb[x] = 15 <- foo_id[x] = 1.'
[dan@glycerine Fri Dec 30 09:57:54 ~/Temp]
$ lb print foo idb
[10000000005] 1 25
[dan@glycerine Fri Dec 30 09:57:55 ~/Temp]
$ lb query foo '_[x] = edb[x].'
/--------------- _ ---------------\
[10000000005] 1 15
\--------------- _ ---------------/
我可以想到几个选项,可以在发生变化时更多地观察变化。在一次案例中,您可以创建一个观察者谓词,并像这样添加值。
watcher(x, y) -> int(x), int(y).
^watcher(x, y) <- foo_id[x] = id, ^idb[id] = y.
可以增强它以拥有自己的实体和时间戳......
另一种方法是,如果您使用Web服务进行EDB更新,则使用
lb web-server monitor -w foo idb
观看谓词列表。