blob: 3f78fabec5acf52d1726caca256322aca6b6caae [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) {
Nils Diewald0981c212015-02-13 20:47:10 +000030 if (!subquery.isEmpty()) {
31 this.subquery = subquery;
32 if (subquery.maybeUnsorted())
33 this.maybeUnsorted = true;
34 }
35 else
36 this.isEmpty = true;
Nils Diewald6b332812014-07-22 18:51:05 +000037
Nils Diewald0981c212015-02-13 20:47:10 +000038 if (exact < 1 || this.subquery.isNull()) {
39 this.isNull = true;
40 this.isOptional = true;
41 this.min = 0;
42 this.max = 0;
43 return;
44 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000045
Nils Diewald0981c212015-02-13 20:47:10 +000046 this.min = exact;
47 this.max = exact;
Nils Diewaldee4a6b72014-06-30 18:23:12 +000048 };
49
Nils Diewaldbb33da22015-03-04 16:24:25 +000050
Nils Diewald92729ce2014-10-06 16:00:17 +000051 // 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 +000052 public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int min,
53 int max) {
Nils Diewald92729ce2014-10-06 16:00:17 +000054
Nils Diewald0981c212015-02-13 20:47:10 +000055 if (!subquery.isEmpty()) {
56 this.subquery = subquery;
Nils Diewald6b332812014-07-22 18:51:05 +000057
Nils Diewald0981c212015-02-13 20:47:10 +000058 if (subquery.maybeUnsorted())
59 this.maybeUnsorted = true;
60 }
61 else
62 this.isEmpty = true;
63
64 // Subquery may be an empty token
Akron747986e2016-02-18 17:07:12 +010065 if (subquery.isNull()) {
Nils Diewald0981c212015-02-13 20:47:10 +000066 this.isNull = true;
67 return;
68 }
69 else {
70 this.isNull = false;
71 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000072
Nils Diewald0981c212015-02-13 20:47:10 +000073 if (min == 0) {
74 this.isOptional = true;
75 min = 1;
76 if (max == 0)
77 this.isNull = true;
78 };
Nils Diewaldbb33da22015-03-04 16:24:25 +000079
Nils Diewald0981c212015-02-13 20:47:10 +000080 this.min = min;
81 this.max = max;
Nils Diewaldee4a6b72014-06-30 18:23:12 +000082 };
83
Nils Diewald92729ce2014-10-06 16:00:17 +000084
85 // Serialize to Lucene SpanQuery
Nils Diewaldbe5943e2014-10-21 19:35:34 +000086 public SpanQuery toQuery () throws QueryException {
Nils Diewald92729ce2014-10-06 16:00:17 +000087
Nils Diewald0981c212015-02-13 20:47:10 +000088 // The query is null
89 if (this.isNull)
90 return (SpanQuery) null;
Nils Diewaldbb33da22015-03-04 16:24:25 +000091
Nils Diewald0981c212015-02-13 20:47:10 +000092 if (this.isEmpty) {
93 log.error("You can't queryize an empty query");
94 return (SpanQuery) null;
95 };
Nils Diewald92729ce2014-10-06 16:00:17 +000096
Nils Diewald0981c212015-02-13 20:47:10 +000097 // The query is not a repetition query at all, but may be optional
98 if (this.min == 1 && this.max == 1)
Nils Diewaldb9dd4132015-02-16 16:32:41 +000099 return this.subquery.retrieveNode(this.retrieveNode).toQuery();
Nils Diewaldbe5943e2014-10-21 19:35:34 +0000100
Nils Diewald0981c212015-02-13 20:47:10 +0000101 // That's a fine repetition query
Nils Diewaldbb33da22015-03-04 16:24:25 +0000102 return new SpanRepetitionQuery(this.subquery.retrieveNode(
103 this.retrieveNode).toQuery(), this.min, this.max, true);
Nils Diewald6b332812014-07-22 18:51:05 +0000104 };
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000105
Nils Diewaldbb33da22015-03-04 16:24:25 +0000106
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000107 public boolean isNegative () {
Nils Diewald0981c212015-02-13 20:47:10 +0000108 if (this.subquery == null)
109 return false;
110 return this.subquery.isNegative();
Nils Diewaldcc7c0b32014-07-31 19:58:22 +0000111 };
Nils Diewaldee4a6b72014-06-30 18:23:12 +0000112};