blob: e9b6a809cb62c8800e8b28f8701142b98e5d990c [file] [log] [blame]
Akronba87cba2016-10-24 03:13:51 +02001package Krawfish::Posting;
Akron5f521532016-10-21 19:30:23 +02002use overload '""' => sub { $_[0]->to_string }, fallback => 1;
Akronba0952d2017-10-23 18:59:55 +02003use Krawfish::Util::Bits;
Akron875cc332016-11-15 13:06:58 +01004use Krawfish::Posting::Payload;
Akronba0952d2017-10-23 18:59:55 +02005use Krawfish::Log;
6use bytes;
Akron5f521532016-10-21 19:30:23 +02007use strict;
8use warnings;
9
Akronba0952d2017-10-23 18:59:55 +020010use constant DEBUG => 0;
Akron90225de2017-10-19 18:33:03 +020011
Akron875cc332016-11-15 13:06:58 +010012# Constructor
Akron5f521532016-10-21 19:30:23 +020013sub new {
14 my $class = shift;
15 bless { @_ }, $class;
16};
17
Akron875cc332016-11-15 13:06:58 +010018
Akron5f521532016-10-21 19:30:23 +020019# Current document
Akronf0d514a2016-11-01 14:16:25 +010020sub doc_id {
21 return $_[0]->{doc_id};
Akron5f521532016-10-21 19:30:23 +020022};
23
24
Akronba0952d2017-10-23 18:59:55 +020025# Corpus classes
Akron6fc5b712017-10-24 14:48:39 +020026sub flags {
Akronf0a77712017-10-18 16:39:18 +020027 my ($self, $flags) = @_;
28
Akronba0952d2017-10-23 18:59:55 +020029
30 # Class 0 is set per default
31 $self->{flags} //= 0b1000_0000_0000_0000;
32
33 return $self->{flags} unless defined $flags;
34 return $self->{flags} & $flags;
Akronf0a77712017-10-18 16:39:18 +020035};
36
37
Akron90225de2017-10-19 18:33:03 +020038# Returns a list of matching query corpus classes
Akronba0952d2017-10-23 18:59:55 +020039sub corpus_classes {
Akronf0a77712017-10-18 16:39:18 +020040 my ($self, $query_flags) = @_;
Akronba0952d2017-10-23 18:59:55 +020041
42 # Returns all flags requested and all flags existing
Akron6fc5b712017-10-24 14:48:39 +020043 my $intersect = $self->flags($query_flags);
Akronba0952d2017-10-23 18:59:55 +020044
Akronf0a77712017-10-18 16:39:18 +020045 my @list = ();
46
Akronba0952d2017-10-23 18:59:55 +020047 if (DEBUG) {
48 print_log(
49 'post',
50 'Intersection between stored and queried classes is <'.
51 reverse(bitstring($intersect)) . '>'
52 );
53 };
54
55 # Remove zero class
56 $intersect &= 0b0111_1111_1111_1111;
57
58 # Initialize move variable
59 my $move = 0b0100_0000_0000_0000;
60
61 my $i = 1;
62
63 # As long as there a set bits ...
64 while ($intersect) {
65
66 if (DEBUG) {
67 print_log(
68 'post',
69 'Check move ' . reverse(bitstring($move)) . ' and intersect ' .
70 reverse(bitstring($intersect))
71 );
Akronf0a77712017-10-18 16:39:18 +020072 };
Akronba0952d2017-10-23 18:59:55 +020073
74 if ($intersect & $move) {
75 if (DEBUG) {
76 print_log(
77 'post',
78 'Move ' . reverse(bitstring($move)) . ' matches ' . reverse(bitstring($intersect))
79 );
80 };
81 push @list, $i;
82 $intersect &= ~$move;
83 };
84 $move >>= 1;
85 $i++;
Akronf0a77712017-10-18 16:39:18 +020086 };
87
88 # Return list of valid classes
89 return @list;
90};
91
Akrond8540bd2017-02-06 15:05:26 +010092
Akrona588d072017-10-13 14:45:34 +020093# Check if two postings are identical
94# WARNING:
95# This should compare payloads separately,
96# because classes may be in different order,
97# though resulting in identical postings
Akron6fc5b712017-10-24 14:48:39 +020098# TODO:
99# Serialization is also bad for flags!!!
Akrona588d072017-10-13 14:45:34 +0200100sub same_as {
101 my ($self, $comp) = @_;
102 return unless $comp;
103 return $self->to_string eq $comp->to_string;
104};
105
106
Akrone0914532017-07-29 19:53:10 +0200107# Stringification
Akron5f521532016-10-21 19:30:23 +0200108sub to_string {
109 my $self = shift;
Akrone1a8a1b2017-10-20 16:51:09 +0200110 my $str = '[' . $self->{doc_id};
Akron875cc332016-11-15 13:06:58 +0100111
Akronba0952d2017-10-23 18:59:55 +0200112 # In case a class != 0 is set - serialize
Akron6fc5b712017-10-24 14:48:39 +0200113 if ($self->flags & 0b0111_1111_1111_1111) {
Akronba0952d2017-10-23 18:59:55 +0200114 $str .= '!' . join(',', $self->corpus_classes);
Akron901bc372017-10-20 11:44:08 +0200115 };
116
Akrone1a8a1b2017-10-20 16:51:09 +0200117 $str . ']';
Akron5f521532016-10-21 19:30:23 +0200118};
119
Akrond8540bd2017-02-06 15:05:26 +0100120
Akrone1a8a1b2017-10-20 16:51:09 +0200121
Akron5f521532016-10-21 19:30:23 +02001221;