WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 二 索引概览 阅读

深入浅出 jackrabbit 二 索引概览

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 这段代码很简单,就是把传进来的event对象转变成两个iterator,深入浅出 jackrabbit 二 索引概览(3),一个是需要remove的node iterator,另外一个是需要add的node iterator, Onevent方法的最终走向是handler.updateNodes

这段代码很简单,就是把传进来的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; 
      } 
    }); 
}

上一页  1 2 3 4  下一页

Tags:深入浅出 jackrabbit 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接