blob: ad4b143ec56199ca02126f286cd6815dd961dd6a [file] [log] [blame]
Akron66485972017-12-07 19:53:14 +01001package Krawfish::Koral::Compile::Node::Merge;
2
3# TODO:
4# THIS IS WRONG HERE!
5
6use Krawfish::Compile::Node;
7
8# TODO:
9# May require Node::nowhere!
10use Krawfish::Compile::Segment::Nowhere;
11use Krawfish::Log;
12use strict;
13use warnings;
14
15# TODO:
16# This runs on the node level
17# and is different to all other
18# Krawfish::Koral::Compile::Node::* queries
19
20use constant DEBUG => 1;
21
22
23sub new {
24 my $class = shift;
25
26 bless {
27 query => shift,
Akron4a6fbed2017-12-08 12:54:43 +010028 top_k => shift // 100,
Akron66485972017-12-07 19:53:14 +010029 }, $class;
30};
31
32
33# Query type
34sub type {
35 'node_merge';
36};
37
38
39# Identify query
40sub identify {
41 my ($self, $dict) = @_;
42 $self->{query} = $self->{query}->identify($dict);
43 return $self;
44};
45
46
47# Optimize query to segments
48sub optimize {
49 my ($self, $segments) = @_;
50
51 # Accept a single segment as well
52 $segments = ref $segments ne 'ARRAY' ? [$segments] : $segments;
53
54 if (DEBUG) {
55 print_log(
56 'kq_n_merge',
57 'Optimize query on node level'
58 );
59 };
60
Akron4a6fbed2017-12-08 12:54:43 +010061
62 # Optimize queries for segments
63 my @queries;
64 foreach my $seg (@$segments) {
65 my $segment_query = $self->{query}->optimize($seg);
66
67 if (DEBUG) {
68 print_log('cmp_node', 'Add query ' . $segment_query->to_string . ' to merge');
69 };
70
71 # There are results expected
72 if ($segment_query->max_freq != 0) {
73 push @queries, $segment_query;
74 };
75 };
76
77 # Query does not require sorted result
78 if (Role::Tiny::does_role($self->{query}, 'Krawfish::Koral::Compile::Node::Group')) {
79 $self->{top_k} = 0;
80 };
Akron66485972017-12-07 19:53:14 +010081
82 # Create new node query
83 my $query = Krawfish::Compile::Node->new(
Akron66485972017-12-07 19:53:14 +010084 top_k => $self->{top_k},
Akron4a6fbed2017-12-08 12:54:43 +010085 queries => \@queries
Akron66485972017-12-07 19:53:14 +010086 );
87
88 if ($query->max_freq == 0) {
89 return Krawfish::Compile::Segment::Nowhere->new;
90 };
91
92 return $query;
93};
94
95
96
97# Stringification
98sub to_string {
99 my ($self, $id) = @_;
100
101 my $str = 'node(';
102
103 if ($self->{top_k}) {
Akron4a6fbed2017-12-08 12:54:43 +0100104 $str .= 'k=' . $self->{top_k} . ':';
Akron66485972017-12-07 19:53:14 +0100105 };
106
Akron4a6fbed2017-12-08 12:54:43 +0100107 return $str . $self->{query}->to_string($id) . ')';
Akron66485972017-12-07 19:53:14 +0100108};
109
110
1111;