]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6137 Use min value from issues when createdAfter is not specified
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Tue, 3 Feb 2015 14:23:55 +0000 (15:23 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 4 Feb 2015 14:14:29 +0000 (15:14 +0100)
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java

index 443ab87c1917aa8b0883f94f3bc0c799b669e684..0710cf444f3a17ac1378132278ee72c5a77c1101 100644 (file)
@@ -39,6 +39,7 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
 import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
+import org.elasticsearch.search.aggregations.metrics.min.Min;
 import org.joda.time.Duration;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.rule.Severity;
@@ -177,8 +178,17 @@ public class IssueIndex extends BaseIndex<Issue, FakeIssueDto, String> {
     setPagination(options, esSearch);
 
     QueryBuilder esQuery = QueryBuilders.matchAllQuery();
-    BoolFilterBuilder esFilter = FilterBuilders.boolFilter();
     Map<String, FilterBuilder> filters = getFilters(query, options);
+    setQueryFilter(esSearch, esQuery, filters);
+
+    setFacets(query, options, filters, esQuery, esSearch);
+
+    SearchResponse response = esSearch.get();
+    return new Result<>(this, response);
+  }
+
+  protected void setQueryFilter(SearchRequestBuilder esSearch, QueryBuilder esQuery, Map<String, FilterBuilder> filters) {
+    BoolFilterBuilder esFilter = FilterBuilders.boolFilter();
     for (FilterBuilder filter : filters.values()) {
       if (filter != null) {
         esFilter.must(filter);
@@ -190,11 +200,6 @@ public class IssueIndex extends BaseIndex<Issue, FakeIssueDto, String> {
     } else {
       esSearch.setQuery(esQuery);
     }
-
-    setFacets(query, options, filters, esQuery, esSearch);
-
-    SearchResponse response = esSearch.get();
-    return new Result<>(this, response);
   }
 
   private BoolFilterBuilder getFilter(IssueQuery query, QueryContext options) {
@@ -551,7 +556,7 @@ public class IssueIndex extends BaseIndex<Issue, FakeIssueDto, String> {
     String timeZoneString = tzFormat.format(now);
 
     Interval bucketSize = Interval.YEAR;
-    long startTime = query.createdAfter() == null ? 0L : query.createdAfter().getTime();
+    long startTime = query.createdAfter() == null ? getMinCreatedAt(filters, esQuery) : query.createdAfter().getTime();
     long endTime = query.createdBefore() == null ? now.getTime() : query.createdBefore().getTime();
     Duration timeSpan = new Duration(startTime, endTime);
     if (timeSpan.isShorterThan(TWENTY_DAYS)) {
@@ -572,6 +577,18 @@ public class IssueIndex extends BaseIndex<Issue, FakeIssueDto, String> {
       .postZone(timeZoneString);
   }
 
+  private long getMinCreatedAt(Map<String, FilterBuilder> filters, QueryBuilder esQuery) {
+    String facetNameAndField = IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT;
+    SearchRequestBuilder minCount = getClient()
+      .prepareSearch(IssueIndexDefinition.INDEX)
+      .setTypes(IssueIndexDefinition.TYPE_ISSUE)
+      .setSearchType(SearchType.COUNT);
+    setQueryFilter(minCount, esQuery, filters);
+    minCount.addAggregation(AggregationBuilders.min(facetNameAndField).field(facetNameAndField));
+    Min minValue = minCount.get().getAggregations().get(facetNameAndField);
+    return Double.valueOf(minValue.getValue()).longValue();
+  }
+
   private void setSorting(IssueQuery query, SearchRequestBuilder esRequest) {
     String sortField = query.sort();
     if (sortField != null) {
index b0b1bd04191c0d31c1fc632032433d33b827b0cb..c56a971ae2ace4c1ec829000959872297b85b716 100644 (file)
@@ -708,6 +708,17 @@ public class IssueIndexMediumTest {
         new FacetValue("2013-01-01T04:00:00+0000", 0),
         new FacetValue("2014-01-01T04:00:00+0000", 5),
         new FacetValue("2015-01-01T04:00:00+0000", 1));
+
+    // createdAfter not set: taking min value
+    createdAt = index.search(IssueQuery.builder().createdBefore(DateUtils.parseDate("2016-01-01")).build(),
+      queryContext).getFacets().get("createdAt");
+    assertThat(createdAt).hasSize(5)
+      .containsOnly(
+        new FacetValue("2011-01-01T04:00:00+0000", 1),
+        new FacetValue("2012-01-01T04:00:00+0000", 0),
+        new FacetValue("2013-01-01T04:00:00+0000", 0),
+        new FacetValue("2014-01-01T04:00:00+0000", 5),
+        new FacetValue("2015-01-01T04:00:00+0000", 1));
   }
 
   @Test