Example #1
0
 /**
  * Transforms an intermediate representation for a expression into a database system valid expression
  *
  * @param array  $expression
  * @param string $escapeChar
  *
  * @return string
  * @throws \Exception
  */
 public function getSqlExpression(array $expression, $escapeChar = null)
 {
     if ($expression["type"] == 'functionCall') {
         switch ($expression["name"]) {
             case 'DATE_INTERVAL':
                 if (count($expression["arguments"]) != 2) {
                     throw new \Exception('DATE_INTERVAL requires 2 parameters');
                 }
                 switch ($expression["arguments"][1]['value']) {
                     case "'DAY'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' DAY';
                     case "'MONTH'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' MONTH';
                     case "'YEAR'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' YEAR';
                 }
                 break;
             case 'FULLTEXT_MATCH':
                 if (count($expression["arguments"]) < 2) {
                     throw new \Exception('FULLTEXT_MATCH requires 2 parameters');
                 }
                 $arguments = array();
                 $length = count($expression["arguments"]) - 1;
                 for ($i = 0; $i < $length; $i++) {
                     $arguments[] = $this->getSqlExpression($expression["arguments"][$i]);
                 }
                 return 'MATCH(' . join(', ', $arguments) . ') AGAINST (' . $this->getSqlExpression($expression["arguments"][$length]) . ')';
             case 'FULLTEXT_MATCH_BMODE':
                 if (count($expression["arguments"]) < 2) {
                     throw new \Exception('FULLTEXT_MATCH requires 2 parameters');
                 }
                 $arguments = array();
                 $length = count($expression["arguments"]) - 1;
                 for ($i = 0; $i < $length; $i++) {
                     $arguments[] = $this->getSqlExpression($expression["arguments"][$i]);
                 }
                 return 'MATCH(' . join(', ', $arguments) . ') AGAINST (' . $this->getSqlExpression($expression["arguments"][$length]) . ' IN BOOLEAN MODE)';
         }
     }
     return parent::getSqlExpression($expression, $escapeChar);
 }
Example #2
0
 /**
  * Transforms an intermediate representation for a expression into a database system valid expression.
  *
  * @param array $expression
  * @param string $escapeChar
  * @param mixed $bindCounts
  * @return string
  *
  * @throws Exception
  */
 public function getSqlExpression(array $expression, $escapeChar = null, $bindCounts = null)
 {
     if ($expression["type"] == 'functionCall') {
         switch (strtoupper($expression["name"])) {
             case 'DATE_INTERVAL':
                 if (count($expression["arguments"]) != 2) {
                     throw new Exception('DATE_INTERVAL requires 2 parameters');
                 }
                 switch ($expression["arguments"][1]['value']) {
                     case "'MICROSECOND'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' MICROSECOND';
                     case "'SECOND'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' SECOND';
                     case "'MINUTE'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' MINUTE';
                     case "'HOUR'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' HOUR';
                     case "'DAY'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' DAY';
                     case "'WEEK'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' WEEK';
                     case "'MONTH'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' MONTH';
                     case "'QUARTER'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' QUARTER';
                     case "'YEAR'":
                         return 'INTERVAL ' . $this->getSqlExpression($expression["arguments"][0]) . ' YEAR';
                     default:
                         throw new Exception('DATE_INTERVAL unit is not supported');
                 }
                 break;
             case 'FULLTEXT_MATCH':
                 if (count($expression["arguments"]) < 2) {
                     throw new Exception('FULLTEXT_MATCH requires 2 parameters');
                 }
                 $arguments = [];
                 $length = count($expression["arguments"]) - 1;
                 for ($i = 0; $i < $length; $i++) {
                     $arguments[] = $this->getSqlExpression($expression["arguments"][$i]);
                 }
                 return 'MATCH(' . join(', ', $arguments) . ') AGAINST (' . $this->getSqlExpression($expression["arguments"][$length]) . ')';
                 break;
             case 'FULLTEXT_MATCH_BMODE':
                 if (count($expression["arguments"]) < 2) {
                     throw new Exception('FULLTEXT_MATCH requires 2 parameters');
                 }
                 $arguments = [];
                 $length = count($expression["arguments"]) - 1;
                 for ($i = 0; $i < $length; $i++) {
                     $arguments[] = $this->getSqlExpression($expression["arguments"][$i]);
                 }
                 return 'MATCH(' . join(', ', $arguments) . ') AGAINST (' . $this->getSqlExpression($expression["arguments"][$length]) . ' IN BOOLEAN MODE)';
                 break;
             case 'REGEXP':
                 if (count($expression['arguments']) != 2) {
                     throw new Exception('REGEXP requires 2 parameters');
                 }
                 return $this->getSqlExpression($expression['arguments'][0]) . ' REGEXP (' . $this->getSqlExpression($expression['arguments'][1]) . ')';
                 break;
         }
     }
     return parent::getSqlExpression($expression, $escapeChar, $bindCounts);
 }