return issueService.getByKey(issueKey);
}
- public Map<String, Integer> findIssueAssignees(Map<String, Object> params) {
+ public Map<String, Long> findIssueAssignees(Map<String, Object> params) {
return issueService.findIssueAssignees(issueQueryService.createFromMap(params));
}
return aggregation;
}
- public Map<String, Integer> findIssueAssignees(IssueQuery query) {
- Map<String, Integer> result = newLinkedHashMap();
+ public Map<String, Long> findIssueAssignees(IssueQuery query) {
+ Map<String, Long> result = newLinkedHashMap();
List<FacetValue> facetValues = indexClient.get(IssueIndex.class).listAssignees(query);
for (FacetValue facetValue : facetValues) {
if ("_notAssigned_".equals(facetValue.getKey())) {
Terms aggregation = (Terms) response.getAggregations().getAsMap().get(IssueNormalizer.IssueField.ASSIGNEE.field());
List<FacetValue> facetValues = newArrayList();
for (Terms.Bucket value : aggregation.getBuckets()) {
- facetValues.add(new FacetValue(value.getKey(), (int) value.getDocCount()));
+ facetValues.add(new FacetValue(value.getKey(), value.getDocCount()));
}
- facetValues.add(new FacetValue("_notAssigned_", (int) ((InternalMissing) response.getAggregations().get("notAssigned")).getDocCount()));
+ facetValues.add(new FacetValue("_notAssigned_", ((InternalMissing) response.getAggregations().get("notAssigned")).getDocCount()));
return facetValues;
}
}
private void setSorting(IssueQuery query, SearchRequestBuilder esSearch) {
- /* integrate Query Sort */
String sortField = query.sort();
- Boolean asc = query.asc();
if (sortField != null) {
+ Boolean asc = query.asc();
List<IndexField> fields = toIndexFields(sortField);
for (IndexField field : fields) {
- FieldSortBuilder sort = SortBuilders.fieldSort(field.sortField());
+ FieldSortBuilder sortBuilder = SortBuilders.fieldSort(field.sortField());
if (asc != null && asc) {
- sort.order(SortOrder.ASC);
+ sortBuilder.order(SortOrder.ASC);
} else {
- sort.order(SortOrder.DESC);
+ sortBuilder.order(SortOrder.DESC);
}
- esSearch.addSort(sort);
+ esSearch.addSort(sortBuilder);
}
} else {
esSearch.addSort(IssueNormalizer.IssueField.ISSUE_UPDATED_AT.sortField(), SortOrder.DESC);
public static final IndexField ASSIGNEE = addSortable(IndexField.Type.STRING, "assignee");
public static final IndexField ATTRIBUTES = add(IndexField.Type.STRING, "attributes");
public static final IndexField AUTHOR_LOGIN = add(IndexField.Type.STRING, "authorLogin");
- public static final IndexField DEBT = add(IndexField.Type.NUMERIC, "debt");
- public static final IndexField EFFORT = add(IndexField.Type.NUMERIC, "effort");
+ public static final IndexField DEBT = add(IndexField.Type.DOUBLE, "debt");
+ public static final IndexField EFFORT = add(IndexField.Type.DOUBLE, "effort");
public static final IndexField ISSUE_CREATED_AT = addSortable(IndexField.Type.DATE, "issueCreatedAt");
public static final IndexField ISSUE_UPDATED_AT = addSortable(IndexField.Type.DATE, "issueUpdatedAt");
public static final IndexField ISSUE_CLOSE_DATE = addSortable(IndexField.Type.DATE, "issueClosedAt");
- public static final IndexField LINE = addSortable(IndexField.Type.NUMERIC, "line");
+ public static final IndexField LINE = addSortable(IndexField.Type.INTEGER, "line");
public static final IndexField MESSAGE = add(IndexField.Type.STRING, "message");
public static final IndexField RESOLUTION = add(IndexField.Type.STRING, "resolution");
public static final IndexField REPORTER = add(IndexField.Type.STRING, "reporter");
public static final IndexField STATUS = addSortable(IndexField.Type.STRING, "status");
public static final IndexField SEVERITY = add(IndexField.Type.STRING, "severity");
- public static final IndexField SEVERITY_VALUE = addSortable(IndexField.Type.NUMERIC, "severityValue");
+ public static final IndexField SEVERITY_VALUE = addSortable(IndexField.Type.INTEGER, "severityValue");
public static final IndexField LANGUAGE = add(IndexField.Type.STRING, "language");
public static final IndexField RULE_KEY = add(IndexField.Type.STRING, "ruleKey");
public static final IndexField FILE_PATH = addSortable(IndexField.Type.STRING, "filePath");
* SQALE console.
*/
@Deprecated
- public static final IndexField ID = addSortable(IndexField.Type.NUMERIC, "id");
+ public static final IndexField ID = addSortable(IndexField.Type.DOUBLE, "id");
public static final IndexField KEY = addSortable(IndexField.Type.STRING, "key");
public static final IndexField _KEY = add(IndexField.Type.STRING, "_key");
}
public RuleQuery setSortField(@Nullable IndexField sf) {
- if (sf != null && !sf.sortable()) {
- throw new IllegalStateException("Field '" + sf.field() + "' is not sortable!");
+ if (sf != null && !sf.isSortable()) {
+ throw new IllegalStateException(String.format("Field '%s' is not sortable", sf.field()));
}
this.sortField = sf;
return this;
return mapNestedField(field);
} else if (field.type() == IndexField.Type.DATE) {
return mapDateField(field);
- } else if (field.type() == IndexField.Type.NUMERIC) {
- return mapNumericField(field);
+ } else if (field.type() == IndexField.Type.DOUBLE) {
+ return mapDoubleField(field);
+ } else if (field.type() == IndexField.Type.INTEGER) {
+ return mapIntegerField(field);
+ } else if (field.type() == IndexField.Type.LONG) {
+ return mapLongField(field);
} else if (field.type() == IndexField.Type.UUID_PATH) {
return mapUuidPathField(field);
} else {
"analyzer", "uuid_analyzer");
}
- protected Map mapNumericField(IndexField field) {
+ protected Map mapDoubleField(IndexField field) {
return ImmutableMap.of("type", "double");
}
+ protected Map mapIntegerField(IndexField field) {
+ return ImmutableMap.of("type", "integer");
+ }
+
+ protected Map mapLongField(IndexField field) {
+ return ImmutableMap.of("type", "long");
+ }
+
protected Map mapBooleanField(IndexField field) {
return ImmutableMap.of("type", "boolean");
}
protected boolean needMultiField(IndexField field) {
return (field.type() == IndexField.Type.TEXT
|| field.type() == IndexField.Type.STRING)
- && (field.sortable() || field.searchable());
- }
-
- protected Map mapSortField(IndexField field) {
- return ImmutableMap.of(
- "type", "string",
- "index", "analyzed",
- "analyzer", "sortable");
+ && (field.isSortable() || field.isSearchable());
}
protected Map mapGramsField(IndexField field) {
protected Map mapMultiField(IndexField field) {
Map<String, Object> mapping = new HashMap<String, Object>();
- if (field.sortable()) {
- mapping.put(IndexField.SORT_SUFFIX, mapSortField(field));
+ if (field.isSortable()) {
+ mapping.put(IndexField.SORT_SUFFIX, ImmutableMap.of(
+ "type", "string",
+ "index", "analyzed",
+ "analyzer", "sortable"));
}
- if (field.searchable()) {
+ if (field.isSearchable()) {
if (field.type() != IndexField.Type.TEXT) {
mapping.put(IndexField.SEARCH_PARTIAL_SUFFIX, mapGramsField(field));
}
Multimap<String, FacetValue> stats = ArrayListMultimap.create();
if (aggregations != null) {
for (Aggregation aggregation : aggregations.asList()) {
- if (aggregation.getClass().isAssignableFrom(StringTerms.class)) {
+ if (aggregation instanceof StringTerms) {
for (Terms.Bucket value : ((Terms) aggregation).getBuckets()) {
-
- FacetValue facetValue = new FacetValue(value.getKey(), (int) value.getDocCount());
- facetValue.setSubFacets(processAggregations(value.getAggregations()));
+ FacetValue facetValue = new FacetValue(value.getKey(), value.getDocCount());
stats.put(aggregation.getName(), facetValue);
}
- } else if (aggregation.getClass().isAssignableFrom(InternalValueCount.class)) {
+ } else if (aggregation instanceof InternalValueCount) {
InternalValueCount count = (InternalValueCount) aggregation;
- FacetValue facetValue = new FacetValue(count.getName(), (int) count.getValue());
+ FacetValue facetValue = new FacetValue(count.getName(), count.getValue());
stats.put(count.getName(), facetValue);
}
}
*/
package org.sonar.server.search;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-
public class FacetValue {
- private String key;
- private Integer value;
- private Multimap<String, FacetValue> subFacets;
+ private final String key;
+ private final long value;
- public FacetValue(String key, Integer value){
+ public FacetValue(String key, long value) {
this.key = key;
this.value = value;
- this.subFacets = ArrayListMultimap.create();
}
public String getKey() {
return key;
}
- public FacetValue setKey(String key) {
- this.key = key;
- return this;
- }
-
- public Integer getValue() {
+ public long getValue() {
return value;
}
- public FacetValue setValue(Integer value) {
- this.value = value;
- return this;
- }
-
- public Multimap<String, FacetValue> getSubFacets() {
- return subFacets;
- }
-
- public FacetValue setSubFacets(Multimap<String, FacetValue> subFacets) {
- this.subFacets = subFacets;
- return this;
- }
-
@Override
- public boolean equals(Object other) {
- return EqualsBuilder.reflectionEquals(this, other);
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ FacetValue that = (FacetValue) o;
+ if (key != null ? !key.equals(that.key) : that.key != null) {
+ return false;
+ }
+ return true;
}
@Override
public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
+ return key != null ? key.hashCode() : 0;
}
}
public class IndexField {
public static enum Type {
- STRING, TEXT, DATE, BOOLEAN, NUMERIC, OBJECT, UUID_PATH
+ STRING, TEXT, DATE, BOOLEAN, INTEGER, LONG, DOUBLE, OBJECT, UUID_PATH
}
public static final String SORT_SUFFIX = "sort";
this.nestedFields = nestedFields;
}
- public boolean sortable() {
+ public boolean isSortable() {
return sortable;
}
- public IndexField sortable(boolean b) {
+ public IndexField setSortable(boolean b) {
this.sortable = b;
return this;
}
- public boolean searchable() {
+ public boolean isSearchable() {
return searchable;
}
- public IndexField searchable(boolean b) {
+ public IndexField setSearchable(boolean b) {
this.searchable = b;
return this;
}
}
public Collection<IndexField> nestedFields() {
- return this.nestedFields;
+ return nestedFields;
}
public String sortField() {
- if (this.sortable()) {
+ if (isSortable()) {
return this.field + ((type == IndexField.Type.TEXT
|| type == IndexField.Type.STRING) ? "." + IndexField.SORT_SUFFIX : "");
} else {
- throw new IllegalStateException("Cannot sort on field (Field is not sortable)");
+ throw new IllegalStateException("Field is not sortable: " + field);
}
}
import java.util.HashSet;
import java.util.Set;
-/**
- * @since 4.4
- */
public class Indexable {
private static final Set<IndexField> ALL_FIELDS = new HashSet<IndexField>();
public static IndexField addSearchable(IndexField.Type type, String field){
IndexField indexField = new IndexField(type, field)
- .searchable(true);
+ .setSearchable(true);
ALL_FIELDS.add(indexField);
return indexField;
}
public static IndexField addSortableAndSearchable(IndexField.Type type, String field) {
IndexField indexField = new IndexField(type, field)
- .searchable(true)
- .sortable(true);
+ .setSearchable(true)
+ .setSortable(true);
ALL_FIELDS.add(indexField);
return indexField;
}
public static IndexField addSortable(IndexField.Type type, String field){
IndexField indexField = new IndexField(type, field)
- .sortable(true);
+ .setSortable(true);
ALL_FIELDS.add(indexField);
return indexField;
}
private void processAggregation(Aggregation aggregation) {
if (Missing.class.isAssignableFrom(aggregation.getClass())) {
Missing missing = (Missing) aggregation;
- int docCount = (int) missing.getDocCount();
- if (docCount > 0) {
+ long docCount = missing.getDocCount();
+ if (docCount > 0L) {
this.facets.put(aggregation.getName().replace("_missing",""), new FacetValue("", docCount));
}
} else if (Terms.class.isAssignableFrom(aggregation.getClass())) {
Terms termAggregation = (Terms) aggregation;
for (Terms.Bucket value : termAggregation.getBuckets()) {
- this.facets.put(aggregation.getName().replace("_selected",""), new FacetValue(value.getKey(), (int) value.getDocCount()));
+ this.facets.put(aggregation.getName().replace("_selected",""), new FacetValue(value.getKey(), value.getDocCount()));
}
} else if (HasAggregations.class.isAssignableFrom(aggregation.getClass())) {
HasAggregations hasAggregations = (HasAggregations) aggregation;
IssueTesting.newDto(rule, file, project).setAssignee("steph"));
session.commit();
- Map<String, Integer> results = service.findIssueAssignees(IssueQuery.builder().build());
+ Map<String, Long> results = service.findIssueAssignees(IssueQuery.builder().build());
assertThat(results).hasSize(3);
- assertThat(results.get("steph")).isEqualTo(2);
- assertThat(results.get("simon")).isEqualTo(1);
- assertThat(results.get(null)).isEqualTo(1);
+ assertThat(results.get("steph")).isEqualTo(2L);
+ assertThat(results.get("simon")).isEqualTo(1L);
+ assertThat(results.get(null)).isEqualTo(1L);
assertThat(results.keySet().toArray()[0]).isEqualTo("steph");
assertThat(results.keySet().toArray()[1]).isEqualTo("simon");
public class RuleIndexMediumTest extends SearchMediumTest {
-
RuleDao dao = tester.get(RuleDao.class);
RuleIndex index = tester.get(RuleIndex.class);
-
@Test
public void getByKey() throws InterruptedException {
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("javascript", "S001"));
assertThat(rule.htmlDescription()).isEqualTo(ruleDto.getDescription());
assertThat(rule.key()).isEqualTo(ruleDto.getKey());
- // TODO
- // assertThat(rule.debtSubCharacteristicKey())
- // .isEqualTo(ruleDto.getDefaultSubCharacteristicId().toString());
assertThat(rule.debtRemediationFunction().type().name())
.isEqualTo(ruleDto.getRemediationFunction());
new RuleQuery().setSortField(RuleNormalizer.RuleField.LANGUAGE);
fail();
} catch (IllegalStateException e) {
- assertThat(e.getMessage()).isEqualTo("Field 'lang' is not sortable!");
+ assertThat(e).hasMessage("Field 'lang' is not sortable");
}
}