source: branches/version-2_13-dev/data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php @ 23664

Revision 23664, 11.4 KB checked in by Seasoft, 6 years ago (diff)

#2644 (SC_DB_DBFactory::alldtlSQL から class_count を削除)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2014 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/**
25 * PostgreSQL 固有の処理をするクラス.
26 *
27 * このクラスを直接インスタンス化しないこと.
28 * 必ず SC_DB_DBFactory クラスを経由してインスタンス化する.
29 * また, SC_DB_DBFactory クラスの関数を必ずオーバーライドしている必要がある.
30 *
31 * @package DB
32 * @author LOCKON CO.,LTD.
33 * @version $Id:SC_DB_DBFactory_PGSQL.php 15532 2007-08-31 14:39:46Z nanasess $
34 */
35class SC_DB_DBFactory_PGSQL extends SC_DB_DBFactory
36{
37    /**
38     * DBのバージョンを取得する.
39     *
40     * @param  string $dsn データソース名
41     * @return string データベースのバージョン
42     */
43    public function sfGetDBVersion($dsn = '')
44    {
45        $objQuery =& SC_Query_Ex::getSingletonInstance($dsn);
46        $val = $objQuery->getOne('select version()');
47        $arrLine = explode(' ', $val);
48
49        return $arrLine[0] . ' ' . str_replace(',', '', $arrLine[1]);
50    }
51
52    /**
53     * MySQL 用の SQL 文に変更する.
54     *
55     * DB_TYPE が PostgreSQL の場合は何もしない
56     *
57     * @access private
58     * @param  string $sql SQL 文
59     * @return string MySQL 用に置換した SQL 文
60     */
61    public function sfChangeMySQL($sql)
62    {
63        return $sql;
64    }
65
66    /**
67     * 昨日の売上高・売上件数を算出する SQL を返す.
68     *
69     * @param  string $method SUM または COUNT
70     * @return string 昨日の売上高・売上件数を算出する SQL
71     */
72    public function getOrderYesterdaySql($method)
73    {
74        return 'SELECT '.$method.'(total) FROM dtb_order '
75               . 'WHERE del_flg = 0 '
76               . "AND to_char(create_date,'YYYY/MM/DD') = to_char(CURRENT_TIMESTAMP - interval '1 days','YYYY/MM/DD') "
77               . 'AND status <> ' . ORDER_CANCEL;
78    }
79
80    /**
81     * 当月の売上高・売上件数を算出する SQL を返す.
82     *
83     * @param  string $method SUM または COUNT
84     * @return string 当月の売上高・売上件数を算出する SQL
85     */
86    public function getOrderMonthSql($method)
87    {
88        return 'SELECT '.$method.'(total) FROM dtb_order '
89               . 'WHERE del_flg = 0 '
90               . "AND to_char(create_date,'YYYY/MM') = ? "
91               . "AND to_char(create_date,'YYYY/MM/DD') <> to_char(CURRENT_TIMESTAMP,'YYYY/MM/DD') "
92               . 'AND status <> ' . ORDER_CANCEL;
93    }
94
95    /**
96     * 昨日のレビュー書き込み件数を算出する SQL を返す.
97     *
98     * @return string 昨日のレビュー書き込み件数を算出する SQL
99     */
100    public function getReviewYesterdaySql()
101    {
102        return 'SELECT COUNT(*) FROM dtb_review AS A '
103               . 'LEFT JOIN dtb_products AS B '
104               . 'ON A.product_id = B.product_id '
105               . 'WHERE A.del_flg=0 '
106               . 'AND B.del_flg = 0 '
107               . "AND to_char(A.create_date, 'YYYY/MM/DD') = to_char(CURRENT_TIMESTAMP - interval '1 days','YYYY/MM/DD') "
108               . "AND to_char(A.create_date,'YYYY/MM/DD') != to_char(CURRENT_TIMESTAMP,'YYYY/MM/DD')";
109    }
110
111    /**
112     * メール送信履歴の start_date の検索条件の SQL を返す.
113     *
114     * @return string 検索条件の SQL
115     */
116    public function getSendHistoryWhereStartdateSql()
117    {
118        return "start_date BETWEEN current_timestamp + '- 5 minutes' AND current_timestamp + '5 minutes'";
119    }
120
121    /**
122     * ダウンロード販売の検索条件の SQL を返す.
123     *
124     * @param  string $dtb_order_alias
125     * @return string 検索条件の SQL
126     */
127    public function getDownloadableDaysWhereSql($dtb_order_alias = 'dtb_order')
128    {
129        $baseinfo = SC_Helper_DB_Ex::sfGetBasisData();
130        //downloadable_daysにNULLが入っている場合(無期限ダウンロード可能時)もあるので、NULLの場合は0日に補正
131        $downloadable_days = $baseinfo['downloadable_days'];
132        // FIXME 怪しい比較「== null」
133        if ($downloadable_days == null || $downloadable_days == '') {
134            $downloadable_days = 0;
135        }
136        $sql = <<< __EOS__
137            (
138                SELECT
139                    CASE
140                        WHEN (SELECT d1.downloadable_days_unlimited FROM dtb_baseinfo d1) = 1 AND $dtb_order_alias.payment_date IS NOT NULL THEN 1
141                        WHEN DATE(CURRENT_TIMESTAMP) <= DATE($dtb_order_alias.payment_date + interval '$downloadable_days days') THEN 1
142                        ELSE 0
143                    END
144            )
145__EOS__;
146
147        return $sql;
148    }
149
150    /**
151     * 売上集計の期間別集計のSQLを返す
152     *
153     * @param  mixed  $type
154     * @return string 検索条件のSQL
155     */
156    public function getOrderTotalDaysWhereSql($type)
157    {
158        switch ($type) {
159            case 'month':
160                $format = 'YYYY-MM';
161                break;
162            case 'year':
163                $format = 'YYYY';
164                break;
165            case 'wday':
166                $format = 'Dy';
167                break;
168            case 'hour':
169                $format = 'HH24';
170                break;
171            default:
172                $format = 'YYYY-MM-DD';
173                break;
174        }
175
176        return "to_char(create_date, '".$format."') AS str_date,
177            COUNT(order_id) AS total_order,
178            SUM(CASE WHEN order_sex = 1 THEN 1 ELSE 0 END) AS men,
179            SUM(CASE WHEN order_sex = 2 THEN 1 ELSE 0 END) AS women,
180            SUM(CASE WHEN customer_id <> 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_member,
181            SUM(CASE WHEN customer_id <> 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_member,
182            SUM(CASE WHEN customer_id = 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_nonmember,
183            SUM(CASE WHEN customer_id = 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_nonmember,
184            SUM(total) AS total,
185            AVG(total) AS total_average";
186    }
187
188    /**
189     * 売上集計の年代別集計の年代抽出部分のSQLを返す
190     *
191     * @return string 年代抽出部分の SQL
192     */
193    public function getOrderTotalAgeColSql()
194    {
195        return 'TRUNC(CAST(EXTRACT(YEAR FROM AGE(create_date, order_birth)) AS INT), -1)';
196    }
197
198    /**
199     * 文字列連結を行う.
200     *
201     * @param  string[]  $columns 連結を行うカラム名
202     * @return string 連結後の SQL 文
203     */
204    public function concatColumn($columns)
205    {
206        $sql = '';
207        $i = 0;
208        $total = count($columns);
209        foreach ($columns as $column) {
210            $sql .= $column;
211            if ($i < $total -1) {
212                $sql .= ' || ';
213            }
214            $i++;
215        }
216
217        return $sql;
218    }
219
220    /**
221     * テーブルを検索する.
222     *
223     * 引数に部分一致するテーブル名を配列で返す.
224     *
225     * @deprecated SC_Query::listTables() を使用してください
226     * @param  string $expression 検索文字列
227     * @return array  テーブル名の配列
228     */
229    public function findTableNames($expression = '')
230    {
231        $objQuery =& SC_Query_Ex::getSingletonInstance();
232        $sql = '   SELECT c.relname AS name, '
233            .  '     CASE c.relkind '
234            .  "     WHEN 'r' THEN 'table' "
235            .  "     WHEN 'v' THEN 'view' END AS type "
236            .  '     FROM pg_catalog.pg_class c '
237            .  'LEFT JOIN pg_catalog.pg_namespace n '
238            .  '       ON n.oid = c.relnamespace '
239            .  "    WHERE c.relkind IN ('r','v') "
240            .  "      AND n.nspname NOT IN ('pg_catalog', 'pg_toast') "
241            .  '      AND pg_catalog.pg_table_is_visible(c.oid) '
242            .  '      AND c.relname LIKE ?'
243            .  ' ORDER BY 1,2;';
244        $arrColList = $objQuery->getAll($sql, array('%' . $expression . '%'));
245        $arrColList = SC_Utils_Ex::sfSwapArray($arrColList, false);
246
247        return $arrColList[0];
248    }
249
250    /**
251     * 文字コード情報を取得する
252     *
253     * @return array 文字コード情報
254     */
255    public function getCharSet()
256    {
257        // 未実装
258        return array();
259    }
260
261    /**
262     * 擬似表を表すSQL文(FROM 句)を取得する
263     *
264     * @return string
265     */
266    public function getDummyFromClauseSql()
267    {
268        return '';
269    }
270
271    /**
272     * テーブル一覧を取得する
273     *
274     * MDB2_Driver_Manager_pgsql#listTables の不具合回避を目的として独自実装している。
275     * @return array テーブル名の配列
276     */
277    public function listTables(SC_Query &$objQuery)
278    {
279        $col = 'tablename';
280        $from = 'pg_tables';
281        $where = "schemaname NOT IN ('pg_catalog', 'information_schema', 'sys')";
282
283        return $objQuery->getCol($col, $from, $where);
284    }
285
286    /**
287     * 商品詳細の SQL を取得する.
288     *
289     * PostgreSQL 用にチューニング。
290     * @param  string $where_products_class 商品規格情報の WHERE 句
291     * @return string 商品詳細の SQL
292     */
293    public function alldtlSQL($where_products_class = '')
294    {
295        if (!SC_Utils_Ex::isBlank($where_products_class)) {
296            $where_products_class = 'AND (' . $where_products_class . ')';
297        }
298        /*
299         * point_rate, deliv_fee は商品規格(dtb_products_class)ごとに保持しているが,
300         * 商品(dtb_products)ごとの設定なので MAX のみを取得する.
301         */
302        $sub_base = "FROM dtb_products_class WHERE del_flg = 0 AND product_id = dtb_products.product_id $where_products_class";
303        $sql = <<< __EOS__
304            (
305                SELECT
306                     dtb_products.*
307                    ,dtb_maker.name AS maker_name
308                    ,(SELECT MIN(product_code) $sub_base) AS product_code_min
309                    ,(SELECT MAX(product_code) $sub_base) AS product_code_max
310                    ,(SELECT MIN(price01) $sub_base) AS price01_min
311                    ,(SELECT MAX(price01) $sub_base) AS price01_max
312                    ,(SELECT MIN(price02) $sub_base) AS price02_min
313                    ,(SELECT MAX(price02) $sub_base) AS price02_max
314                    ,(SELECT MIN(stock) $sub_base) AS stock_min
315                    ,(SELECT MAX(stock) $sub_base) AS stock_max
316                    ,(SELECT MIN(stock_unlimited) $sub_base) AS stock_unlimited_min
317                    ,(SELECT MAX(stock_unlimited) $sub_base) AS stock_unlimited_max
318                    ,(SELECT MAX(point_rate) $sub_base) AS point_rate
319                    ,(SELECT MAX(deliv_fee) $sub_base) AS deliv_fee
320                FROM dtb_products
321                    LEFT JOIN dtb_maker
322                        ON dtb_products.maker_id = dtb_maker.maker_id
323                WHERE EXISTS(SELECT * $sub_base)
324            ) AS alldtl
325__EOS__;
326
327        return $sql;
328    }
329}
Note: See TracBrowser for help on using the repository browser.