/** * Creates a string representing SQL SELECT query * * @return string */ private function createStatementBody() { $filterFieldList = $this->filter instanceof ARSelectFilter ? $this->filter->getFieldList() : array(); $fields = array_merge($this->fieldList, $filterFieldList); $tableAliases = array(); $fieldListStr = ""; $preparedFieldList = array(); if (empty($fields)) { $fieldStr = "*"; } else { foreach ($fields as $fieldInfo) { $field = ""; if (!empty($fieldInfo['tableName'])) { $field = $fieldInfo['tableName'] . "." . $fieldInfo['fieldName']; } else { $field = $fieldInfo['fieldName']; } if (!empty($fieldInfo['fieldNameInResult'])) { $field .= ' AS "' . $fieldInfo['fieldNameInResult'] . '"'; } $preparedFieldList[] = $field; } } $fieldListStr = implode(", ", $preparedFieldList); $tableListStr = implode(", ", array_keys($this->tableList)); // add joins from select filter $filterJoins = $this->filter->getJoinList(); $joins = array_merge($this->joinList, $filterJoins); $joinListStr = ""; if (!empty($joins)) { $preparedJoinList = array(); foreach ($joins as $joinItem) { if (!empty($joinItem['tableAliasName'])) { $alias = ' AS `' . $joinItem['tableAliasName'] . '`'; $tableName = $joinItem['tableAliasName']; } else { $alias = ''; $tableName = $joinItem['tableName']; } if (empty($joinItem['tableAliasName'])) { $tableAliases[$joinItem['tableName']] = $joinItem['tableName']; } else { if (!isset($tableAliases[$joinItem['tableName']])) { $tableAliases[$joinItem['tableName']] = $joinItem['tableAliasName']; } } $preparedJoinList[] = "LEFT JOIN `" . $joinItem['tableName'] . '`' . $alias . " ON " . (isset($tableAliases[$joinItem['mainTableName']]) ? $tableAliases[$joinItem['mainTableName']] : $joinItem['mainTableName']) . "." . $joinItem['mainTableJoinFieldName'] . " = " . $tableName . "." . $joinItem['tableJoinFieldName'] . ''; } $joinListStr = implode(" ", $preparedJoinList); } return "SELECT " . $fieldListStr . " FROM " . $tableListStr . " " . $joinListStr; }
/** * Merges two filters (filter supplied as parameter overwrites order and limit * params of this filter) * * @param ARSelectFilter $filter */ public function merge(ARSelectFilter $filter) { if ($filter->isConditionSet()) { $this->mergeCondition($filter->getCondition()); } if ($filter->isHavingConditionSet()) { $this->mergeHavingCondition($filter->getHavingCondition()); } $this->setFieldOrder($filter->getFieldOrder()); $this->setLimit($filter->getLimit(), $filter->getOffset()); $groupings = $filter->getGroupingFields(); $this->fieldListForGroup = array_merge($this->getGroupingFields(), $groupings); $joins = $filter->getJoinList(); $this->joinList = array_merge($this->joinList, $joins); $fields = $filter->getFieldList(); $this->fieldList = array_merge($this->fieldList, $fields); }