1import { sql, type RawBuilder } from 'kysely' 4 * Check if JSONB array at path has length > minLen 5 * Replaces: whereRaw("jsonb_array_length(game_state->'gameActionHistA') > 0") 7export const jsonbArrayLenGt = (column: string, path: string, minLen: number): RawBuilder<boolean> => 8 sql<boolean>`jsonb_array_length(${sql.ref(column)}->${sql.lit(path)}) > ${minLen}` 11 * Check if no player in game_state->playerStates has alias matching pattern 12 * Replaces complex whereRaw NOT EXISTS subquery 14export const noPlayerAliasLike = (column: string, pattern: string): RawBuilder<boolean> => 15 sql<boolean>`NOT EXISTS ( 16 SELECT 1 FROM jsonb_each(${sql.ref(column)}->'playerStates') ps 17 WHERE ps.value->'publicState'->>'playerAlias' LIKE ${pattern} 21 * Check if any player in game_state->playerStates has alias matching pattern 22 * For orWhereRaw EXISTS subquery 24export const hasPlayerAliasLike = (column: string, pattern: string): RawBuilder<boolean> => 26 SELECT 1 FROM jsonb_each(${sql.ref(column)}->'playerStates') ps 27 WHERE ps.value->'publicState'->>'playerAlias' LIKE ${pattern}