basic leaves pass-thru
[p5sagit/Devel-Size.git] / static / MemView.pl
CommitLineData
b2fc39a5 1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5
f60f09e5 6use JSON::XS;
b2fc39a5 7use Mojolicious::Lite;
8
9use ORLite {
10 file => '../x.db',
11 package => "MemView",
12 #user_version => 1,
13 readonly => 1,
14 #unicode => 1,
15};
16
f60f09e5 17my $j = JSON::XS->new;
18
b2fc39a5 19# Documentation browser under "/perldoc"
20plugin 'PODRenderer';
21
22get '/' => sub {
23 my $self = shift;
24 $self->render('index');
25};
26
27get '/jit_tree/:id/:depth' => sub {
28 my $self = shift;
29 my $id = $self->stash('id');
30 my $depth = $self->stash('depth');
31 warn "jit_tree $id $depth";
875c1073 32 my $node_tree = _fetch_node_tree($id, $depth);
33 my $jit_tree = _transform_node_tree($node_tree, sub {
34 my ($node) = @_;
35 my $children = delete $node->{children}; # XXX edits the src tree
bb66f8a1 36 $node->{'$area'} = $node->{self_size}+$node->{kids_size};
bb66f8a1 37 my $jit_node = {
38 id => $node->{id},
39 name => $node->{name},
40 data => $node,
41 };
42 $jit_node->{children} = $children if $children;
43 return $jit_node;
b2fc39a5 44 });
bb66f8a1 45if(1){
46 use Devel::Dwarn;
47 use Data::Dump qw(pp);
f9d8678b 48 local $jit_tree->{children};
bb66f8a1 49 pp($jit_tree);
50}
b2fc39a5 51 $self->render_json($jit_tree);
52};
53
875c1073 54sub _fetch_node_tree {
55 my ($id, $depth) = @_;
56 my $node = MemView->selectrow_hashref("select * from node where id = ?", undef, $id)
57 or die "Node '$id' not found";
f60f09e5 58 $node->{attr}{self} = $j->decode(delete $node->{attr_json});
e78b28ca 59 $node->{leaves} = $j->decode(delete $node->{leaves_json});
60
5a78486c 61 if ($node->{child_ids}) {
62 my @child_ids = split /,/, $node->{child_ids};
875c1073 63 my $children;
5a78486c 64 if (@child_ids == 1) {
65 my $child = _fetch_node_tree($child_ids[0], $depth); # same depth
f9d8678b 66 # merge node into child
5a78486c 67 # XXX id, depth, parent_id
f9d8678b 68 warn "Merged $node->{name} #$node->{id} with only child $child->{name} #$child->{id}\n";
69 $child->{name} = "$node->{name} + $child->{name}";
70 $child->{$_} += $node->{$_} for (qw(self_size));
5a78486c 71 $child->{$_} = $node->{$_} for (qw(parent_id));
f60f09e5 72 $child->{attr}{$node->{id}} = $node->{attr};
e78b28ca 73 $child->{leaves}{$_} += $node->{leaves}{$_}
74 for keys %{ $node->{leaves} };
5a78486c 75
76 $child->{_ids_merged} .= ",$node->{id}";
77 my @child_ids = split /,/, $node->{child_ids};
78 $child->{child_count} = @child_ids;
79
f9d8678b 80 $node = $child;
875c1073 81 }
f9d8678b 82 elsif ($depth) {
5a78486c 83 $children = [ map { _fetch_node_tree($_, $depth-1) } @child_ids ];
f9d8678b 84 $node->{children} = $children;
85 $node->{child_count} = @$children;
875c1073 86 }
b2fc39a5 87 }
b2fc39a5 88 return $node;
89}
90
f9d8678b 91sub _transform_node_tree { # recurse depth first
875c1073 92 my ($node, $transform) = @_;
93 if (my $children = $node->{children}) {
94 $_ = _transform_node_tree($_, $transform) for @$children;
95 }
96 return $transform->($node);
97}
98
b2fc39a5 99
100app->start;
101__DATA__
102@@ index.html.ep
103% layout 'default';
104% title 'Welcome';
105Welcome to the Mojolicious real-time web framework!
106
107@@ layouts/default.html.ep
108<!DOCTYPE html>
109<head>
110<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
bb66f8a1 111<title>Perl Memory Treemap</title>
b2fc39a5 112
113<!-- CSS Files -->
114<link type="text/css" href="css/base.css" rel="stylesheet" />
115<link type="text/css" href="css/Treemap.css" rel="stylesheet" />
116
117<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
118
119<!-- JIT Library File -->
120<script language="javascript" type="text/javascript" src="jit.js"></script>
121<script language="javascript" type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
122
123<!-- Example File -->
bb66f8a1 124<script language="javascript" type="text/javascript" src="sprintf.js"></script>
b2fc39a5 125<script language="javascript" type="text/javascript" src="tm.js"></script>
126</head>
127
128<body onload="init();">
129<div id="container">
130
131<div id="left-container">
132
b2fc39a5 133<div class="text">
134<h4>
bb66f8a1 135Perl Memory TreeMap
b2fc39a5 136</h4>
bb66f8a1 137 Clicking on a node will show a new TreeMap with the contents of that node.<br /><br />
b2fc39a5 138</div>
139
140<a id="back" href="#" class="theme button white">Go to Parent</a>
b2fc39a5 141</div>
142
143<div id="center-container">
144 <div id="infovis"></div>
145</div>
146
147<div id="right-container">
148
149<div id="inner-details"></div>
150
151</div>
152
153<div id="log"></div>
154</div>
155</body>
156</html>