]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5953 Fix stickyness of facets in non-contextualized mode
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 28 Jan 2015 13:42:33 +0000 (14:42 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 28 Jan 2015 15:45:07 +0000 (16:45 +0100)
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java
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
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_non_sticky_project_facet.json [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_sticky_project_facet.json [new file with mode: 0644]

index 1e8f18d2c07360d3e2101194fd9656064d7ccc24..dea020a2f4141b16971bd95765250fef83a89f44 100644 (file)
@@ -80,6 +80,7 @@ public class IssueQuery {
   private final String sort;
   private final Boolean asc;
   private final Boolean ignorePaging;
+  private final Boolean contextualized;
 
   private IssueQuery(Builder builder) {
     this.issueKeys = defaultCollection(builder.issueKeys);
@@ -109,6 +110,7 @@ public class IssueQuery {
     this.sort = builder.sort;
     this.asc = builder.asc;
     this.ignorePaging = builder.ignorePaging;
+    this.contextualized = builder.contextualized;
   }
 
   public Collection<String> issueKeys() {
@@ -233,6 +235,11 @@ public class IssueQuery {
     return ignorePaging;
   }
 
+  @CheckForNull
+  public Boolean isContextualized() {
+    return contextualized;
+  }
+
   @Override
   public String toString() {
     return ReflectionToStringBuilder.toString(this);
@@ -270,6 +277,7 @@ public class IssueQuery {
     private String sort;
     private Boolean asc = false;
     private Boolean ignorePaging = false;
+    private boolean contextualized;
 
     private Builder() {
     }
@@ -442,6 +450,11 @@ public class IssueQuery {
       this.ignorePaging = ignorePaging;
       return this;
     }
+
+    public Builder setContextualized(boolean b) {
+      this.contextualized = b;
+      return this;
+    }
   }
 
   private static <T> Collection<T> defaultCollection(@Nullable Collection<T> c) {
index bf187e33e9a7fe550cdfc21442dbd1de67145c64..e44236e77f4c8b250e4f9454b8947d0604743b2e 100644 (file)
@@ -198,8 +198,10 @@ public class IssueQueryService implements ServerComponent {
     }
 
     if (allComponentUuids.isEmpty()) {
+      builder.setContextualized(false);
       addComponentsBelowView(builder, session, projects, projectUuids, moduleUuids, directories, fileUuids);
     } else {
+      builder.setContextualized(true);
 
       Set<String> qualifiers = componentService.getDistinctQualifiers(session, allComponentUuids);
       if (qualifiers.isEmpty()) {
index 4f3d41e89ebbbdf36239bcb2f0eb1f256b7a54cf..a29be783eb0cd286e1665fbddc242531d1dff876 100644 (file)
@@ -267,24 +267,31 @@ public class IssueIndex extends BaseIndex<Issue, FakeIssueDto, String> {
     FilterBuilder fileFilter = matchFilter(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, query.fileUuids());
     FilterBuilder componentFilter = matchFilter(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, query.componentUuids());
 
-    if (projectFilter != null) {
-      filters.put(FILTER_COMPONENT_ROOT, projectFilter);
-      filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, moduleFilter);
-      filters.put(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, directoryFilter);
-      filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
-    } else if (moduleRootFilter != null) {
-      filters.put(FILTER_COMPONENT_ROOT, moduleRootFilter);
+    if (BooleanUtils.isTrue(query.isContextualized())) {
+      if (projectFilter != null) {
+        filters.put(FILTER_COMPONENT_ROOT, projectFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, moduleFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, directoryFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
+      } else if (moduleRootFilter != null) {
+        filters.put(FILTER_COMPONENT_ROOT, moduleRootFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, moduleFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, directoryFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
+      } else if (directoryRootFilter != null) {
+        filters.put(FILTER_COMPONENT_ROOT, directoryRootFilter);
+        filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
+      } else if (fileFilter != null) {
+        filters.put(FILTER_COMPONENT_ROOT, fileFilter);
+      } else if (componentFilter != null) {
+        // Last resort, when component type is unknown
+        filters.put(FILTER_COMPONENT_ROOT, componentFilter);
+      }
+    } else {
+      filters.put(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, projectFilter);
       filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, moduleFilter);
       filters.put(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, directoryFilter);
       filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
-    } else if (directoryRootFilter != null) {
-      filters.put(FILTER_COMPONENT_ROOT, directoryRootFilter);
-      filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, fileFilter);
-    } else if (fileFilter != null) {
-      filters.put(FILTER_COMPONENT_ROOT, fileFilter);
-    } else if (componentFilter != null) {
-      // Last resort, when component type is unknown
-      filters.put(FILTER_COMPONENT_ROOT, componentFilter);
     }
   }
 
index 42d26c9717fbe37c719473e8ab1172a79f388e1c..0fc89a0186d8731cbd5c4494faae8b8a5c2f1be7 100644 (file)
@@ -56,7 +56,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class IssueIndexMediumTest {
 
   @ClassRule
-  public static ServerTester tester = new ServerTester();
+  public static ServerTester tester = new ServerTester().setProperty("sonar.log.profilingLevel", "FULL").setProperty("sonar.search.httpPort", "9999");
 
   IssueIndex index;
 
@@ -186,7 +186,7 @@ public class IssueIndexMediumTest {
   }
 
   @Test
-  public void filter_by_components() throws Exception {
+  public void filter_by_components_on_contextualized_search() throws Exception {
     ComponentDto project = ComponentTesting.newProjectDto();
     ComponentDto module = ComponentTesting.newModuleDto(project);
     ComponentDto subModule = ComponentTesting.newModuleDto(module);
@@ -202,12 +202,43 @@ public class IssueIndexMediumTest {
       IssueTesting.newDoc("ISSUE5", subModule),
       IssueTesting.newDoc("ISSUE6", file3));
 
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new QueryContext()).getHits()).hasSize(3);
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid())).build(), new QueryContext()).getHits()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().moduleRootUuids(newArrayList(subModule.uuid())).build(), new QueryContext()).getHits()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().moduleRootUuids(newArrayList(module.uuid())).build(), new QueryContext()).getHits()).hasSize(4);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new QueryContext()).getHits()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new QueryContext())
+      .getHits()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).fileUuids(newArrayList(file1.uuid())).build(), new QueryContext())
+      .getHits()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).moduleRootUuids(newArrayList(subModule.uuid())).build(), new QueryContext())
+      .getHits()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).moduleRootUuids(newArrayList(module.uuid())).build(), new QueryContext())
+      .getHits()).hasSize(4);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).projectUuids(newArrayList(project.uuid())).build(), new QueryContext())
+      .getHits()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder().setContextualized(true).projectUuids(newArrayList("unknown")).build(), new QueryContext())
+      .getHits()).isEmpty();
+  }
+
+  @Test
+  public void filter_by_components_on_non_contextualized_search() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("project");
+    ComponentDto file1 = ComponentTesting.newFileDto(project, "file1");
+    ComponentDto module = ComponentTesting.newModuleDto(project).setUuid("module");
+    ComponentDto file2 = ComponentTesting.newFileDto(module, "file2");
+    ComponentDto subModule = ComponentTesting.newModuleDto(module).setUuid("subModule");
+    ComponentDto file3 = ComponentTesting.newFileDto(subModule, "file3");
+
+    indexIssues(
+      IssueTesting.newDoc("ISSUE1", project),
+      IssueTesting.newDoc("ISSUE2", file1),
+      IssueTesting.newDoc("ISSUE3", module),
+      IssueTesting.newDoc("ISSUE4", file2),
+      IssueTesting.newDoc("ISSUE5", subModule),
+      IssueTesting.newDoc("ISSUE6", file3));
+
     assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList("unknown")).build(), new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new QueryContext()).getHits()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder().moduleUuids(newArrayList(module.uuid())).build(), new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder().moduleUuids(newArrayList(subModule.uuid())).build(), new QueryContext()).getHits()).hasSize(1); // XXX Misleading !
