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);
this.sort = builder.sort;
this.asc = builder.asc;
this.ignorePaging = builder.ignorePaging;
+ this.contextualized = builder.contextualized;
}
public Collection<String> issueKeys() {
return ignorePaging;
}
+ @CheckForNull
+ public Boolean isContextualized() {
+ return contextualized;
+ }
+
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
private String sort;
private Boolean asc = false;
private Boolean ignorePaging = false;
+ private boolean contextualized;
private Builder() {
}
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) {
}
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()) {
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);
}
}
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;
}
@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);
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
.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"));
--- /dev/null
+{
+ "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
+ }
+ ]
+ }
+ ]
+}
--- /dev/null
+{
+ "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
+ }
+ ]
+ }
+ ]
+}