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); }
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; }
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; }