blob: a7bac65bf89149c00aa8606f80172183c8f838d2 [file] [log] [blame]
Akronc1ed58c2017-08-04 17:26:30 +02001package Krawfish::Koral::Meta::Node::Sort;
Akronc5aef8b2017-09-25 19:20:21 +02002use Krawfish::Meta::Segment::Sort;
Akron5a5595b2017-09-10 13:00:57 +02003use Krawfish::Query::Nowhere;
Akronc1ed58c2017-08-04 17:26:30 +02004use Krawfish::Log;
5use strict;
6use warnings;
7
Akronf703f6f2017-08-25 21:20:52 +02008use constant (
9 DEBUG => 1,
10 UNIQUE => 'id'
11);
Akronc1ed58c2017-08-04 17:26:30 +020012
13sub new {
14 my $class = shift;
15
16 if (DEBUG) {
Akronf703f6f2017-08-25 21:20:52 +020017 print_log(
18 'kq_n_sort', 'Create sort query with ' .
19 join(', ', map {$_ ? $_ : '?'} @_)
20 );
Akronc1ed58c2017-08-04 17:26:30 +020021 };
22
23 my $self = bless {
Akrond15e2bb2017-08-11 18:23:14 +020024 query => shift,
25 sort => shift,
26 top_k => shift,
Akronc1ed58c2017-08-04 17:26:30 +020027 filter => shift
28 }, $class;
29};
30
31
Akronf703f6f2017-08-25 21:20:52 +020032sub type {
33 'sort';
34};
35
36
Akronc1ed58c2017-08-04 17:26:30 +020037# Get identifiers
38sub identify {
39 my ($self, $dict) = @_;
40
41 my @identifier;
42 foreach (@{$self->{sort}}) {
43
Akronf703f6f2017-08-25 21:20:52 +020044 # Criterion may not exist in dictionary
45 my $criterion = $_->identify($dict);
46 if ($criterion) {
47 push @identifier, $criterion;
Akronc1ed58c2017-08-04 17:26:30 +020048 };
49 };
50
51 $self->{query} = $self->{query}->identify($dict);
52
53 # Do not sort
54 if (@identifier == 0) {
55 warn 'There is currently no sorting defined';
56 return $self->{query};
57 };
58
59 $self->{sort} = \@identifier;
60 return $self;
61};
62
63
Akronf703f6f2017-08-25 21:20:52 +020064# Stringification
Akronc1ed58c2017-08-04 17:26:30 +020065sub to_string {
66 my $self = shift;
67 my $str = join(',', map { $_->to_string } @{$self->{sort}});
68
69 if ($self->{top_k}) {
70 $str .= ';k=' . $self->{top_k};
71 };
72
73 if ($self->{filter}) {
74 $str .= ';sortFilter'
75 };
76
77 return 'sort(' . $str . ':' . $self->{query}->to_string . ')';
78};
79
80
Akron45d31922017-09-15 17:05:36 +020081# Optimize query for postingslist
Akrond15e2bb2017-08-11 18:23:14 +020082sub optimize {
83 my ($self, $segment) = @_;
84
Akronf703f6f2017-08-25 21:20:52 +020085 my $query = $self->{query}->optimize($segment);
Akrond15e2bb2017-08-11 18:23:14 +020086
Akronf703f6f2017-08-25 21:20:52 +020087 if ($query->max_freq == 0) {
Akron5a5595b2017-09-10 13:00:57 +020088 return Krawfish::Query::Nowhere->new;
Akronf703f6f2017-08-25 21:20:52 +020089 };
90
Akronc5aef8b2017-09-25 19:20:21 +020091 # Krawfish::Meta::Segment::Sort->new(
Akron30690fb2017-09-22 14:25:25 +020092 # query => $query,
93 # index => $segment,
94 # top_k => $top_k,
95 # ranks =>
96 # unique =>
97 # max_rank_ref =>
98 # )
99
Akronf703f6f2017-08-25 21:20:52 +0200100 return $self;
Akrond15e2bb2017-08-11 18:23:14 +0200101};
102
Akronc1ed58c2017-08-04 17:26:30 +02001031;