You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/08/03 22:06:15 UTC

[ignite-teamcity-bot] 01/01: Filtering history by build tag selected in tracked.html

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch filter-hist-by-tag
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit f5b9f5d596cc43e9f3d02a8ce5adb2714195971b
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Sun Aug 4 01:06:04 2019 +0300

    Filtering history by build tag selected in tracked.html
---
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  |  2 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    |  2 +-
 .../tcbot/engine/chain/BuildChainProcessor.java    |  2 +-
 .../tcbot/engine/chain/TestCompactedMult.java      | 27 +++++---
 .../ignite/tcbot/engine/pr/PrChainsProcessor.java  |  3 +-
 .../tracked/TrackedBranchChainsProcessor.java      |  3 +-
 .../apache/ignite/tcbot/engine/ui/DsChainUi.java   | 34 +++++-----
 .../apache/ignite/tcbot/engine/ui/DsSuiteUi.java   | 73 +++++++++++-----------
 .../ignite/tcbot/engine/ui/DsTestFailureUi.java    | 44 ++++++++-----
 .../ci/teamcity/ignited/runhist/Invocation.java    |  7 +++
 .../teamcity/ignited/runhist/RunHistCompacted.java | 28 +++++++--
 .../ignite/tcignited/history/IRunHistory.java      |  3 +
 12 files changed, 145 insertions(+), 83 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
