require 'rubygems' require 'gnuplot' $:.push(".") require 'util' require 'plot' require 'csvx' $modes = [:deterministic,:classic,:partition,:inline,:hybrid] $query_names = { :q1_noagg => "Q1", :q3_noagg => "Q3", :q5_noagg => "Q5", :q9_noagg => "Q9" } # plot_output :pdf, size: "5in,2.5in", fsize: "12" plot_output :aqua # auto_open_plots :true # $plot_auto_open = true def to_seconds(time) case time when /([0-9]+)m([0-9.]+)s/ then $1.to_i * 60 + $2.to_f when /\?/ then 0 when /Timeout/ then 1000000 else raise "Unknown time value '#{time}'" end end def sort_by_cols(order,hash) order.map { |col| hash[col] } end $data = File.csv("data.csv", separator: / *, */). map { |db,q,sf,mode,time| [ (db+"_"+sf).to_sym, [q.to_sym, [mode.to_sym, to_seconds(time)]]] }.reduce { |db, db_trials| db_trials.reduce { |q, q_trials| sort_by_cols($modes, q_trials.to_h) } } def plot_timing_bar_plot(gp, db, details = {}) clusters = $query_names.keys.sort; data = sort_by_cols( clusters, $data[db] ).map {|timings| det_t = timings.shift timings.map { |t| t / det_t * 100} } gp.yrange details.fetch(:yrange, "[0:300]") gp.key "font \"Times-Roman,10\" opaque box top left" gp.ylabel "% of Deterministic Time" draw_clustered_bar_plot(gp, data: data, dataset_labels: $modes.map {|m| m.to_s.capitalize}[1..-1], group_labels: clusters.map {|c| $query_names[c]}, box_style: lambda {|i| "boxes fill solid #{(i.to_f/6)+0.25} lc #{$pretty_styles[4-i][:lt]}"} ) end plot 'sqlite100m' => "Rakefile" do |gp| plot_timing_bar_plot(gp, :sqlite_100m) end plot 'sqlite1g' => "Rakefile" do |gp| plot_timing_bar_plot(gp, :sqlite_1g) end plot 'dbx100m' => "Rakefile" do |gp| plot_timing_bar_plot(gp, :oracle_100m, yrange: "[0:400]" ) end plot 'dbx1g' => "Rakefile" do |gp| plot_timing_bar_plot(gp, :oracle_1g, yrange: "[0:1400]" ) end task :all => ['sqlite100m', 'sqlite1g', 'dbx100m', 'dbx1g'] task :default => :all