可空字段
SmartEDB支持可为空的字段,即没有值的字段。被声明为可为空的字段会关联一个空值指示器,当该指示器被设置时,表示该字段没有值。当为字段赋值时,空值指示器会被清除,以表明该字段现在有值。
请注意,空值不会被包含在索引中。如果一个可为空的字段被建立了索引,并且该类的一个对象针对该字段将空指示符设置为 true
,那么该对象将不会被包含在索引中。因此,要注意除了通过可为空字段的索引之外,还存在其他一些访问方法。例如,考虑如下这样的模式:
class Record
{
nullable uint4 id;
string name;
tree<id> by_id;
};
class Record
{
@Indexable(unique=true)
@nullable
int id;
public String name;
}
class Record
{
[Indexable(Unique=true)]
public int? id;
public String name;
}
任何Record
类的对象,如果其id
的空值指示符被设置,都将无法访问。一旦设置了空值指示符并且事务提交,该对象将从索引中删除。由于没有其他访问方法来定位该对象,它就变得无法访问。此外,请注意,尽管可为可空字段的索引用于查找,但此索引不能用于按此字段对对象进行排序。并且可空字段不能包含在复合索引中。
C API
对于 C 和 C++ 应用程序,会生成 API 以允许设置和清除此空值指示器。如果在数据库模式中声明了标量类元素(int、float、double)为可为空,则会生成以下接口:
MCO_RET classname_fieldname_indicator_get( classname *handle, uint1 *result );
如果字段为空,则返回时参数“result”的值为 0,否则“result”的值为 1。
MCO_RET classname_fieldname_indicator_put( classname *handle, uint1 value);
传递“value”1来设置空指示符,传递0来清除空指示符。
请注意,设置或清除空值指示器对底层字段的值没有影响。换句话说,如果一个可为空的 uint2 字段的值为 5,并且对该字段调用了 classname_fieldname_indicator_put( h, 1 )
,那么在调用之后,该字段的值仍为 5。
对于所有类型的字段,相应的 classname_fieldname_get()
形式都可以返回 MCO_S_NULL_VALUE。classname_fixed_get()
也可以返回 MCO_S_NULL_VALUE,表示一个或多个组成字段为空;需要进一步使用 classname_fieldname_indicator_get()
来确定哪些字段为空。
还需注意的是,空值不会被纳入索引。换句话说,如果对可为空的字段进行了索引,并且某个类的对象在该字段上的空值指示器被设置为 true,那么该对象将不会被纳入索引。无论该字段是简单索引还是作为复合索引中的一个元素,情况都是如此。 因此,请确保除了通过可为空字段的索引之外,还有其他访问方法。例如,给定:
class xyz
{
nullable uint4 avalue;
tree<avalue> by_avalue;
};
任何类 xyz 的对象,如果其 avalue
的空值指示器被设置,都将无法访问。一旦空值指示器被设置且事务提交,该对象将从索引中移除。由于没有其他访问方法来定位该对象,它就变得无法访问。