From 22f49dfea2b49edc42b4bda1d1c1b0973e306ee4 Mon Sep 17 00:00:00 2001 From: flashburst <82953782+flashburst@users.noreply.github.com> Date: Mon, 17 Apr 2023 13:21:24 +0530 Subject: [PATCH 1/2] Added log like function --- sql/nft/website/functions/log_like.sql | 58 ++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sql/nft/website/functions/log_like.sql diff --git a/sql/nft/website/functions/log_like.sql b/sql/nft/website/functions/log_like.sql new file mode 100644 index 0000000..76a2215 --- /dev/null +++ b/sql/nft/website/functions/log_like.sql @@ -0,0 +1,58 @@ +CREATE OR REPLACE FUNCTION log_like +( + _account address, + _token_id uint256 +) +RETURNS uint256 +AS +$$ + DECLARE _previous boolean; + DECLARE _current boolean; + DECLARE _last_liked_at TIMESTAMP WITH TIME ZONE; + DECLARE _last_unliked_at TIMESTAMP WITH TIME ZONE; + DECLARE _liked_at TIMESTAMP WITH TIME ZONE; + DECLARE _token_likes uint256; +BEGIN + IF NOT EXISTS(SELECT 1 FROM nfts WHERE token_id = _token_id) THEN + RAISE EXCEPTION 'Invalid token id'; + END IF; + + SELECT likes.liked INTO _previous + WHERE likes.liked_by = _account + AND likes.token_id = _token_id; + + IF(_previous = false) THEN + _current := true; + _last_liked_at := NOW(); + ELSIF(_previous = true) THEN + _current := false; + _last_unliked_at := NOW(); + ELSE + _current := true; + _last_liked_at := NOW(); + END IF; + + UPDATE likes + SET + liked = _current, + last_liked_at = _last_liked_at, + last_unliked_at = _last_unliked_at + WHERE likes.liked_by = _account + AND likes.token_id = _token_id; + + IF(_current = true) THEN + UPDATE nfts + SET likes = nfts.likes + 1 + WHERE token_id = _token_id + RETURNING nfts.likes INTO _token_likes; + ELSE + UPDATE nfts + SET likes = nfts.likes - 1 + WHERE token_id = _token_id + RETURNING nfts.likes INTO _token_likes; + END IF; + + RETURN _token_likes; +END +$$ +LANGUAGE plpgsql; \ No newline at end of file From 30e9602624babb044c235e47e2e5aea77b097b3f Mon Sep 17 00:00:00 2001 From: flashburst <82953782+flashburst@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:45:58 +0530 Subject: [PATCH 2/2] Refactored to remove if-else for updating table --- sql/nft/website/functions/log_like.sql | 55 ++++++++------------------ 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/sql/nft/website/functions/log_like.sql b/sql/nft/website/functions/log_like.sql index 76a2215..1220bb2 100644 --- a/sql/nft/website/functions/log_like.sql +++ b/sql/nft/website/functions/log_like.sql @@ -1,56 +1,35 @@ CREATE OR REPLACE FUNCTION log_like ( - _account address, - _token_id uint256 + _account address, + _token_id uint256 ) RETURNS uint256 AS $$ - DECLARE _previous boolean; - DECLARE _current boolean; - DECLARE _last_liked_at TIMESTAMP WITH TIME ZONE; - DECLARE _last_unliked_at TIMESTAMP WITH TIME ZONE; - DECLARE _liked_at TIMESTAMP WITH TIME ZONE; - DECLARE _token_likes uint256; + DECLARE _previous boolean; + DECLARE _token_likes uint256; BEGIN IF NOT EXISTS(SELECT 1 FROM nfts WHERE token_id = _token_id) THEN RAISE EXCEPTION 'Invalid token id'; END IF; - SELECT likes.liked INTO _previous - WHERE likes.liked_by = _account - AND likes.token_id = _token_id; - - IF(_previous = false) THEN - _current := true; - _last_liked_at := NOW(); - ELSIF(_previous = true) THEN - _current := false; - _last_unliked_at := NOW(); - ELSE - _current := true; - _last_liked_at := NOW(); - END IF; + SELECT likes.liked INTO _previous + WHERE likes.liked_by = _account + AND likes.token_id = _token_id + LIMIT 1; UPDATE likes SET - liked = _current, - last_liked_at = _last_liked_at, - last_unliked_at = _last_unliked_at - WHERE likes.liked_by = _account - AND likes.token_id = _token_id; + last_unliked_at = CASE WHEN liked = true THEN NOW() ELSE last_unliked_at END, + last_liked_at = CASE WHEN liked = false THEN NOW() ELSE last_liked_at END, + liked = !liked + WHERE likes.liked_by = _account + AND likes.token_id = _token_id; - IF(_current = true) THEN - UPDATE nfts - SET likes = nfts.likes + 1 - WHERE token_id = _token_id - RETURNING nfts.likes INTO _token_likes; - ELSE - UPDATE nfts - SET likes = nfts.likes - 1 - WHERE token_id = _token_id - RETURNING nfts.likes INTO _token_likes; - END IF; + UPDATE nfts + SET likes = likes + (CASE WHEN _previous = true THEN -1 ELSE 1 END) + WHERE token_id = _token_id + RETURNING nfts.likes INTO _token_likes; RETURN _token_likes; END