| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 1 | package Krawfish::Koral::Query::Focus; |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 2 | use strict; |
| 3 | use warnings; | ||||
| Akron | ee06a13 | 2017-12-08 16:59:27 +0100 | [diff] [blame^] | 4 | use Role::Tiny::With; |
| 5 | use Krawfish::Query::Base::Sorted; | ||||
| Akron | 1fe979b | 2017-07-25 14:58:47 +0200 | [diff] [blame] | 6 | use Memoize; |
| 7 | memoize('min_span'); | ||||
| 8 | memoize('max_span'); | ||||
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 9 | |
| Akron | ee06a13 | 2017-12-08 16:59:27 +0100 | [diff] [blame^] | 10 | with 'Krawfish::Koral::Query'; |
| 11 | |||||
| Akron | faf7685 | 2017-07-19 17:37:07 +0200 | [diff] [blame] | 12 | # TODO: |
| 13 | # If span is maybe_unsorted, use a sorted focus, | ||||
| 14 | # otherwise an unsorted focus. | ||||
| 15 | |||||
| 16 | |||||
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 17 | sub new { |
| 18 | my $class = shift; | ||||
| 19 | bless { | ||||
| Akron | 5b6264f | 2017-07-19 01:14:01 +0200 | [diff] [blame] | 20 | operands => [shift], |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 21 | nrs => shift |
| 22 | }, $class; | ||||
| 23 | }; | ||||
| 24 | |||||
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 25 | sub nrs { |
| 26 | $_[0]->{nrs}; | ||||
| 27 | }; | ||||
| 28 | |||||
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 29 | |
| Akron | faf7685 | 2017-07-19 17:37:07 +0200 | [diff] [blame] | 30 | # Optimize query to potentially need sorting |
| Akron | 55fb308 | 2017-07-18 13:24:53 +0200 | [diff] [blame] | 31 | sub optimize { |
| Akron | 48fabe5 | 2017-08-07 16:48:12 +0200 | [diff] [blame] | 32 | my ($self, $segment) = @_; |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 33 | |
| 34 | my $span; | ||||
| 35 | |||||
| 36 | # Not plannable | ||||
| Akron | 48fabe5 | 2017-08-07 16:48:12 +0200 | [diff] [blame] | 37 | unless ($span = $self->operand->optimize($segment)) { |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 38 | $self->copy_info_from($self->span); |
| 39 | return; | ||||
| 40 | }; | ||||
| 41 | |||||
| 42 | # Span has no match | ||||
| Akron | faf7685 | 2017-07-19 17:37:07 +0200 | [diff] [blame] | 43 | if ($span->max_freq == 0) { |
| Akron | 5a5595b | 2017-09-10 13:00:57 +0200 | [diff] [blame] | 44 | return $self->builder->nowhere; |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 45 | }; |
| 46 | |||||
| 47 | $span = Krawfish::Query::Focus->new($span, $self->nrs); | ||||
| 48 | |||||
| 49 | # Does not require sorted buffering | ||||
| Akron | 5b6264f | 2017-07-19 01:14:01 +0200 | [diff] [blame] | 50 | return $span unless $self->operand->maybe_unsorted; |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 51 | |
| 52 | # Requires sorted buffering | ||||
| 53 | return Krawfish::Query::Base::Sorted->new($span, 1000); | ||||
| 54 | }; | ||||
| 55 | |||||
| Akron | 1fe979b | 2017-07-25 14:58:47 +0200 | [diff] [blame] | 56 | sub min_span { |
| 57 | # TODO: | ||||
| 58 | # Find the nested operands and calculate the span length, | ||||
| 59 | # though this may not be trivial | ||||
| 60 | 0 | ||||
| 61 | }; | ||||
| 62 | |||||
| 63 | sub max_span { | ||||
| 64 | # TODO: | ||||
| 65 | # Find the nested operands and calculate the span length, | ||||
| 66 | # though this may not be trivial | ||||
| 67 | -1 | ||||
| 68 | }; | ||||
| Akron | 9b6ea8d | 2017-04-07 14:01:09 +0200 | [diff] [blame] | 69 | |
| Akron | 6ff7b48 | 2017-02-09 01:29:29 +0100 | [diff] [blame] | 70 | 1; |