Changeset 5b94a67792e4df22f400e40ae13bfbe07735a057

Show
Ignore:
Timestamp:
07/07/09 21:59:29 (5 years ago)
Author:
Umar Farooq <umar@omniti.com>
git-committer:
Umar Farooq <umar@omniti.com> 1247003969 +0000
git-parent:

[f8f9b3df4b347d30dc3cdbe22ba4250cb072e15c]

git-author:
Umar Farooq <umar@omniti.com> 1247003969 +0000
Message:

adding composite dataset functionality, probably needs more testing, and the rpn evaluator needs to be fixed up to handle bad syntax better
refs #121

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ui/web/htdocs/css/style.css

    r41084bb r5b94a67  
    10071007float:right; 
    10081008color:#660000; 
     1009} 
     1010span.addGuide { 
     1011padding-left:10px; 
    10091012} 
    10101013span.graphStacks { 
  • ui/web/htdocs/graph_panel.inc

    rf8f9b3d r5b94a67  
    2828        $("h2#graphTitle").unbind(); 
    2929        $(".datatitle").unbind(); 
     30        $(".combinable").each( function() { $(this).draggable('destroy'); }); 
     31        $(".composite_function").each( function() { $(this).droppable('destroy'); }); 
    3032} 
    3133 
     
    5153           return(value); 
    5254        }, { });  
    53 
    54  
     55 
     56        make_composite_draggables(); 
     57
     58 
     59function make_composite_draggables() { 
     60 
     61        $(".combinable").each ( function() {  
     62            $(this).draggable({ cursor: 'move' }); 
     63        }); 
     64 
     65        $(".composite_function").each( function () { $(this).droppable({ 
     66            drop: function(event, ui) {  
     67                 var data_index = $(".datatitle").index(ui.draggable); 
     68                 fbox = $(this).find("input[name='math2']"); 
     69                 fbox.val(fbox.val()+"["+data_index+"]"); 
     70                 var my_index = $("input[name='math2']").index(fbox); 
     71                 graphinfo.datapoints[my_index].math2 = fbox.val(); 
     72                 update_current_graph(true); 
     73               } 
     74          });  
     75      }); 
     76 
     77
    5578function update_graph_permalink(id, start, end, gran){ 
    5679 $("#gpermalink a").attr("href", "drawing_board.php?otype=graph&id="+id+"&start="+start+"&end="+end+"&gran="+gran); 
     
    162185function graph_add_datapoint(d) { 
    163186  if(!graph_locked("Click 'Edit Graph' to unlock.")){ 
    164  
    165187   for(i=0; i<graphinfo.datapoints.length; i++){ 
    166188       if( (graphinfo.datapoints[i].sid==d.sid) && (graphinfo.datapoints[i].metric_name == d.metric_name) ) { 
     
    329351                        ( (d.orig_name!=undefined)? d.orig_name+"`": '') + 
    330352                        ( (d.metric_name!=undefined)? "`"+d.metric_name: ''); 
    331  
     353                         
    332354  o.find(".datatitle").html(d.name); 
    333355  o.find(".datatitle").attr("title", d.mouse_title); 
     
    342364 
    343365  recurse--; 
    344   $("#gtool #dataPoints").append(o.children()); 
     366  $("#gtool #dataPoints").append(o.children());     
     367  if(!locked){ make_composite_draggables();} 
    345368} 
    346369 
     
    692715                        <label for="math">Display Math</label> <input name="math1" type="text" value="" style="width:380px;" /> 
    693716                </div> 
    694                 <div
     717                <div class="composite_function"
    695718                        <label for="math">Function</label> <input name="math2" type="text" value="" style="width:380px;" /> 
    696719                </div> 
     
    701724        <tr> 
    702725                <td><input name="view" type="checkbox" value="1"/></td> 
    703                 <td class="data datatitle"></td> 
     726                <td class="data datatitle combinable"></td> 
    704727                <td><select id="datastack" class="av_stacks"><option value='na'>select</option></select></td> 
    705728                <td><div class="colorPicker"><div class="colorSelector"><div style="background-color: #fff"></div></div><div class="colorPickerHolder"></div></div></td> 
  • ui/web/htdocs/index.php

    r21720f4 r5b94a67  
    2020<script src="js/jquery-ui-1.7.2/ui/ui.sortable.js"></script> 
    2121<script src="js/jquery-ui-1.7.2/ui/ui.slider.js"></script> 
     22<script src="js/jquery-ui-1.7.2/ui/ui.draggable.js"></script> 
     23<script src="js/jquery-ui-1.7.2/ui/ui.droppable.js"></script> 
    2224<script src="js/jquery.flot.js"></script> 
    2325<script src="js/jquery.jeditable.pack.js"></script> 
  • ui/web/htdocs/js/recon.js

    r44c7512 r5b94a67  
    152152        break; 
    153153      case 'min': 
    154         s.unshift(min(s.shift(),s.shift())); break; 
     154        s.unshift(Math.min(s.shift(),s.shift())); break; 
    155155      case 'max': 
    156         s.unshift(max(s.shift(),s.shift())); break; 
     156        s.unshift(Math.max(s.shift(),s.shift())); break; 
    157157      default: 
    158158        if(op.match(/^-?\d+$/)) { 
    159159          s.unshift(op); 
    160160        } 
     161    } 
     162  } 
     163  var newvalue = s.shift(); 
     164  return newvalue; 
     165} 
     166 
     167function my_rpn_eval(expr, meta) { 
     168  var s = []; 
     169  var ops = expr.split(","); 
     170  for (var i = 0; i < ops.length; i++) { 
     171    var opname = ops[i]; 
     172    if(meta && meta[opname]) 
     173      for(var j = 0; j < meta[opname].length; j++) 
     174        ops.splice(i, (j==0) ? 1 : 0, meta[opname][j]); 
     175  } 
     176 
     177  for (var i = 0; i < ops.length; i++) { 
     178    op = ops[i]; 
     179 
     180    switch(op) { 
     181      case 'ln': 
     182        s.unshift(Math.log(parseFloat(s.shift()))); break; 
     183      case 'round': 
     184        r = Math.pow(10,parseFloat(s.shift())); 
     185        l = parseFloat(s.shift()); 
     186        s.unshift(Math.round(r * l)/r); 
     187        break; 
     188      case 'floor': 
     189        s.unshift(Math.floor(parseFloat(s.shift()))); break; 
     190      case 'ceil': 
     191        s.unshift(Math.ceil(parseFloat(s.shift()))); break; 
     192      case 'log': 
     193        r = parseFloat(s.shift()); 
     194        l = parseFloat(s.shift()); 
     195        s.unshift(Math.log(l, r)); 
     196        break; 
     197      case 'e': 
     198        s.unshift(Math.exp(1)); break; 
     199      case 'pi': 
     200        s.unshift(Math.pi()); break; 
     201      case '^': 
     202        r = parseFloat(s.shift()); 
     203        l = parseFloat(s.shift()); 
     204        s.unshift(Math.pow(l, r)); 
     205        break; 
     206      case '-': 
     207        r = parseFloat(s.shift()); 
     208        l = parseFloat(s.shift()); 
     209        s.unshift(l - r); 
     210        break; 
     211      case '/': 
     212        r = parseFloat(s.shift()); 
     213        l = parseFloat(s.shift()); 
     214        s.unshift(l / r); 
     215        break; 
     216      case '+': 
     217          s.unshift(parseFloat(s.shift()) + parseFloat(s.shift()) ); break; 
     218      case '*': 
     219        s.unshift(parseFloat(s.shift()) * parseFloat(s.shift())); break; 
     220      case 'min': 
     221        s.unshift(Math.min(parseFloat(s.shift()),parseFloat(s.shift()))); break; 
     222      case 'max': 
     223        s.unshift(Math.max(parseFloat(s.shift()),parseFloat(s.shift()))); break; 
     224      default: 
     225        if(op.match(/^-?\d+$/)) { 
     226          s.unshift(op); 
     227        } 
     228        else if(op.match(/^-?\d+\.\d*$/)) { 
     229            s.unshift(op); 
     230        } 
    161231    } 
    162232  } 
     
    376446        }, 
    377447      make_composite_data: 
    378         function (i, data) { 
    379           //      console.log("ok with expr", data[i].reconnoiter_source_expression); 
    380         }, 
     448        function (cindex, data) { 
     449 
     450            expr = data[cindex].reconnoiter_source_expression; 
     451            var nindex; 
     452            for(nindex=0; nindex<data.length; nindex++) { 
     453                if(data[nindex].metric_type == 'numeric') break; 
     454            }               
     455            //TODO we assume here that all numeric datasets have the same length, number of points, and time discreteness 
     456            //if iths is not the case, we need to think of interpolating, like we do for stacking in flot 
     457            for(var i=0; i<data[nindex].data.length; i++){ 
     458                nexpr = expr.replace(/\[(\d+)\]/g, function($1) {  
     459                    mat = $1.match(/\d+/); 
     460                    mat  = parseInt(mat); 
     461                    return data[mat].data[i][1]; 
     462                    }); 
     463 
     464                var val = my_rpn_eval(nexpr, {}); 
     465                data[cindex].data.push([ data[nindex].data[i][0], val ]); 
     466            } 
     467 
     468        },         
    381469      plot: 
    382470        function (r, redraw) { 
     
    397485 
    398486          for(var i=0; i<r.data.length; i++) { 
     487            if(r.data[i].metric_type == 'composite' && r.data[i].reconnoiter_source_expression) 
     488              this.ReconGraphMakeCompositeData(i, r.data); 
     489 
    399490            if(r.data[i].reconnoiter_display_expression) 
    400491              r.data[i].dataManip = rpn_magic(r.data[i].reconnoiter_display_expression); 
  • ui/web/lib/Reconnoiter_CompositeSet.php

    r44c7512 r5b94a67  
    2222  } 
    2323  function points() { 
    24     return array_keys($this->data); 
     24    return array(); 
    2525  } 
    2626  function description($ts) { 
     
    3737  } 
    3838  function data($ts, $attr = NULL) { 
    39     return ''
     39    return null
    4040  } 
    4141} 
  • ui/web/lib/Reconnoiter_flot_Driver.php

    r44c7512 r5b94a67  
    9393    $a = array(); 
    9494    $prev_value = '0'; 
    95     $timeline = (get_class($set) == "Reconnoiter_ChangeSet") ? $set->points() : $this->series(); 
    96     foreach($timeline as $ts) { 
    97         $value = $set->data($ts); 
    98         if($value != "") { 
    99           $desc = $set->description($ts); 
    100           if($desc) { 
    101             $a[] = array( $ts * 1000, "$value", $desc );         
    102           } else { 
    103             $a[] = array( $ts * 1000, "$value" ); 
     95    $timeline = ( (get_class($set) == "Reconnoiter_ChangeSet")  
     96                  || (get_class($set) == "Reconnoiter_CompositeSet") )  ? $set->points() : $this->series(); 
     97    if($timeline) { 
     98        foreach($timeline as $ts) { 
     99            $value = $set->data($ts); 
     100            if($value != "") { 
     101              $desc = $set->description($ts); 
     102              if($desc) { 
     103                $a[] = array( $ts * 1000, "$value", $desc );     
     104              } else { 
     105                $a[] = array( $ts * 1000, "$value" ); 
     106              } 
     107            } 
     108            $i++; 
    104109          } 
    105         } 
    106         $i++; 
    107       } 
     110    } 
    108111    return $a; 
    109112  }