Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 88
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
CargoQueryPage
0.00% covered (danger)
0.00%
0 / 88
0.00% covered (danger)
0.00%
0 / 10
1332
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
110
 isExpensive
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isSyndicated
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getRecacheDB
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getQueryInfo
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
132
 linkParameters
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
30
 getOrderFields
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 sortDescending
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 formatResult
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 outputResults
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3class CargoQueryPage extends QueryPage {
4    public function __construct( $name = 'CargoQuery' ) {
5        parent::__construct( $name );
6
7        $req = $this->getRequest();
8        $tablesStr = trim( $req->getVal( 'tables' ) );
9        $fieldsStr = trim( $req->getVal( 'fields' ) );
10        $whereStr = trim( $req->getVal( 'where' ) );
11        $joinOnStr = trim( $req->getVal( 'join_on' ) );
12        $groupByStr = trim( $req->getVal( 'group_by' ) );
13        if ( substr( $groupByStr, -1, 1 ) == ',' ) {
14            $groupByStr = substr( $groupByStr, 0, -1 ); // Remove last comma for group by
15        }
16        $havingStr = trim( $req->getVal( 'having' ) );
17
18        $orderByStr = "";
19        $orderByValues = $req->getArray( 'order_by' );
20        $orderByOptions = $req->getArray( 'order_by_options' );
21        if ( is_array( $orderByValues ) ) {
22            foreach ( $orderByValues as $i => $curOrderBy ) {
23                if ( $curOrderBy == '' ) {
24                    continue;
25                }
26                $orderByStr .= $curOrderBy;
27                if ( $orderByOptions != null ) {
28                    $orderByStr .= ' ' . $orderByOptions[$i];
29                }
30                $orderByStr .= ',';
31            }
32        }
33        if ( substr( $orderByStr, -1, 1 ) == ',' ) {
34            $orderByStr = substr( $orderByStr, 0, -1 ); // Remove last comma for order by
35        }
36        $limitStr = trim( $req->getVal( 'limit' ) );
37        $offsetStr = trim( $req->getVal( 'offset' ) );
38
39        $this->sqlQuery = CargoSQLQuery::newFromValues( $tablesStr, $fieldsStr, $whereStr, $joinOnStr,
40                $groupByStr, $havingStr, $orderByStr, $limitStr, $offsetStr );
41
42        $formatStr = trim( $req->getVal( 'format' ) );
43        $this->format = $formatStr;
44
45        // This is needed for both the results display and the
46        // navigation links.
47        $this->displayParams = [];
48        $queryStringValues = $this->getRequest()->getValues();
49        foreach ( $queryStringValues as $key => $value ) {
50            // For some reason, getValues() turns all spaces
51            // into underlines.
52            $paramName = str_replace( '_', ' ', $key );
53            if ( !in_array( $paramName,
54                    [ 'title', 'tables', 'fields', 'join on', 'order by', 'group by', 'having', 'format',
55                    'offset' ] ) ) {
56                $this->displayParams[$paramName] = $value;
57            }
58        }
59
60        // 'dynamic table' makes its own use of 'order by'.
61        if ( $this->format == 'dynamic table' ) {
62            $this->displayParams['order by'] = $orderByStr;
63        }
64    }
65
66    public function isExpensive() {
67        return false;
68    }
69
70    public function isSyndicated() {
71        return false;
72    }
73
74    // @todo - declare a getPageHeader() function, to show some
75    // information about the query?
76
77    /**
78     * @return string
79     */
80    public function getRecacheDB() {
81        return CargoUtils::getDB();
82    }
83
84    public function getQueryInfo() {
85        $selectOptions = [];
86        if ( $this->sqlQuery->mGroupByStr != '' ) {
87            $selectOptions['GROUP BY'] = $this->sqlQuery->mGroupByStr;
88        }
89        if ( $this->sqlQuery->mHavingStr != '' ) {
90            $selectOptions['HAVING'] = $this->sqlQuery->mHavingStr;
91        }
92
93        // "order by" is handled elsewhere, in getOrderFields().
94
95        // Field aliases need to have quotes placed around them
96        // before running the query.
97        $cdb = CargoUtils::getDB();
98        $aliasedFieldNames = [];
99        foreach ( $this->sqlQuery->mAliasedFieldNames as $alias => $fieldName ) {
100            foreach ( $this->sqlQuery->mAliasedFieldNames as $alias => $fieldName ) {
101                // If it's really a field name, add quotes around it.
102                if ( strpos( $fieldName, '(' ) === false && strpos( $fieldName, '.' ) === false &&
103                    !$cdb->isQuotedIdentifier( $fieldName ) && !CargoUtils::isSQLStringLiteral( $fieldName ) ) {
104                    $fieldName = $cdb->addIdentifierQuotes( $fieldName );
105                }
106                $aliasedFieldNames[$alias] = $fieldName;
107            }
108        }
109
110        $queryInfo = [
111            'tables' => $this->sqlQuery->mAliasedTableNames,
112            'fields' => $aliasedFieldNames,
113            'options' => $selectOptions
114        ];
115        if ( $this->sqlQuery->mWhereStr != '' ) {
116            $queryInfo['conds'] = $this->sqlQuery->mWhereStr;
117        }
118        if ( !empty( $this->sqlQuery->mJoinConds ) ) {
119            $queryInfo['join_conds'] = $this->sqlQuery->mJoinConds;
120        }
121        return $queryInfo;
122    }
123
124    /**
125     * Returns an associative array that will be encoded and added to the
126     * paging links
127     * @return array
128     */
129    public function linkParameters() {
130        $possibleParams = [
131            'tables', 'fields', 'where', 'join_on', 'order_by', 'group_by', 'having', 'format'
132        ];
133        $linkParams = [];
134        $req = $this->getRequest();
135        foreach ( $possibleParams as $possibleParam ) {
136            if ( $req->getCheck( $possibleParam ) ) {
137                $linkParams[$possibleParam] = $req->getVal( $possibleParam );
138            } elseif ( $req->getArray( $possibleParam ) ) {
139                $linkParams[$possibleParam] = $req->getArray( $possibleParam );
140            }
141        }
142
143        foreach ( $this->displayParams as $key => $value ) {
144            $linkParams[$key] = $value;
145        }
146
147        return $linkParams;
148    }
149
150    public function getOrderFields() {
151        return $this->sqlQuery->mOrderBy;
152    }
153
154    public function sortDescending() {
155        return false;
156    }
157
158    public function formatResult( $skin, $result ) {
159        // This function needs to be declared, but it is not called.
160    }
161
162    /**
163     * Format and output report results using the given information plus
164     * OutputPage
165     *
166     * @param OutputPage $out OutputPage to print to
167     * @param Skin $skin User skin to use
168     * @param DatabaseBase $dbr Database (read) connection to use
169     * @param int $res Result pointer
170     * @param int $num Number of available result rows
171     * @param int $offset Paging offset
172     */
173    public function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
174        $valuesTable = [];
175        for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
176            $valuesTable[] = get_object_vars( $row );
177        }
178        $queryDisplayer = CargoQueryDisplayer::newFromSQLQuery( $this->sqlQuery );
179        $queryDisplayer->mFieldDescriptions = $this->sqlQuery->mFieldDescriptions;
180        $queryDisplayer->mFormat = $this->format;
181        $formatter = $queryDisplayer->getFormatter( $out );
182
183        if ( $formatter->isDeferred() ) {
184            $text = $formatter->queryAndDisplay( [ $this->sqlQuery ], $this->displayParams );
185            $out->addHTML( $text );
186            return;
187        }
188
189        $this->displayParams['offset'] = $offset;
190        $queryDisplayer->mDisplayParams = $this->displayParams;
191        $html = $queryDisplayer->displayQueryResults( $formatter, $valuesTable );
192        $out->addHTML( $html );
193    }
194}