
    ݬoi	:                        d Z ddlZddlZddlmZmZ i ddddddddd	d
dd
dd
dd
ddddddddddddddddddi ddddddddddd dd!dd"dd#d$d%d$d&d$d'd$d(d$d)d*d+d*d,d*d-d*i d.d/d0d/d1d/d2d/d3d4d5d4d6d4d7d4d8d4d9d:d;d:d<d:d=d:d>d?d@d?dAd?dBd?i dCdDdEdDdFdDdGdDdHdIdJdIdKdIdLdIdMdNdOdNdPdNdQdNdRdSdTdSdUdSdVdSdWdXi dYdXdZdXd[dXd\d]d^d]d_d]d`d]dad]dbdcdddcdedcdfdcdgdcdhdidjdidkdidldii dmdidndodpdodqdodrdodsdtdudtdvdtdwdtdxdydzdyd{dyd|dyd}dyd~dddddi dddddddddddddddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddd"ddd$dd$d(d$dd*dd*i d-d*dd/dd/d2d/dddddddddd:dd:d=d:dd?dd?dd?dBd?ddʓddʓi ddʓddʓddϓddϓddϓddϓddԓddԓddԓddԓddDddDdGdDddۓddۓddۓddۓi ddSddSdVdSdd]dd]dad]dddddddddddddgdddddddddi ddddddyddyd}dyddddddddddddddddddd ddddddddddddddddddddi ddd	dd
ddddddddddd
dd
dd
ddddddddddddddi ddddddddddddddddddddd dd!dd"d#d$d#d%d#d&d#d'd$i d(d$d(d$d)d/d*d/d2d/d+d,d-d,d.d,d/d,d0d1dd1d2d1d3d1d4d5dd5d6d5dސd5i d7d]d8d]dad]d9d:d;d:d<d:d=d:d>d:d?d@dAd@dBd@dCd@dDd@dEdFdGdFdHdFdIdFi dJdKdLdKdMdKdNdOdPdOdQdOdRdSdTdSdUdSdVdSdWdSdXdydYdyd}dydZdd[dd\di ddd]d^d_d^d`d^dad^dbd^dcdddddeddfdgdhdgdidgdjdgdkdldmdldndldodli dpdldqddrddsddtdduddvddwddxdydzdyd{dyd|dyd}d~dd~dd~dd~dd~dddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddddddddddddddÐdēdŐdēddēdƐdēdǐdȓdɐdȓdʐdȓdːdːdːdːd̜i d͐dΓdϐdГdѐdғdӐdғdddԐdՓd֐dՓdאdؓdِdؓdڐdۓdddddddܐdݓdސdݓdߐdݓddddddddddZd Zd Zd Zd Z	d Z
edk(  r e
        yy(  z
Link all orphaned records to SportsGame using team name matching.
Tables: OddsSnapshot, GameHalfLine, BettingSplits, SharpMove

Run: python3 scripts/link_tables_to_sportsgame.py
    N)datetimetimezonezatlanta hawksATLhawksatlantaatlzboston celticsBOScelticsbostonboszbrooklyn netsBKNnetsbrooklynbknzcharlotte hornetsCHAhornets	charlottechazchicago bullsCHIbullschicagochizcleveland cavaliersCLE	cavalierscavs	clevelandclezdallas mavericksDAL	mavericksmavsdallasdalzdenver nuggetsDENnuggetsdenverdenzdetroit pistonsDETpistonsdetroitdetzgolden state warriorsGSWwarriorszgolden stategswgszhouston rocketsHOUrocketshoustonhouzindiana pacersINDpacersindianaindzlos angeles clippersLACclipperszla clipperslaczlos angeles lakersLALlakersz	la lakerslalzmemphis grizzliesMEM	grizzliesmemphismemz
miami heatMIAheatmiamimiazmilwaukee bucksMILbucks	milwaukeemilzminnesota timberwolvesMINtimberwolveswolves	minnesotaminznew orleans pelicansNOPpelicansznew orleansnopnoznew york knicksNYKknicksznew yorknyknyzoklahoma city thunderOKCthunderzoklahoma cityokczorlando magicORLmagicorlandoorlzphiladelphia 76ersPHI76erssixersphiladelphiaphizphoenix sunsPHXsunsphoenixphxphozportland trail blazersPORztrail blazersblazersportlandporzsacramento kingsSACkings
sacramentosaczsan antonio spursSASspurszsan antoniosassaztoronto raptorsTORUTAWAS)raptorstorontotorz	utah jazzjazzutahutazwashington wizardswizards
washingtonwaswshzarizona cardinalsARI	cardinalsarizonaarizatlanta falconsfalconszbaltimore ravensBALravens	baltimorebalzbuffalo billsBUFbillsbuffalobufzcarolina panthersCARpantherscarolinacarzchicago bearsbearszcincinnati bengalsCINbengals
cincinnaticinzcleveland brownsbrownszdallas cowboyscowboyszdenver broncosbroncoszdetroit lionslionszgreen bay packersGBpackersz	green baygbzhouston texanstexanszindianapolis coltscoltsindianapoliszjacksonville jaguarsJAXjaguarsjacksonvillejaxzkansas city chiefsKCchiefszkansas citykczlas vegas raidersLVraidersz	las vegaslvzlos angeles chargerschargerszlos angeles ramsLARramslarlazmiami dolphinsdolphinszminnesota vikingsvikingsznew england patriotsNEpatriotsznew englandneznew orleans saintsNOsaintsznew york giantsNYGgiantsnygznew york jetsNYJjetsnyjzphiladelphia eagleseagleszpittsburgh steelersPITsteelers
pittsburghpitzsan francisco 49ersSF49erszsan franciscosfninerszseattle seahawksSEAseahawksseattleTBTEN)seaztampa bay buccaneers
buccaneersbucsz	tampa baytbztennessee titanstitans	tennesseetenzwashington commanders
commandersr~   r   zanaheim ducksANAducksanaheimanazarizona coyotescoyoteszboston bruinsbruinszbuffalo sabressabreszcalgary flamesCGYflamescalgarycgyzcarolina hurricanes
hurricanescaneszchicago blackhawks
blackhawkszcolorado avalancheCOL	avalancheavscoloradocolzcolumbus blue jacketsCBJzblue jacketscolumbuscbjzdallas starsstarszdetroit red wingsz	red wingszedmonton oilersEDMoilersedmontonedmzflorida panthersFLAfloridaflazlos angeles kingsLAKlakzminnesota wildwildzmontreal canadiensMTL	canadienshabsmontrealmtlznashville predatorsNSH	predatorspreds	nashvillenshznew jersey devilsNJDdevilsz
new jerseynjdznew york islandersNYI	islandersnyiznew york rangersNYRrangersnyrzottawa senatorsOTTsenatorssensottawaottzphiladelphia flyersflyerszpittsburgh penguinspenguinspenszsan jose sharksSJSsharkszsan josesjssjzseattle krakenkrakenr   zst. louis bluesSTLblueszst louis bluesstlztampa bay lightningTBL	lightningboltstblr   ztoronto maple leafszmaple leafsleafsrx   zutah hockey clubrz   r{   zvancouver canucksVANcanucks	vancouvervanzvegas golden knightsVGKzgolden knightsknightsvegasvgkWSHWPG)zwashington capitalscapitalscapsr   zwinnipeg jetsr   winnipegwpgarsenalARSarszaston villaAVLvillaavlbournemouthBOUbou	brentfordBREbrebrightonBHAzbrighton and hove albionbhachelseaCHEchezcrystal palaceCRYpalacecryevertonEVEevefulhamFULfulipswichIPSzipswich townips	leicesterLEIzleicester citylei	liverpoolLIVlivzmanchester cityMCIzman citymcizmanchester unitedMUNz
man unitedzman utdmun	newcastleNEWznewcastle unitednewznottingham forestNFOforestnfosouthamptonSOUsou	tottenhamTOTztottenham hotspurtotzwest hamWHUzwest ham unitedwhuWOL)rK   wolverhamptonzwolverhampton wandererswolajaxAJA	barcelonaBARzbayern munichBAYbayerndortmundDORzborussia dortmundzinter milanINTinterjuventusJUVpsgPSGzparis saint-germainpariszreal madridRMASLAVILPAF)madridzslavia prahazslavia prague
villarrealzpafos fcpafos)nbanflnhlepluclc                 F   | syt        |       j                         }t        |      dk  r|j                         r|S |j	                         }t
        j                  |i       }||v r||   S |j                         D ]  \  }}||v s||v s|c S  |dd j                         S )z,Normalize team name to standard abbreviationN      )	strstriplenisupperlowerTEAM_ALIASESgetitemsupper)	team_nameleagueteam_str
