企业搜索引擎开发之连接器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 ...
随机推荐
- 转发(forward)和重定向(sendRedirect)
一. RequestDispatche 是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中.详细来说:RequestDispatch对象从客户端获取 ...
- Masonry控制台打印约束冲突问题解决
不知道你是不是视图的布局也是用的第三方Masonry,在使用中是不是也遇到了控制台约束冲突的警告打印,看下图: 从输出的信息可以知道,有的控件的约束明显重复了设置,所以指出了是哪个控件,重复设置了哪些 ...
- [整理]Matlab之中心平滑滤波
滑动平均(moving average):在地球物理异常图上,选定某一尺寸的窗口,将窗口内的所有异常值做算术平均,将平均值作为窗口中心点的异常值.按点距或线距移动窗口,重复此平均方法,直到对整幅图完成 ...
- Android 7.0 UICC 分析(四)
本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...
- js常用方法
若未声明,则都是js的方法 1.indexOf indexOf(str):默认返回字符串中第一次出现索引位置 的下标,没有则返回-1 indexOf(str,position):返回从position ...
- composer 安装
安装composer wget http://curl.haxx.se/ca/cacert.pem curl -sS https://getcomposer.org/installer | php - ...
- 【bzoj3211】花神游历各国
Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 551 1 2 2 1 2 1 1 2 2 2 ...
- 【python】GTK 例子
# encoding:utf-8 # box_multi_button_data.py import pygtk, gtk def destroy(widget, data=None): gtk.ma ...
- java学习教程
java依然是目前比较流行的语言.虽然,本人是C#开发者,但是由于公司决定使用java开发,所以只好开始学习java.在学校时候只是接触过没有过深的学习过,而且参加工作后基本也一直在搞C#.好在,现在 ...
- oracle flashback功能
2). 检查Flashback 功能, 缺省时功能是关闭的. SQL> select name, current_scn, flashback_on from v$database; NAME ...