BigW Consortium Gitlab

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

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

    module MonthlyInterval
      def grouped_count(query)
        if Gitlab::Database.postgresql?
19
          query
20
            .group("to_char(#{Ci::Pipeline.table_name}.created_at, '01 Month YYYY')")
21 22
            .count(:created_at)
            .transform_keys(&:squish)
23
        else
24
          query
25
            .group("DATE_FORMAT(#{Ci::Pipeline.table_name}.created_at, '01 %M %Y')")
26
            .count(:created_at)
27 28 29 30 31 32 33 34
        end
      end

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

35
    class Chart
36
      attr_reader :labels, :total, :success, :project, :pipeline_times
37 38 39 40 41

      def initialize(project)
        @labels = []
        @total = []
        @success = []
42
        @pipeline_times = []
43 44 45 46 47
        @project = project

        collect
      end

48
      def collect
49 50
        query = project.pipelines
          .where("? > #{Ci::Pipeline.table_name}.created_at AND #{Ci::Pipeline.table_name}.created_at > ?", @to, @from)
51 52 53 54 55 56 57 58 59 60 61 62 63 64

        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
65 66 67 68
      end
    end

    class YearChart < Chart
69
      include MonthlyInterval
70

71 72 73 74 75 76
      def initialize(*)
        @to     = Date.today.end_of_month
        @from   = @to.years_ago(1).beginning_of_month
        @format = '%d %B %Y'

        super
77 78 79 80
      end
    end

    class MonthChart < Chart
81
      include DailyInterval
82

83 84 85 86 87 88
      def initialize(*)
        @to     = Date.today
        @from   = @to - 30.days
        @format = '%d %B'

        super
89 90 91 92
      end
    end

    class WeekChart < Chart
93
      include DailyInterval
94

95 96 97 98 99 100
      def initialize(*)
        @to     = Date.today
        @from   = @to - 7.days
        @format = '%d %B'

        super
101 102 103
      end
    end

104
    class PipelineTime < Chart
105
      def collect
106
        commits = project.pipelines.last(30)
107

108 109
        commits.each do |commit|
          @labels << commit.short_sha
110
          duration = commit.duration || 0
111
          @pipeline_times << (duration / 60)
112 113 114 115 116
        end
      end
    end
  end
end