e88ab5c2cb6cf0d89fe767ae8c7acf79a3ad1803
[MojoFacets.git] / lib / MojoFacets / Import / CouchDB.pm
1 package MojoFacets::Import::CouchDB;
2
3 use warnings;
4 use strict;
5
6 use base 'Mojo::Base';
7
8 use File::Slurp;
9 use Data::Dump qw(dump);
10 use JSON;
11 use Mojo::Client;
12
13 __PACKAGE__->attr('path');
14 __PACKAGE__->attr('full_path');
15
16 sub flatten {
17         my ($flat,$data,$prefix) = @_;
18         if ( ref $data eq '' ) {
19                 push @{ $$flat->{$prefix} }, $data;
20         } elsif ( ref $data eq 'HASH' ) {
21                 foreach my $key ( keys %$data ) {
22                         my $full_prefix = $prefix ? $prefix . '.' : '';
23                         $full_prefix .= $key;
24                         flatten( $flat, $data->{$key}, $full_prefix );
25                 }
26         } elsif ( ref $data eq 'ARRAY' ) {
27                 foreach my $el ( @$data ) {
28                         flatten( $flat, $el, $prefix );
29                 }
30         } elsif ( ref $data eq 'Mojo::JSON::_Bool' ) {
31                 push @{ $$flat->{$prefix} }, $data;
32         } else {
33                 die "unsupported ",ref($data)," from ",dump($data);
34         }
35 }
36
37 sub data {
38         my $self = shift;
39
40         my $path = $self->path;
41
42         my $url = read_file $self->full_path;
43         $url =~ s{/\s*$}{}s;
44
45         warn "# CouchDB URL: $url";
46
47         my $json = Mojo::Client->new->get( "$url/_all_docs?include_docs=true" )->res->json;
48
49         my $data;
50
51         if ( ref $json->{rows} eq 'ARRAY' ) {
52                 foreach my $doc ( @{$json->{rows}} ) {
53                         next if $doc->{_id} =~ m{^_design/};
54                         my $flat;
55                         flatten( \$flat, $doc->{doc}, '' );
56                         push @{ $data->{items} }, $flat;
57                 }
58         }
59
60         return $data;
61
62 }
63
64 1