diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogFullDetailsIndex.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogFullDetailsIndex.java index ebfb120880ba..dbd3ab2e3948 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogFullDetailsIndex.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogFullDetailsIndex.java @@ -98,6 +98,9 @@ public class VcsLogFullDetailsIndex implements Disposable { myMapReduceIndex.dispose(); } + protected void onNotIndexableCommit(int commit) throws StorageException { + } + @NotNull public static File getStorageFile(@NotNull String kind, @NotNull String id, int version) { File subdir = new File(PersistentUtil.LOG_CACHE, kind); @@ -125,6 +128,14 @@ public class VcsLogFullDetailsIndex implements Disposable { EnumeratorIntegerDescriptor.INSTANCE, new InputIndexDataExternalizer<>(extension.getKeyDescriptor(), myID)); } + + @Override + protected void updateWithMap(int inputId, @NotNull UpdateData updateData) throws StorageException { + if (((SimpleUpdateData)updateData).getNewData().isEmpty()) { + onNotIndexableCommit(inputId); + } + super.updateWithMap(inputId, updateData); + } } private class MyIndexExtension extends IndexExtension { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogMessagesTrigramIndex.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogMessagesTrigramIndex.java index 6c34b88bbf7b..bb6dbb356c5f 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogMessagesTrigramIndex.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/VcsLogMessagesTrigramIndex.java @@ -16,11 +16,15 @@ package com.intellij.vcs.log.data.index; import com.intellij.openapi.Disposable; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.TrigramBuilder; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.StorageException; +import com.intellij.util.io.EnumeratorIntegerDescriptor; +import com.intellij.util.io.PersistentHashMap; import com.intellij.vcs.log.VcsFullCommitDetails; +import com.intellij.vcs.log.util.PersistentUtil; import gnu.trove.THashMap; import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NotNull; @@ -31,11 +35,18 @@ import java.util.Map; import java.util.Set; public class VcsLogMessagesTrigramIndex extends VcsLogFullDetailsIndex { + private static final Logger LOG = Logger.getInstance(VcsLogMessagesTrigramIndex.class); private static final int VERSION = 0; private static final String TRIGRAMS = "trigrams"; + private static final int VALUE = 239; + + @NotNull private final PersistentHashMap myNoTrigramsCommits; public VcsLogMessagesTrigramIndex(@NotNull String logId, @NotNull Disposable disposableParent) throws IOException { super(logId, TRIGRAMS, VERSION, new TrigramMessageIndexer(), disposableParent); + + myNoTrigramsCommits = + PersistentUtil.createPersistentHashMap(EnumeratorIntegerDescriptor.INSTANCE, "index-no-" + TRIGRAMS, logId, VERSION); } @Nullable @@ -48,6 +59,38 @@ public class VcsLogMessagesTrigramIndex extends VcsLogFullDetailsIndex { return getCommitsWithAllKeys(trigramProcessor.map.keySet()); } + @Override + protected void onNotIndexableCommit(int commit) throws StorageException { + try { + myNoTrigramsCommits.put(commit, VALUE); + } + catch (IOException e) { + throw new StorageException(e); + } + } + + @Override + public boolean isIndexed(int commit) throws IOException { + return super.isIndexed(commit) || myNoTrigramsCommits.containsMapping(commit); + } + + @Override + public void flush() throws StorageException { + super.flush(); + myNoTrigramsCommits.force(); + } + + @Override + public void dispose() { + super.dispose(); + try { + myNoTrigramsCommits.close(); + } + catch (IOException e) { + LOG.warn(e); + } + } + public static class TrigramMessageIndexer implements DataIndexer { @NotNull @Override