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