import org.sonar.server.search.SearchQuery;
import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
/**
* Fill search index with rules
profiler.start("Index rules");
searchIndex.bulkIndex(INDEX_RULES, TYPE_RULE, ids, docs);
profiler.stop();
+
+ List<String> indexIds = searchIndex.findDocumentIds(SearchQuery.create().index(INDEX_RULES).type(TYPE_RULE));
+ indexIds.removeAll(Arrays.asList(ids));
+ if (! indexIds.isEmpty()) {
+ profiler.start("Remove deleted rule documents");
+ searchIndex.bulkDelete(INDEX_RULES, TYPE_RULE, indexIds.toArray(new String[0]));
+ }
}
private XContentBuilder ruleDocument(RuleDto rule, Collection<RuleParamDto> params) throws IOException {
return result;
}
+ public void bulkDelete(String index, String type, String[] ids) {
+ BulkRequestBuilder builder = new BulkRequestBuilder(client);
+ for (int i=0; i<ids.length; i++) {
+ builder.add(client.prepareDelete(index, type, ids[i]));
+ }
+ TimeProfiler profiler = newDebugProfiler();
+ try {
+ profiler.start(format("bulk delete of %d documents with type '%s' from index '%s'", ids.length, type, index));
+ BulkResponse bulkResponse = client.bulk(builder.setRefresh(true).request()).get();
+ if (bulkResponse.hasFailures()) {
+ for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) {
+ if(bulkItemResponse.isFailed()) {
+ int itemId = bulkItemResponse.getItemId();
+ client.prepareDelete(index, type, ids[itemId]).execute().actionGet();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ LOG.error("Interrupted during bulk operation", e);
+ } catch (ExecutionException e) {
+ LOG.error("Execution of bulk operation failed", e);
+ } finally {
+ profiler.stop();
+ }
+ }
+
private TimeProfiler newDebugProfiler() {
TimeProfiler profiler = new TimeProfiler();
profiler.setLogger(LOG);
return profiler;
}
-
}
}
@Test
- public void should_throw_when_problem_on_index() {
+ public void should_update_existing_rules_and_forget_deleted_rules() {
+ long ruleId1 = 1L;
+ RuleDto rule1 = new RuleDto();
+ rule1.setRepositoryKey("xoo");
+ rule1.setRuleKey("key1");
+ rule1.setId(ruleId1);
+ long ruleId2 = 2L;
+ RuleDto rule2 = new RuleDto();
+ rule2.setRepositoryKey("xoo");
+ rule2.setRuleKey("key2");
+ rule2.setId(ruleId2);
+ rule2.setParentId(ruleId1);
+ List<RuleDto> rules = ImmutableList.of(rule1, rule2);
+
+ when(ruleDao.selectNonManual()).thenReturn(rules);
+ registry.bulkRegisterRules();
+ assertThat(registry.findIds(ImmutableMap.of("repositoryKey", "xoo")))
+ .hasSize(2)
+ .containsOnly((int) ruleId1, (int) ruleId2);
}
}