team_lowerleague_aliasesaliasabbrevs          >/var/www/html/eventheodds/scripts/link_tables_to_sportsgame.pynormalize_teamr     s    9~##%H
8}h..0!J!%%fb1N^#j))'--/ vJ*"5M BQ<    c                     d} 	 t        | d      5 }|D ]b  }|j                  d      s|j                  dd      d   j                         j                  d      j                  d      d   c cd d d        S  	 d d d        t
        j                  j                  d	d
      j                  d      d   S # 1 sw Y   ;xY w# t        $ r Y Iw xY w)Nz/var/www/html/eventheodds/.envrzSPORTS_DATABASE_URL==   "?r   SPORTS_DATABASE_URL )open
startswithsplitr  FileNotFoundErrorosenvironr  )env_pathflines      r  load_db_urlr     s    /H(C  	RA R??#9:::c1-a0668>>sCII#NqQQ	R 	RR	R ::>>/4::3?BB	R 	R  s:   B? B3AB3-	B? 7B39B? 3B<8B? ?	C
Cc                     | j                  d       i }| j                         D ]N  \  }}}}}t        ||      }t        ||      }|s$|s'|t        |      ||f}	|t        |      ||f}
|||	<   |||
<   P |S )z8Build lookup: (league, date, home_norm, away_norm) -> idz
        SELECT id, league, DATE("gameDate") as gd, "homeTeam", "awayTeam"
        FROM "SportsGame"
        WHERE "gameDate" >= '2024-10-01'
    )executefetchallr  r  )curlookupsg_idr  gdhomeaway	home_norm	away_normkey1key2s              r  build_sportsgame_lookupr     s    KK  	
 F), !%vr4"40	"40	CGY	:DCGY	:D F4L F4L! Mr  c                    | j                  d| d       | j                         }d}|D ]  \  }}}	}
}|st        |	|      }t        |
|      }t        |d      rt	        |j                               nt	        |      dd }||||f}|j                  |      }|sq| j                  d| d||f       |d	z  } |j                          |||<   |S )
z%Link records in a table to SportsGamezM
        SELECT id, league, "homeTeam", "awayTeam", "gameDate"
        FROM "zo"
        WHERE "gameId" IS NULL
          AND "homeTeam" IS NOT NULL
          AND "awayTeam" IS NOT NULL
    r   dateN
   z
                UPDATE "z." SET "gameId" = %s WHERE id = %s
            r  )r  r  r  hasattrr  r  r  commit)r  conn
