Introduced stored fields
diff --git a/lib/Krawfish/Index/Fields/Doc.pm b/lib/Krawfish/Index/Fields/Doc.pm
index 1ae47a9..e6d0d37 100644
--- a/lib/Krawfish/Index/Fields/Doc.pm
+++ b/lib/Krawfish/Index/Fields/Doc.pm
@@ -45,8 +45,8 @@
push @data, $_->key_id; # Key data
push @data, $_->type; # Key type marker
# Store term or value!
- push @data, $_->term_id;
- push @data, $_->value if $_->type eq 'int';;
+ push @data, $_->term_id unless $_->type eq 'store';
+ push @data, $_->value if $_->type eq 'int' || $_->type eq 'store';
};
push @data, 'EOF';
diff --git a/lib/Krawfish/Index/Fields/Pointer.pm b/lib/Krawfish/Index/Fields/Pointer.pm
index 7527858..5ac97b1 100644
--- a/lib/Krawfish/Index/Fields/Pointer.pm
+++ b/lib/Krawfish/Index/Fields/Pointer.pm
@@ -1,4 +1,7 @@
package Krawfish::Index::Fields::Pointer;
+use Krawfish::Koral::Document::FieldInt;
+use Krawfish::Koral::Document::FieldStore;
+use Krawfish::Koral::Document::FieldString;
use Krawfish::Log;
use warnings;
use strict;
@@ -72,6 +75,7 @@
};
+# This returns only int-values - so it may need to be renamed
sub values {
my $self = shift;
my @key_ids = @_; # Need to be sorted in order!
@@ -99,7 +103,7 @@
$key_id = $doc->[$self->{pos}++];
$type = $doc->[$self->{pos}++];
- # Skip key term
+ # Skip key term or value (in case of store)
$self->{pos}++;
# There is a value to aggregate
@@ -107,7 +111,10 @@
if (DEBUG) {
print_log('f_point', "Found value for " . $key_ids[$key_pos] . ' at ' . $key_pos);
};
- push @values, [$key_id, $doc->[$self->{pos}++]];
+ push @values, Krawfish::Koral::Document::FieldInt->new(
+ key_id => $key_id,
+ value => $doc->[$self->{pos}++]
+ );
};
$key_pos++;
@@ -125,7 +132,7 @@
$self->{pos}++;
$type = $doc->[$self->{pos}++];
$self->{pos}++;
- $self->{pos}++ if $type eq 'int'
+ $self->{pos}++ if $type eq 'int' || $type eq 'store'
};
# Remember the current field
@@ -135,6 +142,7 @@
return @values;
};
+
# Get all field term ids.
# If key ids are passed, they need to be in numerical order!
sub fields {
@@ -149,15 +157,7 @@
unless (@_ > 0) {
while ($current && $current ne 'EOF') {
- # The structure [key_id, key] is necessary for multivalued fields!
- $key_id = $self->{pos}++;
-
- $type = $doc->[$self->{pos}++];
-
- push @fields, [$key_id, $doc->[$self->{pos}++]];
-
- # Skip value
- $self->{pos}++ if $type eq 'int';
+ push @fields, $self->_get_by_type($doc);
$current = $doc->[$self->{pos}];
};
}
@@ -186,14 +186,12 @@
# The key id matches the first id
if ($current == $key_ids[$key_pos]) {
- # The structure [key_id, key] is necessary for multivalued fields!
- $self->{pos}++;
- $type = $doc->[$self->{pos}++];
- my $field = $doc->[$self->{pos}++];
- push @fields, [$current, $field];
+ push @fields, $self->_get_by_type($doc);
if (DEBUG) {
- print_log('f_point', "Found field_id $field for " . $key_ids[$key_pos] . ' at ' . $key_pos);
+ print_log('f_point', 'Found field ' .
+ $fields[-1]->to_string .
+ ' for ' . $key_ids[$key_pos]);
};
$key_pos++;
@@ -210,11 +208,10 @@
else {
$self->{pos}++;
$type = $doc->[$self->{pos}++];
- $self->{pos}++;
+ $self->{pos}++ if $type ne 'store';
+ $self->{pos}++ if $type eq 'int' || $type eq 'store';
};
- # Skip value
- $self->{pos}++ if $type eq 'int';
# Remember the current field
$current = $doc->[$self->{pos}];
@@ -225,9 +222,44 @@
};
+sub _get_by_type {
+ my ($self, $doc) = @_;
+
+ my $key_id = $doc->[$self->{pos}++];
+
+ my $type = $doc->[$self->{pos}++];
+
+ # Read integer
+ if ($type eq 'int') {
+ return Krawfish::Koral::Document::FieldInt->new(
+ key_id => $key_id,
+ key_value_id => $doc->[$self->{pos}++],
+ value => $doc->[$self->{pos}++]
+ );
+ }
+
+ # read string
+ elsif ($type eq 'string') {
+ return Krawfish::Koral::Document::FieldString->new(
+ key_id => $key_id,
+ key_value_id => $doc->[$self->{pos}++]
+ );
+ }
+
+ # read store
+ elsif ($type eq 'store') {
+ return Krawfish::Koral::Document::FieldStore->new(
+ key_id => $key_id,
+ value => $doc->[$self->{pos}++]
+ );
+ };
+};
+
+
sub field_terms {
my $self = shift;
- return map { $_->[1] } $self->fields(@_);
+ warn 'probably wrong!';
+ return map { $_->term_id } $self->fields(@_);
};
diff --git a/lib/Krawfish/Index/Merge.pm b/lib/Krawfish/Index/Merge.pm
index 4ef971b..f6881de 100644
--- a/lib/Krawfish/Index/Merge.pm
+++ b/lib/Krawfish/Index/Merge.pm
@@ -17,10 +17,10 @@
sub new {
- my ($class, $index_a, $index_b) = @_;
+ my ($class, $segment_a, $segment_b) = @_;
bless {
- index_a => $index_a,
- index_b => $index_b
+ segment_a => $segment_a,
+ segment_b => $segment_b
}, $class;
};
@@ -64,6 +64,7 @@
$self->_launch;
};
+
sub _launch {
# TODO:
# - If the dictionary is new
diff --git a/lib/Krawfish/Index/Segment.pm b/lib/Krawfish/Index/Segment.pm
index e23dcaf..0a0a2dd 100644
--- a/lib/Krawfish/Index/Segment.pm
+++ b/lib/Krawfish/Index/Segment.pm
@@ -165,6 +165,7 @@
# Create term index for fields
my $fields = $doc->fields;
foreach (@$fields) {
+ next if $_->type eq 'store';
if (DEBUG) {
print_log('seg', 'Added field #' . $_->term_id . ' for doc_id=' . $doc_id);
};