Esempio n. 1
0
 protected function hf_select($field, $operator, $value, $raw_sql_val, $field_def)
 {
     $commondata = isset($field_def['commondata']) && $field_def['commondata'];
     if ($commondata) {
         return $this->hf_commondata($field, $operator, $value, $raw_sql_val, $field_def);
     }
     $sql = '';
     $vals = array();
     list($field, $sub_field) = Utils_RecordBrowser_CritsSingle::parse_subfield($field);
     $multiselect = $field_def['type'] == 'multiselect';
     $tab2 = isset($field_def['ref_table']) ? $field_def['ref_table'] : false;
     $single_tab = !($tab2 == '__RECORDSETS__' || count(explode(',', $tab2)) > 1);
     if ($sub_field && $single_tab && $tab2) {
         $col2 = explode('|', $sub_field);
         if (!isset($this->subqueries_tab_ids[$tab2])) {
             $this->subqueries_tab_ids[$tab2] = 0;
         }
         $tab_alias_id = $this->subqueries_tab_ids[$tab2]++;
         $nested_tab_alias = $this->tab_alias . '_' . $tab2 . '_' . $tab_alias_id;
         $crits = new Utils_RecordBrowser_Crits();
         foreach ($col2 as $col) {
             $col = $col[0] == ':' ? $col : Utils_RecordBrowserCommon::get_field_id(trim($col));
             if ($col) {
                 $crits->_or(new Utils_RecordBrowser_CritsSingle($col, $operator, $value, false, $raw_sql_val));
             }
         }
         if (!$crits->is_empty()) {
             $subquery = Utils_RecordBrowserCommon::build_query($tab2, $crits, $this->admin_mode, array(), $nested_tab_alias);
             $on_rule = $multiselect ? "{$field} LIKE CONCAT('%\\_\\_', {$nested_tab_alias}.id, '\\_\\_%')" : "{$field} = {$nested_tab_alias}.id";
             $sql = "EXISTS (SELECT 1 FROM {$subquery['sql']} AND {$on_rule})";
             $vals = $subquery['vals'];
         }
     } else {
         if ($raw_sql_val) {
             $sql = "{$field} {$operator} {$value}";
         } elseif (!$value) {
             $sql = "{$field} IS NULL";
             if (!$single_tab || $multiselect) {
                 $sql .= " OR {$field}=''";
             }
         } else {
             if ($single_tab && !$multiselect && $operator != DB::like()) {
                 $operand = '%d';
             } else {
                 if (DB::is_postgresql()) {
                     $field .= '::varchar';
                 }
                 $operand = '%s';
             }
             if ($multiselect) {
                 $value = "%\\_\\_{$value}\\_\\_%";
                 $operator = DB::like();
             }
             $sql = "({$field} {$operator} {$operand} AND {$field} IS NOT NULL)";
             $vals[] = $value;
         }
     }
     return array($sql, $vals);
 }
Esempio n. 2
0
 public static function merge_crits($a = array(), $b = array(), $or = false)
 {
     if (is_array($a)) {
         $a = Utils_RecordBrowser_Crits::from_array($a);
     }
     if (!$a instanceof Utils_RecordBrowser_Crits) {
         $a = new Utils_RecordBrowser_Crits($a);
     }
     if (is_array($b)) {
         $b = Utils_RecordBrowser_Crits::from_array($b);
     }
     if (!$b instanceof Utils_RecordBrowser_Crits) {
         $b = new Utils_RecordBrowser_Crits($b);
     }
     if ($a->is_empty()) {
         return clone $b;
     }
     if ($b->is_empty()) {
         return clone $a;
     }
     $a = clone $a;
     $b = clone $b;
     $ret = $or ? $a->_or($b) : $a->_and($b);
     return $ret;
 }
Esempio n. 3
0
 protected function validate_compound(Utils_RecordBrowser_Crits $crits, $record)
 {
     if ($crits->is_empty()) {
         return true;
     }
     $or = $crits->get_join_operator() == 'OR';
     $success = $or ? false : true;
     foreach ($crits->get_component_crits() as $c) {
         $satisfied = $this->validate($c, $record);
         if ($or) {
             if ($satisfied) {
                 $success = true;
                 break;
             }
         } else {
             if (!$satisfied) {
                 $success = false;
                 break;
             }
         }
     }
     if ($crits->get_negation()) {
         $success = !$success;
     }
     return $success;
 }