BigW Consortium Gitlab

charts.rb 3.04 KB
Newer Older
1 2 3 4 5 6
module Gitlab
  module Ci
    module Charts
      module DailyInterval
        def grouped_count(query)
          query
Maxim Rydkin committed
7
            .group("DATE(#{::Ci::Pipeline.table_name}.created_at)")
8
            .count(:created_at)
9
            .transform_keys { |date| date.strftime(@format) } # rubocop:disable Gitlab/ModuleWithInstanceVariables
10 11 12 13 14 15 16 17 18 19 20
        end

        def interval_step
          @interval_step ||= 1.day
        end
      end

      module MonthlyInterval
        def grouped_count(query)
          if Gitlab::Database.postgresql?
            query
Maxim Rydkin committed
21
              .group("to_char(#{::Ci::Pipeline.table_name}.created_at, '01 Month YYYY')")
22 23 24 25
              .count(:created_at)
              .transform_keys(&:squish)
          else
            query
Maxim Rydkin committed
26
              .group("DATE_FORMAT(#{::Ci::Pipeline.table_name}.created_at, '01 %M %Y')")
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
              .count(:created_at)
          end
        end

        def interval_step
          @interval_step ||= 1.month
        end
      end

      class Chart
        attr_reader :labels, :total, :success, :project, :pipeline_times

        def initialize(project)
          @labels = []
          @total = []
          @success = []
          @pipeline_times = []
          @project = project

          collect
        end

        def collect
          query = project.pipelines
Maxim Rydkin committed
51
            .where("? > #{::Ci::Pipeline.table_name}.created_at AND #{::Ci::Pipeline.table_name}.created_at > ?", @to, @from) # rubocop:disable GitlabSecurity/SqlInjection
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

          totals_count  = grouped_count(query)
          success_count = grouped_count(query.success)

          current = @from
          while current < @to
            label = current.strftime(@format)

            @labels  << label
            @total   << (totals_count[label] || 0)
            @success << (success_count[label] || 0)

            current += interval_step
          end
        end
      end

      class YearChart < Chart
        include MonthlyInterval
71
        attr_reader :to, :from
72 73

        def initialize(*)
74 75
          @to     = Date.today.end_of_month.end_of_day
          @from   = @to.years_ago(1).beginning_of_month.beginning_of_day
76 77 78 79 80 81 82 83
          @format = '%d %B %Y'

          super
        end
      end

      class MonthChart < Chart
        include DailyInterval
84
        attr_reader :to, :from
85 86

        def initialize(*)
87 88
          @to     = Date.today.end_of_day
          @from   = 1.month.ago.beginning_of_day
89 90 91 92 93 94 95 96
          @format = '%d %B'

          super
        end
      end

      class WeekChart < Chart
        include DailyInterval
97
        attr_reader :to, :from
98 99

        def initialize(*)
100 101
          @to     = Date.today.end_of_day
          @from   = 1.week.ago.beginning_of_day
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
          @format = '%d %B'

          super
        end
      end

      class PipelineTime < Chart
        def collect
          commits = project.pipelines.last(30)

          commits.each do |commit|
            @labels << commit.short_sha
            duration = commit.duration || 0
            @pipeline_times << (duration / 60)
          end
        end
      end
    end
  end
end