+    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid())).build(), new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new QueryContext()).getHits()).hasSize(3);
   }
 
   @Test
index 8ed37efe1c5387277b6f80ead1dd2e8b3d9b7aef..39abbf50bb46445e460fb441084cf6411dedf655 100644 (file)
@@ -130,6 +130,38 @@ public class SearchActionComponentsMediumTest {
       .assertJson(this.getClass(), "no_issue.json", false);
   }
 
+  @Test
+  public void project_facet_is_sticky_when_non_contextualized() throws Exception {
+    ComponentDto project1 = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject1"));
+    ComponentDto project2 = insertComponent(ComponentTesting.newProjectDto("BCDE").setKey("MyProject2"));
+    ComponentDto project3 = insertComponent(ComponentTesting.newProjectDto("CDEF").setKey("MyProject3"));
+    setDefaultProjectPermission(project1);
+    setDefaultProjectPermission(project2);
+    setDefaultProjectPermission(project3);
+    ComponentDto file1 = insertComponent(ComponentTesting.newFileDto(project1, "FEDC").setKey("MyComponent1"));
+    ComponentDto file2 = insertComponent(ComponentTesting.newFileDto(project2, "EDCB").setKey("MyComponent2"));
+    ComponentDto file3 = insertComponent(ComponentTesting.newFileDto(project3, "DCBA").setKey("MyComponent3"));
+    RuleDto rule = newRule();
+    IssueDto issue1 = IssueTesting.newDto(rule, file1, project1).setKee("82fd47d4-b650-4037-80bc-7b112bd4eac2");
+    IssueDto issue2 = IssueTesting.newDto(rule, file2, project2).setKee("2bd4eac2-b650-4037-80bc-7b1182fd47d4");
+    IssueDto issue3 = IssueTesting.newDto(rule, file3, project3).setKee("7b1182fd-b650-4037-80bc-82fd47d4eac2");
+    db.issueDao().insert(session, issue1, issue2, issue3);
+    session.commit();
+    tester.get(IssueIndexer.class).indexAll();
+
+    wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
+      .setParam(IssueFilterParameters.PROJECT_UUIDS, project1.uuid())
+      .setParam(SearchAction.PARAM_FACETS, "projectUuids")
+      .execute()
+      .assertJson(this.getClass(), "display_sticky_project_facet.json", false);
+
+    wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
+      .setParam(IssueFilterParameters.COMPONENT_UUIDS, project1.uuid())
+      .setParam(SearchAction.PARAM_FACETS, "projectUuids")
+      .execute()
+      .assertJson(this.getClass(), "display_non_sticky_project_facet.json", false);
+  }
+
   @Test
   public void search_by_file_uuid() throws Exception {
     ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject"));
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_non_sticky_project_facet.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_non_sticky_project_facet.json
new file mode 100644 (file)
index 0000000..78cb166
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "total": 1,
+  "p": 1,
+  "projects": [
+    { "key": "MyProject1" }
+  ],
+  "components": [
+    { "key": "MyProject1" },
+    { "key": "MyComponent1" }
+  ],
+  "issues": [
+    {
+      "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
+      "component": "MyComponent1",
+      "project": "MyProject1",
+      "rule": "xoo:x1"
+    }
+  ],
+  "facets": [
+    {
+      "property": "projectUuids",
+      "values": [
+        {
+          "val": "ABCD",
+          "count": 1
+        }
+      ]
+    }
+  ]
+}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_sticky_project_facet.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionComponentsMediumTest/display_sticky_project_facet.json
new file mode 100644 (file)
index 0000000..99d1729
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "total": 1,
+  "p": 1,
+  "projects": [
+    { "key": "MyProject1" },
+    { "key": "MyProject2" },
+    { "key": "MyProject3" }
+  ],
+  "components": [
+    { "key": "MyProject1" },
+    { "key": "MyProject2" },
+    { "key": "MyProject3" },
+    { "key": "MyComponent1" }
+  ],
+  "issues": [
+    {
+      "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
+      "component": "MyComponent1",
+      "project": "MyProject1",
+      "rule": "xoo:x1"
+    }
+  ],
+  "facets": [
+    {
+      "property": "projectUuids",
+      "values": [
+        {
+          "val": "ABCD",
+          "count": 1
+        },
+        {
+          "val": "BCDE",
+          "count": 1
+        },
+        {
+          "val": "CDEF",
+          "count": 1
+        }
+      ]
+    }
+  ]
+}