summaryrefslogtreecommitdiff
path: root/lib/GitMap/Graph.pm
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2011-06-13 16:29:58 +0200
committerfranck cuny <franck@lumberjaph.net>2011-06-13 16:29:58 +0200
commit967e0cefb06e0c7d4eae46ad6844380693392881 (patch)
treecf0c023eaf2462cc2eff1f810cb8a2a4ac657071 /lib/GitMap/Graph.pm
parentinitial import (diff)
downloadstargit-967e0cefb06e0c7d4eae46ad6844380693392881.tar.gz
import old gitmap to new stargit repo
Signed-off-by: franck cuny <franck@lumberjaph.net>
Diffstat (limited to 'lib/GitMap/Graph.pm')
-rw-r--r--lib/GitMap/Graph.pm138
1 files changed, 138 insertions, 0 deletions
diff --git a/lib/GitMap/Graph.pm b/lib/GitMap/Graph.pm
new file mode 100644
index 0000000..1b9dd0a
--- /dev/null
+++ b/lib/GitMap/Graph.pm
@@ -0,0 +1,138 @@
+package StarGit::Graph;
+
+use Dancer ':syntax';
+use Moose;
+
+with qw(
+ GitHub::Collector::Role::MongoDB
+ GitHub::Collector::Role::Graph::Nodes
+ GitHub::Collector::Role::Graph::Edges
+ GitHub::Collector::Role::Graph::Neighbors
+ GitHub::Collector::Role::Graph::Query
+ GitHub::Collector::Role::Graph::Search
+ GitHub::Collector::Role::Graph::Gexf
+);
+
+has name => (
+ is => 'ro',
+ required => 1,
+ isa => 'Str',
+);
+
+sub neighbors {
+ my ($self, $name) = @_;
+
+ $name ||= $self->name;
+
+ $self->_neighbors($name);
+
+ foreach my $id ( keys %{$self->edges}){
+ $self->connections($id);
+ }
+
+ $self->remove_leaves();
+}
+
+sub _neighbors {
+ my ( $self, $name ) = @_;
+
+ my ($country, $language) = $self->_get_info_from_login($name);
+ my $degree = $self->nodes->{$name} ? $self->nodes->{$name}->{degree} : 0;
+ delete $self->nodes->{$name};
+
+ $self->nodes->{$name} = {
+ id => $name,
+ label => $name,
+ degree => $degree,
+ country => $country,
+ language => $language,
+ };
+
+ foreach my $type (qw/source target/) {
+ $self->_fetch_edges( $name, $type );
+ }
+}
+
+sub connections {
+ my ( $self, $id ) = @_;
+
+ if ( $self->edges->{ $id}->{sourceID} eq $self->name ) {
+ $self->_neighbors( $self->edges->{$id}->{targetID} );
+ }
+ else {
+ $self->_neighbors( $self->edges->{ $id}->{sourceID} );
+ }
+}
+
+sub remove_leaves {
+ my $self = shift;
+
+ foreach my $id ( keys %{$self->nodes} ) {
+ if ( $self->nodes->{$id}->{degree} < 2 ) {
+ delete $self->nodes->{$id};
+ }
+ }
+
+ foreach my $id ( keys %{$self->edges} ) {
+ unless ( $self->nodes->{ $self->edges->{$id}->{sourceID} }
+ && $self->nodes->{ $self->edges->{$id}->{targetID} } )
+ {
+ delete $self->edges->{ $id };
+ }
+ }
+}
+
+sub _fetch_edges {
+ my ( $self, $name, $type ) = @_;
+
+ my $connections = $self->db_edges->find( { $type => $name } );
+
+ while ( my $edge = $connections->next ) {
+ my $look = $type eq 'source ' ? 'target' : 'source';
+ $self->_create_edge($name, $look, $edge);
+ }
+}
+
+sub _create_edge {
+ my ( $self, $name, $type, $edge ) = @_;
+
+ return if $name eq $edge->{$type};
+
+ my $edge_id = $edge->{$type} . $name;
+ if ( !defined $self->edges->{$edge_id} ) {
+ $self->edges->{$edge_id} = {
+ id => $edge_id,
+ targetID => $name,
+ sourceID => $edge->{$type},
+ weight => $edge->{weight},
+ };
+
+ $self->nodes->{$name}->{degree}++;
+
+ if ( defined $self->nodes->{ $edge->{$type} } ) {
+ $self->nodes->{ $edge->{$type} }->{degree}++;
+ }
+ else {
+ my ( $country, $language ) =
+ $self->_get_info_from_login( $edge->{$type} );
+
+ $self->nodes->{ $edge->{$type} } = {
+ id => $edge->{$type},
+ label => $edge->{$type},
+ degree => 1,
+ country => $country,
+ language => $language,
+ };
+ }
+ }
+}
+
+sub _get_info_from_login {
+ my ($self, $login) = @_;
+ my $info = $self->db_profiles->find_one( { login => $login } );
+ my $country = $info->{country} || 'null';
+ my $language = $info->{language} || 'null';
+ return ($country, $language);
+}
+
+1;