企业搜索引擎开发之连接器connector(三十)
连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法
public interface DocumentList {
public Document nextDocument() throws RepositoryException;
public String checkpoint() throws RepositoryException;
}
前者用于获取Document对象,后者获取断点状态
上文中分析的DiffingConnectorDocumentList类即实现了DocumentList接口,从List<CheckpointAndChange> guaranteedChanges集合的迭代器中迭代获取CheckpointAndChange对象然后包装为Document类型对象
Document也是一接口类型
public interface Document {
public Property findProperty(String name) throws RepositoryException;
public Set<String> getPropertyNames() throws RepositoryException;
}
从Document接口定义的方法可以看出,Document接口类似于Map容器结构,如果进一步考察String类型的key对应的value类型Property,可以发现Document接口很类似于HashMap结构
public interface Property {
public Value nextValue() throws RepositoryException;
}
下面继续考察Document接口的具体实现类,以JsonDocument类说明:
/**
*省略了其他部分成员属性及方法
* A simple {@link Document} implementation created from a {@link JSONObject}.
*/
public class JsonDocument implements Document { private final Map<String, List<Value>> properties; /**
* Constructor used by {@link DBHandle} when deserializing a
* {@code DocumentHandle} from the recovery file.
*/
public JsonDocument(JSONObject jsonObject) {
this(buildJsonProperties(jsonObject), jsonObject);
} /**
* Constructor used by the {@link DocumentBuilder} for creating a
* {@link JsonDocument} object used by {@link RepositoryHandler}
* for building a collection over JsonDocument.
*/
public JsonDocument(Map<String, List<Value>> properties,
JSONObject jsonObject) {
this.properties = properties;
this.jsonObject = jsonObject;
objectId = getSingleValueString(SpiConstants.PROPNAME_DOCID);
if (Strings.isNullOrEmpty(objectId)) {
throw new IllegalArgumentException(
"Unable to parse for docID from the properties:" + properties);
}
} @Override
public Set<String> getPropertyNames() {
return properties.keySet();
} @Override
public Property findProperty(String name) throws RepositoryException {
List<Value> property = properties.get(name);
if (name.equals(SpiConstants.PROPNAME_CONTENT) && filterMimeType()) {
property = null;
}
return (property == null) ? null : new SimpleProperty(property);
} }
JsonDocument类还有什么好说的呢,内部实际是对Map<String, List<Value>> properties的封装
属性类型SimpleProperty实现了Property接口
/**
* Simple implementation of the {@link Property} interface.
* Implementors may use this directly or for reference.
*
* @since 1.0
*/
public class SimpleProperty implements Property { final Iterator<Value> iterator; /**
* Constructs a property with a single value.
*
* @param value the property's {@link Value}
* @since 2.4
*/
public SimpleProperty(Value value) {
this(Collections.singletonList(value));
} /**
* Constructs a property with multiple values.
*
* @param values a {@code List} of the property's {@link Value Values}
*/
public SimpleProperty(List<Value> values) {
this.iterator = values.iterator();
} @Override
public Value nextValue() {
return (iterator.hasNext()) ? iterator.next() : null;
}
}
成员属性final Iterator<Value> iterator保存值的迭代器,功能与HashMap的entry链表类似
---------------------------------------------------------------------------
本系列企业搜索引擎开发之连接器connector系本人原创
转载请注明出处 博客园 刺猬的温驯
本人邮箱: chenying998179@163#com (#改为.)
本文链接 http://www.cnblogs.com/chenying99/p/3789695.html
企业搜索引擎开发之连接器connector(三十)的更多相关文章
- 企业搜索引擎开发之连接器connector(十九)
连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...
- 企业搜索引擎开发之连接器connector(十八)
创建并启动连接器实例之后,连接器就会基于Http协议向指定的数据接收服务器发送xmlfeed格式数据,我们可以通过配置http代理服务器抓取当前基于http协议格式的数据(或者也可以通过其他网络抓包工 ...
- 企业搜索引擎开发之连接器connector(十六)
本人有一段时间没有接触企业搜索引擎之连接器的开发了,连接器是涉及企业搜索引擎一个重要的组件,在数据源与企业搜索引擎中间起一个桥梁的作用,类似于数据库之JDBC,通过连接器将不同数据源的数据适配到企业搜 ...
- 企业搜索引擎开发之连接器connector(二十九)
在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...
- 企业搜索引擎开发之连接器connector(二十八)
通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象D ...
- 企业搜索引擎开发之连接器connector(二十六)
连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...
- 企业搜索引擎开发之连接器connector(二十五)
下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的 ...
- 企业搜索引擎开发之连接器connector(二十四)
本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...
- 企业搜索引擎开发之连接器connector(二十二)
下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...
随机推荐
- iOS错误总结(三)
1.如果tableView设置为分组的样式(默认是有cell之间的分割线,可以设置颜色),默认有组以及组尾的高度 需要手动在组头组尾的代理方法中进行组高的设置(如果想设置为0,最好写0.01) 2.组 ...
- inline(内联)函数
1,为小操作定义一个函数的好处是: a.可读性会强很多. b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多 c.函数可以被重用,不必为其他的应用重写代码 ...
- Citrix Reciver提示安装程序集错误
打开注册表查找是否有RegistrySizeLimit这个项目,如果有更改成8个f,如果没有就需要手动建立一个之后输入8个f,操作方法如下: 到了 HKEY_LOCAL_MACHINE\SYSTEM\ ...
- Python列表切成多个
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] #arr是被分割的list,n是每个chunk中含n元素. def chunks(arr, n) ...
- UpdatePanel 中 导出Excel按钮
UpdatePanel 中 导出Excel按钮 要加 Triggers </ContentTemplate> <Triggers> <asp:PostBackTrigge ...
- javascript按中文首字母排序
resultValue=[ '武汉' , '北京' , '上海' , '天津' ] ; resultValue= resultValue.sort( function compareFunction( ...
- C/C++入门---运算符
1, 运算符的优先级 C语言的运算符共有15个优先级,各运算符及其优先级和结合律如下: 运算符 结合律 ()[]-> 从左到右 !~++ -- +(正号) -(负号) *(指针取址符) (typ ...
- 交易B(队列)
临近考试,又把之前的上机的题目看了一遍,自己又尝试着敲代码,发现好多之前的代码现在看来都被自己复杂化了许多,于是把现在重写的代码再贴出来. 之前的题目和代码戳这里 #include<queue& ...
- Ubuntu root 密码 sudo passwd
用vmware安装好ubuntu后,su - 切换不到root,提示密码错误. 解决办法: 1.用当前登录用户打开终端,在终端输入命令 sudo passwd,输入当前用户的密码然后回车 2.会提示输 ...
- 【笔记】Android项目添加项目引用方法
刚才在做phoneGap时,想试图自己添加phoneGap的lib组件(jar的源码),找了好多种方法,下面这种成功了 项目邮件 Properties, Android ,Add... ,然后Dep ...