added user.org_member
[angular-drzb] / angular-server.pl
index 0e38168..3da071c 100755 (executable)
@@ -19,9 +19,13 @@ my $couchdb_database = 'drzb2013v2';
 my $couchdb_view = "http://10.60.0.92:5984/_utils/document.html?$couchdb_database";
 my $client = Mojo::UserAgent->new;
 
+our $view_cache;
+
 sub _couchdb_put {
        my ( $url, $data ) = @_;
 
+       $view_cache = undef;
+
        $data->{'$entity'} = $1 if $url =~ m{/(\w+)\.\d+/$/};
 
        my $json = Mojo::JSON->new->encode( $data );
@@ -216,8 +220,6 @@ any [ 'post' ] => '/data/:database/:entity' => sub {
 
 # CouchDB proxy for _design _view
 
-our $view_cache;
-
 get '/:database/_design/:design/_view/:view' => sub {
        my $self = shift;
        my $format = $self->param('format');
@@ -262,7 +264,29 @@ if ( doc.user.organization != '' ) {
 }
                                        }q|,
                                        reduce => q| function(keys,values,rereduce) { return sum(values); } |,
-                               }
+                               },
+                               authors => {
+                                       map => q|
+function(doc) {
+  if ( doc.work.persons ) {
+    doc.work.persons.forEach( function(person) {
+      emit(person.surname+person.firstname ,
+        person
+      );
+    });
+  }
+  if ( doc.work.symposium_works ) {
+    doc.work.symposium_works.forEach( function(work) {
+      work.persons.forEach( function(person) {
+        emit(person.surname+person.firstname ,
+          person
+        );
+      });
+    });
+  }
+}
+                                       |,
+                               },
                        }
                };
                $json = _couchdb_get($url)
@@ -271,6 +295,26 @@ if ( doc.user.organization != '' ) {
 
        if ( $format eq 'key_array' ) { # array of keys sorted by value
                $json->{rows} = [ map { $_->{key} } sort { $b->{value} <=> $a->{value} } @{ $json->{rows} } ];
+       } elsif ( $format eq 'key_distinct' ) {
+
+               my $found;
+               my @rows = grep {
+                       push @{ $found->{ $_->{key} } }, $_->{id};
+                       $#{ $found->{ $_->{key} } } == 0; # take just first registration
+               } @{ $json->{rows} };
+
+               $json->{rows} = [ map {
+                       $_->{distinct_ids} = $found->{ $_->{key} };
+                       $_;
+               } @rows ];
+
+               $json->{distinct_rows} = scalar @{ $json->{rows} };
+               warn "## distinct stats ", dump( $found );
+
+       } elsif ( $format ) {
+
+               die "unknown format: $format";
+
        }
 
        $view_cache->{$url}->{time} = time();