Make WordPress Core


Ignore:
Timestamp:
02/06/2025 05:02:17 AM (2 months ago)
Author:
peterwilsoncc
Message:

Query: Increase WP_Query cache hits for equivalent arguments.

Introduces normalization a number of arguments passed to WP_Query to increase cache hits for equivalent requests. For example author__in => [ 1, 2 ] and author__in => [ 2, 1 ] will now hit the same cache.

Prior to generating the SQL request and cache key, the following are sorted, made unique and type cast as appropriate.

  • post_type when passed as an array
  • post_status when passed as an array
  • term_querys containing terms
  • cat
  • category__in
  • category__not_in
  • category__and
  • tag_slug__in
  • tag__in
  • tag__not_in
  • tag__and
  • tag_slug__in
  • tag_slug__and
  • post_parent__not_in
  • author
  • author__not_in
  • author__in

The following are sorted for the purposes of generating the cache key and SQL WHERE clause but unmodified for use in the ORDER BY SQL clause:

  • post_name__in
  • post__in
  • post_parent__in

This commit includes changes to unrelated tests, assertions in Tests_Query_ParseQuery::test_parse_query_cat_array_mixed() and WP_Test_REST_Posts_Controller::test_get_items_not_sticky_with_exclude() have been modified to account for the sorting of the items above.

