perf(2meet-data-optimizer): route meta clauses without a value as EXISTS
- WP_Meta_Query adds a value condition only when 'value' is set, so a clause like array( 'key' => 'hp_featured' ) only tests that the key exists. The router read it as "= ''", declined it, and kept the whole query native - HivePress runs such a query on every listing search page (featured-listing lookup in Attribute::set_search_query(): hp_featured plus the search's own filters, ORDER BY RAND()); at 1.3M listings on dev36 it took 2.26 s of a 2.5 s page, routed or not - Verify: PostQueryRouterTest (key-only clause routes as IS NOT NULL), integration 590, unit 704, phpcs, stan; dev36 front-end - PR: PR-122
This commit is contained in:
@@ -678,11 +678,17 @@ class TMDO_Post_Query_Router {
|
||||
*/
|
||||
private static function route_clause( array $clause, array $field ): ?array {
|
||||
$compare = strtoupper( trim( (string) ( $clause['compare'] ?? '=' ) ) );
|
||||
$type = strtoupper( trim( (string) ( $clause['type'] ?? '' ) ) );
|
||||
$type = '' === $type ? 'CHAR' : $type;
|
||||
$value = $clause['value'] ?? '';
|
||||
$kind = $field['type'] ?? 'text';
|
||||
$multi = in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true );
|
||||
// Without 'value', WP_Meta_Query checks only that the key exists (it adds a
|
||||
// value condition only when one is set): HivePress's featured-listing
|
||||
// lookup, run on every search page, is array( 'key' => 'hp_featured' ).
|
||||
if ( ! array_key_exists( 'value', $clause ) && ! in_array( $compare, array( 'EXISTS', 'NOT EXISTS' ), true ) ) {
|
||||
$compare = 'EXISTS';
|
||||
}
|
||||
$type = strtoupper( trim( (string) ( $clause['type'] ?? '' ) ) );
|
||||
$type = '' === $type ? 'CHAR' : $type;
|
||||
$value = $clause['value'] ?? '';
|
||||
$kind = $field['type'] ?? 'text';
|
||||
$multi = in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true );
|
||||
|
||||
if ( ! in_array( $compare, self::COMPARES, true ) || ( ! $multi && is_array( $value ) ) ) {
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user