blob: fa366acfd5da5b8dcbc5ad48890f0b2b649a85bc [file] [log] [blame]
Akron5cf5fca2017-10-09 19:01:47 +02001package Krawfish::Compile::Segment::Sort::Field;
Akron510baba2017-09-27 19:14:48 +02002use Krawfish::Log;
Akronfb9e6522017-05-27 14:35:00 +02003use strict;
4use warnings;
5
Akron5cf5fca2017-10-09 19:01:47 +02006use constant DEBUG => 0;
Akron510baba2017-09-27 19:14:48 +02007
8# TODO:
9# Use this an instantiate it directly with
10# a ranking!
11
Akronfb9e6522017-05-27 14:35:00 +020012# Sorting criterion for field ranks.
13
14# TODO:
15# Probably not only support ranks but all kinds of sorting
16# by having a get_lt() API that also works for strings!
17
Akron96c2f142017-09-28 13:13:15 +020018# TODO:
19# Return max rank for unknown fields!
20
Akrond5abf652017-11-22 15:47:41 +010021# TODO:
22# This may need to be an inflatable
23
24
Akronfb9e6522017-05-27 14:35:00 +020025sub new {
26 my $class = shift;
27
Akron8d0593b2017-08-28 19:35:55 +020028 my ($segment, $field_id, $descending) = @_;
29
Akron510baba2017-09-27 19:14:48 +020030 # Get ranking
31 my $rank = $segment->field_ranks->by($field_id);
32
33 return unless $rank;
34
Akronfb9e6522017-05-27 14:35:00 +020035 my $self = bless {
Akron96c2f142017-09-28 13:13:15 +020036 field_id => $field_id,
37 desc => $descending,
38 max_rank => $rank->max_rank
Akronfb9e6522017-05-27 14:35:00 +020039 }, $class;
40
Akron8d0593b2017-08-28 19:35:55 +020041 # Get fields in descending order
Akron510baba2017-09-27 19:14:48 +020042 if ($descending) {
Akron8d0593b2017-08-28 19:35:55 +020043
44 # This may be a real descending order file
45 # or a reversed single-valued ascending order file
Akron96c2f142017-09-28 13:13:15 +020046 $self->{rank} = $rank->descending or return;
Akron8d0593b2017-08-28 19:35:55 +020047 }
48
49 # Get fields in ascending order
50 else {
Akron96c2f142017-09-28 13:13:15 +020051 $self->{rank} = $rank->ascending or return;
Akron8d0593b2017-08-28 19:35:55 +020052 };
53
Akronfb9e6522017-05-27 14:35:00 +020054 return $self;
55};
56
Akron4204f172017-10-02 22:32:02 +020057sub type {
58 'field';
59};
60
Akronfb9e6522017-05-27 14:35:00 +020061
Akron510baba2017-09-27 19:14:48 +020062# Get the rank for this criterion
63sub rank_for {
64 my ($self, $doc_id) = @_;
Akron8d0593b2017-08-28 19:35:55 +020065
Akrond5abf652017-11-22 15:47:41 +010066 return $self->{rank}->rank_for($doc_id) || ($self->max_rank + 1);
Akron8d0593b2017-08-28 19:35:55 +020067
68 # Get rank if rank is littler than value
Akron510baba2017-09-27 19:14:48 +020069 # my $value = shift;
70 # return $self->{rank}->rank_doc_lt($doc_id, $value);
Akron8d0593b2017-08-28 19:35:55 +020071 # my $max = $ranking->max if $desc;
Akron8d0593b2017-08-28 19:35:55 +020072};
73
74
75sub criterion {
76 $_[0]->{field_id};
Akronfb9e6522017-05-27 14:35:00 +020077};
78
Akron96c2f142017-09-28 13:13:15 +020079sub max_rank {
80 $_[0]->{max_rank}
81}
82
83sub term_id {
84 $_[0]->{field_id};
85};
Akronfb9e6522017-05-27 14:35:00 +020086
Akrond5abf652017-11-22 15:47:41 +010087
88# Stringification
Akron510baba2017-09-27 19:14:48 +020089sub to_string {
90 my $self = shift;
Akrond5abf652017-11-22 15:47:41 +010091 return 'field=#' . $self->{field_id} . ($self->{desc} ? '>' : '<')
Akron510baba2017-09-27 19:14:48 +020092};
93
Akronfb9e6522017-05-27 14:35:00 +0200941;