Props thekt12, peterwilsoncc, spacedmonkey, joemcgill, flixos90, mukesh27, pbearne, swissspidy.
Fixes #59516.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/query/cacheResults.php

    r58122 r59766  
    202202
    203203    /**
    204      * @ticket 59442
     204     * @ticket 59516
    205205     *
    206206     * @covers WP_Query::generate_cache_key
    207      *
    208      * @dataProvider data_query_cache_duplicate
    209      */
    210     public function test_generate_cache_key_normalize( $query_vars1, $query_vars2 ) {
     207     */
     208    public function test_post_in_order_by_clauses_are_not_normalized() {
    211209        global $wpdb;
     210
     211        $post_ids = self::$posts;
     212
     213        $query_vars1 = array(
     214            'post__in' => $post_ids,
     215            'orderby'  => 'post__in',
     216        );
     217        $query_vars2 = array(
     218            'post__in' => array_reverse( $post_ids ),
     219            'orderby'  => 'post__in',
     220        );
    212221
    213222        $fields   = "{$wpdb->posts}.ID";
     
    218227        $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request );
    219228
    220         $reflection = new ReflectionMethod( $query1, 'generate_cache_key' );
    221         $reflection->setAccessible( true );
     229        $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' );
     230        $reflection_q1->setAccessible( true );
     231
     232        $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' );
     233        $reflection_q2->setAccessible( true );
     234
     235        $this->assertNotSame( $request1, $request2, 'Queries should not match' );
     236
     237        $cache_key_1 = $reflection_q1->getValue( $query1 );
     238        $cache_key_2 = $reflection_q2->getValue( $query2 );
     239
     240        $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' );
     241        $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' );
     242        $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' );
     243
     244        // Test the posts are returned different orders.
     245        $this->assertNotSame( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should not match the order of query two posts.' );
     246        // Test the posts are the same sets.
     247        $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' );
     248    }
     249
     250    /**
     251     * @ticket 59516
     252     *
     253     * @covers WP_Query::generate_cache_key
     254     */
     255    public function test_post_parent_in_order_by_clauses_are_not_normalized() {
     256        global $wpdb;
     257
     258        $parent_pages = self::$pages;
     259        $post_names   = array( 'doctor-dillamond', 'elphaba', 'fiyero', 'glinda', 'the-wizard-of-oz' );
     260        $child_pages  = array();
     261        foreach ( $parent_pages as $key => $parent_page ) {
     262            $child_pages[] = self::factory()->post->create(
     263                array(
     264                    'post_parent' => $parent_page,
     265                    'post_type'   => 'page',
     266                    'post_name'   => $post_names[ $key ],
     267                )
     268            );
     269        }
     270
     271        $query_vars1 = array(
     272            'post_parent__in' => $parent_pages,
     273            'post_type'       => 'page',
     274            'orderby'         => 'post_parent__in',
     275        );
     276
     277        $query_vars2 = array(
     278            'post_parent__in' => array_reverse( $parent_pages ),
     279            'post_type'       => 'page',
     280            'orderby'         => 'post_parent__in',
     281        );
     282
     283        $fields   = "{$wpdb->posts}.ID";
     284        $query1   = new WP_Query( $query_vars1 );
     285        $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request );
     286
     287        $query2   = new WP_Query( $query_vars2 );
     288        $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request );
     289
     290        $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' );
     291        $reflection_q1->setAccessible( true );
     292
     293        $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' );
     294        $reflection_q2->setAccessible( true );
     295
     296        $this->assertNotSame( $request1, $request2, 'Queries should not match' );
     297
     298        $cache_key_1 = $reflection_q1->getValue( $query1 );
     299        $cache_key_2 = $reflection_q2->getValue( $query2 );
     300
     301        $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' );
     302        $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' );
     303        $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' );
     304
     305        // Test the posts are returned in the correct order.
     306        $this->assertSame( array( 'doctor-dillamond', 'elphaba', 'fiyero', 'glinda', 'the-wizard-of-oz' ), wp_list_pluck( $query1->posts, 'post_name' ), 'Query one posts should be in alphabetical order' );
     307        $this->assertSame( array( 'the-wizard-of-oz', 'glinda', 'fiyero', 'elphaba', 'doctor-dillamond' ), wp_list_pluck( $query2->posts, 'post_name' ), 'Query two posts should be in reverse alphabetical order.' );
     308        // Test the posts are the same sets.
     309        $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' );
     310    }
     311
     312    /**
     313     * @ticket 59516
     314     *
     315     * @covers WP_Query::generate_cache_key
     316     */
     317    public function test_post_name_in_order_by_clauses_are_not_normalized() {
     318        global $wpdb;
     319        $post_names = array( 'doctor-dillamond', 'elphaba', 'glinda', 'the-wizard-of-oz' );
     320        $posts      = array();
     321
     322        foreach ( $post_names as $post_name ) {
     323            $posts[] = self::factory()->post->create(
     324                array(
     325                    'post_name' => $post_name,
     326                )
     327            );
     328        }
     329
     330        $query_vars1 = array(
     331            'post_name__in' => $post_names,
     332            'orderby'       => 'post_name__in',
     333        );
     334
     335        $query_vars2 = array(
     336            'post_name__in' => array_reverse( $post_names ),
     337            'orderby'       => 'post_name__in',
     338        );
     339
     340        $fields   = "{$wpdb->posts}.ID";
     341        $query1   = new WP_Query( $query_vars1 );
     342        $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request );
     343
     344        $query2   = new WP_Query( $query_vars2 );
     345        $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request );
     346
     347        $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' );
     348        $reflection_q1->setAccessible( true );
     349
     350        $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' );
     351        $reflection_q2->setAccessible( true );
     352
     353        $this->assertNotSame( $request1, $request2, 'Queries should not match' );
     354
     355        $cache_key_1 = $reflection_q1->getValue( $query1 );
     356        $cache_key_2 = $reflection_q2->getValue( $query2 );
     357
     358        $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' );
     359        $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' );
     360        $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' );
     361
     362        // Test the posts are returned in the correct order.
     363        $this->assertSame( array( 'doctor-dillamond', 'elphaba', 'glinda', 'the-wizard-of-oz' ), wp_list_pluck( $query1->posts, 'post_name' ), 'Query one posts should be in alphabetical order' );
     364        $this->assertSame( array( 'the-wizard-of-oz', 'glinda', 'elphaba', 'doctor-dillamond' ), wp_list_pluck( $query2->posts, 'post_name' ), 'Query two posts should be in reverse alphabetical order.' );
     365        // Test the posts are the same sets.
     366        $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' );
     367    }
     368
     369    /**
     370     * @ticket 59442
     371     * @ticket 59516
     372     *
     373     * @covers WP_Query::generate_cache_key
     374     *
     375     * @dataProvider data_query_cache_duplicate
     376     */
     377    public function test_generate_cache_key_normalize( $query_vars1, $query_vars2 ) {
     378        global $wpdb;
     379
     380        $fields   = "{$wpdb->posts}.ID";
     381        $query1   = new WP_Query( $query_vars1 );
     382        $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request );
     383
     384        $query2   = new WP_Query( $query_vars2 );
     385        $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request );
     386
     387        $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' );
     388        $reflection_q1->setAccessible( true );
     389
     390        $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' );
     391        $reflection_q2->setAccessible( true );
    222392
    223393        $this->assertSame( $request1, $request2, 'Queries should match' );
    224394
    225         $cache_key_1 = $reflection->invoke( $query1, $query_vars1, $request1 );
    226         $cache_key_2 = $reflection->invoke( $query1, $query_vars2, $request2 );
    227 
    228         $this->assertSame( $cache_key_1, $cache_key_2, 'Cache key differs the same paramters.' );
     395        $cache_key_1 = $reflection_q1->getValue( $query1 );
     396        $cache_key_2 = $reflection_q2->getValue( $query2 );
     397
     398        $this->assertSame( $cache_key_1, $cache_key_2, 'Cache key differs the same effective parameters.' );
     399        $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' );
     400        $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' );
    229401    }
    230402
     
    281453    public function data_query_cache_duplicate() {
    282454        return array(
    283             'post type empty'           => array(
     455            'post type empty'                              => array(
    284456                'query_vars1' => array( 'post_type' => '' ),
    285457                'query_vars2' => array( 'post_type' => 'post' ),
    286458            ),
    287             'post type array'           => array(
     459            'post type array'                              => array(
    288460                'query_vars1' => array( 'post_type' => array( 'page' ) ),
    289461                'query_vars2' => array( 'post_type' => 'page' ),
    290462            ),
    291             'orderby empty'             => array(
     463            'orderby empty'                                => array(
    292464                'query_vars1' => array( 'orderby' => null ),
    293465                'query_vars2' => array( 'orderby' => 'date' ),
    294466            ),
    295             'different order parameter' => array(
     467            'different order parameter'                    => array(
    296468                'query_vars1' => array(
    297469                    'post_type'      => 'post',
     
    303475                ),
    304476            ),
    305             'same args'                 => array(
     477            'same args'                                    => array(
    306478                'query_vars1' => array( 'post_type' => 'post' ),
    307479                'query_vars2' => array( 'post_type' => 'post' ),
    308480            ),
    309             'same args any'             => array(
     481            'same args any'                                => array(
    310482                'query_vars1' => array( 'post_type' => 'any' ),
    311483                'query_vars2' => array( 'post_type' => 'any' ),
    312484            ),
    313             'any and post types'        => array(
     485            'any and post types'                           => array(
    314486                'query_vars1' => array( 'post_type' => 'any' ),
    315487                'query_vars2' => array( 'post_type' => array( 'post', 'page', 'attachment' ) ),
    316488            ),
    317             'different order post type' => array(
     489            'different order post type'                    => array(
    318490                'query_vars1' => array( 'post_type' => array( 'post', 'page' ) ),
    319491                'query_vars2' => array( 'post_type' => array( 'page', 'post' ) ),
    320492            ),
    321             'post status array'         => array(
     493            'non-unique post type'                         => array(
     494                'query_vars1' => array( 'post_type' => array( 'post', 'page' ) ),
     495                'query_vars2' => array( 'post_type' => array( 'page', 'post', 'page' ) ),
     496            ),
     497            'post status array'                            => array(
    322498                'query_vars1' => array( 'post_status' => 'publish' ),
    323499                'query_vars2' => array( 'post_status' => array( 'publish' ) ),
    324500            ),
    325             'post status order'         => array(
     501            'post status order'                            => array(
    326502                'query_vars1' => array( 'post_status' => array( 'draft', 'publish' ) ),
    327503                'query_vars2' => array( 'post_status' => array( 'publish', 'draft' ) ),
    328504            ),
    329             'cache parameters'          => array(
     505            'non-unique post status'                       => array(
     506                'query_vars1' => array( 'post_status' => array( 'draft', 'publish' ) ),
     507                'query_vars2' => array( 'post_status' => array( 'draft', 'publish', 'draft' ) ),
     508            ),
     509            'post id int vs string'                        => array(
     510                'query_vars1' => array( 'p' => '1' ),
     511                'query_vars2' => array( 'p' => 1 ),
     512            ),
     513            'page id int vs string'                        => array(
     514                'query_vars1' => array( 'page_id' => '2' ),
     515                'query_vars2' => array( 'page_id' => 2 ),
     516            ),
     517            'attachment id int vs string'                  => array(
     518                'query_vars1' => array( 'attachment_id' => '3' ),
     519                'query_vars2' => array( 'attachment_id' => 3 ),
     520            ),
     521            'date and time values int vs string'           => array(
     522                'query_vars1' => array(
     523                    'year'     => '2013',
     524                    'monthnum' => '12',
     525                    'day'      => '12',
     526                    'hour'     => '12',
     527                    'minute'   => '12',
     528                    'second'   => '12',
     529                ),
     530                'query_vars2' => array(
     531                    'year'     => 2013,
     532                    'monthnum' => 12,
     533                    'day'      => 12,
     534                    'hour'     => 12,
     535                    'minute'   => 12,
     536                    'second'   => 12,
     537                ),
     538            ),
     539            'offset value int vs string'                   => array(
     540                'query_vars1' => array( 'offset' => '5' ),
     541                'query_vars2' => array( 'offset' => 5 ),
     542            ),
     543            'posts per page value int vs string'           => array(
     544                'query_vars1' => array( 'posts_per_page' => '5' ),
     545                'query_vars2' => array( 'posts_per_page' => 5 ),
     546            ),
     547            'paged value int vs string'                    => array(
     548                'query_vars1' => array( 'paged' => '2' ),
     549                'query_vars2' => array( 'paged' => 2 ),
     550            ),
     551            'menu_order value int vs string'               => array(
     552                'query_vars1' => array( 'menu_order' => '2' ),
     553                'query_vars2' => array( 'menu_order' => 2 ),
     554            ),
     555            'post__in different order'                     => array(
     556                'query_vars1' => array( 'post__in' => array( 1, 2, 3, 4, 5 ) ),
     557                'query_vars2' => array( 'post__in' => array( 5, 4, 3, 2, 1 ) ),
     558            ),
     559            'post__in non-unique'                          => array(
     560                'query_vars1' => array( 'post__in' => array( 1, 2, 3, 4, 5 ) ),
     561                'query_vars2' => array( 'post__in' => array( 1, 2, 3, 4, 5, 1, 2, 3 ) ),
     562            ),
     563            'post_parent__in different order'              => array(
     564                'query_vars1' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5 ) ),
     565                'query_vars2' => array( 'post_parent__in' => array( 5, 4, 3, 2, 1 ) ),
     566            ),
     567            'post_parent__in non-unique'                   => array(
     568                'query_vars1' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5 ) ),
     569                'query_vars2' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5, 1, 2, 3 ) ),
     570            ),
     571            'post_name__in different order'                => array(
     572                'query_vars1' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ),
     573                'query_vars2' => array( 'post_name__in' => array( 'doctor-dillamond', 'elphaba', 'the-wizard-of-oz', 'glinda' ) ),
     574            ),
     575            'post_name__in non-unique'                     => array(
     576                'query_vars1' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ),
     577                'query_vars2' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ),
     578            ),
     579            'cat different order (array)'                  => array(
     580                'query_vars_1' => array( 'cat' => array( '1', '2' ) ),
     581                'query_vars_2' => array( 'cat' => array( '2', '1' ) ),
     582            ),
     583            'cat different order (string)'                 => array(
     584                'query_vars_1' => array( 'cat' => '2,1' ),
     585                'query_vars_2' => array( 'cat' => '1,2' ),
     586            ),
     587            'cat queries int vs string'                    => array(
     588                'query_vars_1' => array( 'cat' => '2' ),
     589                'query_vars_2' => array( 'cat' => 2 ),
     590            ),
     591            'category__in queries different order (array)' => array(
     592                'query_vars_1' => array( 'category__in' => array( '1', '2' ) ),
     593                'query_vars_2' => array( 'category__in' => array( '2', '1' ) ),
     594            ),
     595            'category__in queries with non-unique array'   => array(
     596                'query_vars_1' => array( 'category__in' => array( '1', '1' ) ),
     597                'query_vars_2' => array( 'category__in' => array( '1' ) ),
     598            ),
     599            'category__in queries string vs array (array)' => array(
     600                'query_vars_1' => array( 'category__in' => array( '1' ) ),
     601                'query_vars_2' => array( 'category__in' => array( 1 ) ),
     602            ),
     603            'category__not_in different order (array)'     => array(
     604                'query_vars_1' => array( 'category__not_in' => array( '1', '2' ) ),
     605                'query_vars_2' => array( 'category__not_in' => array( '2', '1' ) ),
     606            ),
     607            'category__not_in with non-unique array'       => array(
     608                'query_vars_1' => array( 'category__not_in' => array( '1', '1' ) ),
     609                'query_vars_2' => array( 'category__not_in' => array( '1' ) ),
     610            ),
     611            'category__not_in queries string vs array (array)' => array(
     612                'query_vars_1' => array( 'category__not_in' => array( '1' ) ),
     613                'query_vars_2' => array( 'category__not_in' => array( 1 ) ),
     614            ),
     615            'category__and queries width different order (array)' => array(
     616                'query_vars_1' => array( 'category__and' => array( '1', '2' ) ),
     617                'query_vars_2' => array( 'category__and' => array( '2', '1' ) ),
     618            ),
     619            'category__and with non-unique array'          => array(
     620                'query_vars_1' => array( 'category__and' => array( '1', '1', '2' ) ),
     621                'query_vars_2' => array( 'category__and' => array( '1', '2' ) ),
     622            ),
     623            'category__and queries string vs array (array)' => array(
     624                'query_vars_1' => array( 'category__and' => array( '1', '2' ) ),
     625                'query_vars_2' => array( 'category__and' => array( 1, 2 ) ),
     626            ),
     627            'author queries different order (string)'      => array(
     628                'query_vars_1' => array( 'author' => '1,2' ),
     629                'query_vars_2' => array( 'author' => '2,1' ),
     630            ),
     631            'author with non-unique string'                => array(
     632                'query_vars_1' => array( 'author' => '1,1' ),
     633                'query_vars_2' => array( 'author' => '1' ),
     634            ),
     635            'author queries int vs string (string)'        => array(
     636                'query_vars_1' => array( 'author' => 1 ),
     637                'query_vars_2' => array( 'author' => '1' ),
     638            ),
     639            'author queries int vs string (array)'         => array(
     640                'query_vars_1' => array( 'author' => array( 1 ) ),
     641                'query_vars_2' => array( 'author' => array( '1' ) ),
     642            ),
     643            'author__in different order'                   => array(
     644                'query_vars_1' => array( 'author__in' => array( 1, 2 ) ),
     645                'query_vars_2' => array( 'author__in' => array( 2, 1 ) ),
     646            ),
     647            'author__in with non-unique array'             => array(
     648                'query_vars_1' => array( 'author__in' => array( 1, 1, 2 ) ),
     649                'query_vars_2' => array( 'author__in' => array( 1, 2 ) ),
     650            ),
     651            'author__in queries int vs string (array)'     => array(
     652                'query_vars_1' => array( 'author__in' => array( 1 ) ),
     653                'query_vars_2' => array( 'author__in' => array( '1' ) ),
     654            ),
     655            'author__not_in different order (array)'       => array(
     656                'query_vars_1' => array( 'author__not_in' => array( 1, 2 ) ),
     657                'query_vars_2' => array( 'author__not_in' => array( 2, 1 ) ),
     658            ),
     659            'author__not_in queries int vs string (array)' => array(
     660                'query_vars_1' => array( 'author__not_in' => array( 1 ) ),
     661                'query_vars_2' => array( 'author__not_in' => array( '1' ) ),
     662            ),
     663            'tag_slug__in order'                           => array(
     664                'query_vars_1' => array( 'tag_slug__in' => array( 'foo', 'bar' ) ),
     665                'query_vars_2' => array( 'tag_slug__in' => array( 'bar', 'foo' ) ),
     666            ),
     667            'tag_slug__in non-unique vs unique'            => array(
     668                'query_vars_1' => array( 'tag_slug__in' => array( 'foo', 'bar', 'bar' ) ),
     669                'query_vars_2' => array( 'tag_slug__in' => array( 'foo', 'bar' ) ),
     670            ),
     671            'tag_slug__and order'                          => array(
     672                'query_vars_1' => array( 'tag_slug__and' => array( 'foo', 'bar' ) ),
     673                'query_vars_2' => array( 'tag_slug__and' => array( 'bar', 'foo' ) ),
     674            ),
     675            'tag_slug__and non-unique'                     => array(
     676                'query_vars_1' => array( 'tag_slug__and' => array( 'foo', 'bar', 'foo' ) ),
     677                'query_vars_2' => array( 'tag_slug__and' => array( 'bar', 'foo' ) ),
     678            ),
     679            'tag__in queries different order (array)'      => array(
     680                'query_vars_1' => array( 'tag__in' => array( 1, 2 ) ),
     681                'query_vars_2' => array( 'tag__in' => array( 2, 1 ) ),
     682            ),
     683            'tag__in queries non-unique array'             => array(
     684                'query_vars_1' => array( 'tag__in' => array( 1, 2, 1 ) ),
     685                'query_vars_2' => array( 'tag__in' => array( 2, 1 ) ),
     686            ),
     687            'tag__in queries int vs string'                => array(
     688                'query_vars_1' => array( 'tag__in' => array( 2, 1 ) ),
     689                'query_vars_2' => array( 'tag__in' => array( '2', '1' ) ),
     690            ),
     691            'tag__and queries different order (array)'     => array(
     692                'query_vars_1' => array( 'tag__and' => array( 1, 2 ) ),
     693                'query_vars_2' => array( 'tag__and' => array( 2, 1 ) ),
     694            ),
     695            'tag__and queries non-unique array'            => array(
     696                'query_vars_1' => array( 'tag__and' => array( 1, 2, 2 ) ),
     697                'query_vars_2' => array( 'tag__and' => array( 2, 1 ) ),
     698            ),
     699            'tag__not_in queries different order (array)'  => array(
     700                'query_vars_1' => array( 'tag__not_in' => array( 1, 2 ) ),
     701                'query_vars_2' => array( 'tag__not_in' => array( 2, 1 ) ),
     702            ),
     703            'tag__not_in queries non-unique array'         => array(
     704                'query_vars_1' => array( 'tag__not_in' => array( 1, 2, 2 ) ),
     705                'query_vars_2' => array( 'tag__not_in' => array( 1, 2 ) ),
     706            ),
     707            'tag__not_in queries int vs string (array)'    => array(
     708                'query_vars_1' => array( 'tag__not_in' => array( '1' ) ),
     709                'query_vars_2' => array( 'tag__not_in' => array( 1 ) ),
     710            ),
     711            'cache parameters'                             => array(
    330712                'query_vars1' => array(
    331713                    'update_post_meta_cache' => true,
Note: See TracChangeset for help on using the changeset viewer.