table_name	sg_lookupstatsunlinkedlinkedrec_idr  r  r  	game_dater  r  date_strkeyr  s                    r  
link_tabler     s    KK l  	 ||~HF19 -dI"40	"40	,3Iv,F3y~~'(CPYN[^\^L_xI6c"KK # %" aKF  	KKME*Mr  c                  |   t        d       t        d       t        dt        j                  t        j                        j                                 t        d       t               } t        j                  |       }|j                         }t        d       t        |      }t        dt        |       d       i }g d}|D ]E  }t        d|j                  |      d	z    d
| d       	 t        |||||      }t        d| d       G t        d       t        d       t        d       |j!                  d       t        ddddddddddd       t        d       |j#                         D ]5  }	|	\  }
}}|dkD  rd|z  |z  ddnd}t        |
dd|dd|dd|d       7 |j%                          |j%                          t        d       t        dt'        |j)                                d        t        d       |S # t        $ r)}t        d|        |j                          Y d }~rd }~ww xY w)!Nz<============================================================zLINK TABLES TO SPORTSGAMEzTime: z"
[1] Building SportsGame lookup...z
  Indexed z game entries)OddsSnapshotGameHalfLineBettingSplits	SharpMovez
[   z
] Linking z...z	  Linked z recordsz	  Error: z=
============================================================zLINKAGE REPORT:a3  
        SELECT 'OddsSnapshot' as tbl, COUNT(*) as total,
          COUNT(CASE WHEN "gameId" IS NOT NULL THEN 1 END) as linked
        FROM "OddsSnapshot"
        UNION ALL
        SELECT 'GameHalfLine', COUNT(*), COUNT(CASE WHEN "gameId" IS NOT NULL THEN 1 END)
        FROM "GameHalfLine"
        UNION ALL
        SELECT 'BettingSplits', COUNT(*), COUNT(CASE WHEN "gameId" IS NOT NULL THEN 1 END)
        FROM "BettingSplits"
        UNION ALL
        SELECT 'SharpMove', COUNT(*), COUNT(CASE WHEN "gameId" IS NOT NULL THEN 1 END)
        FROM "SharpMove"
    Tablez<20 Totalz>10Linked%z>8z2--------------------------------------------------r   d   z.1fz0%zLinkage complete: z records linked)printr   nowr   utc	isoformatr  psycopg2connectcursorr  r  indexr  	Exceptionrollbackr  r  closesumvalues)db_urlr  r  r  r  tablestabler  erowr  totalpcts                r  run_linkager     s+   	(O	
%&	F8<<-779:
;<	(O]FF#D
++-C 

/0',I	Js9~&m
45E LF FLL')**UG3?@	T5)UCFIfXX./	 
/	
	(OKK  	 
WSM73-q#aBx
@A	(O||~ > UF,1AIVE!#&a(4S	5+Qvcl!C8<=>
 IIKJJL	/	s5<<>23?
CD	(OLM  	IaS/"MMOO	s   ,H			H;H66H;__main__)__doc__r  r  r   r   r  r  r  r  r  r  __name__ r  r  <module>r     s    	 ' '095BG%!*E3;UDI5 	 !' 0:5 CH 	U	 %.u	 7B5	 KPQV	
 	
 !(
 1:5
 CH 	u '25 ;A% JUV[ ^cdi 	E $/ 8>u GOPU X]^c 	% "+E 4<U EJ5 	5 #,U 5>u GLU 	  )3E <J5 SXY^ aefk 	5 #,U 5>u GLU 	% "*5 3<U EJ5 	 (25 ;H QVW\ 	e &.u 7B5 KPQV 	U %0 9B5 KPQV  	e!  $U!  -4U!  =B5!" 	5#" #*5#" 3>u#" GLU#$ 	!%%$ *8%$ AI%%$ R]^c%$ fklq%& 	'& (25'& ;H'& QVW\'& _cdi'( 	5)( #+E)( 4>u)( GLU)( UYZ_)* 	 +* )25+* ;J5+* SXY^+, 	-, !(-, 1:5-, CH-. 	e/. &-e/. 6>u/. GUV[/. ^cdi/0 	10  &u10 /810 AFu10 OTUZ12 	!%32 *9%32 BKE32 T^_d32 glmr34 	E54 $+E54 4@54 INu56 	U76 %,U76 5B576 KPQV76 Y]^c78 	598 .3uUE5#USXaf=@!U!$/!8A5!JOQV!5!"+U!495! 	E! $,U! 5@! INu! 		! !(	! 1:5	! CH	!
 	U!
 %/!
 8B5!
 KPQV! 	! !(! 16u! 	e! &/! 8DU! MRSX! 	E! $,U! 5:5! 	%! "+E! 49%! 	%! "+E! 49%! 	! !(! 16u! 	T! $-d! 5@! HLT! 	%! "*5! 38! 	e! &-e! 6DU! MRSX! 	! (1%! :H! QVW\!  	d!!  %-d!!  5B4!!  JNt!!" 	T#!" $-d#!" 5@#!" HLT#!$ 	%!$ (25%!$ ;@%!& 	E'!& $*5'!& 38'!& AEe'!( 	%)!( ",U)!( 5:5)!* 	U+!* %.u+!* 7<U+!, 	-!, '1$-!, 9Ft-!, NRSW-!. 	d/!. %-d/!. 59$/!0 	51!0 #+E1!0 49%1!2 	3!2 !'3!2 05e3!4 	u5!4 '/5!4 8=e5!6 	u7!6 '1%7!6 :Fu7!6 OTUZ7!8 	t9!8 &-d9!8 5DT9!8 LPQU9!8 X`ae9!: 	E;!: $.u;!: 7@;!: PU $D$UYae!Uu!&eERWA!D"" '"095"BG"5""+U"495" 	" !)%" 27" 	%	" "*5	" 38	"
 	%"
 "*5"
 3<U"
 EJ5" 	u" '3E" <CE" LQRW" 	e" &25" ;@" 	e" &1%" :?" HRSX" [`af" 	 " )7" @J5" SXY^" 	"  '" 05e" 	U" %0" 9>u" 	5" #+E" 4>u" GLU" 	E" $.u" 7@" INu" 	U" %,U" 5:5" CG" 	%" "(" 16u"  	e!"  &1%!"  :@!"  ISTY!"  \abg!"" 	u#"" '25#"" ;B5#"" KVW\#"" _dej#"$ 	U%"$ %-e%"$ 6B5%"$ KPQV%"& 	e'"& &1%'"& :?'"( 	E)"( $-e)"( 6;E)"* 	5+"* #-e+"* 6<U+"* EMe+"* V[\a+", 	u-", '/-", 8=e-". 	u/". '1%/". :@/". INu/"0 	51"0 #+E1"0 4>u1"0 GLU1"0 UYZ_1"2 	%3"2 "*53"2 383"4 	55"4 #*55"4 3CE5"4 LQRW5"6 	u7"6 '257"6 ;B57"6 KPQV7"6 Y]^c7"8 	u9"8 '4U9"8 =DU9"8 MRSX9": 	E;": $*5;": 38;"< 	U="< %.u="< 7B5="< KPQV="> 	?"> (8?"> AJ5?"> SZ[`?"> chin?"@  %%u5C"F5u%u.3U 	u $U 	U	 "5	
 	E
 6u
 ?DU 	5   	% "*5 38 	5   	%  	5 )% 27 	U -e 6;E 	U "5 	5 #-e 6;E 	U %1% :CE LQRW 	U / 8=e  	U!  %-e!  6;E!" 	u#" $U#$ 	U%$ 0%$ 9@%$ INu%& 	E'& -e'& 6;E'( %EZ_),"E+:ECKU5$e-@% 	u &u /9% 	U	 .u	 7A%	
 	u
 ,U
 5<U 	u ).uW\yEP "	C&D?D zM r  