blob: 406247fa708c072e2327e35556c0ca9fa5089c5a [file] [log] [blame]
margaretha9fbffa92015-05-12 18:25:23 +02001package de.ids_mannheim.korap.query.spans;
2
3import static de.ids_mannheim.korap.util.KrillByte.byte2int;
4
5import java.io.IOException;
6import java.util.BitSet;
7import java.util.Map;
8
Akron700c1eb2015-09-25 16:57:30 +02009import org.apache.lucene.index.LeafReaderContext;
margaretha9fbffa92015-05-12 18:25:23 +020010import org.apache.lucene.index.Term;
11import org.apache.lucene.index.TermContext;
12import org.apache.lucene.util.Bits;
13
14import de.ids_mannheim.korap.query.SpanClassFilterQuery;
15import de.ids_mannheim.korap.query.SpanClassFilterQuery.ClassOperation;
16
17public class ClassFilteredSpans extends SimpleSpans {
18
19 private BitSet bitset1, bitset2;
20 private ClassOperation operation;
21 private byte classNum1, classNum2;
22
Akronbb5d1732015-06-22 01:22:40 +020023
margaretha9fbffa92015-05-12 18:25:23 +020024 public ClassFilteredSpans (SpanClassFilterQuery query,
Akron700c1eb2015-09-25 16:57:30 +020025 LeafReaderContext context, Bits acceptDocs,
Akronbb5d1732015-06-22 01:22:40 +020026 Map<Term, TermContext> termContexts)
27 throws IOException {
margaretha9fbffa92015-05-12 18:25:23 +020028 super(query, context, acceptDocs, termContexts);
29 this.operation = query.getOperation();
30 this.classNum1 = query.getClassNum1();
31 this.classNum2 = query.getClassNum2();
32 hasMoreSpans = firstSpans.next();
33 }
34
Akronbb5d1732015-06-22 01:22:40 +020035
margaretha9fbffa92015-05-12 18:25:23 +020036 @Override
Akronbb5d1732015-06-22 01:22:40 +020037 public boolean next () throws IOException {
margaretha9fbffa92015-05-12 18:25:23 +020038 while (hasMoreSpans) {
39 matchPayload.clear();
40 bitset1 = null;
41 bitset2 = null;
42 if (isClassOperationValid()) {
43 this.matchStartPosition = firstSpans.start();
44 this.matchEndPosition = firstSpans.end();
45 this.matchDocNumber = firstSpans.doc();
46 this.matchPayload.addAll(firstSpans.getPayload());
47 hasMoreSpans = firstSpans.next();
48 return true;
49 }
50 hasMoreSpans = firstSpans.next();
51 }
52 return false;
53 }
54
Akronbb5d1732015-06-22 01:22:40 +020055
56 private boolean isClassOperationValid () throws IOException {
margaretha9fbffa92015-05-12 18:25:23 +020057 setBitsets();
Akronc5e73b82016-01-14 17:01:18 +010058
Eliza Margaretha6f989202016-10-14 21:48:29 +020059 int cardinality = Math.max(bitset1.cardinality(),
60 bitset2.cardinality());
Akronc5e73b82016-01-14 17:01:18 +010061
margaretha9fbffa92015-05-12 18:25:23 +020062 bitset1.and(bitset2);
63 // System.out.println("cardinality:" + cardinality);
64 switch (operation) {
65 case DISJOINT:
Akronbb5d1732015-06-22 01:22:40 +020066 if (bitset1.cardinality() == 0)
67 return true;
margaretha9fbffa92015-05-12 18:25:23 +020068 break;
69 case EQUAL:
Akronbb5d1732015-06-22 01:22:40 +020070 if (cardinality == bitset1.cardinality())
71 return true;
margaretha9fbffa92015-05-12 18:25:23 +020072 break;
73 case DIFFER:
74 if (cardinality == 0 || cardinality != bitset1.cardinality())
75 return true;
76 break;
77 case INCLUDE:
78 if (bitset1.cardinality() == bitset2.cardinality()) {
79 return true;
80 }
81 break;
82 case INTERSECT:
Akronbb5d1732015-06-22 01:22:40 +020083 if (bitset1.cardinality() > 0)
84 return true;
margaretha9fbffa92015-05-12 18:25:23 +020085 break;
86 }
87
88 return false;
89 }
90
Akronbb5d1732015-06-22 01:22:40 +020091
92 private void setBitsets () throws IOException {
margaretha9fbffa92015-05-12 18:25:23 +020093 BitSet bs = new BitSet();
94 int start, end;
95 // System.out.println("------------------------");
96 for (byte[] payload : firstSpans.getPayload()) {
Akron6cc7b7b2016-01-14 21:39:18 +010097 /*
Akronc5e73b82016-01-14 17:01:18 +010098 System.err.println(
99 "** " +
100 payload[0] +
101 "|" +
102 byte2int(payload, 1) +
103 "|" +
104 byte2int(payload, 5) +
105 "|" +
106 payload[8] +
107 " **");
Akron6cc7b7b2016-01-14 21:39:18 +0100108 */
Akronc5e73b82016-01-14 17:01:18 +0100109 if (payload[0] == 0) {
110 start = byte2int(payload, 1) + 1;
111 end = byte2int(payload, 5) + 1;
112 if (payload[9] == classNum1) {
margaretha9fbffa92015-05-12 18:25:23 +0200113 // System.out.println("bitset1 " + start + " " +
114 // end);
115 if (bitset1 == null) {
116 bitset1 = new BitSet();
117 bitset1.set(start, end);
118 }
119 else {
120 bs.set(start, end);
121 bitset1.or(bs);
122 }
123 // System.out.println(bitset1);
124 }
Akronc5e73b82016-01-14 17:01:18 +0100125 else if (payload[9] == classNum2) {
margaretha9fbffa92015-05-12 18:25:23 +0200126 // System.out.println("#bitset2 " + start + " " +
127 // end);
128 if (bitset2 == null) {
129 bitset2 = new BitSet();
130 bitset2.set(start, end);
131 }
132 else {
133 bs.set(start, end);
134 bitset2.or(bs);
135 // System.out.println("OR #2");
136 }
137 // System.out.println(bitset2);
138 }
139 }
140 }
141
142 }
143
Akronbb5d1732015-06-22 01:22:40 +0200144
margaretha9fbffa92015-05-12 18:25:23 +0200145 @Override
Akronbb5d1732015-06-22 01:22:40 +0200146 public boolean skipTo (int target) throws IOException {
margaretha9fbffa92015-05-12 18:25:23 +0200147 // TODO Auto-generated method stub
148 return false;
149 }
150
Akronbb5d1732015-06-22 01:22:40 +0200151
margaretha9fbffa92015-05-12 18:25:23 +0200152 @Override
Akronbb5d1732015-06-22 01:22:40 +0200153 public long cost () {
margaretha9fbffa92015-05-12 18:25:23 +0200154 // TODO Auto-generated method stub
155 return 0;
156 }
157}