source: Dev/branches/jQueryUI/server/rdfapi/sparql/SparqlEngineDb/Offsetter.php @ 249

Last change on this file since 249 was 249, checked in by hendrikvanantwerpen, 13 years ago

This one's for Subversion, because it's so close...

First widget (stripped down sequencer).
Seperated client and server code in two direcotry trees.

File size: 3.4 KB
Line 
1<?php
2require_once RDFAPI_INCLUDE_DIR . 'sparql/SparqlEngineDb/SqlMerger.php';
3
4/**
5*   Determines the offset in a row of sql queries.
6*
7*   @author Christian Weiske <cweiske@cweiske.de>
8*   @license http://www.gnu.org/licenses/lgpl.html LGPL
9*
10*   @package sparql
11*/
12class SparqlEngineDb_Offsetter
13{
14    public function __construct(ADOConnection $dbConn, Query $query)
15    {
16        $this->dbConn   = $dbConn;
17        $this->query    = $query;
18    }//public function __construct(ADOConnection $dbConn, Query $query)
19
20
21
22    /**
23    *   Determines the offset in the sqls, the position to start form.
24    *
25    *   @param array $arSqls    Array of SQL query parts as returned by
26    *                           SparqlEngine_TypeSorter::getOrderifiedSqls()
27    *   @return array   Array of two values: The first determines the
28    *                   index of the sql query to begin with, the second
29    *                   is the row offset that should be used in the final
30    *                   SQL query.
31    */
32    public function determineOffset($arSqls)
33    {
34        $arSM = $this->query->getSolutionModifier();
35        if ($arSM['offset'] === null) {
36            return array(0, 0);
37        }
38
39        $nCount = 0;
40        foreach ($arSqls as $nId => $arSql) {
41            $nCurrentCount = $this->getCount($arSql);
42            if ($nCurrentCount + $nCount > $arSM['offset']) {
43                return array($nId, $arSM['offset'] - $nCount);
44            }
45            $nCount += $nCurrentCount;
46        }
47        //nothing found - no results for this offset
48        return array(count($arSqls), 0);
49    }//public function determineOffset($arSql)
50
51
52
53    /**
54    *   Returns the number of rows that the given query will return.
55    *
56    *   @param array $arSql Array with sql parts and at least keys
57    *                'from' and 'where' set.
58    *   @return int     Number of rows returned.
59    */
60    protected function getCount($arSql)
61    {
62        $sql = SparqlEngineDb_SqlMerger::getCount($this->query, $arSql);
63        $dbResult = $this->dbConn->execute($sql);
64
65        $nCount = 0;
66        foreach ($dbResult as $row) {
67            $nCount = intval($row[0]);
68            break;
69        }
70        return $nCount;
71    }//protected function getCount($arSql)
72
73
74
75    /**
76    *   Creates a sql LIMIT statement if the sparql query needs one.
77    *   This method is needed because AdoDb does not support limits with
78    *   prepared statements. It's a pity.
79    *
80    *   @return string  SQL command to be appended to a query, to limit
81    *                   the number of result rows returned.
82    */
83    public static function getLimitSql(Query $query, ADOConnection $dbConn)
84    {
85        $arSM = $query->getSolutionModifier();
86        if ($arSM['limit'] === null && $arSM['offset'] === null) {
87            return '';
88        }
89        //this here is mysql syntax. if anyone has problems, write it
90        //dependent on $dbConn's type
91        if ($arSM['offset'] === null) {
92            return ' LIMIT ' . $arSM['limit'];
93        } else if ($arSM['limit'] === null) {
94            return ' LIMIT ' . $arSM['offset'] . ', 18446744073709551615';
95        } else {
96            return ' LIMIT ' . $arSM['offset'] . ', ' . $arSM['limit'];
97        }
98    }//public static function getLimitSql(Query $query, ADOConnection $dbConn)
99
100}//class SparqlEngineDb_Offsetter
101
102?>
Note: See TracBrowser for help on using the repository browser.