/** * 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; }