function get_sql() { global $wpdb; if (empty($this->queries)) { return array('join' => '', 'where' => ''); } $context_table = MainWP_WP_Stream_DB::$table_context; $main_table = MainWP_WP_Stream_DB::$table; $meta_id_column = 'meta_id'; $join = array(); $where = array(); $queries = $this->queries; $meta_query = new WP_Meta_Query(); foreach ($queries as $i => $query) { foreach ($query as $key => $args) { $type = $meta_query->get_cast_for_type(isset($args['type']) ? $args['type'] : ''); $value = isset($args['value']) ? $args['value'] : null; // Allow 'context' => array('val1', 'val2') as well if (is_null($value)) { $args = array('value' => $args); $value = $args['value']; } if (isset($args['compare'])) { $compare = strtoupper($args['compare']); } else { $compare = is_array($value) ? 'IN' : '='; } $operators = array('=', '!=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'REGEXP', 'NOT REGEXP', 'RLIKE'); if (!in_array($compare, $operators)) { $compare = '='; } if ('IN' === substr($compare, -2)) { if (!is_array($value)) { $value = preg_split('/[,\\s]+/', $value); } $compare_string = '(' . substr(str_repeat(',%s', count($value)), 1) . ')'; } elseif ('LIKE' === substr($compare, -4)) { $value = '%' . like_escape($value) . '%'; $compare_string = '%s'; } else { $compare_string = '%s'; } if (!empty($where[$i])) { $where[$i] .= ' AND '; } else { $where[$i] = ''; } $where[$i] = ' (' . $where[$i] . $wpdb->prepare("CAST({$context_table}.{$key} AS {$type}) {$compare} {$compare_string})", $value); } } $where = array_filter($where); if (empty($where)) { $where = ''; } else { $where = ' AND (' . implode("\n{$this->relation} ", $where) . ' )'; } $join = implode("\n", $join); return apply_filters_ref_array('get_context_sql', array(compact('join', 'where'), $this->queries)); }
/** * @ticket 23033 */ function test_get_cast_for_type() { $query = new WP_Meta_Query(); $this->assertEquals('BINARY', $query->get_cast_for_type('BINARY')); $this->assertEquals('CHAR', $query->get_cast_for_type('CHAR')); $this->assertEquals('DATE', $query->get_cast_for_type('DATE')); $this->assertEquals('DATETIME', $query->get_cast_for_type('DATETIME')); $this->assertEquals('SIGNED', $query->get_cast_for_type('SIGNED')); $this->assertEquals('UNSIGNED', $query->get_cast_for_type('UNSIGNED')); $this->assertEquals('TIME', $query->get_cast_for_type('TIME')); $this->assertEquals('SIGNED', $query->get_cast_for_type('NUMERIC')); $this->assertEquals('NUMERIC(10)', $query->get_cast_for_type('NUMERIC(10)')); $this->assertEquals('CHAR', $query->get_cast_for_type('NUMERIC( 10)')); $this->assertEquals('CHAR', $query->get_cast_for_type('NUMERIC( 10 )')); $this->assertEquals('NUMERIC(10, 5)', $query->get_cast_for_type('NUMERIC(10, 5)')); $this->assertEquals('CHAR', $query->get_cast_for_type('NUMERIC(10, 5)')); $this->assertEquals('NUMERIC(10,5)', $query->get_cast_for_type('NUMERIC(10,5)')); $this->assertEquals('CHAR', $query->get_cast_for_type('NUMERIC( 10, 5 )')); $this->assertEquals('CHAR', $query->get_cast_for_type('NUMERIC(10, 5 )')); $this->assertEquals('DECIMAL', $query->get_cast_for_type('DECIMAL')); $this->assertEquals('DECIMAL(10)', $query->get_cast_for_type('DECIMAL(10)')); $this->assertEquals('CHAR', $query->get_cast_for_type('DECIMAL( 10 )')); $this->assertEquals('CHAR', $query->get_cast_for_type('DECIMAL( 10)')); $this->assertEquals('CHAR', $query->get_cast_for_type('DECIMAL(10 )')); $this->assertEquals('DECIMAL(10, 5)', $query->get_cast_for_type('DECIMAL(10, 5)')); $this->assertEquals('DECIMAL(10,5)', $query->get_cast_for_type('DECIMAL(10,5)')); $this->assertEquals('CHAR', $query->get_cast_for_type('DECIMAL(10, 5)')); $this->assertEquals('CHAR', $query->get_cast_for_type('ANYTHING ELSE')); }