Skip to content
This repository was archived by the owner on Nov 21, 2024. It is now read-only.

Commit 8604c60

Browse files
xbtmattmattCRBl69
committed
[ECO 1753] Fix market_id cast in market_data view, use market_nonce instead of bump_time (#21)
* Fix `market_id` issue in psql view * Change `transaction_version` to `version` and add `emoji_bytes` * Sort by market nonce, break early on market nonce, then use ON CONFLICT DO UPDATE SET with WHERE clause * Lint and rebase * Remove schema refresh since I can just do it locally * Remove unnecessary WHERE clause and use `event_name` column * Fix the state metadata update logic * Add `market_address` to query response * [ECO-1768] Update SQL queries for emojicoin-dot-fun (#24) * small tweaks to matt's pr * show markets before first state event --------- Co-authored-by: matt <[email protected]> Co-authored-by: Bogdan Crisan <[email protected]>
1 parent 9b21358 commit 8604c60

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

cfg/cspell-dictionary.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ mdformat
3737
mosquitto
3838
mqtt
3939
mqttoptions
40+
noqa
4041
notif
4142
pgrep
4243
plpgsql

sql_extensions/migrations/special-queries.sql

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-- LATEST EVENTS {{{
1+
-- LATEST STATE {{{
22

33
-- Create a table containing the latest state for each market and auto update
44
-- using triggers.
@@ -47,31 +47,41 @@ WHERE
4747
ORDER BY
4848
(data -> 'market_metadata' ->> 'market_id')::NUMERIC,
4949
(data ->> 'transaction_version')::NUMERIC DESC,
50-
(data ->> 'event_index')::NUMERIC DESC;
50+
(data -> 'state_metadata' ->> 'market_nonce')::NUMERIC DESC;
5151

5252
CREATE OR REPLACE FUNCTION UPDATE_LATEST_STATE()
5353
RETURNS TRIGGER AS $$
5454
BEGIN
55-
DELETE FROM inbox_latest_state
56-
WHERE (inbox_latest_state.data->'market_metadata'->>'market_id')::numeric = (NEW.data->'market_metadata'->>'market_id')::numeric
57-
AND (inbox_latest_state.data->'state_metadata'->>'bump_time')::numeric <= (NEW.data->'state_metadata'->>'bump_time')::numeric;
58-
INSERT INTO inbox_latest_state SELECT NEW.*;
55+
INSERT INTO inbox_latest_state
56+
SELECT
57+
NEW.*,
58+
(NEW.data -> 'market_metadata' ->> 'market_id')::NUMERIC
59+
ON CONFLICT (market_id) DO UPDATE SET
60+
transaction_version = EXCLUDED.transaction_version,
61+
transaction_block_height = EXCLUDED.transaction_block_height,
62+
data = EXCLUDED.data,
63+
inserted_at = EXCLUDED.inserted_at,
64+
event_index = EXCLUDED.event_index
65+
WHERE
66+
(inbox_latest_state.data -> 'market_metadata' ->> 'market_id')::NUMERIC = (EXCLUDED.data -> 'market_metadata' ->> 'market_id')::NUMERIC
67+
AND
68+
(inbox_latest_state.data -> 'state_metadata' ->> 'market_nonce')::NUMERIC < (EXCLUDED.data -> 'state_metadata' ->> 'market_nonce')::NUMERIC;
5969
RETURN NEW;
6070
END;
6171
$$ LANGUAGE plpgsql;
6272

6373
CREATE TRIGGER update_latest_state
6474
AFTER INSERT ON inbox_events
6575
FOR EACH ROW
66-
WHEN (new.type LIKE '%::emojicoin_dot_fun::State')
76+
WHEN (new.event_name = 'emojicoin_dot_fun::State')
6777
EXECUTE PROCEDURE UPDATE_LATEST_STATE();
6878

6979
CREATE INDEX inbox_latest_state_by_market_cap ON inbox_events (
7080
((data -> 'instantaneous_stats' ->> 'market_cap')::NUMERIC) DESC
7181
);
7282

73-
CREATE INDEX inbox_latest_state_by_bump_time ON inbox_events (
74-
((data -> 'state_metadata' ->> 'bump_time')::NUMERIC) DESC
83+
CREATE INDEX inbox_latest_state_by_nonce ON inbox_events (
84+
((data -> 'state_metadata' ->> 'market_nonce')::NUMERIC) DESC
7585
);
7686

7787
-- }}}
@@ -137,7 +147,7 @@ BEGIN
137147
),
138148
all_time_volume = inbox_volume.all_time_volume + (NEW.data->>'volume_quote')::numeric
139149
WHERE
140-
inbox_volume.market_id = (NEW.data->'market_metadata'->'market_id')::numeric;
150+
inbox_volume.market_id = (NEW.data->'market_metadata'->>'market_id')::numeric;
141151
RETURN NEW;
142152
END;
143153
$$ LANGUAGE plpgsql;
@@ -160,20 +170,34 @@ CREATE INDEX inbox_latest_state_by_daily_volume ON inbox_volume (
160170

161171
-- }}}
162172

173+
-- noqa: disable=ST06
163174
CREATE VIEW market_data AS
164175
SELECT
165-
state.market_id,
176+
-- General data
177+
(registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC AS market_id,
178+
(registration.data -> 'market_metadata' ->> 'emoji_bytes') AS emoji_bytes,
179+
(registration.data -> 'market_metadata' ->> 'market_address') AS market_address,
180+
-- Latest state data
166181
state.transaction_version,
167-
volume.all_time_volume,
168-
volume.daily_volume,
169182
(state.data -> 'instantaneous_stats' ->> 'market_cap')::NUMERIC AS market_cap,
170183
(state.data -> 'state_metadata' ->> 'bump_time')::NUMERIC AS bump_time,
171184
(state.data -> 'cumulative_stats' ->> 'n_swaps')::NUMERIC AS n_swaps,
172185
(state.data -> 'cumulative_stats' ->> 'n_chat_messages')::NUMERIC AS n_chat_messages,
186+
(state.data -> 'last_swap' ->> 'avg_execution_price_q64')::NUMERIC AS avg_execution_price_q64,
187+
(state.data ->> 'lp_coin_supply')::NUMERIC AS lp_coin_supply,
173188
state.data -> 'clamm_virtual_reserves' AS clamm_virtual_reserves,
174-
state.data -> 'cpamm_real_reserves' AS cpamm_real_reserves
175-
FROM inbox_latest_state AS state, inbox_volume AS volume
176-
WHERE state.market_id = volume.market_id;
189+
state.data -> 'cpamm_real_reserves' AS cpamm_real_reserves,
190+
-- Volume data
191+
volume.all_time_volume,
192+
volume.daily_volume
193+
FROM (
194+
SELECT data FROM inbox_events WHERE event_name = 'emojicoin_dot_fun::MarketRegistration'
195+
) AS registration
196+
LEFT JOIN inbox_latest_state AS state
197+
ON (registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC = state.market_id
198+
LEFT JOIN inbox_volume AS volume
199+
ON (registration.data -> 'market_metadata' ->> 'market_id')::NUMERIC = volume.market_id;
200+
-- noqa: disable=ST06
177201

178202
CREATE INDEX inbox_periodic_state ON inbox_events (
179203
((data -> 'market_metadata' ->> 'market_id')::NUMERIC),

0 commit comments

Comments
 (0)