2011-07-19 25 views
0

私はクエリを実行していますが、今日のソースファイルを変更するまでは正常に動作していた定数に格納しようとしていますが、クエリを変更したり変更しなかったので混乱しますこのクエリと対話するコード。ここで動的定数割り当てエラー

は、コードは次のとおりです。

require 'rexml/document' 
include REXML 

def parallel_sort(data, labels) 
    #implement a basic ruby styled selection sort in to sort the data in descending order 
    raise "unequal arrays" if data.length != labels.length 

    0.upto(data.length - 2) do |i| 
     max = i # largest value 
     (i+1).upto(data.length - 1) { |j| max = j if data[j] > data[max] } #try to find new max 
     data[i], data[max], labels[i], labels[max] = data[max], data[i], labels[max], labels[i] if i != max #swap values in both arrays 
    end 

    return (data, labels) 
end 

def process_xml_files(filenames) 
    builds = ["Total Builds", "Failed Builds", "Successful Builds"] 
    outFile = File.new("gchart-data.txt", "w") 
    #outFile = File.new("parallel_sort_test.txt", "w") 
    yearly_data = [] 
    yearly_labels = [] 
    monthly_data = [] 
    monthly_labels = [] 
    failure_data = [] 
    failure_labels = [] 
    failure_percents = [] 
    hash = [] 

    #retrieve needed data from the XML file 
    filenames.each do |filename| 
     #create a document 
     doc = Document.new(File.new(filename)) 
     doc.elements.each("//row/field") do |e| 
     name = e.attributes['name'] 
     text = e.text 

     #search for tags and append correct data to lists 
     if builds.include?(name) 
      hash.push(name) 
      hash.push(text) 
     else 
      if name == "Month-Year" 
       yearly_labels.push(text) 
      elsif name == "Past-Year-Builds" 
       yearly_data.push(text) 
      elsif name == "Month-Day" 
       monthly_labels.push(text) 
      elsif name == "Past-Month-Builds" 
       monthly_data.push(text) 
      elsif name == "Failure Type" 
       failure_labels.push(text) 
      else 
       temp = 100*(text.to_f()/FAILED_BUILDS.to_f()) 
       failure_data.push(temp) 
       failure_percents.push(((100*temp).round/100.0).to_s() + "%") 
      end 
     end 
     end 
    end 

    #sort the failure_percents and failure_labels arrays together 
    failure_percents, failure_labels = parallel_sort(failure_percents, failure_labels) 

    outFile.puts hash 
    outFile.puts "\nYearly Data\n#{yearly_data.join(",")}" 
    outFile.puts yearly_labels 
    outFile.puts "\nMonthly Data\n#{monthly_data.join(",")}" 
    outFile.puts monthly_labels 
    outFile.puts "\nFailure Data\n#{failure_data.join(",")}" 
    outFile.puts failure_labels.zip(failure_percents).join("|") 
end 

