blob: 431b83971719e7919583584f52adb4e6e2f39991 [file] [log] [blame]
Eliza Margarethad12cabb2014-10-27 17:45:34 +00001package de.ids_mannheim.korap.query.spans;
2
3import java.io.IOException;
Eliza Margaretha0170b882014-10-29 15:49:31 +00004import java.nio.ByteBuffer;
Eliza Margarethad12cabb2014-10-27 17:45:34 +00005import java.util.List;
6import java.util.Map;
7
8import org.apache.lucene.index.AtomicReaderContext;
9import org.apache.lucene.index.Term;
10import org.apache.lucene.index.TermContext;
11import org.apache.lucene.search.spans.TermSpans;
12import org.apache.lucene.util.Bits;
Eliza Margarethad12cabb2014-10-27 17:45:34 +000013
14import de.ids_mannheim.korap.query.SpanTermWithIdQuery;
15
Eliza Margaretha493bfa92015-01-13 16:16:38 +000016/**
Nils Diewaldbb33da22015-03-04 16:24:25 +000017 * Enumeration of termSpans having an id. This class just wraps the
18 * usual Lucene
19 * TermSpans, and adds spanid property. It reads the term-id from a
20 * term span
21 * payload. The term-id is encoded in a short, starting from (offset)
22 * 0 in the
Eliza Margaretha493bfa92015-01-13 16:16:38 +000023 * payload.
Eliza Margarethad12cabb2014-10-27 17:45:34 +000024 *
Eliza Margaretha493bfa92015-01-13 16:16:38 +000025 * @author margaretha
Eliza Margarethad12cabb2014-10-27 17:45:34 +000026 * */
margaretha50c76332015-03-19 10:10:39 +010027public class TermSpansWithId extends SimpleSpans {
Eliza Margarethad12cabb2014-10-27 17:45:34 +000028
Eliza Margaretha493bfa92015-01-13 16:16:38 +000029 private TermSpans termSpans;
Eliza Margarethad12cabb2014-10-27 17:45:34 +000030
Nils Diewaldbb33da22015-03-04 16:24:25 +000031
Eliza Margaretha493bfa92015-01-13 16:16:38 +000032 /**
33 * Creates TermSpansWithId from the given spanTermWithIdQuery.
34 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000035 * @param spanTermWithIdQuery
36 * a spanTermWithIdQuery
Eliza Margaretha493bfa92015-01-13 16:16:38 +000037 * @param context
38 * @param acceptDocs
39 * @param termContexts
40 * @throws IOException
41 */
Nils Diewaldbb33da22015-03-04 16:24:25 +000042 public TermSpansWithId (SpanTermWithIdQuery spanTermWithIdQuery,
43 AtomicReaderContext context, Bits acceptDocs,
44 Map<Term, TermContext> termContexts)
45 throws IOException {
Eliza Margaretha493bfa92015-01-13 16:16:38 +000046 super(spanTermWithIdQuery, context, acceptDocs, termContexts);
47 termSpans = (TermSpans) firstSpans;
48 hasMoreSpans = termSpans.next();
margaretha50c76332015-03-19 10:10:39 +010049 hasSpanId = true;
Eliza Margaretha493bfa92015-01-13 16:16:38 +000050 }
Eliza Margarethad12cabb2014-10-27 17:45:34 +000051
Nils Diewaldbb33da22015-03-04 16:24:25 +000052
Eliza Margaretha493bfa92015-01-13 16:16:38 +000053 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000054 public boolean next () throws IOException {
Eliza Margaretha493bfa92015-01-13 16:16:38 +000055 isStartEnumeration = false;
56 return advance();
57 }
Eliza Margarethad12cabb2014-10-27 17:45:34 +000058
Nils Diewaldbb33da22015-03-04 16:24:25 +000059
Eliza Margaretha493bfa92015-01-13 16:16:38 +000060 /**
61 * Advances to the next match and set it as the current match.
62 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000063 * @return <code>true</code> if a match is found,
64 * <code>false</code>
Eliza Margaretha493bfa92015-01-13 16:16:38 +000065 * otherwise.
66 * @throws IOException
67 */
Nils Diewaldbb33da22015-03-04 16:24:25 +000068 private boolean advance () throws IOException {
Eliza Margaretha493bfa92015-01-13 16:16:38 +000069 while (hasMoreSpans) {
70 readPayload();
71 matchDocNumber = firstSpans.doc();
72 matchStartPosition = firstSpans.start();
73 matchEndPosition = firstSpans.end();
74 hasMoreSpans = firstSpans.next();
75 return true;
76 }
77 return false;
78 }
Eliza Margarethad12cabb2014-10-27 17:45:34 +000079
Nils Diewaldbb33da22015-03-04 16:24:25 +000080
Eliza Margaretha493bfa92015-01-13 16:16:38 +000081 /**
Nils Diewaldbb33da22015-03-04 16:24:25 +000082 * Read the payloads of the current firstspan and set the term id
83 * info from
Eliza Margaretha493bfa92015-01-13 16:16:38 +000084 * the payloads.
85 *
86 * @throws IOException
87 */
Nils Diewaldbb33da22015-03-04 16:24:25 +000088 private void readPayload () throws IOException {
Eliza Margaretha493bfa92015-01-13 16:16:38 +000089 List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
90 ByteBuffer bb = ByteBuffer.allocate(payload.get(0).length);
91 bb.put(payload.get(0));
92 setSpanId(bb.getShort(0)); //term id
93 }
Eliza Margarethad12cabb2014-10-27 17:45:34 +000094
Nils Diewaldbb33da22015-03-04 16:24:25 +000095
Eliza Margaretha493bfa92015-01-13 16:16:38 +000096 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000097 public boolean skipTo (int target) throws IOException {
Eliza Margaretha493bfa92015-01-13 16:16:38 +000098 if (hasMoreSpans && (firstSpans.doc() < target)) {
99 if (!firstSpans.skipTo(target)) {
100 return false;
101 }
102 }
103 matchPayload.clear();
104 isStartEnumeration = false;
105 return advance();
106 }
107
Nils Diewaldbb33da22015-03-04 16:24:25 +0000108
Eliza Margaretha493bfa92015-01-13 16:16:38 +0000109 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000110 public long cost () {
Eliza Margaretha493bfa92015-01-13 16:16:38 +0000111 return firstSpans.cost(); // plus cost from reading payload
112 }
Eliza Margarethad12cabb2014-10-27 17:45:34 +0000113
114}