X-Git-Url: http://git.rot13.org/?p=angular-mojolicious.git;a=blobdiff_plain;f=trigger%2FKinoSearch.pm;h=6866c35d5959246db39efaad2c5ea9dca89d9c8d;hp=7c2d04820a4ef9adabef42a5dc3259bc0690a7ef;hb=HEAD;hpb=d8028706703faa762badd391033e3808b854b1ba;ds=sidebyside diff --git a/trigger/KinoSearch.pm b/trigger/KinoSearch.pm index 7c2d048..6866c35 100644 --- a/trigger/KinoSearch.pm +++ b/trigger/KinoSearch.pm @@ -24,17 +24,16 @@ our $indexer; sub _indexer { $indexer ||= KinoSearch::Index::Indexer->new( schema => $schema, - index => '/tmp/index', + index => "/tmp/kinosearch.$database", create => 1, ); }; -use JSON; - sub flatten { my ($flat,$data,$prefix) = @_; if ( ref $data eq '' ) { - $$flat->{$prefix} = $data; + $$flat->{$prefix} .= "\n" . $data; + $$flat->{$prefix} =~ s/^\n//; # strip first } elsif ( ref $data eq 'HASH' ) { foreach my $key ( keys %$data ) { my $full_prefix = $prefix ? $prefix . '.' : ''; @@ -42,14 +41,23 @@ sub flatten { flatten( $flat, $data->{$key}, $full_prefix ); } } elsif ( ref $data eq 'ARRAY' ) { - $$flat->{$prefix} = join("\n", map { ref $_ ? dump($_) : $_ } @$data); - # FIXME arrays with non-scalar references aren't really indexed well + foreach my $el ( @$data ) { + flatten( $flat, $el, $prefix ); + } + } elsif ( ref $data eq 'Mojo::JSON::_Bool' ) { + $$flat->{$prefix} = $data; + } else { + die "unsupported ",ref($data)," from ",dump($data); } } sub filter { my $change = shift; my $doc = $change->{doc} || next; + + _indexer->delete_by_term( field => '_id', term => $doc->{_id} ); + return 0 if $doc->{_deleted}; + my $flat; flatten( \$flat, $doc, '' ); foreach my $field ( keys %$flat ) { @@ -57,13 +65,14 @@ sub filter { $schema->spec_field( name => $field, type => $type ); warn "# +++ $field\n"; } - $flat->{doc} = encode_json $doc; + $flat->{doc} = $json->encode($doc); warn "# add_doc ",dump($flat); _indexer->add_doc($flat); return 0; } sub commit { + return unless $indexer; $indexer->commit; undef $indexer; warn "# commit index done\n";