Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 33 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 1 |
FeatureCompactor | |
0.00% |
0 / 33 |
|
0.00% |
0 / 4 |
306 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
compactRow | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
30 | |||
compactRows | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
expandCacheResult | |
0.00% |
0 / 22 |
|
0.00% |
0 / 1 |
110 |
1 | <?php |
2 | |
3 | namespace Flow\Data\Compactor; |
4 | |
5 | use Flow\Data\Compactor; |
6 | use Flow\Exception\DataModelException; |
7 | |
8 | /** |
9 | * Removes the feature fields from stored array since its duplicating the cache key values |
10 | * Re-adds them when retrieving from cache. |
11 | */ |
12 | class FeatureCompactor implements Compactor { |
13 | /** |
14 | * @var string[] |
15 | */ |
16 | protected $indexed; |
17 | |
18 | /** |
19 | * @param string[] $indexedColumns |
20 | */ |
21 | public function __construct( array $indexedColumns ) { |
22 | $this->indexed = $indexedColumns; |
23 | } |
24 | |
25 | /** |
26 | * The indexed values are always available when querying, this strips |
27 | * the duplicated data. |
28 | * |
29 | * @param array $row |
30 | * @return array |
31 | * @throws DataModelException |
32 | */ |
33 | public function compactRow( array $row ) { |
34 | foreach ( $this->indexed as $key ) { |
35 | unset( $row[$key] ); |
36 | } |
37 | foreach ( $row as $foo ) { |
38 | if ( $foo !== null && !is_scalar( $foo ) ) { |
39 | throw new DataModelException( |
40 | 'Attempted to compact row containing objects, must be scalar values: ' . |
41 | print_r( $foo, true ), 'process-data' |
42 | ); |
43 | } |
44 | } |
45 | return $row; |
46 | } |
47 | |
48 | /** |
49 | * @param array[] $rows |
50 | * @return array[] |
51 | */ |
52 | public function compactRows( array $rows ) { |
53 | return array_map( [ $this, 'compactRow' ], $rows ); |
54 | } |
55 | |
56 | /** |
57 | * The $cached array is three dimensional. Each top level key is a cache key |
58 | * and contains an array of rows. Each row is an array representing a single data model. |
59 | * |
60 | * $cached = [ $cacheKey => [ [ 'rev_id' => 123, ... ], ... ], ... ] |
61 | * |
62 | * The $keyToQuery array maps from cache key to the values that were used to build the cache key. |
63 | * These values are re-added to the results found in memcache. |
64 | * |
65 | * @param array $cached Array of results from BagOStuff::multiGet each containing a list of rows |
66 | * @param array $keyToQuery Map from key in $cached to the values used to generate that key |
67 | * @return array The $cached array with the queried values merged in |
68 | * @throws DataModelException |
69 | */ |
70 | public function expandCacheResult( array $cached, array $keyToQuery ) { |
71 | foreach ( $cached as $key => $rows ) { |
72 | $query = $keyToQuery[$key] ?? []; |
73 | if ( !is_array( $query ) ) { |
74 | throw new DataModelException( 'Cached data for "' . $key . |
75 | '"" should map to a valid query: ' . print_r( $query, true ), 'process-data' ); |
76 | } |
77 | |
78 | foreach ( $query as $foo ) { |
79 | if ( $foo !== null && !is_scalar( $foo ) ) { |
80 | throw new DataModelException( |
81 | 'Query values to merge with cache contains objects, should be scalar values: ' . |
82 | print_r( $foo, true ), |
83 | 'process-data' |
84 | ); |
85 | } |
86 | } |
87 | foreach ( $rows as $k => $row ) { |
88 | foreach ( $row as $foo ) { |
89 | if ( $foo !== null && !is_scalar( $foo ) ) { |
90 | throw new DataModelException( |
91 | 'Result from cache contains objects, should be scalar values: ' . |
92 | print_r( $foo, true ), |
93 | 'process-data' |
94 | ); |
95 | } |
96 | } |
97 | $cached[$key][$k] += $query; |
98 | } |
99 | } |
100 | |
101 | return $cached; |
102 | } |
103 | } |