Skip to content

Commit

Permalink
refs #267
Browse files Browse the repository at this point in the history
correction for Redmine0.9.0 or later
  • Loading branch information
toshiyuki.ando1971 committed Feb 2, 2010
1 parent e410845 commit 40c19f4
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 103 deletions.
2 changes: 1 addition & 1 deletion init.rb
Expand Up @@ -45,6 +45,6 @@
end

Dispatcher.to_prepare do
Query.send( :include, RedmineHudson::Redmine::QueryPatch)
Query.send( :include, RedmineHudson::RedmineExt::QueryPatch)
end

226 changes: 124 additions & 102 deletions lib/query_patch.rb
@@ -1,12 +1,52 @@
# $Id$

require 'redmine/version'

module RedmineHudson
module Redmine
module RedmineExt
module QueryPatchFor09Later
def sql_for_field_with_redmine_hudson(field, operator, value, db_table, db_field, is_custom_filter=false)
case field
when "hudson_build"
return sql_for_hudson_build(field, operator, value)

when "hudson_job"
return sql_for_hudson_job(field, operator, value)

else
return sql_for_field_without_redmine_hudson(field, operator, value, db_table, db_field, is_custom_filter)
end
end
end #QueryPatchFor09

module QueryPatchFor08
def sql_for_field_with_redmine_hudson(field, value, db_table, db_field, is_custom_filter)
operator = operator_for field
case field
when "hudson_build"
return sql_for_hudson_build(field, operator, value)

when "hudson_job"
return sql_for_hudson_job(field, operator, value)

else
return sql_for_field_without_redmine_hudson(field, value, db_table, db_field, is_custom_filter)
end
end
end #QueryPatchFor08

module QueryPatch
def self.included(base) #:nodoc:
base.class_eval do

unloadable

if Redmine::VERSION::MAJOR == 0 && Redmine::VERSION::MINOR < 9 then
include RedmineHudson::RedmineExt::QueryPatchFor08
else
include RedmineHudson::RedmineExt::QueryPatchFor09Later
end

def available_filters_with_redmine_hudson
return @available_filters if @available_filters

Expand Down Expand Up @@ -35,106 +75,88 @@ def available_filters_with_redmine_hudson
return @available_filters
end

def sql_for_field_with_redmine_hudson(field, value, db_table, db_field, is_custom_filter)
case field
when "hudson_build"
return sql_for_hudson_build(field, value)

when "hudson_job"
return sql_for_hudson_job(field, value)

else
return sql_for_field_without_redmine_hudson(field, value, db_table, db_field, is_custom_filter)
end
end

def sql_for_hudson_build(field, value)
return sql_for_always_true unless project

jobs = HudsonJob.find(:all, :conditions => ["#{HudsonJob.table_name}.project_id = ?", project.id])
value_jobs = jobs.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

builds = HudsonBuild.find(:all, :conditions => ["#{HudsonBuild.table_name}.hudson_job_id in (#{value_jobs}) and #{conditions_for(field, value)}"])
cond_builds = builds.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

hbchangesets = HudsonBuildChangeset.find(:all, :conditions => ["#{HudsonBuildChangeset.table_name}.hudson_build_id in (#{cond_builds})"])
value_revisions = hbchangesets.collect{|target| "#{connection.quote_string(target.revision.to_s)}"}.join(",")

sql = "#{Issue.table_name}.id in"
sql << "(select changesets_issues.issue_id from changesets_issues"
sql << " where changesets_issues.changeset_id in"
sql << " (select #{Changeset.table_name}.id from #{Changeset.table_name}"
sql << " where #{Changeset.table_name}.repository_id = #{project.repository.id}"
sql << " and #{Changeset.table_name}.revision in (#{value_revisions})"
sql << " )"
sql << ")"

return sql
end

def sql_for_hudson_job(field, value)
return sql_for_always_true unless project

builds = HudsonBuild.find(:all, :conditions => "#{conditions_for(field, value)}")
cond_builds = builds.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

hbchangesets = HudsonBuildChangeset.find(:all, :conditions => ["#{HudsonBuildChangeset.table_name}.hudson_build_id in (#{cond_builds})"])
value_revisions = hbchangesets.collect{|target| "#{connection.quote_string(target.revision.to_s)}"}.join(",")

sql = "#{Issue.table_name}.id in"
sql << "(select changesets_issues.issue_id from changesets_issues"
sql << " where changesets_issues.changeset_id in"
sql << " (select #{Changeset.table_name}.id from #{Changeset.table_name}"
sql << " where #{Changeset.table_name}.repository_id = #{project.repository.id}"
sql << " and #{Changeset.table_name}.revision in (#{value_revisions})"
sql << " )"
sql << ")"

return sql
end

