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

Fix/nfts queries #250

Merged
merged 3 commits into from
Jan 24, 2025
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
46 changes: 18 additions & 28 deletions src/ports/catalog/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -622,22 +622,27 @@ const getTradesJoin = () => {
SELECT
COUNT(id),
COUNT(id) FILTER (WHERE status = 'open' and type = 'public_nft_order') AS nfts_listings_count,
unified_trades.contract_address_sent,
contract_address_sent,
-- Add both MIN and MAX for order_amount_received
MIN(amount_received) FILTER (WHERE status = 'open' and type = 'public_nft_order') AS min_order_amount_received,
MAX(amount_received) FILTER (WHERE status = 'open' and type = 'public_nft_order') AS max_order_amount_received,
-- Item amount is the minimum value for public_item_order
MAX(assets -> 'sent' ->> 'token_id') AS token_id, -- Max token_id for public_nft_order
assets -> 'sent' ->> 'item_id' AS item_id, -- Max item_id for public_item_order
MAX(created_at) AS max_created_at,
m.min_item_created_at,
-- Subquery to get the min_item_created_at from all statuses
(
SELECT
MIN(created_at)
FROM unified_trades ut2
WHERE ut2.contract_address_sent = unified_trades.contract_address_sent AND ut2.type = 'public_item_order'
) AS min_item_created_at,
MAX(id::text) FILTER (WHERE status = 'open' and type = 'public_item_order') AS open_item_trade_id,
MAX(amount_received) FILTER (WHERE status = 'open' and type = 'public_item_order') AS open_item_trade_price,
json_agg(assets) AS aggregated_assets -- Aggregate the assets into a JSON array
FROM unified_trades
LEFT JOIN min_item_created m ON m.contract_address_sent = unified_trades.contract_address_sent
WHERE status = 'open'
GROUP BY unified_trades.contract_address_sent, (unified_trades.assets -> 'sent' ->> 'item_id'), m.min_item_created_at
GROUP BY contract_address_sent, assets -> 'sent' ->> 'item_id'
) AS offchain_orders ON offchain_orders.contract_address_sent = items.collection_id AND offchain_orders.item_id::numeric = items.blockchain_id
`
}
Expand All @@ -661,7 +666,7 @@ const getNFTsWithOrdersCTE = (filters: CatalogQueryFilters) => {
)
// When filtering by NEWEST, we need to join the top_n_items CTE because we just want the N newest ones
.append(
filters.sortBy === CatalogSortBy.NEWEST
filters.isOnSale === false && (filters.sortBy === CatalogSortBy.NEWEST || filters.sortBy === CatalogSortBy.RECENTLY_SOLD)
? SQL` AND orders.item_id IN (
SELECT id::text
FROM top_n_items
Expand All @@ -678,36 +683,22 @@ const getNFTsWithOrdersCTE = (filters: CatalogQueryFilters) => {
)
}

const getMinItemCreatedAtCTE = () => {
return SQL`
, min_item_created AS (
SELECT
contract_address_sent,
(assets -> 'sent' ->> 'item_id')::numeric AS item_id_num,
min(created_at) AS min_item_created_at
FROM
unified_trades
WHERE
type = 'public_item_order'
GROUP BY
contract_address_sent,
(assets -> 'sent' ->> 'item_id')::numeric
)
`
}

