From 4c3fab94d314ce6adddd3bedfe1f95e5253bfe8c Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Tue, 14 Aug 2018 21:28:35 +0300 Subject: [PATCH] [vcs-log] speed up filtering with index by text filter with multiple patterns IDEA-130970 --- .../vcs/log/data/index/IndexDataGetter.java | 46 ++++++++++--------- .../vcs/log/ui/filter/VcsLogTextFilterImpl.kt | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/IndexDataGetter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/IndexDataGetter.java index 55e5f53ff1b4..446eab400823 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/IndexDataGetter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/index/IndexDataGetter.java @@ -29,6 +29,7 @@ import com.intellij.vcs.log.*; import com.intellij.vcs.log.data.VcsLogStorage; import com.intellij.vcs.log.history.FileNamesData; import com.intellij.vcs.log.impl.FatalErrorHandler; +import com.intellij.vcs.log.ui.filter.VcsLogMultiplePatternsTextFilter; import com.intellij.vcs.log.util.TroveUtil; import com.intellij.vcsUtil.VcsUtil; import gnu.trove.TIntHashSet; @@ -194,30 +195,33 @@ public class IndexDataGetter { @NotNull private TIntHashSet filterMessages(@NotNull VcsLogTextFilter filter) { - if (!filter.isRegex()) { + if (!filter.isRegex() || filter instanceof VcsLogMultiplePatternsTextFilter) { TIntHashSet resultByTrigrams = executeAndCatch(() -> { - TIntHashSet commitsForSearch = myIndexStorage.trigrams.getCommitsForSubstring(filter.getText()); - if (commitsForSearch != null) { - TIntHashSet result = new TIntHashSet(); - commitsForSearch.forEach(commit -> { - try { - String value = myIndexStorage.messages.get(commit); - if (value != null) { - if (filter.matches(value)) { - result.add(commit); - } - } - } - catch (IOException e) { - myFatalErrorsConsumer.consume(this, e); - return false; - } - return true; - }); - return result; + List trigramSources = filter instanceof VcsLogMultiplePatternsTextFilter ? + ((VcsLogMultiplePatternsTextFilter)filter).getPatterns() : + Collections.singletonList(filter.getText()); + TIntHashSet commitsForSearch = new TIntHashSet(); + for (String string : trigramSources) { + TIntHashSet commits = myIndexStorage.trigrams.getCommitsForSubstring(string); + if (commits == null) return null; + TroveUtil.addAll(commitsForSearch, commits); } - return null; + TIntHashSet result = new TIntHashSet(); + commitsForSearch.forEach(commit -> { + try { + String value = myIndexStorage.messages.get(commit); + if (value != null && filter.matches(value)) { + result.add(commit); + } + } + catch (IOException e) { + myFatalErrorsConsumer.consume(this, e); + return false; + } + return true; + }); + return result; }); if (resultByTrigrams != null) return resultByTrigrams; diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt index f6b23e98db67..74035a1af5f5 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt @@ -75,7 +75,7 @@ class VcsLogRegexTextFilter internal constructor(private val pattern: Pattern) : } } -class VcsLogMultiplePatternsTextFilter internal constructor(private val patterns: List, +class VcsLogMultiplePatternsTextFilter internal constructor(val patterns: List, private val isMatchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter { override fun getText(): String = if (patterns.size == 1) patterns.single() else patterns.joinToString("|") { Pattern.quote(it) }