1<?php 2/** 3 * FunctionBuilder.php 4 * 5 * Builds function statements. 6 * 7 * PHP version 5 8 * 9 * LICENSE: 10 * Copyright (c) 2010-2015 Justin Swanhart and André Rothe 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. The name of the author may not be used to endorse or promote products 22 * derived from this software without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 * 35 * @author André Rothe <andre.rothe@phosco.info> 36 * @copyright 2010-2015 Justin Swanhart and André Rothe 37 * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) 38 * @version SVN: $Id$ 39 * 40 */ 41 42namespace PHPSQLParser\builders; 43use PHPSQLParser\exceptions\UnableToCreateSQLException; 44use PHPSQLParser\utils\ExpressionType; 45 46/** 47 * This class implements the builder for function calls. 48 * You can overwrite all functions to achieve another handling. 49 * 50 * @author André Rothe <andre.rothe@phosco.info> 51 * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) 52 * 53 */ 54class FunctionBuilder implements Builder { 55 56 protected function buildAlias($parsed) { 57 $builder = new AliasBuilder(); 58 return $builder->build($parsed); 59 } 60 61 protected function buildColRef($parsed) { 62 $builder = new ColumnReferenceBuilder(); 63 return $builder->build($parsed); 64 } 65 66 protected function buildConstant($parsed) { 67 $builder = new ConstantBuilder(); 68 return $builder->build($parsed); 69 } 70 71 protected function buildReserved($parsed) { 72 $builder = new ReservedBuilder(); 73 return $builder->build($parsed); 74 } 75 76 protected function isReserved($parsed) { 77 $builder = new ReservedBuilder(); 78 return $builder->isReserved($parsed); 79 } 80 81 protected function buildSelectExpression($parsed) { 82 $builder = new SelectExpressionBuilder(); 83 return $builder->build($parsed); 84 } 85 86 protected function buildSelectBracketExpression($parsed) { 87 $builder = new SelectBracketExpressionBuilder(); 88 return $builder->build($parsed); 89 } 90 91 protected function buildSubQuery($parsed) { 92 $builder = new SubQueryBuilder(); 93 return $builder->build($parsed); 94 } 95 96 public function build(array $parsed) { 97 if (($parsed['expr_type'] !== ExpressionType::AGGREGATE_FUNCTION) 98 && ($parsed['expr_type'] !== ExpressionType::SIMPLE_FUNCTION) 99 && ($parsed['expr_type'] !== ExpressionType::CUSTOM_FUNCTION)) { 100 return ""; 101 } 102 103 if ($parsed['sub_tree'] === false) { 104 return $parsed['base_expr'] . "()" . $this->buildAlias($parsed); 105 } 106 107 $sql = ""; 108 foreach ($parsed['sub_tree'] as $k => $v) { 109 $len = strlen($sql); 110 $sql .= $this->build($v); 111 $sql .= $this->buildConstant($v); 112 $sql .= $this->buildSubQuery($v); 113 $sql .= $this->buildColRef($v); 114 $sql .= $this->buildReserved($v); 115 $sql .= $this->buildSelectBracketExpression($v); 116 $sql .= $this->buildSelectExpression($v); 117 118 if ($len == strlen($sql)) { 119 throw new UnableToCreateSQLException('function subtree', $k, $v, 'expr_type'); 120 } 121 122 $sql .= ($this->isReserved($v) ? " " : ","); 123 } 124 return $parsed['base_expr'] . "(" . substr($sql, 0, -1) . ")" . $this->buildAlias($parsed); 125 } 126 127} 128?> 129