index 55dd5ad..04c493d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
@@ -92,7 +92,7 @@ public class GetChainResultsAsHtml {
         status.chainName = ctx.suiteName();
 
         IStringCompactor c = injector.getInstance(IStringCompactor.class);
-        status.initFromContext(tcIgn, ctx, failRateBranch, c, false, null, null, -1);
+        status.initFromContext(tcIgn, ctx, failRateBranch, c, false, null, null, -1, null);
 
         res.append(showChainAtServerData(status));
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
index 2b38122..6de270d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
@@ -141,7 +141,7 @@ public class GetBuildTestFailures {
         if (cnt > 0)
             runningUpdates.addAndGet(cnt);
 
-        chainStatus.initFromContext(tcIgnited, ctx, failRateBranch, injector.getInstance(IStringCompactor.class), false, null, null, -1);
+        chainStatus.initFromContext(tcIgnited, ctx, failRateBranch, injector.getInstance(IStringCompactor.class), false, null, null, -1, null);
 
         res.addChainOnServer(chainStatus);
 
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
index e1f68b8..d4d82ae 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
@@ -138,7 +138,7 @@ public class BuildChainProcessor {
      * @param failRateBranch Fail rate branch.
      * @param mode background data update mode.
      * @param sortOption how to sort suites in context, default is by failure rate (most often - first).
-     * @param requireParamVal Require exact parameters value presence in the build.
+     * @param requireParamVal Require exact parameters value presence in the build. Null means no filtering.
      */
     @AutoProfiling
     public FullChainRunCtx loadFullChainContext(
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java
index a37faaf..b6cfc09 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java
@@ -17,12 +17,6 @@
 
 package org.apache.ignite.tcbot.engine.chain;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import javax.annotation.Nullable;
 import org.apache.ignite.tcbot.common.TcBotConst;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
@@ -33,6 +27,14 @@ import org.apache.ignite.tcignited.history.IRunStat;
 import org.apache.ignite.tcignited.history.ISuiteRunHistory;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+
 /**
  * Test occurrence merged from several runs.
  */
@@ -138,6 +140,12 @@ public class TestCompactedMult {
     }
 
     public IRunHistory history(ITeamcityIgnited ignited, @Nullable Integer baseBranchId) {
+         return history(ignited, baseBranchId, null);
+    }
+
+    public IRunHistory history(ITeamcityIgnited ignited,
+                               @Nullable Integer baseBranchId,
+                               @Nullable Map<Integer, Integer> requireParameters) {
         Integer name = testName();
         if (name == null || baseBranchId == null)
             return null;
@@ -147,7 +155,12 @@ public class TestCompactedMult {
         if (suiteRunHist == null)
             return null;
 
-        return suiteRunHist.getTestRunHist(name);
+        IRunHistory testRunHist = suiteRunHist.getTestRunHist(name);
+
+        if (requireParameters == null || requireParameters.isEmpty())
+            return testRunHist;
+
+        return testRunHist.filter(requireParameters);
     }
 
     /**
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
index a307f2a..96ca393 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
@@ -165,7 +165,8 @@ public class PrChainsProcessor {
                 runningUpdates.addAndGet(cnt0);
 
             //fail rate reference is always default (master)
-            chainStatus.initFromContext(tcIgnited, ctx, baseBranchForTc, compactor, false, null, null, -1); // don't need for PR
+            chainStatus.initFromContext(tcIgnited, ctx, baseBranchForTc, compactor, false,
+                    null, null, -1, null); // don't need for PR
 
             initJiraAndGitInfo(chainStatus, jiraIntegration, gitHubConnIgnited);
         }
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
index 0cbab4e..d74daf0 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
@@ -158,7 +158,8 @@ public class TrackedBranchChainsProcessor implements IDetailedStatusForTrackedBr
                 if (cnt > 0)
                     runningUpdates.addAndGet(cnt);
 
-                chainStatus.initFromContext(tcIgnited, ctx, baseBranchTc, compactor, calcTrustedTests, tagSelected, displayMode, maxDurationSec);
+                chainStatus.initFromContext(tcIgnited, ctx, baseBranchTc, compactor, calcTrustedTests, tagSelected,
+                        displayMode, maxDurationSec, requireParamVal);
 
                 return chainStatus;
             })
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
index 47b7d0b..3eabb2c 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
@@ -159,13 +159,14 @@ public class DsChainUi {
     }
 
     public void initFromContext(ITeamcityIgnited tcIgnited,
-        FullChainRunCtx ctx,
-        @Nullable String baseBranchTc,
-        IStringCompactor compactor,
-        boolean calcTrustedTests,
-        @Nullable String tagSelected,
-        @Nullable DisplayMode displayMode,
-        int maxDurationSec) {
+                                FullChainRunCtx ctx,
+                                @Nullable String baseBranchTc,
+                                IStringCompactor compactor,
+                                boolean calcTrustedTests,
+                                @Nullable String tagSelected,
+                                @Nullable DisplayMode displayMode,
+                                int maxDurationSec,
+                                @Nullable Map<Integer, Integer> requireParamVal) {
         failedTests = 0;
         failedToFinish = 0;
         totalTests = 0;
@@ -188,8 +189,8 @@ public class DsChainUi {
             .filter(suite -> !suite.isComposite())
             .filter(suiteFilter)
             .peek(suite -> {
-                Integer totalTests = suite.totalTests();
-                this.totalTests += totalTests != null ? totalTests : 0;
+                int totalTests = suite.totalTests();
+                this.totalTests += totalTests;
 
                 if (calcTrustedTests)
                     trustedTests += suite.trustedTests(tcIgnited, baseBranchId);
@@ -202,10 +203,15 @@ public class DsChainUi {
                     || dModeToUse == DisplayMode.ShowAllSuites
                     || suite.hasTestToReport(tcIgnited, baseBranchId)
                     || suite.hasLongRunningTest(maxDurationSec)) {
-                    final DsSuiteUi suiteCurStatus = new DsSuiteUi();
-
-                    suiteCurStatus.initFromContext(tcIgnited, suite, baseBranchTc, compactor, true, calcTrustedTests,
-                        maxDurationSec);
+                    final DsSuiteUi suiteCurStatus = new DsSuiteUi()
+                            .initFromContext(tcIgnited,
+                                    suite,
+                                    baseBranchTc,
+                                    compactor,
+                                    true,
+                                    calcTrustedTests,
+                                    maxDurationSec,
+                                    requireParamVal);
 
                     failedTests += suiteCurStatus.failedTests != null ? suiteCurStatus.failedTests : 0;
 
@@ -241,7 +247,7 @@ public class DsChainUi {
                 MultBuildRunCtx suite = pairCtxAndOccur.get1();
                 TestCompactedMult longRunningOccur = pairCtxAndOccur.get2();
 
-                DsTestFailureUi failure = createOrrucForLongRun(tcIgnited, compactor, suite, longRunningOccur, baseBranchTc);
+                DsTestFailureUi failure = createOrrucForLongRun(tcIgnited, compactor, suite, longRunningOccur, baseBranchTc, requireParamVal);
 
                 failure.testName = "[" + suite.suiteName() + "] " + failure.testName; //may be separate field
 
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
index 64d4a66..e9fa992 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
@@ -17,19 +17,6 @@
 
 package org.apache.ignite.tcbot.engine.ui;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import org.apache.ignite.tcbot.common.util.UrlUtil;
 import org.apache.ignite.tcbot.engine.chain.MultBuildRunCtx;
 import org.apache.ignite.tcbot.engine.chain.TestCompactedMult;
@@ -40,6 +27,13 @@ import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.tcignited.buildlog.ITestLogCheckResult;
 import org.apache.ignite.tcignited.history.IRunHistory;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
 import static org.apache.ignite.tcbot.common.util.TimeUtil.millisToDurationPrintable;
 import static org.apache.ignite.tcignited.history.RunHistSync.normalizeBranch;
 
@@ -140,14 +134,16 @@ public class DsSuiteUi extends ShortSuiteUi {
      * @param includeTests Include tests - usually {@code true}, but it may be disabled for speeding up VISA collection.
      * @param calcTrustedTests
      * @param maxDurationSec 0 or negative means don't indclude. has no effect if tests not included
+     * @param requireParamVal filtering for runs history based on parameter value selected.
      */
     public DsSuiteUi initFromContext(ITeamcityIgnited tcIgnited,
-        @Nonnull final MultBuildRunCtx suite,
-        @Nullable final String baseBranch,
-        @Nonnull IStringCompactor compactor,
-        boolean includeTests,
-        boolean calcTrustedTests,
-        int maxDurationSec) {
+                                     @Nonnull final MultBuildRunCtx suite,
+                                     @Nullable final String baseBranch,
+                                     @Nonnull IStringCompactor compactor,
+                                     boolean includeTests,
+                                     boolean calcTrustedTests,
+                                     int maxDurationSec,
+                                     @Nullable Map<Integer, Integer> requireParamVal) {
         String failRateNormalizedBranch = normalizeBranch(baseBranch);
         Integer baseBranchId = compactor.getStringIdIfPresent(failRateNormalizedBranch);
         IRunHistory baseBranchHist = suite.history(tcIgnited, baseBranchId);
@@ -189,18 +185,22 @@ public class DsSuiteUi extends ShortSuiteUi {
             tests.sort(Comparator.comparing(function).reversed());
 
             tests.forEach(occurrence -> {
-                final DsTestFailureUi failure = new DsTestFailureUi();
-
-                failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(),
-                    suite.branchName(), baseBranch, baseBranchId);
-                failure.initStat(occurrence, buildTypeIdId, tcIgnited, baseBranchId, curBranchId);
+                DsTestFailureUi failure = new DsTestFailureUi()
+                        .initFromOccurrence(occurrence,
+                                tcIgnited,
+                                suite.projectId(),
+                                suite.branchName(),
+                                baseBranch,
+                                baseBranchId,
+                                curBranchId,
+                                requireParamVal);
 
                 testFailures.add(failure);
             });
 
             suite.getTopLongRunning().forEach(occurrence -> {
                 if (occurrence.getAvgDurationMs() > TimeUnit.SECONDS.toMillis(15)) {
-                    final DsTestFailureUi failure = createOrrucForLongRun(tcIgnited, compactor, suite, occurrence, baseBranch);
+                    final DsTestFailureUi failure = createOrrucForLongRun(tcIgnited, compactor, suite, occurrence, baseBranch, requireParamVal);
 
                     topLongRunning.add(failure);
                 }
@@ -303,21 +303,18 @@ public class DsSuiteUi extends ShortSuiteUi {
         return failure;
     }
 
-    @Nonnull public static DsTestFailureUi createOrrucForLongRun(ITeamcityIgnited tcIgnited,
-        IStringCompactor compactor, @Nonnull MultBuildRunCtx suite,
-        final TestCompactedMult occurrence,
-        @Nullable final String failRateBranch) {
-        final DsTestFailureUi failure = new DsTestFailureUi();
-
+    @Nonnull
+    public static DsTestFailureUi createOrrucForLongRun(ITeamcityIgnited tcIgnited,
+                                                        IStringCompactor compactor,
+                                                        @Nonnull MultBuildRunCtx suite,
+                                                        TestCompactedMult occurrence,
+                                                        @Nullable String failRateBranch,
+                                                        @Nullable Map<Integer, Integer> requireParamVal) {
         Integer baseBranchId = compactor.getStringIdIfPresent(normalizeBranch(failRateBranch));
-        Integer buildTypeIdId = suite.buildTypeIdId();
-        failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(),
-            failRateBranch, baseBranchId);
+        Integer curBranchId = compactor.getStringIdIfPresent(normalizeBranch(suite.branchName()));
 
-        failure.initStat(occurrence, buildTypeIdId, tcIgnited,  baseBranchId,
-            compactor.getStringIdIfPresent(normalizeBranch(suite.branchName())));
-
-        return failure;
+        return new DsTestFailureUi().initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(),
+                failRateBranch, baseBranchId, curBranchId, requireParamVal);
     }
 
     public void findFailureAndAddWarning(String testName, ITestLogCheckResult logCheckRes) {
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java
index a4e0458..333db5b 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java
@@ -19,6 +19,7 @@ package org.apache.ignite.tcbot.engine.ui;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -85,13 +86,17 @@ public class DsTestFailureUi extends ShortTestFailureUi {
      * @param branchName current branch name.
      * @param baseBranchName base branch name (e.g. master), without normalization.
      * @param baseBranchId Normalized base branch ID (from compactor).
+     * @param curBranchId
+     * @param requireParameters
      */
-    public void initFromOccurrence(@Nonnull final TestCompactedMult failure,
-        @Nonnull final ITeamcityIgnited tcIgn,
-        @Nullable final String projectId,
-        @Nullable final String branchName,
-        @Nullable final String baseBranchName,
-        Integer baseBranchId) {
+    public DsTestFailureUi initFromOccurrence(@Nonnull final TestCompactedMult failure,
+                                              @Nonnull final ITeamcityIgnited tcIgn,
+                                              @Nullable final String projectId,
+                                              @Nullable final String branchName,
+                                              @Nullable final String baseBranchName,
+                                              Integer baseBranchId,
+                                              @Nullable Integer curBranchId,
+                                              @Nullable Map<Integer, Integer> requireParameters) {
         success = !failure.isFailedButNotMuted();
 
         investigated = failure.isInvestigated();
@@ -121,12 +126,17 @@ public class DsTestFailureUi extends ShortTestFailureUi {
             .map(ITest::getTestId)
             .filter(Objects::nonNull)
             .forEach(testNameId -> {
-                if (webUrl == null && testNameId != null)
+                if (webUrl == null)
                     webUrl = buildWebLink(tcIgn, testNameId, projectId, branchName);
 
-                if (webUrlBaseBranch == null && testNameId != null)
+                if (webUrlBaseBranch == null)
                     webUrlBaseBranch = buildWebLink(tcIgn, testNameId, projectId, baseBranchName);
             });
+
+
+        initStat(failure, tcIgn, baseBranchId, curBranchId, requireParameters);
+
+        return this;
     }
 
 
@@ -174,21 +184,23 @@ public class DsTestFailureUi extends ShortTestFailureUi {
 
     /**
      * @param occurrence
-     * @param buildTypeIdId
      * @param tcIgnited TC service as Run stat supplier.
      * @param baseBranchId Base branch: Fail rate and flakyness detection normalized branch.
      * @param curBranchNormalized Cur branch normalized.
+     * @param requireParameters
      */
-    public void initStat(TestCompactedMult occurrence, Integer buildTypeIdId, ITeamcityIgnited tcIgnited,
-        @Nullable Integer baseBranchId,
-        @Nullable Integer curBranchNormalized) {
-        final IRunHistory stat = occurrence.history(tcIgnited, baseBranchId);
+    public void initStat(TestCompactedMult occurrence,
+                         ITeamcityIgnited tcIgnited,
+                         @Nullable Integer baseBranchId,
+                         @Nullable Integer curBranchNormalized,
+                         @Nullable Map<Integer, Integer> requireParameters) {
+        final IRunHistory stat = occurrence.history(tcIgnited, baseBranchId, requireParameters);
         histBaseBranch.init(stat);
 
         IRunHistory statForProblemsDetection;
 
         if (!Objects.equals(curBranchNormalized, baseBranchId)) {
-            statForProblemsDetection = occurrence.history(tcIgnited, curBranchNormalized);
+            statForProblemsDetection = occurrence.history(tcIgnited, curBranchNormalized, requireParameters);
 
             if (statForProblemsDetection != null) {
                 histCurBranch = new DsTestHistoryUi();
@@ -205,6 +217,10 @@ public class DsTestFailureUi extends ShortTestFailureUi {
 
             if (statForProblemsDetection.detectTemplate(EventTemplates.newContributedTestFailure) != null)
                 problemRef = new DsProblemRef("Recently contributed test failure");
+
+            if (stat.isFlaky()
+                    && statForProblemsDetection.detectTemplate(EventTemplates.newFailureForFlakyTest) != null)
+                problemRef = new DsProblemRef("New failure of flaky test");
         }
     }
 
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
index 68e80cb..6515806 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
@@ -20,6 +20,7 @@ package org.apache.ignite.ci.teamcity.ignited.runhist;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import org.apache.ignite.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcignited.history.ChangesState;
 
@@ -53,6 +54,8 @@ public class Invocation {
     /** Additional (important) build Parameters, which can be used for filtering. */
     @Nullable private Map<Integer, Integer> parms;
 
+    private ParametersCompacted parameters = new ParametersCompacted();
+
     /**
      * Creates invocation.
      * @param buildId Build id.
@@ -132,4 +135,8 @@ public class Invocation {
 
         return this;
     }
+
+    public boolean containsParameters(Map<Integer, Integer> requireParameters) {
+        return false;
+    }
 }
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
index 3b86767..c93398b 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
@@ -18,20 +18,23 @@
 package org.apache.ignite.ci.teamcity.ignited.runhist;
 
 import com.google.common.base.MoreObjects;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-import javax.annotation.Nullable;
 import org.apache.ignite.tcbot.common.TcBotConst;
 import org.apache.ignite.tcignited.history.ChangesState;
 import org.apache.ignite.tcignited.history.IEventTemplate;
 import org.apache.ignite.tcignited.history.IRunHistory;
 import org.apache.ignite.tcignited.history.RunStatus;
 
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 /**
  *
  */
-public class RunHistCompacted implements  IRunHistory {
+public class RunHistCompacted implements IRunHistory {
     /** Data. */
     private InvocationData data = new InvocationData();
 
@@ -98,6 +101,21 @@ public class RunHistCompacted implements  IRunHistory {
         return data.criticalFailuresCount();
     }
 
+    @Override
+    public IRunHistory filter(Map<Integer, Integer> requireParameters) {
+        RunHistCompacted runHistCompacted = new RunHistCompacted();
+
+        Stream<Invocation> invocationStream = data.invocations().filter(
+                invocation -> invocation.containsParameters(requireParameters)
+        );
+
+        invocationStream.forEach(i -> {
+            runHistCompacted.data.add(i);
+        });
+
+        return runHistCompacted;
+    }
+
     private static int[] concatArr(int[] arr1, int[] arr2) {
         int[] arr1and2 = new int[arr1.length + arr2.length];
         System.arraycopy(arr1, 0, arr1and2, 0, arr1.length);
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
index cfd3ce4..a477a17 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
@@ -18,6 +18,7 @@ package org.apache.ignite.tcignited.history;
 
 import javax.annotation.Nullable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Test or Build run statistics.
@@ -58,4 +59,6 @@ public interface IRunHistory extends IRunStat, IRunHistSummary {
 
         return 1.0f * getFailuresCount() / runs;
     }
+
+    IRunHistory filter(Map<Integer, Integer> requireParameters);
 }