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));
 }
Example #2
0
 /**
  * @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'));
 }