def execute_queries() 
    FAILED_BUILDS = `mysql -h hostname -u root -D database -e 
    "SELECT COUNT(id) FROM builds WHERE buildstatus = 3 
    AND DATE(submittime) >= 
    DATE_SUB(CURDATE(), INTERVAL 1 YEAR);"`.gsub!(/[A-Za-z()\s]+/,"") 

    #get the total number of builds 
    totalBuilds = `mysql -h hostname -u root -D database -X -e 
    "SELECT COUNT(buildid) 'Total Builds' FROM builds 
    WHERE DATE(submittime) >= 
    DATE_SUB(CURDATE(), INTERVAL 1 YEAR);" > total-builds.xml` 

    #get the number of successful builds 
    successBuilds = `mysql -h hostname -u root -D database -X -e 
    "SELECT COUNT(buildid) 'Successful Builds' FROM builds 
    WHERE buildstatus = 2 AND DATE(submittime) >= 
    DATE_SUB(CURDATE(), INTERVAL 1 YEAR);" > success-builds.xml` 

    #get the number of failed builds 
    failedBuilds = `mysql -h hostname -u root -D database -X -e 
    "SELECT COUNT(buildid)'Failed Builds' FROM builds 
    WHERE buildstatus = 3 AND DATE(submittime) >= 
    DATE_SUB(CURDATE(), INTERVAL 1 YEAR);" > failed-builds.xml` 

    #get the number of builds per month 
    months = `mysql -h hostname -u root -D database -X -e 
    "select count(id) as 'Past-Year-Builds', 
    CONCAT(SUBSTR(MONTHNAME(submittime), 1,3), '-', 
    YEAR(submittime)) as 'Month-Year' from builds where 
    DATE(submittime) >= DATE_SUB(CURDATE(), interval 1 year) 
    group by YEAR(submittime), MONTH(submittime);" > year-builds.xml` 

    days = `mysql -h hostname -u root -D database -X -e 
    "SELECT COUNT(id) AS 'Past-Month-Builds', 
    CONCAT(SUBSTR(MONTHNAME(submittime), 1, 3), '-', 
    DAY(submittime)) as 'Month-Day' FROM builds 
    WHERE DATE(submittime) >= DATE_SUB(CURDATE(), INTERVAL 30 day) 
    GROUP BY MONTH(submittime), DAY(submittime);" > month-builds.xml` 

    failures = `mysql -h hostname -u root -D database -X -e 
    "select F.name 'Failure Type', count(B.id) 'Failure Count' 
    from builds B JOIN failureareas F ON B.failurearea = F.id 
    where Date(B.submittime) >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) 
    AND B.buildstatus != 2 GROUP BY F.name;" > failures.xml` 
end 


def start() 
    #grab data from the database 
    execute_queries() 

    #collect the xml files from the current directory 
    filenames = Dir.glob("*.xml") 

    #merge the xml files together 
    finalXML = process_xml_files(filenames) 

    #clean up directory 
    filenames.each do |filename| 
     del = `rm #{filename}` 
    end 
end 

#test for execution 
if __FILE__ == $0 
    start() 
end 

、これは動作しません。だから、なぜ誰も私を伝えることができますか?私は一度だけ定数に割り当てます。ここで

は誤りです:

gchart-url.rb:14: syntax error 
gchart-url.rb:75: dynamic constant assignment 
    FAILED_BUILDS = `mysql -h hostname -u root -D database -e 
    "SELECT COUNT(id) FROM builds WHERE buildstatus = 3 
    AND DATE(submittime) >= 
    DATE_SUB(CURDATE(), INTERVAL 1 YEAR);"`.gsub!(/[A-Za-z()\s]+/,"") 
       ^
gchart-url.rb:114: syntax error 

すべてのヘルプは素晴らしいことです。おかげさまで

EDIT:長い記事

+0

「私が変更を行うまではうまくいきます」変更が正確には何ですか? – Dogbert

+0

ファイルの先頭にparallel_sortメソッドを追加しました。 –

+0

動的定数ではありません。 – Thilo

答えて

2

まず申し訳ありませんが、あなたは最初から始め、構文エラーを整理すべき1報告 - しばしば残りは消えます。ラインで

14変更returnは、配列を返す:

return [data, labels] 
end 

Rubyは、メソッドから定数を設定するべきではないと思います。クラス定義(defブロックの外側)から設定するとエラーにはなりません。メソッドから定数を実際に作成する場合は、次のようにします。

self.class.const_set(:FAILED_BUILDS, `mysql -h .... 

しかし、私の質問はなぜ定数を設定したいのですか?インスタンス変数はよりよい解決策かもしれません。

+0

ありがとうございます。クエリが実行された後、データから単一の数値を抽出し、それを使用して操作を実行します。数字は決してプログラムの実行中に変化しません。それは定数の背後にある推論でした。 –

+1

私は、この場合でさえ、変数がより良いと言います。定数は、PIの値や設定ファイルのデフォルトの位置のような、ソースコードに設定されているものですが、プログラムによって計算されるものは変数です(たとえ一度だけ計算されたとしても)。それは私の謙虚な示唆に過ぎません;-) – Arsen7

+0

限界を超えてオブジェクトをテストしたいが、限界に達するまで反復したくない場合(実世界の限界:5000、テスト限界:3) – gamov