Test Failed
Push — master ( 87eb8d...25783a )
by Paul
03:58
created

CountsManager::get()   A

Complexity

Conditions 4
Paths 1

Size

Total Lines 20
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 14
nc 1
nop 1
dl 0
loc 20
ccs 0
cts 16
cp 0
crap 20
rs 9.7998
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Database\CountsManager;
4
5
use GeminiLabs\SiteReviews\Database\OptionManager;
6
use GeminiLabs\SiteReviews\Database\SqlQueries;
7
use GeminiLabs\SiteReviews\Modules\Rating;
8
9
class CountsManager
10
{
11
	/**
12
	 * @return array
13
	 */
14
	public function build( array $args = [], $limit = 500 )
15
	{
16
		$counts = [];
17
		$greaterThanId = 0;
18
		while( $reviews = glsr( SqlQueries::class )->getReviewRatings( $args, $greaterThanId, $limit )) {
19
			$types = array_keys( array_flip( array_column( $reviews, 'type' )));
20
			foreach( $types as $type ) {
21
				if( isset( $counts[$type] ))continue;
22
				$counts[$type] = array_fill_keys( range( 0, Rating::MAX_RATING ), 0 );
23
			}
24
			foreach( $reviews as $review ) {
25
				$counts[$review->type][$review->rating]++;
26
			}
27
			$greaterThanId = end( $reviews )->ID;
28
		}
29
		return $counts;
30
	}
31
32
	/**
33
	 * @return array
34
	 */
35
	public function buildFromIds( array $postIds, $limit = 100 )
36
	{
37
		$counts = array_fill_keys( range( 0, Rating::MAX_RATING ), 0 );
38
		$greaterThanId = 0;
39
		while( $reviews = glsr( SqlQueries::class )->getReviewRatingsFromIds( $postIds, $greaterThanId, $limit )) {
40
			foreach( $reviews as $review ) {
41
				$counts[$review->rating]++;
42
			}
43
			$greaterThanId = end( $reviews )->ID;
44
		}
45
		return $counts;
46
	}
47
48
	/**
49
	 * @return array
50
	 */
51
	public function flatten( array $reviewCounts )
52
	{
53
		$counts = [];
54
		array_walk_recursive( $reviewCounts, function( $num, $index ) use( &$counts ) {
55
			$counts[$index] = isset($counts[$index])
56
				? $num + $counts[$index]
57
				: $num;
58
		});
59
		return $counts;
60
	}
61
62
	/**
63
	 * @return array
64
	 */
65
	public function get( array $args = [] )
66
	{
67
		$args = wp_parse_args( $args, [
68
			'max' => Rating::MAX_RATING,
69
			'min' => Rating::MIN_RATING,
70
			'types' => 'local',
71
		]);
72
		$counts = array_intersect_key(
73
			glsr( OptionManager::class )->get( 'counts', [] ),
74
			array_flip( array_intersect( array_keys( glsr()->reviewTypes ), (array)$args['types'] ))
75
		);
76
		$counts = $this->normalize( $counts );
77
		array_walk( $counts, function( &$ratings ) use( $args ) {
78
			$ratings[0] = 0;
79
			foreach( $ratings as $index => &$num ) {
80
				if( $index >= intval( $args['min'] ) && $index <= intval( $args['max'] ))continue;
81
				$num = 0;
82
			}
83
		});
84
		return $counts;
85
	}
86
87
	/**
88
	 * @return array
89
	 */
90
	public function getFlattened( array $args = [] )
91
	{
92
		return $this->flatten( $this->get( $args ));
93
	}
94
95
	/**
96
	 * @return array
97
	 */
98
	protected function normalize( array $reviewCounts )
99
	{
100
		foreach( $reviewCounts as $type => &$counts ) {
101
			foreach( range( 0, Rating::MAX_RATING ) as $rating ) {
102
				if( isset( $counts[$rating] ))continue;
103
				$counts[$rating] = 0;
104
			}
105
			ksort( $counts );
106
		}
107
		return $reviewCounts;
108
	}
109
}
110
111