blob: 4279640e7eea14213ae452e618ded4c16d657894 [file] [log] [blame]
Nils Diewaldee4a6b72014-06-30 18:23:12 +00001package de.ids_mannheim.korap.query.wrap;
2
3import org.apache.lucene.search.spans.SpanQuery;
4
5import de.ids_mannheim.korap.query.SpanRepetitionQuery;
Nils Diewald92729ce2014-10-06 16:00:17 +00006import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
Nils Diewaldbe5943e2014-10-21 19:35:34 +00007import de.ids_mannheim.korap.util.QueryException;
Nils Diewaldee4a6b72014-06-30 18:23:12 +00008
Nils Diewaldbe5943e2014-10-21 19:35:34 +00009import org.slf4j.Logger;
10import org.slf4j.LoggerFactory;
11
12// DEAL WITH NEGATIVITY
Nils Diewaldee4a6b72014-06-30 18:23:12 +000013
Nils Diewald92729ce2014-10-06 16:00:17 +000014public class SpanRepetitionQueryWrapper extends SpanQueryWrapper {
15 private SpanQueryWrapper subquery;
Nils Diewaldee4a6b72014-06-30 18:23:12 +000016
Nils Diewaldbe5943e2014-10-21 19:35:34 +000017 // Logger
Nils Diewaldbb33da22015-03-04 16:24:25 +000018 private final static Logger log = LoggerFactory
19 .getLogger(SpanSequenceQueryWrapper.class);
20
Nils Diewaldbe5943e2014-10-21 19:35:34 +000021
22 public SpanRepetitionQueryWrapper () {
Nils Diewald0981c212015-02-13 20:47:10 +000023 this.isEmpty = true;
24 this.isNull = false;
Nils Diewaldbe5943e2014-10-21 19:35:34 +000025 };
26
Nils Diewaldbb33da22015-03-04 16:24:25 +000027
Nils Diewald92729ce2014-10-06 16:00:17 +000028 // This is for exact enumbered repetition, like in a{3}
29 public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int exact) {
Akron35c2d0d2017-02-15 11:16:22 +010030
Nils Diewald0981c212015-02-13 20:47:10 +000031 if (!subquery.isEmpty()) {
32 this.subquery = subquery;
Akrona26184e2018-12-05 15:37:34 +010033 this.maybeUnsorted = subquery.maybeUnsorted();
Akron35c2d0d2017-02-15 11:16:22 +010034 this.isEmpty = false;
Nils Diewald0981c212015-02-13 20:47:10 +000035 }
36 else
37 this.isEmpty = true;
Nils Diewald6b332812014-07-22 18:51:05 +000038
Nils Diewald0981c212015-02-13 20:47:10 +000039 if (exact < 1 || this.subquery.isNull()) {
40 this.isNull = true;
41 this.isOptional = true;
42 this.min = 0;
43 this.max = 0;
44 return;
45 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000046
Akron35c2d0d2017-02-15 11:16:22 +010047 this.isNull = false;
Nils Diewald0981c212015-02-13 20:47:10 +000048 this.min = exact;
49 this.max = exact;
Nils Diewaldee4a6b72014-06-30 18:23:12 +000050 };
51
Nils Diewaldbb33da22015-03-04 16:24:25 +000052
Nils Diewald92729ce2014-10-06 16:00:17 +000053 // This is for a range of repetitions, like in a{2,3}, a{,4}, a{3,}, a+, a*, a?
Nils Diewaldbb33da22015-03-04 16:24:25 +000054 public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int min,
55 int max) {
Nils Diewald92729ce2014-10-06 16:00:17 +000056
Nils Diewald0981c212015-02-13 20:47:10 +000057 if (!subquery.isEmpty()) {
58 this.subquery = subquery;
Nils Diewald6b332812014-07-22 18:51:05 +000059
Nils Diewald0981c212015-02-13 20:47:10 +000060 if (subquery.maybeUnsorted())
61 this.maybeUnsorted = true;
62 }
63 else
64 this.isEmpty = true;
65
66 // Subquery may be an empty token
Akron747986e2016-02-18 17:07:12 +010067 if (subquery.isNull()) {
Nils Diewald0981c212015-02-13 20:47:10 +000068 this.isNull = true;
69 return;
70 }
71 else {
72 this.isNull = false;
73 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000074
Nils Diewald0981c212015-02-13 20:47:10 +000075 if (min == 0) {
76 this.isOptional = true;
77 min = 1;
78 if (max == 0)
79 this.isNull = true;
80 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000081
Nils Diewald0981c212015-02-13 20:47:10 +000082 this.min = min;
83 this.max = max;
Nils Diewaldee4a6b72014-06-30 18:23:12 +000084 };
85
Nils Diewald92729ce2014-10-06 16:00:17 +000086
87 // Serialize to Lucene SpanQuery
Akrona7b936d2016-03-04 13:40:54 +010088 @Override
89 public SpanQuery toFragmentQuery () throws QueryException {
Nils Diewald92729ce2014-10-06 16:00:17 +000090
Nils Diewald0981c212015-02-13 20:47:10 +000091 // The query is null
92 if (this.isNull)
93 return (SpanQuery) null;
Nils Diewaldbb33da22015-03-04 16:24:25 +000094
Nils Diewald0981c212015-02-13 20:47:10 +000095 if (this.isEmpty) {
96 log.error("You can't queryize an empty query");
97 return (SpanQuery) null;
98 };
Nils Diewald92729ce2014-10-06 16:00:17 +000099
Nils Diewald0981c212015-02-13 20:47:10 +0000100 // The query is not a repetition query at all, but may be optional
101 if (this.min == 1 && this.max == 1)
Akron6759b042016-04-28 01:25:00 +0200102 return this.subquery.retrieveNode(this.retrieveNode)
103 .toFragmentQuery();
Nils Diewaldbe5943e2014-10-21 19:35:34 +0000104
Nils Diewald0981c212015-02-13 20:47:10 +0000105 // That's a fine repetition query
Eliza Margaretha6f989202016-10-14 21:48:29 +0200106 return new SpanRepetitionQuery(
107 this.subquery.retrieveNode(this.retrieveNode).toFragmentQuery(),
108 this.min, this.max, true);
Nils Diewald6b332812014-07-22 18:51:05 +0000109 };
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000110
Nils Diewaldbb33da22015-03-04 16:24:25 +0000111
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000112 public boolean isNegative () {
Nils Diewald0981c212015-02-13 20:47:10 +0000113 if (this.subquery == null)
114 return false;
115 return this.subquery.isNegative();
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000116 };
Nils Diewaldee4a6b72014-06-30 18:23:12 +0000117};