Exemple #1
0
 /**
  * Compile a condition into SQL
  *
  * @param SugarQuery_Builder_Condition $condition
  * @param string $sql Current SQL string
  * @param string $operator Preceding logical operator - AND/OR
  *
  * @return string
  */
 public function compileCondition(SugarQuery_Builder_Condition $condition)
 {
     $sql = '';
     $field = $this->compileField($condition->field);
     if (empty($field)) {
         return false;
     }
     if ($condition->isNull) {
         $sql .= "{$field} IS NULL";
     } elseif ($condition->notNull) {
         $sql .= "{$field} IS NOT NULL";
     } else {
         switch ($condition->operator) {
             case 'IN':
                 $valArray = array();
                 if ($condition->values instanceof SugarQuery) {
                     $sql .= "{$field} IN (" . $condition->values->compileSql($this->sugar_query) . ")";
                 } else {
                     foreach ($condition->values as $val) {
                         $valArray[] = $this->prepareValue($val, $condition);
                     }
                     $sql .= "{$field} IN (" . implode(',', $valArray) . ")";
                 }
                 break;
             case 'NOT IN':
                 $valArray = array();
                 $sql .= "({$field} IS NULL OR {$field} NOT IN ";
                 if ($condition->values instanceof SugarQuery) {
                     $sql .= '(' . $condition->values->compileSql($this->sugar_query) . ')';
                 } else {
                     foreach ($condition->values as $val) {
                         $valArray[] = $this->prepareValue($val, $condition);
                     }
                     $sql .= '(' . implode(',', $valArray) . ')';
                 }
                 $sql .= ')';
                 break;
             case 'BETWEEN':
                 $value['min'] = $this->prepareValue($condition->values['min'], $condition);
                 $value['max'] = $this->prepareValue($condition->values['max'], $condition);
                 $sql .= "{$field} BETWEEN {$value['min']} AND {$value['max']}";
                 break;
             case 'STARTS':
             case 'CONTAINS':
             case 'DOES NOT CONTAIN':
             case 'ENDS':
                 //Handling for not contains
                 $comparitor = 'LIKE';
                 $chainWith = 'OR';
                 if ($condition->operator === 'DOES NOT CONTAIN') {
                     $comparitor = 'NOT LIKE';
                     $chainWith = 'AND';
                 }
                 if ($this->db->supports('case_insensitive')) {
                     $field = "UPPER({$field})";
                 }
                 if (is_array($condition->values)) {
                     $conditions = array();
                     foreach ($condition->values as $value) {
                         if ($this->db->supports('case_insensitive')) {
                             $value = strtoupper($value);
                         }
                         $val = $this->prepareValue($value, $condition);
                         $conditions[] = "{$field} {$comparitor} {$val}";
                     }
                     $sql .= '(' . implode(' ' . $chainWith . ' ', $conditions);
                     if ($condition->operator === 'DOES NOT CONTAIN') {
                         $sql .= " OR {$field} IS NULL";
                     }
                     $sql .= ') ';
                 } else {
                     $value = $this->db->supports('case_insensitive') ? strtoupper($condition->values) : $condition->values;
                     $value = $this->prepareValue($value, $condition);
                     $sql .= "{$field} {$comparitor} {$value}";
                 }
                 break;
             case 'EQUALFIELD':
                 $sql .= "{$field} = " . $this->compileField(new SugarQuery_Builder_Field_Condition($condition->values, $this->sugar_query));
                 break;
             case 'NOTEQUALFIELD':
                 $sql .= "{$field} != " . $this->compileField(new SugarQuery_Builder_Field_Condition($condition->values, $this->sugar_query));
                 break;
             case '=':
             case '!=':
             case '>':
             case '<':
             case '>=':
             case '<=':
             default:
                 if ($condition->values instanceof SugarQuery) {
                     $sql .= "{$field} {$condition->operator} (" . $condition->values->compileSql($this->sugar_query) . ")";
                 } else {
                     $value = $this->prepareValue($condition->values, $condition);
                     $sql .= "{$field} {$condition->operator} {$value}";
                 }
                 break;
         }
     }
     return $sql;
 }