/trunk/src/org/getopt/luke/IntervalLimitedCollector.java

http://luke.googlecode.com/ · Java · 106 lines · 81 code · 15 blank · 10 comment · 6 complexity · ce2a265d55c26fcae951e4a7b1b441fb MD5 · raw file

  1. package org.getopt.luke;
  2. import java.io.IOException;
  3. import org.apache.lucene.index.AtomicReaderContext;
  4. import org.apache.lucene.index.IndexReader;
  5. import org.apache.lucene.search.Scorer;
  6. import org.apache.lucene.search.TimeLimitingCollector;
  7. import org.apache.lucene.search.TopDocs;
  8. import org.apache.lucene.search.TopScoreDocCollector;
  9. import org.apache.lucene.search.TimeLimitingCollector.TimeExceededException;
  10. public class IntervalLimitedCollector extends LimitedHitCollector {
  11. private long maxTime;
  12. private long lastDoc = 0;
  13. private TopScoreDocCollector tdc;
  14. private TopDocs topDocs = null;
  15. private TimeLimitingCollector thc;
  16. public IntervalLimitedCollector(int maxTime, boolean outOfOrder, boolean shouldScore) {
  17. this.maxTime = maxTime;
  18. this.outOfOrder = outOfOrder;
  19. this.shouldScore = shouldScore;
  20. tdc = TopScoreDocCollector.create(1000, outOfOrder);
  21. thc = new TimeLimitingCollector(tdc, TimeLimitingCollector.getGlobalCounter(), maxTime);
  22. }
  23. /* (non-Javadoc)
  24. * @see org.getopt.luke.LimitedHitCollector#limitSize()
  25. */
  26. @Override
  27. public long limitSize() {
  28. return maxTime;
  29. }
  30. /* (non-Javadoc)
  31. * @see org.getopt.luke.LimitedHitCollector#limitType()
  32. */
  33. @Override
  34. public int limitType() {
  35. return TYPE_TIME;
  36. }
  37. @Override
  38. public int getDocId(int pos) {
  39. if (topDocs == null) {
  40. topDocs = tdc.topDocs();
  41. }
  42. return topDocs.scoreDocs[pos].doc;
  43. }
  44. /* (non-Javadoc)
  45. * @see org.getopt.luke.AccessibleHitCollector#getScore(int)
  46. */
  47. @Override
  48. public float getScore(int pos) {
  49. if (topDocs == null) {
  50. topDocs = tdc.topDocs();
  51. }
  52. return topDocs.scoreDocs[pos].score;
  53. }
  54. @Override
  55. public int getTotalHits() {
  56. return tdc.getTotalHits();
  57. }
  58. @Override
  59. public void collect(int docNum) throws IOException {
  60. try {
  61. thc.collect(docNum);
  62. } catch (TimeExceededException tee) {
  63. // re-throw
  64. throw new LimitedException(TYPE_TIME, maxTime, tee.getTimeElapsed(), tee.getLastDocCollected());
  65. }
  66. }
  67. @Override
  68. public boolean acceptsDocsOutOfOrder() {
  69. return outOfOrder;
  70. }
  71. @Override
  72. public void setNextReader(AtomicReaderContext context) throws IOException {
  73. this.docBase = context.docBase;
  74. thc.setNextReader(context);
  75. }
  76. @Override
  77. public void setScorer(Scorer scorer) throws IOException {
  78. this.scorer = scorer;
  79. if (shouldScore) {
  80. thc.setScorer(scorer);
  81. } else {
  82. thc.setScorer(NoScoringScorer.INSTANCE);
  83. }
  84. }
  85. @Override
  86. public void reset() {
  87. lastDoc = 0;
  88. tdc = TopScoreDocCollector.create(1000, outOfOrder);
  89. thc = new TimeLimitingCollector(tdc, TimeLimitingCollector.getGlobalCounter(), maxTime);
  90. }
  91. }