
    zi+                         d dl mZ d dlZd dlZd dlmZ d dlmZ d dlZd dlm	Z	m
Z
 dZdZdZdd	Z G d
 d      Z G d d      Zy)    )annotationsN)datetime)Any)database_urlsplit_dsn_ssla#  
CREATE TABLE IF NOT EXISTS lpl_recording_sessions (
    session_id TEXT PRIMARY KEY,
    slug TEXT NOT NULL,
    condition_id TEXT,
    question TEXT,
    outcomes_json JSONB,
    token_ids_json JSONB,
    output_dir TEXT,
    started_at TIMESTAMPTZ NOT NULL,
    ended_at TIMESTAMPTZ,
    status TEXT NOT NULL,
    notes TEXT,
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS lpl_recording_sessions_slug_idx
    ON lpl_recording_sessions (slug, started_at DESC);
a  
CREATE TABLE IF NOT EXISTS lpl_orderbook_events (
    id BIGSERIAL PRIMARY KEY,
    session_id TEXT NOT NULL,
    slug TEXT NOT NULL,
    condition_id TEXT,
    asset_id TEXT,
    outcome TEXT,
    event_type TEXT NOT NULL,
    message_index BIGINT NOT NULL,
    connection_id INTEGER NOT NULL,
    exchange_ts TIMESTAMPTZ,
    received_at_wall TIMESTAMPTZ NOT NULL,
    received_at_monotonic_ns BIGINT NOT NULL,
    raw_json JSONB NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE (session_id, message_index)
);
CREATE INDEX IF NOT EXISTS lpl_orderbook_events_slug_time_idx
    ON lpl_orderbook_events (slug, received_at_wall DESC);
CREATE INDEX IF NOT EXISTS lpl_orderbook_events_session_idx
    ON lpl_orderbook_events (session_id, message_index);
a  
CREATE TABLE IF NOT EXISTS lpl_orderbook_snapshots (
    id BIGSERIAL PRIMARY KEY,
    session_id TEXT NOT NULL,
    slug TEXT NOT NULL,
    asset_id TEXT NOT NULL,
    outcome TEXT,
    snapshot_at_wall TIMESTAMPTZ NOT NULL,
    message_index BIGINT NOT NULL,
    best_bid DOUBLE PRECISION,
    best_ask DOUBLE PRECISION,
    bid_levels_json JSONB NOT NULL,
    ask_levels_json JSONB NOT NULL,
    source TEXT NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS lpl_orderbook_snapshots_slug_time_idx
    ON lpl_orderbook_snapshots (slug, snapshot_at_wall DESC);
CREATE INDEX IF NOT EXISTS lpl_orderbook_snapshots_session_idx
    ON lpl_orderbook_snapshots (session_id, message_index);
c                2    t        j                  | dd      S )NFT)ensure_ascii	sort_keys)jsondumps)values    4/root/polymarket_arb/analysis/lpl_orderbook/store.pyr   r   P   s    ::e%4@@    c                      e Zd ZdddZddZddZddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	d	d
	 	 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)LplOrderbookStoreNc                d    t        |      | _        d | _        t        j                         | _        y N)r   dsnconnasyncioLock_lock)selfr   s     r   __init__zLplOrderbookStore.__init__U   s"    $/3	\\^
r   c                v   K   | j                          d {    | j                          d {    | S 7 7 wr   )connectinit_schemar   s    r   
__aenter__zLplOrderbookStore.__aenter__Z   s5     lln    	 s   959799c                @   K   | j                          d {    y 7 wr   )closer   _excs     r   	__aexit__zLplOrderbookStore.__aexit___   s     jjls   c                   K   t        | j                        \  }}t        j                  ||       d {   | _        y 7 
w)N)ssl)r   r   asyncpgr   r   )r   	clean_dsnssl_ctxs      r   r   zLplOrderbookStore.connectb   s1     *4884	7!//)AA	As   3AA Ac                |   K   | j                   *| j                   j                          d {    d | _         y y 7 wr   )r   r!   r   s    r   r!   zLplOrderbookStore.closef   s3     99 ))//###DI !#s   *<:<c                  K   | j                   J t        t        t        fD ]\  }|j	                         j                  d      D ]8  }|j	                         }|s| j                   j                  |       d {    : ^ y 7 	w)N;)r   DDL_LPL_SESSIONSDDL_LPL_EVENTSDDL_LPL_SNAPSHOTSstripsplitexecute)r   ddlstmts      r   r   zLplOrderbookStore.init_schemak   sx     yy$$$$n6GH 	2C		))#. 2zz|))++D1112	2 2s   ABB8B9
Bc               "  K   | j                   J | j                  4 d {    | j                   j                  d||||t        |      t        |      ||	       d {    d d d       d {    y 7 R7 7 	# 1 d {  7  sw Y   y xY ww)Na  
                INSERT INTO lpl_recording_sessions (
                    session_id, slug, condition_id, question, outcomes_json,
                    token_ids_json, output_dir, started_at, status
                ) VALUES ($1,$2,$3,$4,$5::jsonb,$6::jsonb,$7,$8,'running')
                ON CONFLICT (session_id) DO UPDATE SET
                    status = 'running',
                    updated_at = NOW()
                r   r   r2   r   )	r   