const getTopNItemsCTE = (filters: CatalogQueryFilters) => {
if (filters.sortBy === CatalogSortBy.NEWEST) {
if (filters.isOnSale === false && (filters.sortBy === CatalogSortBy.NEWEST || filters.sortBy === CatalogSortBy.RECENTLY_SOLD)) {
const limit = filters.first ?? 10
const offset = filters.skip ?? 0
return SQL`
, top_n_items AS (
SELECT * FROM `.append(MARKETPLACE_SQUID_SCHEMA).append(SQL`.item AS items
ORDER BY items.available DESC
SELECT * FROM `
.append(MARKETPLACE_SQUID_SCHEMA)
.append(
SQL`.item AS items
ORDER BY items.`.append(filters.sortBy === CatalogSortBy.NEWEST ? 'first_listed_at' : 'sold_at').append(SQL` DESC
LIMIT ${limit}
OFFSET ${offset}
)
`)
)
}
return SQL``
}
Expand All @@ -717,7 +708,6 @@ export const getCollectionsItemsCatalogQueryWithTrades = (filters: CatalogQueryF
.append(getTradesCTE())
.append(getTopNItemsCTE(filters))
.append(getNFTsWithOrdersCTE(filters))
.append(getMinItemCreatedAtCTE())
.append(
SQL`
SELECT
Expand Down Expand Up @@ -788,7 +778,7 @@ export const getCollectionsItemsCatalogQueryWithTrades = (filters: CatalogQueryF
)
.append(getMaxPriceCaseWithTrades(filters))
.append(
filters.sortBy === CatalogSortBy.NEWEST
filters.isOnSale === false && (filters.sortBy === CatalogSortBy.NEWEST || filters.sortBy === CatalogSortBy.RECENTLY_SOLD)
? SQL`FROM top_n_items as items`
: SQL`
FROM `
Expand Down
53 changes: 31 additions & 22 deletions src/ports/nfts/ensQueries.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import SQL, { SQLStatement } from 'sql-template-strings'
import { MARKETPLACE_SQUID_SCHEMA } from '../../constants'
import { getWhereStatementFromFilters } from '../utils'
import { getNFTsSortBy } from './landQueries'
import { getNFTLimitAndOffsetStatement, getTradesCTE } from './queries'
Expand Down Expand Up @@ -35,36 +36,39 @@ export function getENSs(nftFilters: GetNFTsFilters): SQLStatement {
return SQL`
WITH filtered_ens_nfts AS (
SELECT *
FROM squid_marketplace.nft
WHERE category = 'ens' `
.append(ids ? SQL` AND id = ANY(${ids}) ` : SQL``)
FROM `
.append(MARKETPLACE_SQUID_SCHEMA)
.append(
SQL`
),
`
.append(getTradesCTE(nftFilters, false))
SQL`.nft
WHERE category = 'ens' `
.append(ids ? SQL` AND id = ANY(${ids}) ` : SQL``)
.append(
SQL`
),
`
)
.append(
isOnSale
? SQL`
.append(getTradesCTE(nftFilters, false))
.append(
SQL`
`
)
.append(
isOnSale
? SQL`
, valid_orders AS (
SELECT
o.nft_id,
o.status,
o.expires_at_normalized
FROM
squid_marketplace.order o
`.append(MARKETPLACE_SQUID_SCHEMA).append(SQL`.order o
WHERE
o.status = 'open'
AND o.expires_at_normalized > now()
)`
: SQL``
)
.append(
SQL`
)`)
: SQL``
)
.append(
SQL`
SELECT
count(*) OVER () AS count,
nft.id,
Expand Down Expand Up @@ -95,12 +99,17 @@ export function getENSs(nftFilters: GetNFTsFilters): SQLStatement {
AND trades.assets -> 'sent' ->> 'contract_address' = nft.contract_address
AND trades.status = 'open'
AND trades.signer || '-' || nft.network = nft.owner_id
LEFT JOIN squid_marketplace.ens ens ON ens.id = nft.ens_id
LEFT JOIN `
.append(MARKETPLACE_SQUID_SCHEMA)
.append(
SQL`.ens ens ON ens.id = nft.ens_id
`
.append(isOnSale ? SQL`LEFT JOIN valid_orders orders ON orders.nft_id = nft.id` : SQL``)
.append(geENSWhereStatement(nftFilters))
.append(getNFTsSortBy(sortBy))
.append(getNFTLimitAndOffsetStatement(nftFilters))
.append(isOnSale ? SQL`LEFT JOIN valid_orders orders ON orders.nft_id = nft.id` : SQL``)
.append(geENSWhereStatement(nftFilters))
.append(getNFTsSortBy(sortBy))
.append(getNFTLimitAndOffsetStatement(nftFilters))
)
)
)
)
}
2 changes: 1 addition & 1 deletion src/ports/prices/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function getPricesQuery(filters: PriceFilters) {
...fromPriceFiltersToNFTFilters(filters),
isOnSale: true
}
return SQL`SELECT price FROM (`.append(getNFTsQuery(nftFilters)).append(SQL`) as nfts`)
return SQL`SELECT price FROM (`.append(getNFTsQuery({ ...nftFilters, sortBy: undefined })).append(SQL`) as nfts`)
}

const catalogFilters = {
Expand Down
Loading