🌳
pt0/gamesapp/serverF/dbJsonbHelpersAI.mts
1import { sql, type RawBuilder } from 'kysely'
3/**
4 * Check if JSONB array at path has length > minLen
5 * Replaces: whereRaw("jsonb_array_length(game_state->'gameActionHistA') > 0")
6 */
7export const jsonbArrayLenGt = (column: string, path: string, minLen: number): RawBuilder<boolean> =>
8 sql<boolean>`jsonb_array_length(${sql.ref(column)}->${sql.lit(path)}) > ${minLen}`
10/**
11 * Check if no player in game_state->playerStates has alias matching pattern
12 * Replaces complex whereRaw NOT EXISTS subquery
13 */
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}
18 )`
20/**
21 * Check if any player in game_state->playerStates has alias matching pattern
22 * For orWhereRaw EXISTS subquery
23 */
24export const hasPlayerAliasLike = (column: string, pattern: string): RawBuilder<boolean> =>
25 sql<boolean>`EXISTS (
26 SELECT 1 FROM jsonb_each(${sql.ref(column)}->'playerStates') ps
27 WHERE ps.value->'publicState'->>'playerAlias' LIKE ${pattern}
28 )`