| Akron | 6e62986 | 2017-01-01 17:08:27 +0100 | [diff] [blame] | 1 | package Krawfish::Result::Snippet; |
| 2 | use parent 'Krawfish::Result'; | ||||
| 3 | use Krawfish::Result::Snippet::Highlights; | ||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 4 | use Krawfish::Log; |
| 5 | use strict; | ||||
| 6 | use warnings; | ||||
| 7 | |||||
| Akron | 1273619 | 2017-03-08 20:31:58 +0100 | [diff] [blame] | 8 | use constant DEBUG => 0; |
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 9 | |
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 10 | # TODO: |
| 11 | # - ExpandToSpan | ||||
| 12 | # - Context with chars and tokens | ||||
| 13 | |||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 14 | sub new { |
| 15 | my $class = shift; | ||||
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 16 | my %param = @_; |
| 17 | |||||
| 18 | my $self = bless { | ||||
| 19 | query => $param{query}, | ||||
| 20 | index => $param{index} | ||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 21 | }, $class; |
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 22 | |
| Akron | 6a74973 | 2017-02-14 14:43:06 +0100 | [diff] [blame] | 23 | $self->{subtokens} = $self->{index}->subtokens; |
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 24 | |
| 25 | # Create highlight object | ||||
| Akron | 6e62986 | 2017-01-01 17:08:27 +0100 | [diff] [blame] | 26 | $self->{highlights} = Krawfish::Result::Snippet::Highlights->new( |
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 27 | $param{highlights}, |
| Akron | 6a74973 | 2017-02-14 14:43:06 +0100 | [diff] [blame] | 28 | $self->{subtokens} |
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 29 | ); |
| 30 | |||||
| 31 | return $self; | ||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 32 | }; |
| 33 | |||||
| 34 | |||||
| 35 | # Iterated through the ordered linked list | ||||
| 36 | sub next { | ||||
| 37 | my $self = shift; | ||||
| 38 | $self->{match} = undef; | ||||
| Akron | eed5391 | 2017-02-17 03:09:45 +0100 | [diff] [blame] | 39 | # $self->{highlights}->clear; |
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 40 | return $self->{query}->next; |
| 41 | }; | ||||
| 42 | |||||
| 43 | |||||
| Akron | eed5391 | 2017-02-17 03:09:45 +0100 | [diff] [blame] | 44 | # Return the current match |
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 45 | sub current_match { |
| 46 | my $self = shift; | ||||
| 47 | |||||
| 48 | print_log('c_snippet', 'Get current match') if DEBUG; | ||||
| 49 | |||||
| 50 | # Match is already set | ||||
| 51 | return $self->{match} if $self->{match}; | ||||
| 52 | |||||
| 53 | # Get current match from query | ||||
| 54 | my $match = $self->match_from_query; | ||||
| 55 | |||||
| 56 | print_log('c_snippet', 'match is' . $match) if DEBUG; | ||||
| 57 | |||||
| 58 | my $pd = $self->{index}->primary->get( | ||||
| 59 | $match->doc_id, | ||||
| 60 | 0, | ||||
| 61 | 500 | ||||
| 62 | ) // ''; | ||||
| 63 | |||||
| Akron | c001d36 | 2016-12-12 19:07:52 +0100 | [diff] [blame] | 64 | # TODO: $highlights |
| 65 | |||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 66 | $match->fields({snippet => $pd}); |
| 67 | |||||
| 68 | $self->{match} = $match; | ||||
| 69 | return $match; | ||||
| 70 | }; | ||||
| 71 | |||||
| Akron | eed5391 | 2017-02-17 03:09:45 +0100 | [diff] [blame] | 72 | |
| 73 | # Stringification | ||||
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 74 | sub to_string { |
| 75 | my $self = shift; | ||||
| 76 | my $str = 'collectSnippet('; | ||||
| 77 | $str .= $self->{query}->to_string; | ||||
| 78 | return $str . ')'; | ||||
| 79 | }; | ||||
| 80 | |||||
| Akron | eed5391 | 2017-02-17 03:09:45 +0100 | [diff] [blame] | 81 | |
| Akron | a1fbdeb | 2016-12-12 02:06:08 +0100 | [diff] [blame] | 82 | # From Mojo::Util |
| 83 | sub _squote { | ||||
| 84 | my $str = shift; | ||||
| 85 | $str =~ s/(['\\])/\\$1/g; | ||||
| 86 | return qq{'$str'}; | ||||
| 87 | }; | ||||
| 88 | |||||
| 89 | |||||
| 90 | 1; | ||||