最近遇到一个新问题,以前的系统设计一般都会先做数据库设计,即便是到了java的hibernate以后,虽然说是对象为核心,而不再是数据库为核心了,但是通常也是做好了数据库设计以后,用插件生成的对象。这次,真的以对象为核心设计了。Grails的,要知道表字段是什么意思,自己去看域下面的groovy文件中的注释吧。Oh,no。。。。。。
做性能测试,需要增删改数据,这可必须知道表字段之间的外键关联关系,这可如何是好。开发说自己看groovy文件吧,这这这。。。。。。崩溃是我不变的信仰,为神马受伤的总是俺。本来想找找插件的。算了,懒惰那是必须的,懒得找,反正不是在用TC吗,自己写一个算了。如果让我重新选择,我一定搜搜插件去,懒惰是要付出代价的。
好了,言归正传。看看是啥情况吧。使用grails的命令,可以生成一个ddl.sql,外键的定义大概是这样的:
alter table table1 add constraint FK4A1F43F328ED9437 foreign key (field1) references table2;
所以程序就分成了两个部分:
第一个部分是从ddl文件中过滤出外键部分,得到:
Table1(field1),table2
写入临时文件,这个不难;
第二部分就非常的纠结了,大家看看我当时对代码的测试用例,就能知道这个算法有多麻烦了
用例1:
A(01),B
A.01
B
用例2:
B(01),B
B.01
B
用例3:
A(01),B
A(02),C
A.01.02
C
B
用例4:
A(01),B
A(02),C
B(03),D
A.01.02
C
B.03
D
用例5:
A(01),B
A(02),C
B(03),D
B(01),B
A.01.02
C
B.03
D
B.01
B
用例6:
A(01),B
A(02),C
D(03),E
B(01),B
A.01.02
C
B
D.03
E
B.01
B
用例7:
A(01),B
A(02),C
G(06),A
G.06
A.01.02
C
B
用例8:
A(01),B
A(02),C
D(03),E
B(04),B
G(05),A
C(06),F
G.05
A.01.02
C.06
F
B
D.03
E
B.04
B
用力9:
A(01),B
A(02),C
B(03),D
D(04),E
B(05),F
G(06),A
B(07),B
H(08),A
J(09),K
H(10),I
I(11),B
G.06
A.01.02
C
B.03.05
F
D.04
E
H.08.10
I.11
B.03.05
F
D.04
E
A
J.09
K
B.07
B
当然我也知道生成图片更直观,但是山寨嘛,凑活着能用就行了。别尽善尽美了。
看了上面的这些用例,大致可以看到几种情况:
第一种情况:
本表的关联,比如一张表记录了菜单,菜单表的一个字段是父节点id,自然这个字段肯定得在菜单表的id里面存在的。
第二种情况:
A(01),B
A(02),C
生成依赖关系:
A.01.02
C
B
不但的把C插入到A后面,还得算出前面的tab字符个数,同时还得把关联的A表字段02加进来
第三种情况:
A(01),B
A(02),C
G(06),A
这个更麻烦一点,执行到GA的时候,得把G放到最前面,然后后面的字串全部加上一个tab字符
第四种情况:
A(01),B
B(03),D
D(04),E
H(10),I
I(11),B
可以看到,HIB,但是B其实在上一段中是出现过的BDE,也就是说还得跟后面拼接上变成HIBDE,可以想到先得截出来子串,还得调整tab数量,反正是够呛。
简单的说,就是非常非常的琐碎麻烦。不过这只是完成了一半,后面一半也麻烦的要命,从groovy文件中,搜出字段定义,找到相应的注释,写回到输出文件中。有空再做吧。
附件: http://download.csdn.net/detail/Testingba/3591071