@@ -77,6 +77,8 @@ public class SolrQueryLayerService extends SolrSearchService {
77
77
protected SearchStateFactory searchStateFactory ;
78
78
protected PID collectionsPid ;
79
79
protected ObjectPathFactory pathFactory ;
80
+
81
+ private static int NEIGHBOR_SEEK_PAGE_SIZE = 500 ;
80
82
81
83
/**
82
84
* Returns a list of the most recently added items in the collection
@@ -338,152 +340,63 @@ public List<BriefObjectMetadataBean> getNeighboringItems(BriefObjectMetadataBean
338
340
339
341
facetFieldUtil .addToSolrQuery (ancestorPath , solrQuery );
340
342
}
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 {
423
353
try {
354
+ solrQuery .setStart (start );
424
355
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
+ }
426
363
} catch (SolrServerException e ) {
427
364
LOG .error ("Error retrieving Neighboring items: " + e );
428
365
return null ;
429
366
}
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 ;
472
386
}
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
-
485
387
}
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
+ }
487
400
}
488
401
489
402
/**
0 commit comments