コード例 #1
0
  @Override
  public synchronized boolean index(E element) throws Exception {
    int elemId = element.getElementId();
    if (!elementStore.hasIndex(elemId)) {
      return false;
    }

    // Set element score
    if (scoreStore.hasIndex(elemId) && element.getScore() == 0) {
      element.setScore(scoreStore.get(elemId));
    }

    // Check if prefixes changed
    boolean prefixChanged = false;
    E oldElement = elementStore.getElement(elemId);
    if (oldElement == null || !Arrays.equals(element.getTerms(), oldElement.getTerms())) {
      prefixChanged = true;
    }

    // Update elementStore, filterStore
    long scn = element.getTimestamp();
    long elemFilter = bloomFilter.computeIndexFilter(element);
    filterStore.set(elemId, elemFilter);
    elementStore.setElement(elemId, element, scn);

    // Update connectionsStore upon prefix changes
    if (prefixChanged) {
      updateConnectionStore(oldElement, element);
    }

    // Persist connectionsStore if elementStore is persisted
    if (elementStore.getHWMark() == elementStore.getLWMark()) {
      connectionsStore.persist();
    }

    // Logging
    if (logger.isDebugEnabled()) {
      logger.debug(getName() + " indexed element " + element);
    } else {
      logger.info(getName() + " indexed element " + element.getElementId());
    }

    return true;
  }
コード例 #2
0
ファイル: GenericTypeahead.java プロジェクト: yangqqh/cleo
  @Override
  public boolean index(E element) throws Exception {
    ensureOpen();
    writeLock.lock();

    try {
      int elemId = element.getElementId();
      if (!elementStore.hasIndex(elemId)) {
        return false;
      }

      // Set element score
      if (scoreStore.hasIndex(elemId) && element.getScore() == 0) {
        element.setScore(scoreStore.get(elemId));
      }

      // Check if prefixes changed
      boolean prefixChanged = false;
      E oldElement = elementStore.getElement(elemId);
      if (oldElement == null || !Arrays.equals(element.getTerms(), oldElement.getTerms())) {
        prefixChanged = true;
      }

      // Update elementStore, filterStore
      long scn = element.getTimestamp();
      long elemFilter = bloomFilter.computeIndexFilter(element);
      filterStore.set(elemId, elemFilter);
      elementStore.setElement(elemId, element, scn);

      // Update connectionsStore upon prefix changes
      if (prefixChanged) {
        updateConnectionStore(oldElement, element);
      }
    } finally {
      writeLock.unlock();
    }

    // Logging
    if (logger.isInfoEnabled()) {
      logger.info(getName() + " indexed element " + element.getElementId());
    }

    return true;
  }
コード例 #3
0
  /**
   * Update the underlying connectiosStore.
   *
   * @param oldElement - old element
   * @param newElement - new element
   * @throws Exception
   */
  protected void updateConnectionStore(E oldElement, E newElement) throws Exception {
    if (rollingEnabled && oldElement == null) {
      rollingTypeahead.offer(newElement);
    } else {
      long scn = newElement.getTimestamp();
      int elemId = newElement.getElementId();

      if (oldElement == null) {
        // Insert operation
        for (String term : newElement.getTerms()) {
          int len = Math.min(term.length(), maxKeyLength);
          for (int i = 1; i <= len; i++) {
            String source = term.substring(0, i);
            connectionsStore.addConnection(source, elemId, scn);
          }
        }
      } else if (newElement.getTimestamp() >= getHWMark()) {
        // Update operation
        Set<String> oldPrefixes = new HashSet<String>();
        Set<String> newPrefixes = new HashSet<String>();

        for (String term : oldElement.getTerms()) {
          int len = Math.min(term.length(), maxKeyLength);
          for (int i = 1; i <= len; i++) {
            String source = term.substring(0, i);
            oldPrefixes.add(source);
          }
        }

        for (String term : newElement.getTerms()) {
          int len = Math.min(term.length(), maxKeyLength);
          for (int i = 1; i <= len; i++) {
            String source = term.substring(0, i);
            newPrefixes.add(source);
          }
        }

        // Calculate intersection
        Set<String> commonPrefixes = new HashSet<String>();
        commonPrefixes.addAll(oldPrefixes);
        commonPrefixes.retainAll(newPrefixes);

        newPrefixes.removeAll(commonPrefixes);
        for (String source : newPrefixes) {
          connectionsStore.addConnection(source, elemId, scn);
        }

        oldPrefixes.removeAll(commonPrefixes);
        for (String source : oldPrefixes) {
          connectionsStore.removeConnection(source, elemId, scn);
        }
      } else {
        logger.info("ignored element: " + newElement);
      }
    }
  }