blob: 9eb0ee0b36e0e2d35d5d0b2ab65c3bedf6da2dfe [file] [log] [blame]
Akronba87cba2016-10-24 03:13:51 +02001package Krawfish::Posting;
Akron71fc0ec2017-11-02 17:34:21 +01002use strict;
3use warnings;
Akron5df7d942017-11-01 17:42:34 +01004use Role::Tiny;
Akron71fc0ec2017-11-02 17:34:21 +01005use overload '""' => sub { $_[0]->to_string }, fallback => 1;
6use Krawfish::Util::Bits;
7use Krawfish::Posting::Payload;
8use Krawfish::Log;
9use bytes;
10
Akron5df7d942017-11-01 17:42:34 +010011requires qw/doc_id
12 flags
13 corpus_classes
14 same_as
15 to_string
16 clone/;
Akron5f521532016-10-21 19:30:23 +020017
Akronce242632017-11-23 17:19:10 +010018with 'Krawfish::Posting::Ranks';
19
Akronba0952d2017-10-23 18:59:55 +020020use constant DEBUG => 0;
Akron90225de2017-10-19 18:33:03 +020021
Akron875cc332016-11-15 13:06:58 +010022# Constructor
Akron5f521532016-10-21 19:30:23 +020023sub new {
24 my $class = shift;
25 bless { @_ }, $class;
26};
27
Akron875cc332016-11-15 13:06:58 +010028
Akron5f521532016-10-21 19:30:23 +020029# Current document
Akronf0d514a2016-11-01 14:16:25 +010030sub doc_id {
31 return $_[0]->{doc_id};
Akron5f521532016-10-21 19:30:23 +020032};
33
34
Akronba0952d2017-10-23 18:59:55 +020035# Corpus classes
Akron6fc5b712017-10-24 14:48:39 +020036sub flags {
Akronf0a77712017-10-18 16:39:18 +020037 my ($self, $flags) = @_;
38
Akronba0952d2017-10-23 18:59:55 +020039
40 # Class 0 is set per default
41 $self->{flags} //= 0b1000_0000_0000_0000;
42
43 return $self->{flags} unless defined $flags;
44 return $self->{flags} & $flags;
Akronf0a77712017-10-18 16:39:18 +020045};
46
47
Akron90225de2017-10-19 18:33:03 +020048# Returns a list of matching query corpus classes
Akronba0952d2017-10-23 18:59:55 +020049sub corpus_classes {
Akronf0a77712017-10-18 16:39:18 +020050 my ($self, $query_flags) = @_;
Akronba0952d2017-10-23 18:59:55 +020051
52 # Returns all flags requested and all flags existing
Akron6fc5b712017-10-24 14:48:39 +020053 my $intersect = $self->flags($query_flags);
Akronba0952d2017-10-23 18:59:55 +020054
Akronf0a77712017-10-18 16:39:18 +020055 my @list = ();
56
Akronba0952d2017-10-23 18:59:55 +020057 if (DEBUG) {
58 print_log(
59 'post',
60 'Intersection between stored and queried classes is <'.
61 reverse(bitstring($intersect)) . '>'
62 );
63 };
64
65 # Remove zero class
Akron015093d2017-10-24 18:47:44 +020066 return flags_to_classes($intersect & 0b0111_1111_1111_1111);
Akronf0a77712017-10-18 16:39:18 +020067};
68
Akrond8540bd2017-02-06 15:05:26 +010069
Akrona588d072017-10-13 14:45:34 +020070# Check if two postings are identical
Akrona588d072017-10-13 14:45:34 +020071sub same_as {
72 my ($self, $comp) = @_;
73 return unless $comp;
Akrond4bb15a2017-10-24 15:12:46 +020074 return if $self->doc_id != $comp->doc_id;
75 return if $self->flags != $comp->flags;
76 return 1;
Akrona588d072017-10-13 14:45:34 +020077};
78
79
Akrone0914532017-07-29 19:53:10 +020080# Stringification
Akron5f521532016-10-21 19:30:23 +020081sub to_string {
82 my $self = shift;
Akrone1a8a1b2017-10-20 16:51:09 +020083 my $str = '[' . $self->{doc_id};
Akron875cc332016-11-15 13:06:58 +010084
Akronba0952d2017-10-23 18:59:55 +020085 # In case a class != 0 is set - serialize
Akron6fc5b712017-10-24 14:48:39 +020086 if ($self->flags & 0b0111_1111_1111_1111) {
Akronba0952d2017-10-23 18:59:55 +020087 $str .= '!' . join(',', $self->corpus_classes);
Akron901bc372017-10-20 11:44:08 +020088 };
89
Akronce242632017-11-23 17:19:10 +010090 if ($self->ranks) {
91 $str .= '::' . join(',', map { $_ ? $_ : '0' } $self->ranks);
92 };
93
Akrone1a8a1b2017-10-20 16:51:09 +020094 $str . ']';
Akron5f521532016-10-21 19:30:23 +020095};
96
Akrond8540bd2017-02-06 15:05:26 +010097
Akrone1a8a1b2017-10-20 16:51:09 +020098
Akron5f521532016-10-21 19:30:23 +0200991;