avoid extra dip when getting users
This commit is contained in:
		
							parent
							
								
									347a6a54d2
								
							
						
					
					
						commit
						a97f8229b0
					
				| @ -28,12 +28,12 @@ async function comments (me, models, id, sort, root) { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const filter = await filterClause(me, models) |   const filter = await filterClause(me, models) | ||||||
|   const [{ item_comments: comments }] = await models.$queryRaw('SELECT item_comments($1, $2, $3, $4)', Number(id), COMMENT_DEPTH_LIMIT, orderBy, filter) |   const [{ item_comments: comments }] = await models.$queryRaw('SELECT item_comments($1, $2, $3, $4)', Number(id), COMMENT_DEPTH_LIMIT, filter, orderBy) | ||||||
|   return comments |   return comments | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getItem (parent, { id }, { me, models }) { | export async function getItem (parent, { id }, { me, models }) { | ||||||
|   const [item] = await models.$queryRaw(` |   const [item] = await itemQueryWithUsers(models, ` | ||||||
|   ${SELECT} |   ${SELECT} | ||||||
|   FROM "Item" |   FROM "Item" | ||||||
|   WHERE id = $1`, Number(id))
 |   WHERE id = $1`, Number(id))
 | ||||||
| @ -135,6 +135,15 @@ function recentClause (type) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | async function itemQueryWithUsers (models, query, ...args) { | ||||||
|  |   return await models.$queryRaw(` | ||||||
|  |     SELECT "Item".*, to_json(users.*) as user | ||||||
|  |     FROM ( | ||||||
|  |       ${query} | ||||||
|  |     ) "Item" | ||||||
|  |     JOIN users ON "Item"."userId" = users.id`, ...args)
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const subClause = (sub, num, table) => { | const subClause = (sub, num, table) => { | ||||||
|   return sub ? ` AND ${table ? `${table}.` : ''}"subName" = $${num} ` : '' |   return sub ? ` AND ${table ? `${table}.` : ''}"subName" = $${num} ` : '' | ||||||
| } | } | ||||||
| @ -151,7 +160,7 @@ export default { | |||||||
|     }, |     }, | ||||||
|     topItems: async (parent, { cursor, sort, when }, { me, models }) => { |     topItems: async (parent, { cursor, sort, when }, { me, models }) => { | ||||||
|       const decodedCursor = decodeCursor(cursor) |       const decodedCursor = decodeCursor(cursor) | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "parentId" IS NULL AND "Item".created_at <= $1 |         WHERE "parentId" IS NULL AND "Item".created_at <= $1 | ||||||
| @ -168,7 +177,7 @@ export default { | |||||||
|     }, |     }, | ||||||
|     topComments: async (parent, { cursor, sort, when }, { me, models }) => { |     topComments: async (parent, { cursor, sort, when }, { me, models }) => { | ||||||
|       const decodedCursor = decodeCursor(cursor) |       const decodedCursor = decodeCursor(cursor) | ||||||
|       const comments = await models.$queryRaw(` |       const comments = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "parentId" IS NOT NULL |         WHERE "parentId" IS NOT NULL | ||||||
| @ -206,7 +215,7 @@ export default { | |||||||
|             throw new UserInputError('no user has that name', { argumentName: 'name' }) |             throw new UserInputError('no user has that name', { argumentName: 'name' }) | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           items = await models.$queryRaw(` |           items = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             WHERE "userId" = $1 AND "parentId" IS NULL AND created_at <= $2 |             WHERE "userId" = $1 AND "parentId" IS NULL AND created_at <= $2 | ||||||
| @ -218,7 +227,7 @@ export default { | |||||||
|             LIMIT ${LIMIT}`, user.id, decodedCursor.time, decodedCursor.offset)
 |             LIMIT ${LIMIT}`, user.id, decodedCursor.time, decodedCursor.offset)
 | ||||||
|           break |           break | ||||||
|         case 'recent': |         case 'recent': | ||||||
|           items = await models.$queryRaw(` |           items = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             WHERE "parentId" IS NULL AND created_at <= $1 |             WHERE "parentId" IS NULL AND created_at <= $1 | ||||||
| @ -231,7 +240,7 @@ export default { | |||||||
|             LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset, ...subArr)
 |             LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset, ...subArr)
 | ||||||
|           break |           break | ||||||
|         case 'top': |         case 'top': | ||||||
|           items = await models.$queryRaw(` |           items = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             WHERE "parentId" IS NULL AND "Item".created_at <= $1 |             WHERE "parentId" IS NULL AND "Item".created_at <= $1 | ||||||
| @ -250,7 +259,7 @@ export default { | |||||||
| 
 | 
 | ||||||
|           switch (subFull?.rankingType) { |           switch (subFull?.rankingType) { | ||||||
|             case 'AUCTION': |             case 'AUCTION': | ||||||
|               items = await models.$queryRaw(` |               items = await itemQueryWithUsers(models, ` | ||||||
|                 SELECT * |                 SELECT * | ||||||
|                 FROM ( |                 FROM ( | ||||||
|                   (${SELECT} |                   (${SELECT} | ||||||
| @ -280,7 +289,7 @@ export default { | |||||||
|               // if there are 21 items, return them ... if not do the unrestricted query
 |               // if there are 21 items, return them ... if not do the unrestricted query
 | ||||||
|               // instead of doing this we should materialize a view ... but this is easier for now
 |               // instead of doing this we should materialize a view ... but this is easier for now
 | ||||||
|               if (decodedCursor.offset === 0) { |               if (decodedCursor.offset === 0) { | ||||||
|                 items = await models.$queryRaw(` |                 items = await itemQueryWithUsers(models, ` | ||||||
|                     ${SELECT} |                     ${SELECT} | ||||||
|                     FROM "Item" |                     FROM "Item" | ||||||
|                     WHERE "parentId" IS NULL AND "Item".created_at <= $1 AND "Item".created_at > $3 |                     WHERE "parentId" IS NULL AND "Item".created_at <= $1 AND "Item".created_at > $3 | ||||||
| @ -293,7 +302,7 @@ export default { | |||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
|               if (decodedCursor.offset !== 0 || items?.length < LIMIT) { |               if (decodedCursor.offset !== 0 || items?.length < LIMIT) { | ||||||
|                 items = await models.$queryRaw(` |                 items = await itemQueryWithUsers(models, ` | ||||||
|                     ${SELECT} |                     ${SELECT} | ||||||
|                     FROM "Item" |                     FROM "Item" | ||||||
|                     WHERE "parentId" IS NULL AND "Item".created_at <= $1 |                     WHERE "parentId" IS NULL AND "Item".created_at <= $1 | ||||||
| @ -307,7 +316,7 @@ export default { | |||||||
| 
 | 
 | ||||||
|               if (decodedCursor.offset === 0) { |               if (decodedCursor.offset === 0) { | ||||||
|                 // get pins for the page and return those separately
 |                 // get pins for the page and return those separately
 | ||||||
|                 pins = await models.$queryRaw(`SELECT rank_filter.*
 |                 pins = await itemQueryWithUsers(models, `SELECT rank_filter.*
 | ||||||
|                   FROM ( |                   FROM ( | ||||||
|                     ${SELECT}, |                     ${SELECT}, | ||||||
|                     rank() OVER ( |                     rank() OVER ( | ||||||
| @ -331,7 +340,7 @@ export default { | |||||||
|     }, |     }, | ||||||
|     allItems: async (parent, { cursor }, { me, models }) => { |     allItems: async (parent, { cursor }, { me, models }) => { | ||||||
|       const decodedCursor = decodeCursor(cursor) |       const decodedCursor = decodeCursor(cursor) | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         ORDER BY created_at DESC |         ORDER BY created_at DESC | ||||||
| @ -348,7 +357,7 @@ export default { | |||||||
|         return me ? ` AND "userId" <> ${me.id} ` : '' |         return me ? ` AND "userId" <> ${me.id} ` : '' | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "Item"."weightedVotes" - "Item"."weightedDownVotes" <= -${ITEM_FILTER_THRESHOLD} |         WHERE "Item"."weightedVotes" - "Item"."weightedDownVotes" <= -${ITEM_FILTER_THRESHOLD} | ||||||
| @ -367,7 +376,7 @@ export default { | |||||||
|         return me ? ` AND "userId" <> ${me.id} ` : '' |         return me ? ` AND "userId" <> ${me.id} ` : '' | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "Item"."weightedVotes" - "Item"."weightedDownVotes" < 0 |         WHERE "Item"."weightedVotes" - "Item"."weightedDownVotes" < 0 | ||||||
| @ -384,7 +393,7 @@ export default { | |||||||
|     freebieItems: async (parent, { cursor }, { me, models }) => { |     freebieItems: async (parent, { cursor }, { me, models }) => { | ||||||
|       const decodedCursor = decodeCursor(cursor) |       const decodedCursor = decodeCursor(cursor) | ||||||
| 
 | 
 | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "Item".freebie |         WHERE "Item".freebie | ||||||
| @ -406,16 +415,14 @@ export default { | |||||||
|         }) |         }) | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const items = await models.$queryRaw( |       const items = await itemQueryWithUsers(models, ` | ||||||
|         `${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE "userId" = $1 |         WHERE "userId" = $1 | ||||||
|         AND "bounty" IS NOT NULL |         AND "bounty" IS NOT NULL | ||||||
|         ORDER BY created_at DESC |         ORDER BY created_at DESC | ||||||
|         OFFSET $2 |         OFFSET $2 | ||||||
|         LIMIT $3`,
 |         LIMIT $3`, user.id, decodedCursor.offset, limit || LIMIT)
 | ||||||
|         user.id, decodedCursor.offset, limit || LIMIT |  | ||||||
|       ) |  | ||||||
| 
 | 
 | ||||||
|       return { |       return { | ||||||
|         cursor: items.length === (limit || LIMIT) ? nextCursorEncoded(decodedCursor) : null, |         cursor: items.length === (limit || LIMIT) ? nextCursorEncoded(decodedCursor) : null, | ||||||
| @ -431,7 +438,7 @@ export default { | |||||||
|       let comments, user |       let comments, user | ||||||
|       switch (sort) { |       switch (sort) { | ||||||
|         case 'recent': |         case 'recent': | ||||||
|           comments = await models.$queryRaw(` |           comments = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             JOIN "Item" root ON "Item"."rootId" = root.id |             JOIN "Item" root ON "Item"."rootId" = root.id | ||||||
| @ -452,7 +459,7 @@ export default { | |||||||
|             throw new UserInputError('no user has that name', { argumentName: 'name' }) |             throw new UserInputError('no user has that name', { argumentName: 'name' }) | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           comments = await models.$queryRaw(` |           comments = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             WHERE "userId" = $1 AND "parentId" IS NOT NULL |             WHERE "userId" = $1 AND "parentId" IS NOT NULL | ||||||
| @ -463,10 +470,9 @@ export default { | |||||||
|             LIMIT ${LIMIT}`, user.id, decodedCursor.time, decodedCursor.offset)
 |             LIMIT ${LIMIT}`, user.id, decodedCursor.time, decodedCursor.offset)
 | ||||||
|           break |           break | ||||||
|         case 'top': |         case 'top': | ||||||
|           comments = await models.$queryRaw(` |           comments = await itemQueryWithUsers(models, ` | ||||||
|           ${SELECT} |           ${SELECT} | ||||||
|           FROM "Item" |           FROM "Item" | ||||||
|           JOIN "Item" root ON "Item"."rootId" = root.id |  | ||||||
|           WHERE "Item"."parentId" IS NOT NULL AND"Item"."deletedAt" IS NULL |           WHERE "Item"."parentId" IS NOT NULL AND"Item"."deletedAt" IS NULL | ||||||
|           AND "Item".created_at <= $1 |           AND "Item".created_at <= $1 | ||||||
|           ${topClause(within)} |           ${topClause(within)} | ||||||
| @ -492,7 +498,7 @@ export default { | |||||||
|         throw new UserInputError('no user has that name', { argumentName: 'name' }) |         throw new UserInputError('no user has that name', { argumentName: 'name' }) | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const items = await models.$queryRaw(` |       const items = await itemQueryWithUsers(models, ` | ||||||
|             ${SELECT} |             ${SELECT} | ||||||
|             FROM "Item" |             FROM "Item" | ||||||
|             JOIN "Bookmark" ON "Bookmark"."itemId" = "Item"."id" AND "Bookmark"."userId" = $1 |             JOIN "Bookmark" ON "Bookmark"."itemId" = "Item"."id" AND "Bookmark"."userId" = $1 | ||||||
| @ -552,7 +558,7 @@ export default { | |||||||
|         similar += '((\\?|#)%)?' |         similar += '((\\?|#)%)?' | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       return await models.$queryRaw(` |       return await itemQueryWithUsers(models, ` | ||||||
|         ${SELECT} |         ${SELECT} | ||||||
|         FROM "Item" |         FROM "Item" | ||||||
|         WHERE LOWER(url) SIMILAR TO LOWER($1) |         WHERE LOWER(url) SIMILAR TO LOWER($1) | ||||||
| @ -880,8 +886,12 @@ export default { | |||||||
| 
 | 
 | ||||||
|       return poll |       return poll | ||||||
|     }, |     }, | ||||||
|     user: async (item, args, { models }) => |     user: async (item, args, { models }) => { | ||||||
|       await models.user.findUnique({ where: { id: item.userId } }), |       if (item.user) { | ||||||
|  |         return item.user | ||||||
|  |       } | ||||||
|  |       return await models.user.findUnique({ where: { id: item.userId } }) | ||||||
|  |     }, | ||||||
|     fwdUser: async (item, args, { models }) => { |     fwdUser: async (item, args, { models }) => { | ||||||
|       if (!item.fwdUserId) { |       if (!item.fwdUserId) { | ||||||
|         return null |         return null | ||||||
|  | |||||||
| @ -19,11 +19,11 @@ export const ITEM_FIELDS = gql` | |||||||
|     otsHash |     otsHash | ||||||
|     position |     position | ||||||
|     sats |     sats | ||||||
|     upvotes |  | ||||||
|     boost |     boost | ||||||
|     bounty |     bounty | ||||||
|     bountyPaidTo |     bountyPaidTo | ||||||
|     path |     path | ||||||
|  |     upvotes | ||||||
|     meSats |     meSats | ||||||
|     meDontLike |     meDontLike | ||||||
|     meBookmark |     meBookmark | ||||||
|  | |||||||
| @ -0,0 +1,26 @@ | |||||||
|  | CREATE OR REPLACE FUNCTION item_comments(_item_id int, _level int, _where text, _order_by text) | ||||||
|  |   RETURNS jsonb | ||||||
|  |   LANGUAGE plpgsql STABLE PARALLEL SAFE AS | ||||||
|  | $$ | ||||||
|  | DECLARE | ||||||
|  |     result  jsonb; | ||||||
|  | BEGIN | ||||||
|  |     IF _level < 1 THEN | ||||||
|  |         RETURN '[]'::jsonb; | ||||||
|  |     END IF; | ||||||
|  | 
 | ||||||
|  |     EXECUTE '' | ||||||
|  |         || 'SELECT COALESCE(jsonb_agg(sub), ''[]''::jsonb) AS comments ' | ||||||
|  |         || 'FROM  ( ' | ||||||
|  |         || '    SELECT "Item".*, "Item".created_at AS "createdAt", "Item".updated_at AS "updatedAt", ' | ||||||
|  |         || '    item_comments("Item".id, $2 - 1, $3, $4) AS comments, to_jsonb(users.*) as user ' | ||||||
|  |         || '    FROM   "Item" p ' | ||||||
|  |         || '    JOIN   "Item" ON "Item"."parentId" = p.id ' | ||||||
|  |         || '    JOIN   users  ON users.id = "Item"."userId" ' | ||||||
|  |         || '    WHERE  p.id = $1 ' || _where || ' ' | ||||||
|  |         ||      _order_by | ||||||
|  |         || ' ) sub' | ||||||
|  |     INTO result USING _item_id, _level, _where, _order_by; | ||||||
|  |     RETURN result; | ||||||
|  | END | ||||||
|  | $$; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user