Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
ShallowCompactor
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 6
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 compactRow
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 compactRows
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getShallow
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getResultDuplicator
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 expandCacheResult
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace Flow\Data\Compactor;
4
5use Flow\Data\Compactor;
6use Flow\Data\Index\UniqueFeatureIndex;
7use Flow\Data\Utils\ResultDuplicator;
8
9/**
10 * Backs an index with a UniqueFeatureIndex.  This index will store only the primary key
11 * values from the unique index, and on retrieval from cache will materialize the primary key
12 * values into full rows from the unique index.
13 */
14class ShallowCompactor implements Compactor {
15    /**
16     * @var Compactor
17     */
18    protected $inner;
19
20    /**
21     * @var UniqueFeatureIndex
22     */
23    protected $shallow;
24
25    /**
26     * @var string[]
27     */
28    protected $sort;
29
30    /**
31     * @param Compactor $inner
32     * @param UniqueFeatureIndex $shallow
33     * @param string[] $sortedColumns
34     */
35    public function __construct( Compactor $inner, UniqueFeatureIndex $shallow, array $sortedColumns ) {
36        $this->inner = $inner;
37        $this->shallow = $shallow;
38        $this->sort = $sortedColumns;
39    }
40
41    /**
42     * @param array $row
43     * @return array
44     */
45    public function compactRow( array $row ) {
46        $keys = array_merge( $this->shallow->getPrimaryKeyColumns(), $this->sort );
47        $extra = array_diff( array_keys( $row ), $keys );
48        foreach ( $extra as $key ) {
49            unset( $row[$key] );
50        }
51        return $this->inner->compactRow( $row );
52    }
53
54    /**
55     * @param array $rows
56     * @return array
57     */
58    public function compactRows( array $rows ) {
59        return array_map( [ $this, 'compactRow' ], $rows );
60    }
61
62    /**
63     * @return UniqueFeatureIndex
64     */
65    public function getShallow() {
66        return $this->shallow;
67    }
68
69    /**
70     * @param array $cached
71     * @param array $keyToQuery
72     * @return ResultDuplicator
73     */
74    public function getResultDuplicator( array $cached, array $keyToQuery ) {
75        $results = $this->inner->expandCacheResult( $cached, $keyToQuery );
76        // Allows us to flatten $results into a single $query array, then
77        // rebuild final return value in same structure and order as $results.
78        $duplicator = new ResultDuplicator( $this->shallow->getPrimaryKeyColumns(), 2 );
79        foreach ( $results as $i => $rows ) {
80            foreach ( $rows as $j => $row ) {
81                $duplicator->add( $row, [ $i, $j ] );
82            }
83        }
84
85        return $duplicator;
86    }
87
88    /**
89     * @param array $cached
90     * @param array $keyToQuery
91     * @return array
92     */
93    public function expandCacheResult( array $cached, array $keyToQuery ) {
94        $duplicator = $this->getResultDuplicator( $cached, $keyToQuery );
95        $queries = $duplicator->getUniqueQueries();
96        $innerResult = $this->shallow->findMulti( $queries );
97
98        foreach ( $innerResult as $rows ) {
99            // __construct guaranteed the shallow backing index is a unique, so $first is only result
100            $first = reset( $rows );
101            $duplicator->merge( $first, $first );
102        }
103
104        return $duplicator->getResult();
105    }
106}