Cassandra 2.1:通过嵌套 UDT 进行递归

2024-01-19

我正在研究用户定义的类型,发现你可以这样做:

cqlsh:test> CREATE TYPE ping(time timestamp);
cqlsh:test> CREATE TYPE pong(time timestamp, ping frozen <ping>);
cqlsh:test> ALTER TYPE ping ADD pong frozen <pong>;


cqlsh:test> DESC TYPE ping ;

CREATE TYPE test.ping (
    time timestamp,
    pong frozen<pong>
);

cqlsh:test> DESC TYPE pong ;

CREATE TYPE test.pong (
    time timestamp,
    ping frozen<ping>
);

这与任何用例相关吗?


刚刚在研究密切相关的项目时遇到了这个Java 司机票 https://datastax-oss.atlassian.net/browse/JAVA-908.

该架构似乎是递归的,但当您实际尝试插入数据时,这不起作用:

// (using int instead of time for the sake of clarity)
cqlsh:test> create type ping(pingid int);
cqlsh:test> create type pong(pongid int, ping frozen<ping>);
cqlsh:test> alter type ping ADD pong frozen<pong>;
cqlsh:test> create table foo(ping frozen<ping> primary key);

// These are OK:

cqlsh:test> insert into foo(ping) values( {pingid:1} );

cqlsh:test> insert into foo(ping) values(
    { pingid:1, 
      pong: { pongid:2, 
              ping: {pingid: 3}}} );

// But notice what happens when you nest one more level:

cqlsh:test> insert into foo(ping) values(
    { pingid:1, 
      pong: { pongid:2, 
              ping: {pingid: 3, 
                     pong: {pongid: 4}}}} );
InvalidRequest: code=2200 [Invalid query] message="Unknown field 'pong' in value of user
defined type ping"

看起来像ping当时使用的pong被定义的是一个“副本”,没有看到 ALTER 语句的效果。所以我的猜测是不允许递归并且缺少检查。当我得到 Cassandra 开发人员的确认时,我会更新我的答案。

一个有趣的副作用是您不能删除任何一个ping nor pong在那之后 :-)


EDIT:这确实是ALTER TYPE不应该允许。看卡桑德拉-10339 https://issues.apache.org/jira/browse/CASSANDRA-10339.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cassandra 2.1:通过嵌套 UDT 进行递归 的相关文章

随机推荐