经过对代码的更深入的跟踪理解,发现了superobject采用的是平衡二叉树的方式保存数据的。
首先看看保存数据的类
TSuperAvlEntry = class
private
FGt, FLt: TSuperAvlEntry;
FGt和FLt分别是保存通过比较(比较hash或者比较key的asc)大的保存在Gt,小的保存在Lt,是一个二叉树链表。
先上图

假如有如下Json
"assign": {
"FAreaKey": "FKey",
"FAreaName": "FName",
"FAreaCode": "FCode",
}
按照sosmASC排序模式
1.首先插入的是FAreaKey节点,
2.然后插入的是FAreaName时跟Root就是FAreaKey进行比较那他会插入到FAreaKey对应的节点的Gt下图形A1表示
3.然后插入的是FAreaCode跟FAreakey比较时为较小的插入到LT下面如图A2表示
4.A2图已经为平衡二叉树。
再看看按sosmAdd排序模式
按照sosmAdd的模式的话都是排在后面也就是都放在GT位置
3.然后插入的是FAreaCode跟FAreakey比较时因为GT位置已经有了FAreaName,此时再跟FAreaName比较也是为大的插入FAreaName的GT下面如图B1表示
4.如图B1表示经过平衡二叉树后变成了B2样式。
这样查找的话,因为sosmAdd的查询时都是查找GT位置,不会查找LT分支,所以查询FAreaKey时会查询不到。
所以简单的办法就是如果安装sosmAdd方式存储是不进行平衡二叉数,这样所有的数据都保存在GT位置。这样就成为了一个链表的方式,这样可以从头查到尾。必然可以查到。
*****深入研究后发现查询时之前的不区分Key的大小写的修改其实很容易做到。
最终的Insert代码为