连接器里面采用的什么样的数据结构,我们先从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(三十)的更多相关文章

  1. 企业搜索引擎开发之连接器connector(十九)

    连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...

  2. 企业搜索引擎开发之连接器connector(十八)

    创建并启动连接器实例之后,连接器就会基于Http协议向指定的数据接收服务器发送xmlfeed格式数据,我们可以通过配置http代理服务器抓取当前基于http协议格式的数据(或者也可以通过其他网络抓包工 ...

  3. 企业搜索引擎开发之连接器connector(十六)

    本人有一段时间没有接触企业搜索引擎之连接器的开发了,连接器是涉及企业搜索引擎一个重要的组件,在数据源与企业搜索引擎中间起一个桥梁的作用,类似于数据库之JDBC,通过连接器将不同数据源的数据适配到企业搜 ...

  4. 企业搜索引擎开发之连接器connector(二十九)

    在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...

  5. 企业搜索引擎开发之连接器connector(二十八)

    通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象D ...

  6. 企业搜索引擎开发之连接器connector(二十六)

    连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...

  7. 企业搜索引擎开发之连接器connector(二十五)

    下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的 ...

  8. 企业搜索引擎开发之连接器connector(二十四)

    本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...

  9. 企业搜索引擎开发之连接器connector(二十二)

    下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...

随机推荐

  1. 转发(forward)和重定向(sendRedirect)

    一. RequestDispatche 是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中.详细来说:RequestDispatch对象从客户端获取 ...

  2. Masonry控制台打印约束冲突问题解决

    不知道你是不是视图的布局也是用的第三方Masonry,在使用中是不是也遇到了控制台约束冲突的警告打印,看下图: 从输出的信息可以知道,有的控件的约束明显重复了设置,所以指出了是哪个控件,重复设置了哪些 ...

  3. [整理]Matlab之中心平滑滤波

    滑动平均(moving average):在地球物理异常图上,选定某一尺寸的窗口,将窗口内的所有异常值做算术平均,将平均值作为窗口中心点的异常值.按点距或线距移动窗口,重复此平均方法,直到对整幅图完成 ...

  4. Android 7.0 UICC 分析(四)

    本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...

  5. js常用方法

    若未声明,则都是js的方法 1.indexOf indexOf(str):默认返回字符串中第一次出现索引位置 的下标,没有则返回-1 indexOf(str,position):返回从position ...

  6. composer 安装

    安装composer wget http://curl.haxx.se/ca/cacert.pem curl -sS https://getcomposer.org/installer | php - ...

  7. 【bzoj3211】花神游历各国

    Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 551 1 2 2 1 2 1 1 2 2 2 ...

  8. 【python】GTK 例子

    # encoding:utf-8 # box_multi_button_data.py import pygtk, gtk def destroy(widget, data=None): gtk.ma ...

  9. java学习教程

    java依然是目前比较流行的语言.虽然,本人是C#开发者,但是由于公司决定使用java开发,所以只好开始学习java.在学校时候只是接触过没有过深的学习过,而且参加工作后基本也一直在搞C#.好在,现在 ...

  10. oracle flashback功能

    2). 检查Flashback 功能, 缺省时功能是关闭的. SQL> select name, current_scn, flashback_on from v$database; NAME  ...