blob: 992787c270730a511c957468446def776294c93a [file] [log] [blame]
margaretha5c26de42015-04-14 12:47:58 +02001package de.ids_mannheim.korap.query.wrap;
2
margaretha5c26de42015-04-14 12:47:58 +02003import org.apache.lucene.search.spans.SpanQuery;
margarethaf70addb2015-04-27 13:17:18 +02004import org.apache.lucene.search.spans.SpanTermQuery;
margaretha5c26de42015-04-14 12:47:58 +02005
6import de.ids_mannheim.korap.query.SpanFocusQuery;
margarethaf70addb2015-04-27 13:17:18 +02007import de.ids_mannheim.korap.query.SpanRelationMatchQuery;
8import de.ids_mannheim.korap.query.SpanRelationQuery;
margaretha5c26de42015-04-14 12:47:58 +02009import de.ids_mannheim.korap.util.QueryException;
10
11public class SpanRelationWrapper extends SpanQueryWrapper {
12
13 private SpanQueryWrapper relationQuery;
14 private SpanQueryWrapper subQuery1;
15 private SpanQueryWrapper subQuery2;
margarethab097bac2015-04-15 11:37:02 +020016
Akronbb5d1732015-06-22 01:22:40 +020017
margaretha5c26de42015-04-14 12:47:58 +020018 public SpanRelationWrapper (SpanQueryWrapper relationWrapper,
Akronbb5d1732015-06-22 01:22:40 +020019 SpanQueryWrapper operand1,
20 SpanQueryWrapper operand2) {
margaretha5c26de42015-04-14 12:47:58 +020021
22 this.relationQuery = relationWrapper;
23 if (relationQuery != null) {
24 this.isNull = false;
25 }
26 else
27 return;
28
margarethab59eefa2015-04-14 15:55:32 +020029 if (relationQuery.isEmpty) {
30 this.isEmpty = true;
31 return;
32 }
33
margaretha5c26de42015-04-14 12:47:58 +020034 this.subQuery1 = operand1;
35 this.subQuery2 = operand2;
36 }
37
margarethab097bac2015-04-15 11:37:02 +020038
margaretha5c26de42015-04-14 12:47:58 +020039 @Override
Akronbb5d1732015-06-22 01:22:40 +020040 public SpanQuery toQuery () throws QueryException {
margaretha5c26de42015-04-14 12:47:58 +020041
margarethab59eefa2015-04-14 15:55:32 +020042 if (this.isNull() || this.isEmpty()) {
margaretha5c26de42015-04-14 12:47:58 +020043 return null;
44 }
45
Akronbb5d1732015-06-22 01:22:40 +020046 SpanTermQuery relationTermQuery = (SpanTermQuery) relationQuery
47 .retrieveNode(this.retrieveNode).toQuery();
margarethaf70addb2015-04-27 13:17:18 +020048 if (relationTermQuery == null)
margarethab097bac2015-04-15 11:37:02 +020049 return null;
Akronbb5d1732015-06-22 01:22:40 +020050
margarethaf70addb2015-04-27 13:17:18 +020051 SpanRelationQuery rq = new SpanRelationQuery(relationTermQuery, true);
margaretha5c26de42015-04-14 12:47:58 +020052 SpanQuery subq1, subq2;
margarethaf70addb2015-04-27 13:17:18 +020053
margaretha5c26de42015-04-14 12:47:58 +020054 if (subQuery1.isEmpty) {
55 if (!subQuery2.isEmpty) {
margarethaca8d6222015-04-15 13:46:41 +020056 // match target
margaretha5c26de42015-04-14 12:47:58 +020057 subq2 = subQuery2.retrieveNode(this.retrieveNode).toQuery();
margarethaf70addb2015-04-27 13:17:18 +020058 if (subQuery1.hasClass) {
59 rq.setSourceClass(subQuery1.getClassNumber());
margaretha5c26de42015-04-14 12:47:58 +020060 }
margarethaf70addb2015-04-27 13:17:18 +020061
62 return new SpanRelationMatchQuery(rq, subq2, true);
margaretha5c26de42015-04-14 12:47:58 +020063 }
64 }
65 else if (subQuery2.isEmpty) {
66 if (!subQuery1.isEmpty) {
margarethaca8d6222015-04-15 13:46:41 +020067 // match source
margaretha5c26de42015-04-14 12:47:58 +020068 subq1 = subQuery1.retrieveNode(this.retrieveNode).toQuery();
margarethaf70addb2015-04-27 13:17:18 +020069 if (subQuery2.hasClass) {
70 rq.setTargetClass(subQuery2.getClassNumber());
margaretha5c26de42015-04-14 12:47:58 +020071 }
margarethaf70addb2015-04-27 13:17:18 +020072 return new SpanRelationMatchQuery(rq, subq1, true);
margarethab097bac2015-04-15 11:37:02 +020073 }
margaretha5c26de42015-04-14 12:47:58 +020074 }
margarethab097bac2015-04-15 11:37:02 +020075 else {
margaretha5c26de42015-04-14 12:47:58 +020076 // match both
77 subq1 = subQuery1.retrieveNode(this.retrieveNode).toQuery();
margaretha5c26de42015-04-14 12:47:58 +020078 subq2 = subQuery2.retrieveNode(this.retrieveNode).toQuery();
margarethaf70addb2015-04-27 13:17:18 +020079 return new SpanRelationMatchQuery(rq, subq1, subq2, true);
margaretha5c26de42015-04-14 12:47:58 +020080 }
margarethab097bac2015-04-15 11:37:02 +020081
margarethaf70addb2015-04-27 13:17:18 +020082 // both empty
83 if (subQuery1.hasClass) {
84 rq.setSourceClass(subQuery1.getClassNumber());
margarethaca8d6222015-04-15 13:46:41 +020085 }
margarethaf70addb2015-04-27 13:17:18 +020086 if (subQuery2.hasClass) {
87 rq.setTargetClass(subQuery2.getClassNumber());
88 }
89 SpanFocusQuery fq = new SpanFocusQuery(rq, rq.getTempClassNumbers());
90 fq.setMatchTemporaryClass(true);
91 fq.setRemoveTemporaryClasses(true);
92 fq.setSorted(false);
93 return fq;
margaretha5c26de42015-04-14 12:47:58 +020094 }
95}