From ae121131024be5549f602034a1e6c2e0ca14ef8f Mon Sep 17 00:00:00 2001
From: alvaro <alvaro@graves.cl>
Date: Wed, 20 Mar 2013 22:17:58 -0700
Subject: [PATCH] d3linechart adapted to figure2 query. Also, added metadata to
 paths

---
 .../Haanga/Extension/Filter/D3linechart.php   | 157 +++++++++++++-----
 1 file changed, 115 insertions(+), 42 deletions(-)

diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/D3linechart.php b/lib/Haanga/lib/Haanga/Extension/Filter/D3linechart.php
index 67245a7e..6e202031 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/D3linechart.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/D3linechart.php
@@ -10,8 +10,8 @@ class Haanga_Extension_Filter_D3LineChart{
   	$firstColumn = true;
   	$names = explode(",", $varname);
   	$j = 0;
-  	$data['series']=array();
-  	$data['dict']=array();
+
+  	
   	
   	$fieldCounter=0;
   	$varList = array();
@@ -26,38 +26,80 @@ class Haanga_Extension_Filter_D3LineChart{
   	    $variable['name'] = $aux[0];
   	    $variable['value'] = $aux[1];
   	  }
-  	  if($fieldCounter > 0){array_push($data['dict'], $variable['name']);}
   	  $fieldCounter++;
   	  array_push($varList, $variable);
   	}
 
+  	$columnsAsSeries = false;
   	$series = array();
-  	foreach($obj as $k){  	
-  	  $series = array();
-  	  foreach($varList as $v){
-  	    $name = $v['name'];
-  	    $val = $v['value'];
-
-  	  	if($j==0){
-  	  	  $series['key'] = $k->$name->$val;
-  	  	  //$newItem[$j]['x'] = $value;
-  	  	}else{
-  	  	  $series['values'][] = $k->$name->$val;
-  	  	}
-  	  	$j++;
-  	  } 
-  	  $i++;
-  	  $j=0;
- 	  	array_push($data['series'], $series);
-  	}
+  	if($columnsAsSeries){
+  	  foreach($obj as $k){  	
+  	    $newItem = array();
+  	    foreach($varList as $v){
+  	      $name = $v['name'];
+  	      $val = $v['value'];
+  	      
+  	      if($j==0){
+  	        //$newItem[$j]['x'] = $value;
+  	      }else{
+  	        $series[$name]['key'] = $name;
+  	        $series[$name]['values'][] = $k->$name->$val;
+  	      }
+  	      $j++;
+  	    } 
+  	    $i++;
+  	    $j=0;
+  	    // 	  	array_push($data, $newItem);
+  	  }
+  	  foreach($series as $v){
+  	    $data[] = $v;
+  	  }
+    }else{
+  	  foreach($obj as $k){  	
+  	    $newSerie = array();
+  	    $currentSerie = null;
+  	    $newItem = array();
+  	    foreach($varList as $v){
+  	      $name = $v['name'];
+  	      $val = $v['value'];
+  	      
+  	      if($j==0){
+  	        $currentSerie = $k->$name->$val;
+  	        if(!isset($data[$currentSerie])){ $data[$currentSerie] = array();}  	        
+  	      }elseif($j == 1){
+  	        $newItem['key'] = $k->$name->$val;
+  	      }elseif($j == sizeof($varList)-1){
+  	        $newItem['uri'] =  $k->$name->$val;
+  	        $data[$currentSerie][] = $newItem;
+  	        $newItem = array();
+  	      }else{
+  	        $newItem['values'] = floatval($k->$name->$val);
+  	      }
+  	      $j++;
+  	    }
+  	    $i++;
+  	    $j=0;
+  	    // 	  	array_push($data, $newItem);
+  	  }
+  	/*  $data = array(
+  	                 array('key' => 'zxc', 'values' => array( 1, 2)),
+  	                 array('key' => 'asd', 'values' => array(10, 2)),
+  	                 array('key' => 'zxc1', 'values' => array( 11, 2)),
+  	                 array('key' => 'asd1', 'values' => array(21, 2)),
+  	                 array('key' => 'zxc2', 'values' => array( 23, 2)),
+  	                 array('key' => 'asd3', 'values' => array(20, 2)),
+  	               );*/
+    }
   	
   	//Getting options
-  	$options['height'] = 500;
+  	$options['height'] = 300;
   	$options['width'] = 1000;
   	$options['padding'] = 20;
-  	$options['chartProportion'] = 0.8;
+  	$options['barsProportion'] = 0.8;
   	$options['legendSpace'] = 15;
   	$options['intermediateLines'] = 4;
