feat(2meet-data-optimizer): support composite indexes on entity groups
- register_group() accepts $args['indexes'] (name => ordered keys); indexes on unknown keys are dropped. Kept outside the field definition, so schema hashes are unchanged. - Schema_Manager::ensure_group_indexes() adds missing cidx_* indexes to the existing flat table in place; the applied definition is remembered in tmdo_entity_indexes so later requests skip SHOW INDEX. - Bench (1M listings, scenario 2): Entity p50 337 ms -> 278 ms with (hp_verified, hp_price), on par with Hot (269 ms). - Verify: core unit 656 / integration 459 green, phpcs clean - PR: PR-027
This commit is contained in:
@@ -40,6 +40,9 @@ final class TMDO_Entity_Registry {
|
||||
/** @var array<string, array<string, string[]>> 實體類型 → 群組名 → 限定的 post_type */
|
||||
private static array $scopes = array();
|
||||
|
||||
/** @var array<string, array<string, array<string, string[]>>> 實體類型 → 群組名 → 索引名 → 欄位 key */
|
||||
private static array $indexes = array();
|
||||
|
||||
/** @var array<string, array> "entity/group" → 同名群組以不同定義重複註冊的紀錄 */
|
||||
private static array $collisions = array();
|
||||
|
||||
@@ -74,6 +77,7 @@ final class TMDO_Entity_Registry {
|
||||
self::$unscoped_index = array();
|
||||
self::$scoped_index = array();
|
||||
self::$scopes = array();
|
||||
self::$indexes = array();
|
||||
self::$pending_schemas = array();
|
||||
self::$collisions = array();
|
||||
self::$restored = array();
|
||||
@@ -119,6 +123,9 @@ final class TMDO_Entity_Registry {
|
||||
* 多個群組共用 meta_key 時,依 post 本身的類型決定歸屬;
|
||||
* 不屬於任何宣告 post_type 的 post 不受管理(走原生 meta)。
|
||||
* 不列入欄位定義,所以不影響 schema hash 與衝突比對。
|
||||
* indexes (array<string, string[]>) — 複合索引:名稱 → 欄位 key(依序);
|
||||
* 含未知欄位的索引會被略過。同樣不影響 schema hash,
|
||||
* 由 TMDO_Schema_Manager::ensure_group_indexes() 補建到既有表。
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
@@ -151,6 +158,13 @@ final class TMDO_Entity_Registry {
|
||||
if ( $post_types ) {
|
||||
self::$scopes[ $entity_type ][ $group_name ] = $post_types;
|
||||
}
|
||||
$keys = array_column( $normalized, 'key' );
|
||||
foreach ( (array) ( $args['indexes'] ?? array() ) as $index_name => $columns ) {
|
||||
$columns = array_values( array_map( 'strval', (array) $columns ) );
|
||||
if ( $columns && ! array_diff( $columns, $keys ) ) {
|
||||
self::$indexes[ $entity_type ][ $group_name ][ (string) $index_name ] = $columns;
|
||||
}
|
||||
}
|
||||
foreach ( $normalized as $normalized_field ) {
|
||||
self::index_field( $entity_type, $normalized_field, $post_types );
|
||||
}
|
||||
@@ -372,6 +386,15 @@ final class TMDO_Entity_Registry {
|
||||
return array_keys( self::$groups[ $entity_type ] ?? array() );
|
||||
}
|
||||
|
||||
/**
|
||||
* 群組宣告的複合索引。
|
||||
*
|
||||
* @return array<string, string[]> 索引名 → 欄位 key
|
||||
*/
|
||||
public static function get_group_indexes( string $entity_type, string $group_name ): array {
|
||||
return self::$indexes[ $entity_type ][ $group_name ] ?? array();
|
||||
}
|
||||
|
||||
/**
|
||||
* 群組限定的 post_type(未限定時為空陣列)。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user