今天主要介绍的是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. LN : leetcode 399 Evaluate Division

    lc 399 Evaluate Division 399 Evaluate Division Equations are given in the format A / B = k, where A ...

  2. 存储过程中高性能安全式SQL拼接

    不少开发人员在进行SQL拼接时头痛之极,不知道如何进行拼接操作才会更安全又不影响性能,下面我以存储过程为例与大家分享一个相对比较安全高效的方法 简介:存储过程(Stored Procedure)是在大 ...

  3. [ TJOI 2007 ] 线段

    \(\\\) \(Description\) 一个\(N\times N\) 的网格,每行有一段要必走,求从\((1,1)\)到\((N,N)\)的最短路长度. \(N\le 2\times10^4\ ...

  4. python中os模块中文帮助

    python中os模块中文帮助   python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...

  5. Android开发: 关于性能需要考虑的

    刚做Android开发时,只管完成任务,将需求完成,以能完成一款界面酷炫的app为自豪.然而,随着代码量的增加,越来越意识到,一款成功的移动端产品,光有酷炫的外衣还不够,还需要在各方面都优秀. 试想, ...

  6. Android yuv转Bitmap

      YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=nu ...

  7. Linux System

    Linux System linux 是一个功能强大的操作系统,同时它是一个自由软件,是免费的.源代码开放的,编制它的目的是建立不受任何商品化软件版权制约的.全世界都能自由使用的UNIX兼容产品.各种 ...

  8. JAVA基础——集合浅析

    Java  集合      数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关.刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈” ...

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

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

  10. enote笔记语言(2)(ver0.4)

    why not(whyn't)                    为什么不(与“why”相反对应,是它的反面)   how对策 how设计   key-memo:                 ...