/branches/branch-3x/src/org/getopt/luke/IntervalLimitedCollector.java

http://luke.googlecode.com/ · Java · 105 lines · 80 code · 15 blank · 10 comment · 6 complexity · e6cb8dea2a13048be71dad3f9276e4f6 MD5 · raw file

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