blob: 106de490062a85a06482bddabb43a31af1b5c2b3 [file] [log] [blame]
package Krawfish::Compile::Segment::Sort::Field;
use Krawfish::Log;
use strict;
use warnings;
use constant DEBUG => 0;
# TODO:
# Use this an instantiate it directly with
# a ranking!
# Sorting criterion for field ranks.
# TODO:
# Probably not only support ranks but all kinds of sorting
# by having a get_lt() API that also works for strings!
# TODO:
# Return max rank for unknown fields!
# TODO:
# This may need to be an inflatable
sub new {
my $class = shift;
my ($segment, $field_id, $descending) = @_;
# Get ranking
my $rank = $segment->field_ranks->by($field_id);
return unless $rank;
my $self = bless {
field_id => $field_id,
rank => $rank,
desc => $descending,
max_rank => $rank->max_rank
}, $class;
return $self;
};
sub type {
'field';
};
# Get the rank for this criterion
sub rank_for {
my ($self, $doc_id) = @_;
# Get fields in descending order
if ($self->{desc}) {
# This may be a real descending order file
# or a reversed single-valued ascending order file
return $self->{rank}->desc_rank_for($doc_id) || ($self->max_rank + 1);
};
# Get fields in ascending order
return $self->{rank}->asc_rank_for($doc_id) || ($self->max_rank + 1);
# Get rank if rank is littler than value
# my $value = shift;
# return $self->{rank}->rank_doc_lt($doc_id, $value);
# my $max = $ranking->max if $desc;
};
# Get key by rank
sub key_for {
my ($self, $rank) = @_;
# Get fields in descending order
if ($self->{desc}) {
# This may be a real descending order file
# or a reversed single-valued ascending order file
return $self->{rank}->desc_key_for($rank);
};
# Get fields in ascending order
return $self->{rank}->asc_key_for($rank);
};
sub criterion {
$_[0]->{field_id};
};
sub max_rank {
$_[0]->{max_rank}
}
sub term_id {
$_[0]->{field_id};
};
# Stringification
sub to_string {
my $self = shift;
return 'field=#' . $self->{field_id} . ($self->{desc} ? '>' : '<')
};
1;