深入浅出 jackrabbit 二 索引概览
2009-09-17 00:00:00 来源:WEB开发网这段代码很简单,就是把传进来的event对象转变成两个iterator,一个是需要remove的node iterator,另外一个是需要add的node iterator。由于lucene不支持索引的更新,所以对于lucene来说,save,update,delete再本质上就是delete和 save。Update被拆成了先delete后save两个环节,也就是说如果update一个节点,那么这个节点的id既会出现在 removedIds里,也会出现在addedStates里。
Onevent方法的最终走向是handler.updateNodes(),所以我们也需要进入到updateNodes方法中。
跟随着代码,我们到达了updateNodes方法:
Java代码
public void updateNodes(NodeIdIterator remove, NodeStateIterator add)
throws RepositoryException, IOException {
checkOpen();
final Map aggregateRoots = new HashMap();
final Set removedNodeIds = new HashSet();
final Set addedNodeIds = new HashSet();
index.update(new AbstractIteratorDecorator(remove) {
public Object next() {
NodeId nodeId = (NodeId) super.next();
removedNodeIds.add(nodeId);
return nodeId.getUUID();
}
}, new AbstractIteratorDecorator(add) {
public Object next() {
NodeState state = (NodeState) super.next();
if (state == null) {
return null;
}
addedNodeIds.add(state.getNodeId());
removedNodeIds.remove(state.getNodeId());
Document doc = null;
try {
//非常重要的一个方法,但是它会在那里执行呢?
doc = createDocument(state, getNamespaceMappings(),
index.getIndexFormatVersion());
retrieveAggregateRoot(state, aggregateRoots);
} catch (RepositoryException e) {
log.warn("Exception while creating document for node: "
+ state.getNodeId() + ": " + e.toString());
}
return doc;
}
});
}
Tags:深入浅出 jackrabbit 索引
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接