blob: 0bb22f2744f37612978765166064595eaa9cbf0c [file] [log] [blame]
Nils Diewaldf399a672013-11-18 17:55:22 +00001package de.ids_mannheim.korap.query.wrap;
2
3import java.util.*;
Nils Diewald164f8be2014-02-13 02:43:16 +00004import de.ids_mannheim.korap.query.DistanceConstraint;
5import de.ids_mannheim.korap.query.SpanElementQuery;
Nils Diewaldf399a672013-11-18 17:55:22 +00006import de.ids_mannheim.korap.query.SpanNextQuery;
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +00007import de.ids_mannheim.korap.query.SpanDistanceQuery;
Nils Diewald164f8be2014-02-13 02:43:16 +00008import de.ids_mannheim.korap.query.SpanMultipleDistanceQuery;
9
Nils Diewaldf399a672013-11-18 17:55:22 +000010import de.ids_mannheim.korap.query.wrap.SpanSegmentQueryWrapper;
11import de.ids_mannheim.korap.query.wrap.SpanRegexQueryWrapper;
12
13import org.apache.lucene.index.Term;
14import org.apache.lucene.search.spans.SpanQuery;
15import org.apache.lucene.search.spans.SpanTermQuery;
16import de.ids_mannheim.korap.query.wrap.SpanQueryWrapperInterface;
17
18/**
19 * @author Nils Diewald
20 */
21public class SpanSequenceQueryWrapper implements SpanQueryWrapperInterface {
22 private String field;
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +000023 private ArrayList<SpanQuery> segments;
24 private ArrayList<DistanceConstraint> constraints;
25 private boolean isInOrder = true;
26
Nils Diewaldf399a672013-11-18 17:55:22 +000027 public SpanSequenceQueryWrapper (String field) {
28 this.field = field;
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +000029 this.segments = new ArrayList<SpanQuery>(2);
Nils Diewaldf399a672013-11-18 17:55:22 +000030 };
31
32 public SpanSequenceQueryWrapper (String field, String ... terms) {
33 this(field);
34 for (int i = 0; i < terms.length; i++) {
35 this.segments.add((SpanQuery) new SpanTermQuery(new Term(field, terms[i])));
36 };
37 };
38
39 public SpanSequenceQueryWrapper (String field, SpanQuery sq) {
40 this(field);
41 this.segments.add((SpanQuery) sq);
42 };
43
44 public SpanSequenceQueryWrapper (String field, SpanQueryWrapperInterface sswq) {
45 this(field);
46 this.segments.add((SpanQuery) sswq.toQuery());
47 };
48
49 public SpanSequenceQueryWrapper (String field, SpanRegexQueryWrapper re) {
50 this(field);
51 this.segments.add((SpanQuery) re.toQuery());
52 };
53
54 public SpanQuery get (int index) {
55 return this.segments.get(index);
56 };
57
58 public void set (int index, SpanQuery sq) {
59 this.segments.set(index, sq);
60 };
61
62 public SpanSequenceQueryWrapper append (String term) {
63 this.segments.add((SpanQuery) new SpanTermQuery(new Term(field, term)));
64 return this;
65 };
66
67 public SpanSequenceQueryWrapper append (SpanQueryWrapperInterface ssq) {
68 this.segments.add((SpanQuery) ssq.toQuery());
69 return this;
70 };
71
72 public SpanSequenceQueryWrapper append (SpanRegexQueryWrapper srqw) {
73 this.segments.add((SpanQuery) srqw.toQuery());
74 return this;
75 };
76
77 public SpanSequenceQueryWrapper prepend (String term) {
78 this.segments.add(0, (SpanQuery) new SpanTermQuery(new Term(field, term)));
79 return this;
80 };
81
82 public SpanSequenceQueryWrapper prepend (SpanSegmentQueryWrapper ssq) {
83 this.segments.add(0, (SpanQuery) ssq.toQuery());
84 return this;
85 };
86
87 public SpanSequenceQueryWrapper prepend (SpanRegexQueryWrapper re) {
88 this.segments.add(0, (SpanQuery) re.toQuery());
89 return this;
90 };
91
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +000092 public SpanSequenceQueryWrapper withConstraint (int min, int max) {
Nils Diewald164f8be2014-02-13 02:43:16 +000093 if (this.constraints == null)
94 this.constraints = new ArrayList<DistanceConstraint>(1);
Eliza Margaretha01929182014-02-19 11:48:59 +000095 this.constraints.add(new DistanceConstraint(min, max,false));
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +000096 return this;
97 };
98
Nils Diewald164f8be2014-02-13 02:43:16 +000099 public SpanSequenceQueryWrapper withConstraint (int min, int max, String unit) {
100 if (this.constraints == null)
101 this.constraints = new ArrayList<DistanceConstraint>(1);
Nils Diewaldf5f29ff2014-02-14 12:24:34 +0000102 if (unit.equals("w"))
Eliza Margaretha01929182014-02-19 11:48:59 +0000103 this.constraints.add(new DistanceConstraint(min, max,false));
Nils Diewaldf5f29ff2014-02-14 12:24:34 +0000104 else
105 this.constraints.add(
106 new DistanceConstraint(
Eliza Margaretha01929182014-02-19 11:48:59 +0000107 new SpanElementQuery(this.field, unit), min, max,false)
Nils Diewaldf5f29ff2014-02-14 12:24:34 +0000108 );
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000109 return this;
110 };
111
Nils Diewaldf399a672013-11-18 17:55:22 +0000112 public SpanQuery toQuery () {
113 if (this.segments.size() == 0) {
114 return (SpanQuery) null;
115 };
116
117 SpanQuery query = this.segments.get(0);
118
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000119 // NextQueries:
Nils Diewald164f8be2014-02-13 02:43:16 +0000120 if (this.constraints == null || this.constraints.size() == 0) {
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000121 for (int i = 1; i < this.segments.size(); i++) {
122 query = new SpanNextQuery(
123 query,
124 this.segments.get(i) // Todo: Maybe payloads are not necessary
125 );
126 };
127 return (SpanQuery) query;
Nils Diewaldf399a672013-11-18 17:55:22 +0000128 };
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000129
130 // DistanceQueries
131 if (this.constraints.size() == 1) {
Nils Diewald164f8be2014-02-13 02:43:16 +0000132 DistanceConstraint constraint = this.constraints.get(0);
133
134 // Create spanElementDistance query
135 if (!constraint.getUnit().equals("w")) {
136 for (int i = 1; i < this.segments.size(); i++) {
137 query = new SpanDistanceQuery(
Eliza Margaretha609fcc62014-02-13 14:10:20 +0000138 new SpanElementQuery(this.field, constraint.getUnit()),
Nils Diewald164f8be2014-02-13 02:43:16 +0000139 query,
140 this.segments.get(i),
141 constraint.getMinDistance(),
142 constraint.getMaxDistance(),
143 this.isInOrder(),
144 true
145 );
146 };
147 }
148
149 // Create spanDistance query
150 else {
151 for (int i = 1; i < this.segments.size(); i++) {
152 query = new SpanDistanceQuery(
153 query,
154 this.segments.get(i),
155 constraint.getMinDistance(),
156 constraint.getMaxDistance(),
157 this.isInOrder(),
158 true
159 );
160 };
161 };
162
163 return (SpanQuery) query;
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000164 };
165
Nils Diewald164f8be2014-02-13 02:43:16 +0000166 // MultipleDistanceQueries
167 for (int i = 1; i < this.segments.size(); i++) {
168 query = new SpanMultipleDistanceQuery(
169 query,
170 this.segments.get(i),
171 this.constraints,
172 this.isInOrder(),
173 true
174 );
175 };
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000176
Nils Diewald164f8be2014-02-13 02:43:16 +0000177 return (SpanQuery) query;
Nils Diewaldd7cb0eb2014-02-12 23:06:10 +0000178 };
179
180 public void setInOrder (boolean isInOrder) {
181 this.isInOrder = isInOrder;
182 };
183
184 public boolean isInOrder () {
185 return this.isInOrder;
Nils Diewaldf399a672013-11-18 17:55:22 +0000186 };
Nils Diewald164f8be2014-02-13 02:43:16 +0000187
188 public boolean hasConstraints () {
189 if (this.constraints == null)
190 return false;
191 if (this.constraints.size() <= 0)
192 return false;
193 return true;
194 };
Nils Diewaldf399a672013-11-18 17:55:22 +0000195};