49 $dbr = $this->dbProvider->getReplicaDatabase();
51 $so = $this->getStatsProvider( $opts->
getValue(
'count' ), $opts );
53 $fixedStart = $opts->
getValue(
'start' ) !==
'';
56 $period = 3600 * 24 * $opts->
getValue(
'days' );
59 $cutoff = (int)wfTimestamp( TS_UNIX, $opts->
getValue(
'start' ) );
61 $cutoff = $now - $period;
63 $cutoff = self::roundTimestampToCutoff( $opts->
getValue(
'scale' ), $cutoff,
'earlier' );
68 $end = self::roundTimestampToCutoff( $opts->
getValue(
'scale' ), $start + $period,
'later' ) - 1;
73 $timestampColumn = $so->getTimestampColumn();
75 $selectQueryBuilder = $so->createQueryBuilder( $dbr, __METHOD__ );
76 $selectQueryBuilder->andWhere(
77 $this->makeTimeCondition(
80 wfTimestamp( TS_MW, $start ),
81 wfTimestampOrNull( TS_MW, $end )
85 $res = $selectQueryBuilder->fetchResultSet();
86 wfDebug( __METHOD__ .
"-queryend\n" );
89 $dateFormat = $so->getDateFormat();
90 $increment = self::getIncrement( $opts->
getValue(
'scale' ) );
92 $labels = $so->labels();
93 $defaults = array_fill_keys( array_keys( $labels ), 0 );
97 $lastValue = $end ?? $now + 10;
98 while ( $cutoff <= $lastValue ) {
99 $date = $language->sprintfDate( $dateFormat, wfTimestamp( TS_MW, $cutoff ) );
100 $cutoff += $increment;
101 $data[$date] = $defaults;
104 $data[$language->sprintfDate( $dateFormat, wfTimestamp( TS_MW, $lastValue ) )] = $defaults;
107 $labelToIndex = array_flip( $labels );
109 foreach ( $res as $row ) {
110 $indexLabels = $so->indexOf( $row );
111 if ( $indexLabels ===
null ) {
115 foreach ( $indexLabels as $i ) {
116 if ( !isset( $labelToIndex[$i] ) ) {
119 $date = $language->sprintfDate( $dateFormat, $row->$timestampColumn );
121 if ( !isset( $data[$date] ) ) {
125 $data[$date][$labelToIndex[$i]]++;
130 if ( $labels === [
'all' ] ) {
134 foreach ( $labels as &$label ) {
135 if ( !str_contains( $label,
'@' ) ) {
138 [ $groupId, $code ] = explode(
'@', $label, 2 );
139 if ( $code && $groupId ) {
140 $code = Utilities::getLanguageName( $code, $language->getCode() ) .
" ($code)";
142 $group = $group ? $group->getLabel() : $groupId;
143 $label =
"$group @ $code";
145 $label = Utilities::getLanguageName( $code, $language->getCode() ) .
" ($code)";
146 } elseif ( $groupId ) {
148 $label = $group ? $group->getLabel() : $groupId;
153 if ( $end ===
null ) {
155 $last = end( $data );
157 unset( $data[$key] );
158 $data[
"$key*" ] = $last;
161 return [ $labels, $data ];