/[Sack]/trunk/lib/Sack/Merge.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Sack/Merge.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 200 - (hide annotations)
Sun Nov 8 16:46:19 2009 UTC (14 years, 7 months ago) by dpavlin
File size: 1587 byte(s)
merge view results on shards from clients on server

1 dpavlin 198 package Sack::Merge;
2    
3     use warnings;
4     use strict;
5    
6     use Digest::MD5 qw(md5);
7     use Time::HiRes qw(time);
8     use Data::Dump qw(dump);
9    
10     our $out;
11     sub out { $out }
12    
13     our $nr = 0;
14     our $md5_nr;
15     our $digest_fh;
16     our @digest_offset;
17    
18 dpavlin 200 sub clean {
19     undef $out;
20     }
21    
22 dpavlin 198 sub add {
23     my ( $self, $new ) = @_;
24    
25     my $t_merge = time();
26    
27     my $tick = 0;
28    
29     my $missing;
30    
31     foreach my $k1 ( keys %$new ) {
32    
33     foreach my $k2 ( keys %{ $new->{$k1} } ) {
34    
35     my $n = delete $new->{$k1}->{$k2};
36    
37     if ( $k1 =~ m{#} ) {
38     my $md5 = md5 $k2;
39     if ( defined $md5_nr->{$md5} ) {
40     $k2 = $md5_nr->{$md5};
41     } else {
42     open( $digest_fh, '>', '/tmp/sack.digest' ) unless $digest_fh;
43     $digest_offset[ $nr ] = tell( $digest_fh );
44     print $digest_fh "$k2\n";
45    
46     $k2 = $md5_nr->{$md5} = $nr;
47     $nr++;
48     }
49     }
50    
51     my $ref = ref $out->{$k1}->{$k2};
52    
53     if ( ! defined $out->{$k1}->{$k2} ) {
54     $out->{$k1}->{$k2} = $n;
55     } elsif ( $k1 =~ m{\+} ) {
56     # warn "## agregate $k1 $k2";
57     $out->{$k1}->{$k2} += $n;
58     } elsif ( $ref eq 'ARRAY' ) {
59     if ( ref $n eq 'ARRAY' ) {
60     push @{ $out->{$k1}->{$k2} }, $_ foreach @$n;
61     } else {
62     push @{ $out->{$k1}->{$k2} }, $n;
63     }
64     } elsif ( $ref eq '' ) {
65     $out->{$k1}->{$k2} = [ $out->{$k1}->{$k2}, $n ];
66     } else {
67     die "can't merge $k2 [$ref] from ",dump($n), " into ", dump($out->{$k1}->{$k2});
68     }
69    
70     if ( $tick++ % 1000 == 0 ) {
71     print STDERR ".";
72     } elsif ( $tick % 10000 == 0 ) {
73     print STDERR $tick;
74     }
75     }
76     }
77    
78     $t_merge = time - $t_merge;
79     warn sprintf "\nmerged %d in %.4fs\n", $tick, $t_merge;
80    
81     return $tick;
82     }
83    
84     1;

  ViewVC Help
Powered by ViewVC 1.1.26