+  	$options['numberOfBars'] = 0;
+  	$options['chartProportion'] = .8;
     for($z=$fieldCounter; $z < count($names); $z++){
       $pair = explode("=", $names[$z]);
       $key = trim($pair[0], "\" '");
@@ -77,34 +119,60 @@ class Haanga_Extension_Filter_D3LineChart{
       return s[d%s.length];
     }
     
-    var maxValue_$divId = getMax(dataset_".$divId."['series']);
+    var maxValue_$divId = getMax(dataset_".$divId.");
     var svg = d3.selectAll('#".$divId."').append('svg').attr('width', options_$divId.width).attr('height', options_$divId.height);
     var maxHeight_$divId = options_$divId.chartProportion*options_$divId.height;
-
+    var labels_$divId = getLabels(dataset_$divId);
+    options_$divId.numberOfBars = getNumberOfBars(dataset_$divId);
 
     function getMax(d){
-      maxValue = 0;
-      for(var i in d){
-        e = d[i];
-        for(var j in e.values){
-          aux = parseInt(e.values[j]);
-         if(maxValue < aux){
-           maxValue = aux;
+     maxValue = 0;
+     for(var i in d){
+       e = d[i];
+       for(var j in e){
+         if(maxValue < parseInt(e[j].values)){
+           maxValue = parseInt(e[j].values);
          }
        }
      }
      return maxValue+1;
-   }    
-//Axis
+   }  
+   
+   function getNumberOfBars(d){
+     numberOfBars = 0;
+     for(var i in d){
+       e = d[i];
+       aux = 0;
+       for(var j in e){
+         aux++;
+       }
+       if(aux > numberOfBars){
+         numberOfBars = aux;
+       }
+     }
+     return numberOfBars;
+   } 
+
+   function getLabels(d){
+     labels = [];
+     for(i in d){
+       e = d[i];
+       for(j in e){
+         labels.push(e[j].key);
+       }
+     return labels
+     }
+   }
+ //Axis
   var xaxis = svg.append('g');
     xaxis.append('line').style('stroke', 'black').style('stroke-width', '2px').attr('x1',  1+options_$divId.legendSpace).attr('y1', maxHeight_$divId).attr('x2', options_$divId.width+options_$divId.padding+ options_$divId.legendSpace).attr('y2', maxHeight_$divId)
     xaxis.selectAll('line.stub')
     var labels_$divId = xaxis.selectAll('text.xaxis')
-        .data(dataset_".$divId."['dict'])
+        .data(labels_".$divId.")
         .enter().append('text').text(function(d){return d})
         .style('font-size', '12px').style('font-family', 'sans-serif')
         .attr('class', 'xaxis')        
-        .attr('x', function(d, i){return options_$divId.chartProportion*i*(parseInt(options_$divId.width)/ dataset_".$divId."['series'].length) + 4*options_$divId.padding + options_$divId.legendSpace})
+        .attr('x', function(d, i){return options_$divId.chartProportion*i*(parseInt(options_$divId.width)/ options_$divId.numberOfBars) + 4*options_$divId.padding + options_$divId.legendSpace})
         .attr('y', function(d, i){return maxHeight_$divId+30;})
         .attr('transform', function(d){return 'translate(-'+(this.getBBox().width/2)+')'});
 
@@ -118,18 +186,23 @@ class Haanga_Extension_Filter_D3LineChart{
     
 //Values
 var line = d3.svg.line()
-    .x(function(d, i){return options_$divId.chartProportion*i*(parseInt(options_$divId.width) / dataset_".$divId."['series'].length) + 4*options_$divId.padding + options_$divId.legendSpace})
-    .y(function(d, i) { return (1-d/maxValue_$divId)*maxHeight_$divId; });
+    .x(function(d, i){return options_$divId.chartProportion*i*(parseInt(options_$divId.width) / options_$divId.numberOfBars) + 4*options_$divId.padding + options_$divId.legendSpace})
+    .y(function(d, i) {return (1-d.values/maxValue_$divId)*maxHeight_$divId; });
 
-for(var k in dataset_".$divId."['series']){
+var j=0;
+for(var k in dataset_".$divId."){
   svg.append('path').attr('class', 'line')
-        .datum(dataset_".$divId."['series'][k].values)
+        .datum(dataset_".$divId."[k])
         .attr('d', line)
         .style('opacity', 0.8)
         .style('stroke', function(d, i){return color(k)})
         .style('stroke-width', '2px')
-        .style('stroke-dasharray', stroke(k))
-        .style('fill', 'none');
+        .style('stroke-dasharray', stroke(j))
+        .style('fill', 'none')        .append('svg:metadata')
+        .append('vsr:vsr:depicts')
+        .attr('rdf:rdf:resource', function(d){target = ''; for(var x in d){target += d[x].uri+' ';} return target;});
+;
+  j++
 }
 
         d3.selectAll('rect.bar')
-- 
GitLab