blob: 81b8967142b1b84c1dd32a38bdecb960fe832107 [file] [log] [blame]
Akron5e4b2972017-08-05 20:59:48 +02001package Krawfish::Koral::Query::Match;
2use parent 'Krawfish::Koral::Query';
3use Krawfish::Query::Match;
4use strict;
5use warnings;
6
7# This Query does not search segment data, but
8# returns the data it is passed to.
9# It is used to fetch enriched match data.
10# Normally it only matches for certain documents,
11# meaning it is normally encapsulated into a filter.
12
13use constant {
14 DEBUG => 0
15};
16
17
18sub new {
19 my $class = shift;
20 bless {
21 operands => [shift],
22 start => shift,
23 end => shift
24 }, $class;
25};
26
27
28sub to_koral_fragment {
29 my $self = shift;
30 return {
31 '@type' => 'koral:match',
32 'doc' => $self->operand->to_koral_fragment,
33 'start' => $self->start,
34 'end' => $self->end
35 };
36};
37
38sub type { 'match' };
39
40
41# A match has a defined span
42sub min_span {
43 $_[0]->end - $_[0]->start;
44};
45
46
47# A match has a defined span
48sub max_span {
49 $_[0]->end - $_[0]->start;
50};
51
52
53# Normalize the class query
54sub normalize {
55 my $self = shift;
56
57 my $doc;
58 unless ($doc = $self->operand->normalize) {
59 $self->copy_info_from($self->operand);
60 return;
61 };
62
63 $self->operand($doc);
64
65 # If there can't be a valid match
66 if ($self->start < 0) {
67
68 # TODO:
69 # Warn about out of scope
Akron5a5595b2017-09-10 13:00:57 +020070 return $self->builder->nowhere;
Akron5e4b2972017-08-05 20:59:48 +020071 }
72
73 # Defined span is negative
74 elsif ($self->start > $self->end) {
Akron5a5595b2017-09-10 13:00:57 +020075 return $self->builder->nowhere;
Akron5e4b2972017-08-05 20:59:48 +020076 };
77
78 return $self;
79};
80
81
82# Treat the query as if it is root
83sub finalize {
84 my $self = shift;
85
86 # If there can't be a valid match
87 if ($self->start == $self->end) {
Akron5a5595b2017-09-10 13:00:57 +020088 return $self->builder->nowhere;
Akron5e4b2972017-08-05 20:59:48 +020089 };
90
91 return $self;
92};
93
94
Akron48fabe52017-08-07 16:48:12 +020095# Optimize on segment
Akron5e4b2972017-08-05 20:59:48 +020096sub optimize {
97 my ($self, $segment) = @_;
98
99 # Get document optimized
100 my $doc = $self->operand->optimize($segment);
101
Akron5a5595b2017-09-10 13:00:57 +0200102 # Return nowhere if document is not found
Akron5e4b2972017-08-05 20:59:48 +0200103 return $doc if $doc->max_freq == 0;
104
105 return Krawfish::Query::Match->new(
106 $doc,
107 $self->start,
108 $self->end
109 );
110};
111
112
113
114sub to_string {
115 my $self = shift;
116 return '[[' . $self->operand->to_string . ':' . $self->start . '-' . $self->end . ']]';
117};
118
119
120sub start {
121 $_[0]->{start};
122};
123
124
125sub end {
126 $_[0]->{end};
127};
128
129
Akron655a10a2017-09-11 14:13:18 +0200130sub is_anywhere {
Akron5e4b2972017-08-05 20:59:48 +0200131 0;
132};
133
134
135sub is_optional {
136 0;
137};
138
139
140sub is_null {
141 my $self = shift;
142 if ($self->start == $self->end) {
143 return 1;
144 };
145 return;
146};
147
148
149sub is_negative {
150 0;
151};
152
153
154sub is_extended {
155 1;
156};
157
158
159sub is_extended_right {
160 1;
161};
162
163
164sub is_extended_left {
165 0;
166};
167
168
169sub maybe_unsorded {
170 0;
171};
172
173
174sub is_classed {
175 0;
176};
177
178
179sub from_koral {
180 my ($class, $kq) = @_;
181 ...
182};
183
184
1851;