/** * 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); } } }
@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; }
@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; }