今天主要介绍的是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. 263 Ugly Number 丑数

    编写程序判断给定的数是否为丑数.丑数就是只包含质因子 2, 3, 5 的正整数.例如, 6, 8 是丑数,而 14 不是,因为它包含了另外一个质因子 7.注意:    1 也可以被当做丑数.    输 ...

  2. esp8266 SOC方案经过半年沉淀之后再度重启

    我发誓这是最后一次玩esp8266,该脱坑了...... 以前看不懂的教程 http://club.gizwits.com/thread-6447-1-1.html 2018教程 http://clu ...

  3. oracle添加联合主键

    1 alter table tablename add constraint unionkeyname primary key (column1,column2); 上面语句中: tablename为 ...

  4. Probabilistic locking in SQLite

    In SQLite, a reader/writer lock mechanism is required to control the multi-process concurrent access ...

  5. Call stack Structure

                      The stack frame at the top of the stack is for the currently executing routine. Th ...

  6. sql IIF函数的应用

    工作中由于用各种框架,业务也不是很复杂,一直没怎么写过复杂的sql,今天写了一个 数据如下 代码如下 Sub 班级分数等级分析(shname) Dim Con As Object, rs As Obj ...

  7. pycharm中将ui文件转换成py文件

    方法一:直接使用命令行 python -m PyQt5.uic.pyuic xx.ui -o xx.py 方法二:直接使用命令 先进到C:\python\pkgs\pyqt-5.9.2-py37h65 ...

  8. Leetcode747至少是其他数字两倍的最大数

    Leetcode747至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 .查找数组中的最大元素是否至少是数组中每个其他数字的两倍.如果是,则返回最大元素的索引,否则返回-1 ...

  9. 06二叉树、Map、Collections、适配器

    06二叉树.Map.Collections.适配器-2018/07/16 1.set集合,无索引,不可以重复,无序(存取不一致) 2.TreeSet用来对象元素进行排序,可以保证元素唯一 储存自定义对 ...

  10. 「 Luogu P2285 」打鼹鼠

    解题思路 第一眼看上去觉得要设计一个三维的 DP,$dp[i][j][k]$ 表示在 $(i,j)$ 这个位置上 $k$ 时刻能够打死的最多的鼹鼠. 但是被数据范围卡死.完全开不开数组啊. 然后注意到 ...