/** * Generate a powerfull criteria based. * * Recieve $data that is an array (operand_left, operand_right, operator) * If operant_left is array I call... myself :), else try to get the field name. * If right operand is array can myself to, else, nothing. * Third operator IS_ a operator name that send to sql::operate(); * @param array $data Genertaded by calls of sql class. * @param string $operation Is one of: insert, select, delete, update, if is diferent to select, then the result will not include the alias for table. * @return Criteria for any sql query. */ function builder_criteria($token_criteria, $operation = 'insert') { $num_elements = count($token_criteria); $this->_criteria_built = True; switch ($num_elements) { case 0: case 1: $local_criteria = $token_criteria; break; case 2: case 3: $operator = array_pop($token_criteria); $left = array_shift($token_criteria); $right = array_shift($token_criteria); if (is_array($left) && $operator != 'in') { $left = $this->builder_criteria($left, $operation); } else { $entity = $this->get_entity($left); $this->entities[$entity]->set_operation($operation); $field = $left; $left = $this->entities[$entity]->put_real_alias($this->real_field($entity, $left)); } if (is_array($right)) { if ($operator != 'in') { $right = $this->builder_criteria($right, $operation); } } else { if (isset($field) && $field && !($operator == 'has' || $operator == 'begin_with' || $operator == 'end_with')) { $right = $this->entities[$entity]->cast($right, $field); } } if ($operator == 'append_and' || $operator == 'append_or') { $param = array($left, $right); $local_criteria = phpgwapi_sql_criteria::operate($operator, $param); } else { $local_criteria = phpgwapi_sql_criteria::operate($operator, $left, $right); } break; default: $operator = array_pop($token_criteria); foreach ($token_criteria as $criteria) { $criterias[] = $this->builder_criteria($criteria, $operation); } $local_criteria = phpgwapi_sql_criteria::operate($operator, $criterias); } return $local_criteria; }
/** * Analize a criteria created by tokens and create a string that represent it, useful for any kind of operation that use criteria I guess. * * @param $token_criteria array Array with all the criteria in tokens, generated with sql_criteria * @return string Criteria string (All that goes in WHERE clause) * @see sql_criteria */ function entity_criteria($token_criteria) { /* Things to care about: - `_append_and', `_append_or' arrays have two elements: 1. array with criterias, 2. token - `in' is a three element: 1. field name, 2. array with values, 3. token */ $num_elements = count($token_criteria); switch ($num_elements) { case 0: case 1: $local_criteria = $token_criteria; break; case 2: case 3: $operator = array_pop($token_criteria); $left = array_shift($token_criteria); $right = array_shift($token_criteria); if (is_array($left) && $operator != 'in') { $left = $this->entity_criteria($left); } else { $left = $this->real_field($left); } if (is_array($right)) { $right = $this->entity_criteria($right); } $local_criteria = phpgwapi_sql_criteria::operate($operator, $left, $right); break; default: $operator = array_pop($token_criteria); $local_criteria = phpgwapi_sql_criteria::operate($operator, $token_criteria); } return $local_criteria; }