- /**
- * Generate SQL JOIN and WHERE clauses for a first-order query clause.
- *
- * "First-order" means that it's an array with a 'key' or 'value'.
- *
- * @since 4.1.0
- * @access public
- *
- * @param array $clause Query clause, passed by reference.
- * @param array $parent_query Parent query array.
- * @return array {
- * Array containing JOIN and WHERE SQL clauses to append to a first-order query.
- *
- * @type string $join SQL fragment to append to the main JOIN clause.
- * @type string $where SQL fragment to append to the main WHERE clause.
- * }
- */
- public function get_sql_for_clause( &$clause, $parent_query ) {
- global $wpdb;
-
- $sql_chunks = array(
- 'where' => array(),
- 'join' => array(),
- );
-
- if ( isset( $clause['compare'] ) ) {
- $clause['compare'] = strtoupper( $clause['compare'] );
- } else {
- $clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '=';
- }
-
- if ( ! in_array( $clause['compare'], array(
- '=', '!=', '>', '>=', '<', '<=',
- 'LIKE', 'NOT LIKE',
- 'IN', 'NOT IN',
- 'BETWEEN', 'NOT BETWEEN',
- 'EXISTS', 'NOT EXISTS',
- 'REGEXP', 'NOT REGEXP', 'RLIKE'
- ) ) ) {
- $clause['compare'] = '=';
- }
-
- $meta_compare = $clause['compare'];
-
- // First build the JOIN clause, if one is required.
- $join = '';
-
- // We prefer to avoid joins if possible. Look for an existing join compatible with this clause.
- $alias = $this->find_compatible_table_alias( $clause, $parent_query );
- if ( false === $alias ) {
- $i = count( $this->table_aliases );
- $alias = $i ? 'mt' . $i : $this->meta_table;
-
- // JOIN clauses for NOT EXISTS have their own syntax.
- if ( 'NOT EXISTS' === $meta_compare ) {
- $join .= " LEFT JOIN $this->meta_table";
- $join .= $i ? " AS $alias" : '';
- $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] );
-
- // All other JOIN clauses.
- } else {
- $join .= " INNER JOIN $this->meta_table";
- $join .= $i ? " AS $alias" : '';
- $join .= " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )";
- }