Skip to content

Commit 66c78b5

Browse files
committed
Changed neighbor item list to use the default sort order
1 parent 8e3181a commit 66c78b5

File tree

2 files changed

+65
-148
lines changed

2 files changed

+65
-148
lines changed

access-common/src/main/java/edu/unc/lib/dl/ui/service/SolrQueryLayerService.java

+51-138
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ public class SolrQueryLayerService extends SolrSearchService {
7777
protected SearchStateFactory searchStateFactory;
7878
protected PID collectionsPid;
7979
protected ObjectPathFactory pathFactory;
80+
81+
private static int NEIGHBOR_SEEK_PAGE_SIZE = 500;
8082

8183
/**
8284
* Returns a list of the most recently added items in the collection
@@ -338,152 +340,63 @@ public List<BriefObjectMetadataBean> getNeighboringItems(BriefObjectMetadataBean
338340

339341
facetFieldUtil.addToSolrQuery(ancestorPath, solrQuery);
340342
}
341-
342-
// If this item has no display order, get arbitrary items surrounding it.
343-
344-
Long pivotOrder = metadata.getDisplayOrder();
345-
346-
if (pivotOrder == null) {
347-
348-
LOG.debug("No display order, just querying for " + windowSize + " siblings");
349-
350-
StringBuilder query = new StringBuilder();
351-
352-
List<BriefObjectMetadataBean> list = null;
353-
354-
query.append("*:*");
355-
query.append(accessRestrictionClause);
356-
solrQuery.setQuery(query.toString());
357-
358-
solrQuery.setStart(0);
359-
solrQuery.setRows(windowSize);
360-
361-
solrQuery.setSort(solrSettings.getFieldName(SearchFieldKeys.DISPLAY_ORDER.name()), SolrQuery.ORDER.desc);
362-
363-
try {
364-
QueryResponse queryResponse = this.executeQuery(solrQuery);
365-
list = queryResponse.getBeans(BriefObjectMetadataBean.class);
366-
} catch (SolrServerException e) {
367-
LOG.error("Error retrieving Neighboring items: " + e);
368-
return null;
369-
}
370-
371-
return list;
372-
373-
// Otherwise, query for items surrounding this item.
374-
375-
} else {
376-
377-
LOG.debug("Display order is " + pivotOrder);
378-
379-
// Find the right and left lists
380-
381-
StringBuilder query;
382-
383-
List<BriefObjectMetadataBean> leftList = null;
384-
List<BriefObjectMetadataBean> rightList = null;
385-
386-
solrQuery.setStart(0);
387-
solrQuery.setRows(windowSize - 1);
388-
389-
// Right list
390-
391-
query = new StringBuilder();
392-
393-
query.append(solrSettings.getFieldName(SearchFieldKeys.DISPLAY_ORDER.name())).append(":[")
394-
.append(pivotOrder + 1).append(" TO *]");
395-
query.append(accessRestrictionClause);
396-
solrQuery.setQuery(query.toString());
397-
398-
solrQuery.setSort(solrSettings.getFieldName(SearchFieldKeys.DISPLAY_ORDER.name()), SolrQuery.ORDER.asc);
399-
400-
try {
401-
QueryResponse queryResponse = this.executeQuery(solrQuery);
402-
rightList = queryResponse.getBeans(BriefObjectMetadataBean.class);
403-
} catch (SolrServerException e) {
404-
LOG.error("Error retrieving Neighboring items: " + e);
405-
return null;
406-
}
407-
408-
LOG.debug("Got " + rightList.size() + " items for right list");
409-
410-
// Left list
411-
412-
// (Note that display order stuff is reversed.)
413-
414-
query = new StringBuilder();
415-
416-
query.append(solrSettings.getFieldName(SearchFieldKeys.DISPLAY_ORDER.name())).append(":[* TO ")
417-
.append(pivotOrder - 1).append("]");
418-
query.append(accessRestrictionClause);
419-
solrQuery.setQuery(query.toString());
420-
421-
solrQuery.setSort(solrSettings.getFieldName(SearchFieldKeys.DISPLAY_ORDER.name()), SolrQuery.ORDER.desc);
422-
343+
344+
solrQuery.setQuery("*:*" + accessRestrictionClause);
345+
346+
addSort(solrQuery, "default", true);
347+
solrQuery.setRows(NEIGHBOR_SEEK_PAGE_SIZE);
348+
solrQuery.setFields("id");
349+
350+
long total = -1;
351+
int start = 0;
352+
pageLoop: do {
423353
try {
354+
solrQuery.setStart(start);
424355
QueryResponse queryResponse = this.executeQuery(solrQuery);
425-
leftList = queryResponse.getBeans(BriefObjectMetadataBean.class);
356+
total = queryResponse.getResults().getNumFound();
357+
for (SolrDocument doc : queryResponse.getResults()) {
358+
if (metadata.getId().equals(doc.getFieldValue("id"))) {
359+
break pageLoop;
360+
}
361+
start++;
362+
}
426363
} catch (SolrServerException e) {
427364
LOG.error("Error retrieving Neighboring items: " + e);
428365
return null;
429366
}
430-
431-
LOG.debug("Got " + leftList.size() + " items for left list");
432-
433-
// Trim the lists
434-
435-
int halfWindow = windowSize / 2;
436-
437-
// If we have enough in both lists, trim both to be
438-
// halfWindow long.
439-
440-
if (leftList.size() >= halfWindow && rightList.size() >= halfWindow) {
441-
442-
LOG.debug("Trimming both lists");
443-
444-
leftList.subList(halfWindow, leftList.size()).clear();
445-
rightList.subList(halfWindow, rightList.size()).clear();
446-
447-
// If we don't have enough in the left list and we have extra in the right list,
448-
// try to pick up the slack by trimming fewer items from the right list.
449-
450-
} else if (leftList.size() < halfWindow && rightList.size() > halfWindow) {
451-
452-
LOG.debug("Picking up slack from right list");
453-
454-
// How much extra do we need from the right list?
455-
456-
int extra = halfWindow - leftList.size();
457-
458-
// Only "take" the extra (ie, clear less of the right list) if we have it available.
459-
460-
if (halfWindow + extra < rightList.size())
461-
rightList.subList(halfWindow + extra, rightList.size()).clear();
462-
463-
} else if (rightList.size() < halfWindow && leftList.size() > halfWindow) {
464-
465-
LOG.debug("Picking up slack from left list");
466-
467-
int extra = halfWindow - rightList.size();
468-
469-
if (halfWindow + extra < leftList.size())
470-
leftList.subList(halfWindow + extra, leftList.size()).clear();
471-
367+
} while (start < total);
368+
369+
// Wasn't found, no neighbors shall be forthcoming
370+
if (start >= total) {
371+
return null;
372+
}
373+
374+
long left = start - (windowSize / 2);
375+
long right = start + (windowSize / 2);
376+
377+
if (left < 0) {
378+
right -= left;
379+
left = 0;
380+
}
381+
382+
if (right >= total) {
383+
left -= (right - total) + 1;
384+
if (left < 0) {
385+
left = 0;
472386
}
473-
474-
// (Otherwise, we do no trimming, since both lists are smaller or the same size
475-
// as the window.)
476-
477-
// Assemble the result.
478-
479-
Collections.reverse(leftList);
480-
leftList.add(metadata);
481-
leftList.addAll(rightList);
482-
483-
return leftList;
484-
485387
}
486-
388+
389+
solrQuery.setFields(new String[0]);
390+
solrQuery.setRows(windowSize);
391+
solrQuery.setStart((int) left);
392+
393+
try {
394+
QueryResponse queryResponse = this.executeQuery(solrQuery);
395+
return queryResponse.getBeans(BriefObjectMetadataBean.class);
396+
} catch (SolrServerException e) {
397+
LOG.error("Error retrieving Neighboring items: " + e);
398+
return null;
399+
}
487400
}
488401

489402
/**

solr-search/src/main/java/edu/unc/lib/dl/search/solr/service/SolrSearchService.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -475,16 +475,7 @@ protected SolrQuery generateSearch(SearchRequest searchRequest) {
475475
}
476476

477477
// Add sort parameters
478-
List<SearchSettings.SortField> sortFields = searchSettings.sortTypes.get(searchState.getSortType());
479-
if (sortFields != null) {
480-
for (int i = 0; i < sortFields.size(); i++) {
481-
SearchSettings.SortField sortField = sortFields.get(i);
482-
SolrQuery.ORDER sortOrder = SolrQuery.ORDER.valueOf(sortField.getSortOrder());
483-
if (!searchState.getSortNormalOrder())
484-
sortOrder = sortOrder.reverse();
485-
solrQuery.addSort(solrSettings.getFieldName(sortField.getFieldName()), sortOrder);
486-
}
487-
}
478+
addSort(solrQuery, searchState.getSortType(), searchState.getSortNormalOrder());
488479

489480
// Set requested resource types
490481
String resourceTypeFilter = this.getResourceTypeFilter(searchState.getResourceTypes());
@@ -564,6 +555,19 @@ protected SolrQuery generateSearch(SearchRequest searchRequest) {
564555

565556
return solrQuery;
566557
}
558+
559+
protected void addSort(SolrQuery solrQuery, String sortType, boolean normalOrder) {
560+
List<SearchSettings.SortField> sortFields = searchSettings.sortTypes.get(sortType);
561+
if (sortFields != null) {
562+
for (int i = 0; i < sortFields.size(); i++) {
563+
SearchSettings.SortField sortField = sortFields.get(i);
564+
SolrQuery.ORDER sortOrder = SolrQuery.ORDER.valueOf(sortField.getSortOrder());
565+
if (!normalOrder)
566+
sortOrder = sortOrder.reverse();
567+
solrQuery.addSort(solrSettings.getFieldName(sortField.getFieldName()), sortOrder);
568+
}
569+
}
570+
}
567571

568572
/**
569573
* Add search fields from a search state to the given termQuery

0 commit comments

Comments
 (0)