denormalize votes
This commit is contained in:
		
							parent
							
								
									e2aceee234
								
							
						
					
					
						commit
						1c608d42f4
					
				@ -904,14 +904,6 @@ export default {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return comments(me, models, item.id, item.pinId ? 'recent' : 'hot', item)
 | 
					      return comments(me, models, item.id, item.pinId ? 'recent' : 'hot', item)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    upvotes: async (item, args, { models }) => {
 | 
					 | 
				
			||||||
      const [{ count }] = await models.$queryRaw(`
 | 
					 | 
				
			||||||
        SELECT COUNT(DISTINCT "userId") as count
 | 
					 | 
				
			||||||
        FROM "ItemAct"
 | 
					 | 
				
			||||||
        WHERE act = 'TIP' AND "itemId" = $1`, Number(item.id))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      return count
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    wvotes: async (item) => {
 | 
					    wvotes: async (item) => {
 | 
				
			||||||
      return item.weightedVotes - item.weightedDownVotes
 | 
					      return item.weightedVotes - item.weightedDownVotes
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -1123,7 +1115,7 @@ const createItem = async (parent, { sub, title, url, text, boost, forward, bount
 | 
				
			|||||||
export const SELECT =
 | 
					export const SELECT =
 | 
				
			||||||
  `SELECT "Item".id, "Item".created_at as "createdAt", "Item".updated_at as "updatedAt", "Item".title,
 | 
					  `SELECT "Item".id, "Item".created_at as "createdAt", "Item".updated_at as "updatedAt", "Item".title,
 | 
				
			||||||
  "Item".text, "Item".url, "Item"."bounty", "Item"."userId", "Item"."fwdUserId", "Item"."parentId",
 | 
					  "Item".text, "Item".url, "Item"."bounty", "Item"."userId", "Item"."fwdUserId", "Item"."parentId",
 | 
				
			||||||
  "Item"."pinId", "Item"."maxBid", "Item"."rootId",
 | 
					  "Item"."pinId", "Item"."maxBid", "Item"."rootId", "Item".upvotes,
 | 
				
			||||||
  "Item".company, "Item".location, "Item".remote, "Item"."deletedAt",
 | 
					  "Item".company, "Item".location, "Item".remote, "Item"."deletedAt",
 | 
				
			||||||
  "Item"."subName", "Item".status, "Item"."uploadId", "Item"."pollCost", "Item".boost,
 | 
					  "Item"."subName", "Item".status, "Item"."uploadId", "Item"."pollCost", "Item".boost,
 | 
				
			||||||
  "Item".msats, "Item".ncomments, "Item"."commentMsats", "Item"."lastCommentAt", "Item"."weightedVotes",
 | 
					  "Item".msats, "Item".ncomments, "Item"."commentMsats", "Item"."lastCommentAt", "Item"."weightedVotes",
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					-- AlterTable
 | 
				
			||||||
 | 
					ALTER TABLE "users" ALTER COLUMN "tipDefault" SET DEFAULT 100;
 | 
				
			||||||
@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					-- AlterTable
 | 
				
			||||||
 | 
					ALTER TABLE "Item" ADD COLUMN "upvotes" INTEGER NOT NULL DEFAULT 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE "Item"
 | 
				
			||||||
 | 
					SET upvotes = subquery.votes
 | 
				
			||||||
 | 
					FROM (SELECT "ItemAct"."itemId", COUNT(DISTINCT "userId") AS votes
 | 
				
			||||||
 | 
					        FROM "ItemAct"
 | 
				
			||||||
 | 
					        WHERE "ItemAct".act = 'TIP'
 | 
				
			||||||
 | 
					        GROUP BY "ItemAct"."itemId") subquery
 | 
				
			||||||
 | 
					WHERE "Item".id = subquery."itemId";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE OR REPLACE FUNCTION weighted_votes_after_tip(item_id INTEGER, user_id INTEGER, sats INTEGER) RETURNS INTEGER AS $$
 | 
				
			||||||
 | 
					DECLARE
 | 
				
			||||||
 | 
					    user_trust DOUBLE PRECISION;
 | 
				
			||||||
 | 
					    sats_past INTEGER;
 | 
				
			||||||
 | 
					    vote_add INTEGER := 0;
 | 
				
			||||||
 | 
					    multiplier DOUBLE PRECISION;
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    -- grab user's trust who is upvoting
 | 
				
			||||||
 | 
					    SELECT trust INTO user_trust FROM users WHERE id = user_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    -- in order to add this to weightedVotes, we need to do log((satsN+satsPrior)/satsPrior)
 | 
				
			||||||
 | 
					    -- so compute sats prior
 | 
				
			||||||
 | 
					    SELECT SUM(msats) / 1000 INTO sats_past
 | 
				
			||||||
 | 
					    FROM "ItemAct"
 | 
				
			||||||
 | 
					    WHERE "userId" = user_id AND "itemId" = item_id AND act IN ('TIP', 'FEE');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IF sats_past IS NULL OR sats_past = 0 THEN
 | 
				
			||||||
 | 
					        multiplier := LOG(sats);
 | 
				
			||||||
 | 
					        vote_add := 1;
 | 
				
			||||||
 | 
					    ELSE
 | 
				
			||||||
 | 
					        multiplier := LOG((sats+sats_past)/sats_past::FLOAT);
 | 
				
			||||||
 | 
					    END IF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    -- update item
 | 
				
			||||||
 | 
					    UPDATE "Item"
 | 
				
			||||||
 | 
					        SET "weightedVotes" = "weightedVotes" + (user_trust * multiplier), upvotes = upvotes + vote_add
 | 
				
			||||||
 | 
					        WHERE id = item_id AND "userId" <> user_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RETURN 0;
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					$$ LANGUAGE plpgsql;
 | 
				
			||||||
@ -252,7 +252,6 @@ model Item {
 | 
				
			|||||||
  path        Unsupported("LTREE")?
 | 
					  path        Unsupported("LTREE")?
 | 
				
			||||||
  pin         Pin?                  @relation(fields: [pinId], references: [id])
 | 
					  pin         Pin?                  @relation(fields: [pinId], references: [id])
 | 
				
			||||||
  pinId       Int?
 | 
					  pinId       Int?
 | 
				
			||||||
  boost       Int                   @default(0)
 | 
					 | 
				
			||||||
  uploadId    Int?
 | 
					  uploadId    Int?
 | 
				
			||||||
  upload      Upload?
 | 
					  upload      Upload?
 | 
				
			||||||
  paidImgLink Boolean               @default(false)
 | 
					  paidImgLink Boolean               @default(false)
 | 
				
			||||||
@ -273,6 +272,8 @@ model Item {
 | 
				
			|||||||
  weightedVotes     Float  @default(0)
 | 
					  weightedVotes     Float  @default(0)
 | 
				
			||||||
  weightedDownVotes Float  @default(0)
 | 
					  weightedDownVotes Float  @default(0)
 | 
				
			||||||
  msats             BigInt @default(0)
 | 
					  msats             BigInt @default(0)
 | 
				
			||||||
 | 
					  boost             Int    @default(0)
 | 
				
			||||||
 | 
					  upvotes           Int    @default(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // denormalized comment stats
 | 
					  // denormalized comment stats
 | 
				
			||||||
  ncomments     Int       @default(0)
 | 
					  ncomments     Int       @default(0)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user