| Akron | 6d9341b | 2016-11-16 16:59:01 +0100 | [diff] [blame] | 1 | package Krawfish::Query::Unique; |
| 2 | use parent 'Krawfish::Query'; |
| 3 | use Krawfish::Log; |
| 4 | use strict; |
| 5 | use warnings; |
| 6 | |
| 7 | use constant DEBUG => 0; |
| 8 | |
| 9 | sub new { |
| 10 | my $class = shift; |
| 11 | bless { |
| 12 | span => shift, |
| 13 | last => undef |
| 14 | }; |
| 15 | }; |
| 16 | |
| Akron | b765367 | 2017-08-07 14:34:14 +0200 | [diff] [blame] | 17 | sub clone { |
| 18 | my $self = shift; |
| 19 | __PACKAGE__->new( |
| 20 | $self->{span}->clone |
| 21 | ); |
| 22 | }; |
| 23 | |
| Akron | 6d9341b | 2016-11-16 16:59:01 +0100 | [diff] [blame] | 24 | sub next { |
| 25 | my $self = shift; |
| 26 | |
| 27 | print_log('unique', 'Next unique span') if DEBUG; |
| 28 | |
| 29 | my $span = $self->{span}; |
| 30 | while ($span->next) { |
| 31 | my $current = $span->current; |
| 32 | |
| 33 | print_log('unique', 'Found ' . $current->to_string) if DEBUG; |
| 34 | |
| Akron | a3581a9 | 2017-08-17 17:45:37 +0200 | [diff] [blame] | 35 | unless ($current->same_as($self->{last})) { |
| Akron | 6d9341b | 2016-11-16 16:59:01 +0100 | [diff] [blame] | 36 | |
| 37 | print_log('unique', 'Span is unique') if DEBUG; |
| 38 | |
| 39 | $self->{last} = $current; |
| 40 | $self->{doc_id} = $current->doc_id; |
| 41 | $self->{start} = $current->start; |
| 42 | $self->{end} = $current->end; |
| 43 | $self->{payload} = $current->payload; |
| 44 | return 1; |
| 45 | } |
| 46 | elsif (DEBUG) { |
| 47 | print_log('unique', 'Span is not unique'); |
| 48 | }; |
| 49 | |
| Akron | 4204f17 | 2017-10-02 22:32:02 +0200 | [diff] [blame] | 50 | CORE::next; |
| Akron | 6d9341b | 2016-11-16 16:59:01 +0100 | [diff] [blame] | 51 | }; |
| 52 | return; |
| 53 | }; |
| 54 | |
| 55 | sub to_string { |
| 56 | return 'unique(' . $_[0]->{span}->to_string . ')'; |
| 57 | }; |
| 58 | |
| Akron | 0c998cc | 2017-07-19 03:29:37 +0200 | [diff] [blame] | 59 | |
| Akron | faf7685 | 2017-07-19 17:37:07 +0200 | [diff] [blame] | 60 | sub max_freq { |
| 61 | $_[0]->{span}->max_freq; |
| Akron | 0c998cc | 2017-07-19 03:29:37 +0200 | [diff] [blame] | 62 | }; |
| 63 | |
| Akron | 15fc197 | 2017-07-20 22:53:00 +0200 | [diff] [blame] | 64 | |
| 65 | sub filter_by { |
| 66 | my ($self, $corpus) = @_; |
| 67 | $self->{span} = $self->{span}->filter_by($corpus); |
| 68 | return $self; |
| 69 | }; |
| 70 | |
| Akron | 6d9341b | 2016-11-16 16:59:01 +0100 | [diff] [blame] | 71 | 1; |