blob: 1fbd5f35bde3ecf224d3e79c2b58ae0060339620 [file] [log] [blame]
Akron6ff7b482017-02-09 01:29:29 +01001package Krawfish::Koral::Query::Focus;
Akron6ff7b482017-02-09 01:29:29 +01002use strict;
3use warnings;
Akronee06a132017-12-08 16:59:27 +01004use Role::Tiny::With;
5use Krawfish::Query::Base::Sorted;
Akron1fe979b2017-07-25 14:58:47 +02006use Memoize;
7memoize('min_span');
8memoize('max_span');
Akron6ff7b482017-02-09 01:29:29 +01009
Akronee06a132017-12-08 16:59:27 +010010with 'Krawfish::Koral::Query';
11
Akronfaf76852017-07-19 17:37:07 +020012# TODO:
13# If span is maybe_unsorted, use a sorted focus,
14# otherwise an unsorted focus.
15
16
Akron6ff7b482017-02-09 01:29:29 +010017sub new {
18 my $class = shift;
19 bless {
Akron5b6264f2017-07-19 01:14:01 +020020 operands => [shift],
Akron6ff7b482017-02-09 01:29:29 +010021 nrs => shift
22 }, $class;
23};
24
Akron6ff7b482017-02-09 01:29:29 +010025sub nrs {
26 $_[0]->{nrs};
27};
28
Akron6ff7b482017-02-09 01:29:29 +010029
Akronfaf76852017-07-19 17:37:07 +020030# Optimize query to potentially need sorting
Akron55fb3082017-07-18 13:24:53 +020031sub optimize {
Akron48fabe52017-08-07 16:48:12 +020032 my ($self, $segment) = @_;
Akron6ff7b482017-02-09 01:29:29 +010033
34 my $span;
35
36 # Not plannable
Akron48fabe52017-08-07 16:48:12 +020037 unless ($span = $self->operand->optimize($segment)) {
Akron6ff7b482017-02-09 01:29:29 +010038 $self->copy_info_from($self->span);
39 return;
40 };
41
42 # Span has no match
Akronfaf76852017-07-19 17:37:07 +020043 if ($span->max_freq == 0) {
Akron5a5595b2017-09-10 13:00:57 +020044 return $self->builder->nowhere;
Akron6ff7b482017-02-09 01:29:29 +010045 };
46
47 $span = Krawfish::Query::Focus->new($span, $self->nrs);
48
49 # Does not require sorted buffering
Akron5b6264f2017-07-19 01:14:01 +020050 return $span unless $self->operand->maybe_unsorted;
Akron6ff7b482017-02-09 01:29:29 +010051
52 # Requires sorted buffering
53 return Krawfish::Query::Base::Sorted->new($span, 1000);
54};
55
Akron1fe979b2017-07-25 14:58:47 +020056sub 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
63sub max_span {
64 # TODO:
65 # Find the nested operands and calculate the span length,
66 # though this may not be trivial
67 -1
68};
Akron9b6ea8d2017-04-07 14:01:09 +020069
Akron6ff7b482017-02-09 01:29:29 +0100701;