Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ECO-1768] Update SQL queries for emojicoin-dot-fun #24

Merged
merged 2 commits into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cfg/cspell-dictionary.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ mdformat
mosquitto
mqtt
mqttoptions
noqa
notif
pgrep
plpgsql
Expand Down
74 changes: 28 additions & 46 deletions sql_extensions/migrations/special-queries.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-- LATEST EVENTS {{{
-- LATEST STATE {{{

-- Create a table containing the latest state for each market and auto update
-- using triggers.
Expand Down Expand Up @@ -52,48 +52,20 @@ ORDER BY
CREATE OR REPLACE FUNCTION UPDATE_LATEST_STATE()
RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (
SELECT 1
FROM inbox_latest_state
WHERE (inbox_latest_state.data->'market_metadata'->>'market_id')::numeric = (NEW.data->'market_metadata'->>'market_id')::numeric
AND (inbox_latest_state.data->'state_metadata'->>'market_nonce')::numeric > (NEW.data->'state_metadata'->>'market_nonce')::numeric
) THEN
RETURN NEW;
END IF;

INSERT INTO inbox_latest_state (
sequence_number,
creation_number,
account_address,
transaction_version,
transaction_block_height,
type,
data,
inserted_at,
event_index,
indexed_type,
market_id
)
VALUES (
NEW.sequence_number,
NEW.creation_number,
NEW.account_address,
NEW.transaction_version,
NEW.transaction_block_height,
NEW.type,
NEW.data,
NEW.inserted_at,
NEW.event_index,
NEW.indexed_type,
(NEW.data -> 'market_metadata' ->> 'market_id')::numeric
)
INSERT INTO inbox_latest_state
SELECT
NEW.*,
(NEW.data -> 'market_metadata' ->> 'market_id')::NUMERIC
ON CONFLICT (market_id) DO UPDATE SET
transaction_version = EXCLUDED.transaction_version,
transaction_block_height = EXCLUDED.transaction_block_height,
data = EXCLUDED.data,
inserted_at = EXCLUDED.inserted_at,
event_index = EXCLUDED.event_index;

event_index = EXCLUDED.event_index
WHERE
(inbox_latest_state.data -> 'market_metadata' ->> 'market_id')::NUMERIC = (EXCLUDED.data -> 'market_metadata' ->> 'market_id')::NUMERIC
AND
(inbox_latest_state.data -> 'state_metadata' ->> 'market_nonce')::NUMERIC < (EXCLUDED.data -> 'state_metadata' ->> 'market_nonce')::NUMERIC;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Expand Down Expand Up @@ -198,24 +170,34 @@ CREATE INDEX inbox_latest_state_by_daily_volume ON inbox_volume (

-- }}}

-- noqa: disable=ST06
CREATE VIEW market_data AS
SELECT
state.market_id,
-- General data
(registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC AS market_id,
(registration.data -> 'market_metadata' ->> 'emoji_bytes') AS emoji_bytes,
(registration.data -> 'market_metadata' ->> 'market_address') AS market_address,
-- Latest state data
state.transaction_version,
(state.data -> 'instantaneous_stats' ->> 'market_cap')::NUMERIC AS market_cap,
(state.data -> 'state_metadata' ->> 'bump_time')::NUMERIC AS bump_time,
(state.data -> 'cumulative_stats' ->> 'n_swaps')::NUMERIC AS n_swaps,
(state.data -> 'cumulative_stats' ->> 'n_chat_messages')::NUMERIC AS n_chat_messages,
(state.data -> 'last_swap' ->> 'avg_execution_price_q64')::NUMERIC AS avg_execution_price_q64,
(state.data ->> 'lp_coin_supply')::NUMERIC AS lp_coin_supply,
volume.all_time_volume,
volume.daily_volume,
(state.data -> 'market_metadata' ->> 'emoji_bytes') AS emoji_bytes,
(state.data -> 'market_metadata' ->> 'market_address') AS market_address,
state.data -> 'clamm_virtual_reserves' AS clamm_virtual_reserves,
state.data -> 'cpamm_real_reserves' AS cpamm_real_reserves
FROM inbox_latest_state AS state, inbox_volume AS volume
WHERE state.market_id = volume.market_id;
state.data -> 'cpamm_real_reserves' AS cpamm_real_reserves,
-- Volume data
volume.all_time_volume,
volume.daily_volume
FROM (
SELECT data FROM inbox_events WHERE event_name = 'emojicoin_dot_fun::MarketRegistration'
) AS registration
LEFT JOIN inbox_latest_state AS state
ON (registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC = state.market_id
LEFT JOIN inbox_volume AS volume
ON (registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC = volume.market_id;
-- noqa: disable=ST06

CREATE INDEX inbox_periodic_state ON inbox_events (
((data -> 'market_metadata' ->> 'market_id')::NUMERIC),
Expand Down
Loading