今天主要介绍的是Xapian::Database这个类。先上图



看上去就非常恐怖的吧,我们一点点的说。

首先一切的開始都来自那个include目录中的database.h,他的直接实现是在omdatabase.cc中,此外在common目录中另一个database.h这个文件是DataBase的私有类指针的声明,在backends/database.cc中给出了这个私有类的实现,当然这个类事实上是个抽象类,他把Database的所要实现的功能都抽象出来了。而且他也是个私有类,对外也是隐藏的。而且代码的编译速度也会变快。由于pimpl技术。

那么既然抽象类关键的就在于new的地方了。由于这里会实现多态的。在这里xapian把Database这个类的实现写在了两个文件!!

!相对摆架子的部分在前面我说的omdatabase.cc中。

而真正最关键的就是这个类的构造函数。这里会给出internal的实现。这个关键的代码在dbfactory.cc中。在dbfactory.h和dbfactory.cc中我们在这里被多态了。

在使用中xapian大家有时候可能会这种写法Xapian::WritableDatabase(Xapian::Brass::open(fullpath, Xapian::DB_CREATE_OR_OPEN, XAPIAN_BLOCK_SIZE))

在这里我们open()的方法事实上调用的是不同的backends的writedatabase的构造函数,然后得到这个类再去用Xapian::WritableDatabase的拷贝构造函数实现了不同的backends做事。此外internal是个接口类这里依据宏我们对其进行了不同的new。



在这里我们才进入了真正的database的处理。以下我就以brassdatabase为例,讲述database的实现。各位看官赶紧刷卡上车,我们开车了。

class BrassDatabase : public Xapian::Database::Internal,说个有意思的,他把基类的虚函数写在了子类的私有方法里面。当然多态之后,还是进入了子类中的那个方法。

在这个类中我们能够清晰的看到了Xapian的数据库文件的构成了,这个BrassDatabase类聚合了7个类:

BrassPostListTable(不压缩数据)

BrassPositionListTable(不压缩数据)

BrassTermListTable(压缩数据)

BrassValueManager

BrassSynonymTable(压缩数据)

BrassSpellingTable(压缩数据)

BrassRecordTable(压缩数据)

这里的类大家对他的第一印象參照我第一篇文章给出的xapian的概念。这里不再反复。我主要给大家说下各自的实现。

首先BrassPostListTable,BrassTermListTable,BrassSynonymTable。BrassSpellingTable这四个类继承于BrassLazyTable。而BrassRecordTable。BrassPostListTable这两个类继承于BrassTable。

BrassValueManager这个类比較有意思他事实上能够看成是BrassPositionListTable,BrassTermListTable这两个类的组合。在这里我把xapian的value概念看成了特殊的term。value除了维护了一个和term一样的概念PostListTable,而且本身的value是排序的放置的,当中维护全部Value的状态

Xapian::doccount freq; (一个slots相应的value相应的document的个数)

std::string lower_bound;(一个slots相应的value最低值)

std::string upper_bound;(一个slots相应的value最大值)

这个结构体叫ValueStats。然后本身还维护了一个结构。这个结构保存了document id。slots,value三者的相应关系。
std::map<Xapian::valueno, std::map<Xapian::docid, std::string> > changes; 我们接着聊其它的6个类,首先前面说到了BrassLazyTable和BrassTable,BrassLazyTable继承于BrassTable。他们差别就在于BrassTable默认不压缩数据,我们的xapian採用zlib技术来压缩数据。
BrassTable(const char * tablename_, const std::string & path_,
bool readonly_, int compress_strategy_ = DONT_COMPRESS,
bool lazy = false);

在Xapian里面的基类都不是摆设,非常多时候做事的主要都是基类在做,(此基类非抽象类)。

在这个BrassTable中使用了 BrassTable_base完毕了B树的数据结构。也就是插入树的相应位置(原谅小弟才疏学浅这个充满位运算和B树的数据结构类我基本是略过了。

。),在完毕了B树的插入之后调用write_to_file方法完毕数据写入也就是相似于fopen,Xapian本身是单写多读的。他运用了fcntrl文件锁的方式。这个部分也是写在了BrassTable类中。

BrassTable位于最底层真正读写数据库文件就在这里,而在这之上的那6个类维护了数据在进程中的关系。Value这个类应该是被拆解出BrassPositionListTable,BrassTermListTable记录到数据库中。

说究竟。我们再回来到最開始Xapian::Database中,Xapian::WritableDatabase继承自Xapian::Database,前面Xapian::Database有的他都有,你结合我的第一章和这一章,我认为你应该有一个数据分析存储提交的大概流程了吧。这里的PositionListTable即传说中的倒排索引的概念我讲得不好,推荐大家看下这个http://www.cnblogs.com/chenying99/p/3149233.html

然后再到我们xapian来。他是一层层最后到BrassTable中写入了数据。

最后说下Xapian::WritableDatabase中事务的实现。

begin_transaction(bool flushed)

commit_transaction()

cancel_transaction()

begin_transaction对外是默认flushed=true。调用他的时候,他会把開始事务之前的数据从内存也就是我前面提到的七个类维护的数据结构中写到文件里。再然后他会把transaction_state = TRANSACTION_FLUSHED;然后你開始数据写操作,数据先写入了七个类中的数据结构中,当你须要cancel_transaction()就清除七个类的数据结构中保存的数据就好了,你commit_transaction()就提交到磁盘。由于数据不是随写随提交,而是有个写数据先到内存保存依据你的commit请求再从内存到文件,才有了可方便的撤销事务。

有些的不好的地方大家多多不吝赐教。我这边文章事实上重点还是说数据的写,以下一篇会写到数据的读。

上面的UML可能图太大。我截取了两个局部的。


XAPIAN简单介绍(三)的更多相关文章

  1. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  2. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  3. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  4. 2、Cocos2dx 3.0游戏开发找小三之引擎简单介绍

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 引擎简单介绍 Cocos2d-x 的 ...

  5. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  6. 5、Cocos2dx 3.0游戏开发找小三之測试例子简单介绍及小结

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 測试例子简单介绍 Cocos2d-x ...

  7. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  8. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  9. ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector            listView每项在选中.按下等不同状态时的Drawable divider            ...

随机推荐

  1. 268 Missing Number 缺失的数字

    给出一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数.案例 1输入: [3,0,1]输出: 2案例 2输入: [9,6,4,2,3,5,7, ...

  2. html5 页面音频

    1. html5 样式 <audio class="audioleft download" id="audVoice" type="audio/ ...

  3. oracle 手动配置服务器端和客户端

    1.oracle 服务器端配置 将oracle安装完成之后,在Net Configuration Assistant配置 1.监听程序配置 先找到Net Configuration Assistant ...

  4. MERGE INTO USING用法

    MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your ...

  5. 梦想CAD控件安卓图层

    新建图层 CAD中我们设置好图层后除了我们平常的绘图时选择线段的颜色,线型,线宽等作用,而且我们还可以在出图时选择性显示图形,冻结图形,已达到我们想要的效果. 实现代码说明: //增加一个图层 参数为 ...

  6. 01Struts 2

    Struts 2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交 ...

  7. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  8. 『 Luogu P3205 』 HNOI2010 合唱队

    解题思路 设置两个二维数组 $f$ 和 $g$,含义如下. $f[l][r]$ 表示在期望得到的队形中 $l\rightarrow r$ 这段区间初始队形排列的方案数,并且最后一个加入进去的是第 $l ...

  9. MFC 课程总结

    <基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1 ...

  10. 数据结构---二叉搜索树BST实现

    1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...