0.7.32
This commit is contained in:
@@ -188,6 +188,51 @@ SELECT
|
||||
) AS token_metadata_missing_count,
|
||||
(SELECT COUNT(*) FROM k_sol_pools) AS pool_count,
|
||||
(SELECT COUNT(*) FROM k_sol_pairs) AS pair_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
SELECT pair.id
|
||||
FROM k_sol_pairs pair
|
||||
LEFT JOIN k_sol_trade_events te ON te.pair_id = pair.id
|
||||
GROUP BY pair.id
|
||||
HAVING COUNT(DISTINCT te.id) = 0
|
||||
)
|
||||
) AS literal_pair_without_trade_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
SELECT pair.id
|
||||
FROM k_sol_pairs pair
|
||||
LEFT JOIN k_sol_pair_candles pc ON pc.pair_id = pair.id
|
||||
GROUP BY pair.id
|
||||
HAVING COUNT(DISTINCT pc.bucket_start_unix || ':' || pc.timeframe_seconds) = 0
|
||||
)
|
||||
) AS literal_pair_without_candle_count,
|
||||
(
|
||||
SELECT COUNT(DISTINCT pair_id)
|
||||
FROM k_sol_trade_events
|
||||
) AS trade_materialized_pair_count,
|
||||
(
|
||||
SELECT COUNT(DISTINCT pair_id)
|
||||
FROM k_sol_pair_candles
|
||||
) AS candle_materialized_pair_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
SELECT pair.id
|
||||
FROM k_sol_pairs pair
|
||||
JOIN k_sol_pools p ON p.id = pair.pool_id
|
||||
JOIN k_sol_dex_decoded_events dde ON dde.pool_account = p.address
|
||||
JOIN k_sol_chain_transactions ct ON ct.id = dde.transaction_id
|
||||
WHERE json_extract(dde.payload_json, '$.tradeCandidate') = 1
|
||||
AND ct.err_json IS NULL
|
||||
GROUP BY pair.id
|
||||
)
|
||||
) AS actionable_pair_count,
|
||||
(
|
||||
SELECT COUNT(DISTINCT timeframe_seconds)
|
||||
FROM k_sol_pair_candles
|
||||
) AS candle_bucket_timeframe_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
@@ -216,6 +261,24 @@ SELECT
|
||||
AND COUNT(DISTINCT dde.id) > 0
|
||||
)
|
||||
) AS non_actionable_pair_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
SELECT pair.id
|
||||
FROM k_sol_pairs pair
|
||||
JOIN k_sol_pools p ON p.id = pair.pool_id
|
||||
LEFT JOIN k_sol_dex_decoded_events dde ON dde.pool_account = p.address
|
||||
LEFT JOIN k_sol_chain_transactions ct ON ct.id = dde.transaction_id
|
||||
LEFT JOIN k_sol_trade_events te ON te.pair_id = pair.id
|
||||
GROUP BY pair.id
|
||||
HAVING COUNT(DISTINCT CASE
|
||||
WHEN json_extract(dde.payload_json, '$.tradeCandidate') = 1
|
||||
AND ct.id IS NOT NULL
|
||||
AND ct.err_json IS NULL
|
||||
THEN dde.id END) > 0
|
||||
AND COUNT(DISTINCT te.id) = 0
|
||||
)
|
||||
) AS blocking_pair_without_trade_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
@@ -234,6 +297,24 @@ SELECT
|
||||
AND COUNT(DISTINCT te.id) = 0
|
||||
)
|
||||
) AS pair_without_trade_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
SELECT pair.id
|
||||
FROM k_sol_pairs pair
|
||||
JOIN k_sol_pools p ON p.id = pair.pool_id
|
||||
LEFT JOIN k_sol_dex_decoded_events dde ON dde.pool_account = p.address
|
||||
LEFT JOIN k_sol_chain_transactions ct ON ct.id = dde.transaction_id
|
||||
LEFT JOIN k_sol_pair_candles pc ON pc.pair_id = pair.id
|
||||
GROUP BY pair.id
|
||||
HAVING COUNT(DISTINCT CASE
|
||||
WHEN json_extract(dde.payload_json, '$.candleCandidate') = 1
|
||||
AND ct.id IS NOT NULL
|
||||
AND ct.err_json IS NULL
|
||||
THEN dde.id END) > 0
|
||||
AND COUNT(DISTINCT pc.bucket_start_unix || ':' || pc.timeframe_seconds) = 0
|
||||
)
|
||||
) AS blocking_pair_without_candle_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
@@ -295,7 +376,15 @@ SELECT
|
||||
token_metadata_missing_count: row.token_metadata_missing_count,
|
||||
pool_count: row.pool_count,
|
||||
pair_count: row.pair_count,
|
||||
literal_pair_without_trade_count: row.literal_pair_without_trade_count,
|
||||
literal_pair_without_candle_count: row.literal_pair_without_candle_count,
|
||||
trade_materialized_pair_count: row.trade_materialized_pair_count,
|
||||
candle_materialized_pair_count: row.candle_materialized_pair_count,
|
||||
actionable_pair_count: row.actionable_pair_count,
|
||||
candle_bucket_timeframe_count: row.candle_bucket_timeframe_count,
|
||||
non_actionable_pair_count: row.non_actionable_pair_count,
|
||||
blocking_pair_without_trade_count: row.blocking_pair_without_trade_count,
|
||||
blocking_pair_without_candle_count: row.blocking_pair_without_candle_count,
|
||||
pair_without_trade_count: row.pair_without_trade_count,
|
||||
pair_without_candle_count: row.pair_without_candle_count,
|
||||
actionable_missing_trade_event_count: row.actionable_missing_trade_event_count,
|
||||
@@ -523,6 +612,112 @@ ORDER BY pair.id
|
||||
}
|
||||
}
|
||||
|
||||
/// Lists local pair materialization/actionability summaries.
|
||||
pub async fn query_local_pair_actionability_diagnostic_list_summaries(
|
||||
database: &crate::Database,
|
||||
) -> Result<std::vec::Vec<crate::LocalPairActionabilityDiagnosticSummaryDto>, crate::Error> {
|
||||
match database.connection() {
|
||||
crate::DatabaseConnection::Sqlite(pool) => {
|
||||
let rows_result = sqlx::query_as::<
|
||||
sqlx::Sqlite,
|
||||
crate::db::dtos::LocalPairActionabilityDiagnosticSummaryRow,
|
||||
>(
|
||||
r#"
|
||||
WITH pair_state AS (
|
||||
SELECT
|
||||
pair.id AS pair_id,
|
||||
COUNT(DISTINCT dde.id) AS decoded_event_count,
|
||||
COUNT(DISTINCT CASE WHEN json_extract(dde.payload_json, '$.tradeCandidate') = 1 THEN dde.id END) AS decoded_trade_candidate_count,
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN json_extract(dde.payload_json, '$.tradeCandidate') = 1
|
||||
AND ct.id IS NOT NULL
|
||||
AND ct.err_json IS NULL
|
||||
THEN dde.id END) AS actionable_trade_candidate_count,
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN json_extract(dde.payload_json, '$.tradeCandidate') = 1
|
||||
AND ct.id IS NOT NULL
|
||||
AND ct.err_json IS NOT NULL
|
||||
THEN dde.id END) AS failed_trade_candidate_count,
|
||||
COUNT(DISTINCT te.id) AS trade_event_count,
|
||||
COUNT(DISTINCT pc.bucket_start_unix || ':' || pc.timeframe_seconds) AS pair_candle_count
|
||||
FROM k_sol_pairs pair
|
||||
JOIN k_sol_pools p ON p.id = pair.pool_id
|
||||
LEFT JOIN k_sol_dex_decoded_events dde ON dde.pool_account = p.address
|
||||
LEFT JOIN k_sol_chain_transactions ct ON ct.id = dde.transaction_id
|
||||
LEFT JOIN k_sol_trade_events te ON te.pair_id = pair.id
|
||||
LEFT JOIN k_sol_pair_candles pc ON pc.pair_id = pair.id
|
||||
GROUP BY pair.id
|
||||
), classified AS (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN trade_event_count > 0 THEN 'trade_materialized'
|
||||
WHEN actionable_trade_candidate_count > 0 THEN 'actionable_without_materialized_trade'
|
||||
WHEN failed_trade_candidate_count > 0 THEN 'failed_trade_candidate_only'
|
||||
WHEN decoded_trade_candidate_count > 0 THEN 'non_actionable_trade_candidate_only'
|
||||
WHEN decoded_event_count > 0 THEN 'decoded_without_trade_candidate'
|
||||
ELSE 'catalog_only'
|
||||
END AS pair_actionability,
|
||||
pair_id,
|
||||
decoded_event_count,
|
||||
decoded_trade_candidate_count,
|
||||
actionable_trade_candidate_count,
|
||||
failed_trade_candidate_count,
|
||||
trade_event_count,
|
||||
pair_candle_count
|
||||
FROM pair_state
|
||||
)
|
||||
SELECT
|
||||
pair_actionability AS pair_actionability,
|
||||
COUNT(pair_id) AS pair_count,
|
||||
SUM(decoded_event_count) AS decoded_event_count,
|
||||
SUM(decoded_trade_candidate_count) AS decoded_trade_candidate_count,
|
||||
SUM(actionable_trade_candidate_count) AS actionable_trade_candidate_count,
|
||||
SUM(failed_trade_candidate_count) AS failed_trade_candidate_count,
|
||||
SUM(trade_event_count) AS trade_event_count,
|
||||
SUM(pair_candle_count) AS pair_candle_count
|
||||
FROM classified
|
||||
GROUP BY pair_actionability
|
||||
ORDER BY
|
||||
CASE pair_actionability
|
||||
WHEN 'trade_materialized' THEN 1
|
||||
WHEN 'actionable_without_materialized_trade' THEN 2
|
||||
WHEN 'failed_trade_candidate_only' THEN 3
|
||||
WHEN 'non_actionable_trade_candidate_only' THEN 4
|
||||
WHEN 'decoded_without_trade_candidate' THEN 5
|
||||
ELSE 6
|
||||
END,
|
||||
pair_actionability
|
||||
"#,
|
||||
)
|
||||
.fetch_all(pool)
|
||||
.await;
|
||||
let rows = match rows_result {
|
||||
Ok(rows) => rows,
|
||||
Err(error) => {
|
||||
return Err(crate::Error::Db(format!(
|
||||
"cannot list local pair actionability diagnostic summaries on sqlite: {}",
|
||||
error
|
||||
)));
|
||||
},
|
||||
};
|
||||
let mut summaries = std::vec::Vec::new();
|
||||
for row in rows {
|
||||
summaries.push(crate::LocalPairActionabilityDiagnosticSummaryDto {
|
||||
pair_actionability: row.pair_actionability,
|
||||
pair_count: row.pair_count,
|
||||
decoded_event_count: row.decoded_event_count,
|
||||
decoded_trade_candidate_count: row.decoded_trade_candidate_count,
|
||||
actionable_trade_candidate_count: row.actionable_trade_candidate_count,
|
||||
failed_trade_candidate_count: row.failed_trade_candidate_count,
|
||||
trade_event_count: row.trade_event_count,
|
||||
pair_candle_count: row.pair_candle_count,
|
||||
});
|
||||
}
|
||||
return Ok(summaries);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/// Lists local decoded-event diagnostic summaries.
|
||||
pub async fn query_local_decoded_event_diagnostic_list_summaries(
|
||||
database: &crate::Database,
|
||||
|
||||
Reference in New Issue
Block a user