session_idslugcondition_idquestionoutcomes	token_ids
output_dir
started_ats	            r   create_sessionz LplOrderbookStore.create_sessions   s      yy$$$:: 	 	))## hi #  	 	 		 	 	 	sV   BA4B9A:A6A:#B.A8/B6A:8B:B BBB )notesc                  K   | j                   J | j                  4 d {    | j                   j                  d||||       d {    d d d       d {    y 7 <7 7 	# 1 d {  7  sw Y   y xY ww)Nz
                UPDATE lpl_recording_sessions
                SET ended_at = $2, status = $3, notes = $4, updated_at = NOW()
                WHERE session_id = $1
                )r   r   r2   )r   r7   ended_atstatusrA   s        r   finish_sessionz LplOrderbookStore.finish_session   s      yy$$$:: 	 	))##
 
 
 
	 	 	
	 	 	 	sV   A9AA9#A$A 	A$A9A"A9 A$"A9$A6*A-+A62A9c                 K   | j                   J | j                  4 d {    | j                   j                  d|||||||||	|
|t        |             d {    d d d       d {    y 7 M7 7 	# 1 d {  7  sw Y   y xY ww)Na  
                INSERT INTO lpl_orderbook_events (
                    session_id, slug, condition_id, asset_id, outcome, event_type,
                    message_index, connection_id, exchange_ts, received_at_wall,
                    received_at_monotonic_ns, raw_json
                ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12::jsonb)
                ON CONFLICT (session_id, message_index) DO NOTHING
                r6   )r   r7   r8   r9   asset_idoutcome
event_typemessage_indexconnection_idexchange_tsreceived_at_wallreceived_at_monotonic_nsraw_jsons                r   insert_eventzLplOrderbookStore.insert_event   s       yy$$$:: 	 	))##  (h)  	 	 		 	 	 	sV   B
A/B
4A5A1A5B
)A3*B
1A53B
5B;A><BB
c               (  K   | j                   J | j                  4 d {    | j                   j                  d||||||||t        |	      t        |
      |       d {    d d d       d {    y 7 U7 7 	# 1 d {  7  sw Y   y xY ww)NaR  
                INSERT INTO lpl_orderbook_snapshots (
                    session_id, slug, asset_id, outcome, snapshot_at_wall,
                    message_index, best_bid, best_ask, bid_levels_json,
                    ask_levels_json, source
                ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11)
                r6   )r   r7   r8   rG   rH   snapshot_at_wallrJ   best_bidbest_ask
bid_levels
ask_levelssources               r   insert_snapshotz!LplOrderbookStore.insert_snapshot   s      yy$$$:: 	 	))##  j!j!%  	 	 		 	 	 	sV   BA7B<A=!A9"A=&B1A;2B9A=;B=BBBBr   )r   z
str | NonereturnNone)rY   z'LplOrderbookStore'r#   objectrY   rZ   )rY   rZ   )r7   strr8   r]   r9   r]   r:   r]   r;   	list[str]r<   r^   r=   r]   r>   r   rY   rZ   )
r7   r]   rC   r   rD   r]   rA   r]   rY   rZ   )r7   r]   r8   r]   r9   r]   rG   r]   rH   r]   rI   r]   rJ   intrK   r_   rL   zdatetime | NonerM   r   rN   r_   rO   zdict[str, Any]rY   rZ   )r7   r]   r8   r]   rG   r]   rH   r]   rR   r   rJ   r_   rS   float | NonerT   r`   rU   list[dict[str, float]]rV   ra   rW   r]   rY   rZ   )__name__
__module____qualname__r   r   r$   r   r!   r   r?   rE   rP   rX    r   r   r   r   T   s   $

B
2    	 
             
 P   	
   
,' ' 	'
 ' ' ' ' ' ' %' #' #&' !' 
'R$ $ 	$
 $ $ #$ $ $ $ +$ +$ $ 
$r   r   c                  @    e Zd ZdZd	dZd
dZddZddZddZddZ	y)NoopLplOrderbookStorez9JSONL-only store used when no DATABASE_URL is configured.c                   K   | S wr   re   r   s    r   r   z NoopLplOrderbookStore.__aenter__   s     s   c                   K   y wr   re   r"   s     r   r$   zNoopLplOrderbookStore.__aexit__  	        c                   K   y wr   re   r   _kwargss     r   r?   z$NoopLplOrderbookStore.create_session  rj   rk   c                   K   y wr   re   rm   s     r   rE   z$NoopLplOrderbookStore.finish_session  rj   rk   c                   K   y wr   re   rm   s     r   rP   z"NoopLplOrderbookStore.insert_event
  rj   rk   c                   K   y wr   re   rm   s     r   rX   z%NoopLplOrderbookStore.insert_snapshot  rj   rk   N)rY   z'NoopLplOrderbookStore'r[   )rn   r   rY   rZ   )
rb   rc   rd   __doc__r   r$   r?   rE   rP   rX   re   r   r   rg   rg      s#    Cr   rg   )r   r   rY   r]   )
__future__r   r   r   r   typingr   r'   analysis.safe_btc5.db_storer   r   r-   r.   r/   r   r   rg   re   r   r   <module>rv      sN    "      C (0 .Ad dN r   