# conditions always true
def sql_for_always_true
return "#{HudsonBuild.table_name}.id > 0"
end

def conditions_for(field, value)
retval = ""

available_filters
return retval unless @hudson_filters

filter = @hudson_filters.detect {|hfilter| hfilter.name == field}
return retval unless filter

db_table = filter.db_table
db_field = filter.db_field

case operator_for field
when "="
retval = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
when "!"
retval = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
when "!*"
retval = "#{db_table}.#{db_field} IS NULL"
retval << " OR #{db_table}.#{db_field} = ''"
when "*"
retval = "#{db_table}.#{db_field} IS NOT NULL"
retval << " AND #{db_table}.#{db_field} <> ''"
when ">="
retval = "#{db_table}.#{db_field} >= #{value.first.to_i}"
when "<="
retval = "#{db_table}.#{db_field} <= #{value.first.to_i}"
when "!~"
retval = "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
end
return retval
end

alias_method_chain :available_filters, :redmine_hudson unless method_defined?(:available_filters_without_redmine_hudson)
alias_method_chain :sql_for_field, :redmine_hudson unless method_defined?(:sql_for_field_without_redmine_hudson)
alias_method_chain :available_filters, :redmine_hudson unless method_defined?(:available_filters_without_redmine_hudson)
alias_method_chain :sql_for_field, :redmine_hudson unless method_defined?(:sql_for_field_without_redmine_hudson)

def sql_for_hudson_build(field, operator, value)
return sql_for_always_true unless project

jobs = HudsonJob.find(:all, :conditions => ["#{HudsonJob.table_name}.project_id = ?", project.id])
value_jobs = jobs.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

builds = HudsonBuild.find(:all, :conditions => ["#{HudsonBuild.table_name}.hudson_job_id in (#{value_jobs}) and #{conditions_for(field, operator, value)}"])
cond_builds = builds.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

hbchangesets = HudsonBuildChangeset.find(:all, :conditions => ["#{HudsonBuildChangeset.table_name}.hudson_build_id in (#{cond_builds})"])
value_revisions = hbchangesets.collect{|target| "#{connection.quote_string(target.revision.to_s)}"}.join(",")
sql = "#{Issue.table_name}.id in"
sql << "(select changesets_issues.issue_id from changesets_issues"
sql << " where changesets_issues.changeset_id in"
sql << " (select #{Changeset.table_name}.id from #{Changeset.table_name}"
sql << " where #{Changeset.table_name}.repository_id = #{project.repository.id}"
sql << " and #{Changeset.table_name}.revision in (#{value_revisions})"
sql << " )"
sql << ")"
return sql
end

def sql_for_hudson_job(field, operator, value)
return sql_for_always_true unless project

builds = HudsonBuild.find(:all, :conditions => "#{conditions_for(field, operator, value)}")
cond_builds = builds.collect{|target| "#{connection.quote_string(target.id.to_s)}"}.join(",")

hbchangesets = HudsonBuildChangeset.find(:all, :conditions => ["#{HudsonBuildChangeset.table_name}.hudson_build_id in (#{cond_builds})"])
value_revisions = hbchangesets.collect{|target| "#{connection.quote_string(target.revision.to_s)}"}.join(",")

sql = "#{Issue.table_name}.id in"
sql << "(select changesets_issues.issue_id from changesets_issues"
sql << " where changesets_issues.changeset_id in"
sql << " (select #{Changeset.table_name}.id from #{Changeset.table_name}"
sql << " where #{Changeset.table_name}.repository_id = #{project.repository.id}"
sql << " and #{Changeset.table_name}.revision in (#{value_revisions})"
sql << " )"
sql << ")"
return sql
end

# conditions always true
def sql_for_always_true
return "#{HudsonBuild.table_name}.id > 0"
end

def conditions_for(field, operator, value)
retval = ""

available_filters
return retval unless @hudson_filters
filter = @hudson_filters.detect {|hfilter| hfilter.name == field}
return retval unless filter
db_table = filter.db_table
db_field = filter.db_field

case operator
when "="
retval = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
when "!"
retval = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
when "!*"
retval = "#{db_table}.#{db_field} IS NULL"
retval << " OR #{db_table}.#{db_field} = ''"
when "*"
retval = "#{db_table}.#{db_field} IS NOT NULL"
retval << " AND #{db_table}.#{db_field} <> ''"
when ">="
retval = "#{db_table}.#{db_field} >= #{value.first.to_i}"
when "<="
retval = "#{db_table}.#{db_field} <= #{value.first.to_i}"
when "!~"
retval = "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
end
return retval
end
end
end
end
end
end
end #QueryPatch
end #RedmineExt
end #RedmineHudson

0 comments on commit 40c19f4

Please sign in to comment.