diegoceccarelli commented on a change in pull request #300: SOLR-11831: Skip
second grouping step if group.limit is 1 (aka Las Vegas Patch)
URL: https://github.com/apache/lucene-solr/pull/300#discussion_r295265453
##########
File path:
solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
##########
@@ -80,50 +106,120 @@ public NamedList transform(List<Command> data) throws
IOException {
final NamedList<List<Comparable>> rawSearchGroups =
(NamedList<List<Comparable>>) topGroupsAndGroupCount.get(TOP_GROUPS);
if (rawSearchGroups != null) {
for (Map.Entry<String, List<Comparable>> rawSearchGroup :
rawSearchGroups){
- SearchGroup<BytesRef> searchGroup = new SearchGroup<>();
- SchemaField groupField = rawSearchGroup.getKey() != null?
searcher.getSchema().getFieldOrNull(command.getKey()) : null;
- searchGroup.groupValue = null;
- if (rawSearchGroup.getKey() != null) {
- if (groupField != null) {
- BytesRefBuilder builder = new BytesRefBuilder();
- groupField.getType().readableToIndexed(rawSearchGroup.getKey(),
builder);
- searchGroup.groupValue = builder.get();
- } else {
- searchGroup.groupValue = new BytesRef(rawSearchGroup.getKey());
- }
- }
- searchGroup.sortValues = rawSearchGroup.getValue().toArray(new
Comparable[rawSearchGroup.getValue().size()]);
- for (int i = 0; i < searchGroup.sortValues.length; i++) {
- SchemaField field = groupSort.getSort()[i].getField() != null ?
searcher.getSchema().getFieldOrNull(groupSort.getSort()[i].getField()) : null;
- searchGroup.sortValues[i] =
ShardResultTransformerUtils.unmarshalSortValue(searchGroup.sortValues[i],
field);
- }
- searchGroups.add(searchGroup);
+ searchGroups.add(deserializeOneSearchGroup(command.getKey(),
groupSort, rawSearchGroup.getKey(), rawSearchGroup.getValue()));
}
}
-
final Integer groupCount = (Integer)
topGroupsAndGroupCount.get(GROUP_COUNT);
result.put(command.getKey(), new
SearchGroupsFieldCommandResult(groupCount, searchGroups));
}
return result;
}
- private NamedList serializeSearchGroup(Collection<SearchGroup<BytesRef>>
data, SearchGroupsFieldCommand command) {
- final NamedList<Object[]> result = new NamedList<>(data.size());
+ public static class DefaultSearchResultResultTransformer extends
SearchGroupsResultTransformer {
- for (SearchGroup<BytesRef> searchGroup : data) {
+ public DefaultSearchResultResultTransformer(SolrIndexSearcher searcher) {
+ super(searcher);
+ }
+
+ // given a raw search group will return its array sort values.
+ protected Object[] getSortValues(Object groupDocs){
+ List docs = (List<Comparable>)groupDocs;
+ return docs.toArray(new Comparable[docs.size()]);
+ }
+
+ @Override
+ protected SearchGroup<BytesRef> deserializeOneSearchGroup(String
groupField, Sort groupSort, String groupKey, Object rawSearchGroup){
+ SearchGroup<BytesRef> searchGroup = new SearchGroup<>();
+ SchemaField schemaGroupField = groupKey != null?
searcher.getSchema().getFieldOrNull(groupField) : null;
+ searchGroup.groupValue = null;
+ if (groupKey != null) {
+ if (schemaGroupField != null) {
+ BytesRefBuilder builder = new BytesRefBuilder();
+ schemaGroupField.getType().readableToIndexed(groupKey, builder);
+ searchGroup.groupValue = builder.get();
+ } else {
+ searchGroup.groupValue = new BytesRef(groupKey);
+ }
+ }
+ searchGroup.sortValues = getSortValues(rawSearchGroup);
+ for (int i = 0; i < searchGroup.sortValues.length; i++) {
+ final String sortField = groupSort.getSort()[i].getField();
+ SchemaField field = sortField != null ?
searcher.getSchema().getFieldOrNull(sortField) : null;
+ searchGroup.sortValues[i] =
ShardResultTransformerUtils.unmarshalSortValue(searchGroup.sortValues[i],
field);
+ }
+ return searchGroup;
+ }
+
+ @Override
+ protected Object serializeOneSearchGroup(SearchGroup<BytesRef>
searchGroup, SearchGroupsFieldCommand command) {
Object[] convertedSortValues = new Object[searchGroup.sortValues.length];
for (int i = 0; i < searchGroup.sortValues.length; i++) {
Object sortValue = searchGroup.sortValues[i];
SchemaField field = command.getGroupSort().getSort()[i].getField() !=
null ?
searcher.getSchema().getFieldOrNull(command.getGroupSort().getSort()[i].getField())
: null;
convertedSortValues[i] =
ShardResultTransformerUtils.marshalSortValue(sortValue, field);
}
- SchemaField field =
searcher.getSchema().getFieldOrNull(command.getKey());
- String groupValue = searchGroup.groupValue != null ?
field.getType().indexedToReadable(searchGroup.groupValue, new
CharsRefBuilder()).toString() : null;
- result.add(groupValue, convertedSortValues);
+ return convertedSortValues;
}
-
- return result;
}
-}
+ public static class SkipSecondStepSearchResultResultTransformer extends
DefaultSearchResultResultTransformer {
+
+ private static final String TOP_DOC_SOLR_ID_KEY = "topDocSolrId";
+ private static final String TOP_DOC_SCORE_KEY = "topDocScore";
+ private static final String SORTVALUES_KEY = "sortValues";
+
+ public SkipSecondStepSearchResultResultTransformer(SolrIndexSearcher
searcher) {
+ super(searcher);
+ }
+
+ @Override
+ protected Object[] getSortValues(Object groupDocs){
+ NamedList<Object> groupInfo = (NamedList) groupDocs;
+ final ArrayList<?> sortValues =
(ArrayList<?>)groupInfo.get(SORTVALUES_KEY);
+ return sortValues.toArray(new Comparable[sortValues.size()]);
+ }
+
+ @Override
+ protected SearchGroup<BytesRef> deserializeOneSearchGroup(String
groupField, Sort groupSort, String groupKey, Object groupDocs){
+ SearchGroup<BytesRef> searchGroup =
super.deserializeOneSearchGroup(groupField, groupSort, groupKey, groupDocs);
+ NamedList<Object> groupInfo = (NamedList) groupDocs;
+ searchGroup.topDocLuceneId = DocIdSetIterator.NO_MORE_DOCS;
+ searchGroup.topDocScore = (float) groupInfo.get(TOP_DOC_SCORE_KEY);
+ searchGroup.topDocSolrId = groupInfo.get(TOP_DOC_SOLR_ID_KEY);
+ return searchGroup;
+ }
+
+ @Override
+ protected Object serializeOneSearchGroup(SearchGroup<BytesRef>
searchGroup, SearchGroupsFieldCommand command) {
Review comment:
Thanks 108faf8d28b7f6ba53359d76d889aedb33eb34a0, I think that `NamedList(5)`
was due to a previous solution that was using 5 fields, I just used the empty
constructor for simplicity.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]