From fbcf21cd9d15a53568c6ee56c7f11fe65dd41dfc Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Mon, 3 Jun 2013 00:16:02 -0400 Subject: [PATCH] groups: optimize public groups fetch by putting in same fetch as myGroups (but before, due to projections bug) --- src/app/index.coffee | 89 ++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/src/app/index.coffee b/src/app/index.coffee index 125fb5566a..2da29431fd 100644 --- a/src/app/index.coffee +++ b/src/app/index.coffee @@ -34,55 +34,54 @@ setupSubscriptions = (page, model, params, next, cb) -> # Fetch public groups as _publicGroups # Note: due to https://github.com/codeparty/racer/issues/57, this has to come at the very beginning. The more limited # the returned fields in motifs, the sooner they must come in fetch / subscribes. - model.query('groups').publicGroups().fetch (err, pg) -> + publicGroupsQuery = model.query('groups').publicGroups() + myGroupsQuery = model.query('groups').withMember(uuid) + model.fetch publicGroupsQuery, myGroupsQuery, (err, publicGroups, groups) -> return next(err) if err - model.set '_publicGroups', _.sortBy(pg.get(), (g) -> -_.size(g.members)) + model.set '_publicGroups', _.sortBy(publicGroups.get(), (g) -> -_.size(g.members)) + finished = (descriptors, paths) -> + # Add public "Tavern" guild in + descriptors.push('groups.habitrpg'); paths.push('_habitRPG') - model.query('groups').withMember(uuid).fetch (err, groups) -> - return next(err) if err - finished = (descriptors, paths) -> - # Add public "Tavern" guild in - descriptors.push('groups.habitrpg'); paths.push('_habitRPG') - - # Subscribe to each descriptor - model.subscribe.apply model, descriptors.concat -> - [err, refs] = [arguments[0], arguments] - return next(err) if err - _.each paths, (path, idx) -> model.ref path, refs[idx+1]; true - unless model.get('_user') - console.error "User not found - this shouldn't be happening!" - return page.redirect('/logout') #delete model.session.userId - - return cb() - - groupsObj = groups.get() - - # (1) Solo player - return finished([selfQ], ['_user']) if _.isEmpty(groupsObj) - - ## (2) Party or Guild has members, fetch those users too - # Subscribe to the groups themselves. We separate them by _party, _guilds, and _habitRPG (the "global" guild). - groupsInfo = _.reduce groupsObj, ((m,g)-> - if g.type is 'guild' then m.guildIds.push(g.id) else m.partyId = g.id - m.members = m.members.concat(g.members) - m - ), {guildIds:[], partyId:null, members:[]} - - # Fetch, not subscribe. There's nothing dynamic we need from members, just the the Group (below) which includes chat, challenges, etc - model.query('users').publicInfo(groupsInfo.members).fetch (err, members) -> + # Subscribe to each descriptor + model.subscribe.apply model, descriptors.concat -> + [err, refs] = [arguments[0], arguments] return next(err) if err - # we need _members as an object in the view, so we can iterate over _party.members as :id, and access _members[:id] for the info - mObj = members.get() - model.set "_members", _.object(_.pluck(mObj,'id'), mObj) - model.set "_membersArray", mObj + _.each paths, (path, idx) -> model.ref path, refs[idx+1]; true + unless model.get('_user') + console.error "User not found - this shouldn't be happening!" + return page.redirect('/logout') #delete model.session.userId - # Note - selfQ *must* come after membersQ in subscribe, otherwise _user will only get the fields restricted by party-members in store.coffee. Strang bug, but easy to get around - partyQ = model.query('groups').withIds(groupsInfo.partyId) - if _.isEmpty(groupsInfo.guildIds) - finished [partyQ, selfQ], ['_party', '_user'] - else - guildsQ = model.query('groups').withIds(groupsInfo.guildIds) - finished [partyQ, guildsQ, selfQ], ['_party', '_guilds', '_user'] + return cb() + + groupsObj = groups.get() + + # (1) Solo player + return finished([selfQ], ['_user']) if _.isEmpty(groupsObj) + + ## (2) Party or Guild has members, fetch those users too + # Subscribe to the groups themselves. We separate them by _party, _guilds, and _habitRPG (the "global" guild). + groupsInfo = _.reduce groupsObj, ((m,g)-> + if g.type is 'guild' then m.guildIds.push(g.id) else m.partyId = g.id + m.members = m.members.concat(g.members) + m + ), {guildIds:[], partyId:null, members:[]} + + # Fetch, not subscribe. There's nothing dynamic we need from members, just the the Group (below) which includes chat, challenges, etc + model.query('users').publicInfo(groupsInfo.members).fetch (err, members) -> + return next(err) if err + # we need _members as an object in the view, so we can iterate over _party.members as :id, and access _members[:id] for the info + mObj = members.get() + model.set "_members", _.object(_.pluck(mObj,'id'), mObj) + model.set "_membersArray", mObj + + # Note - selfQ *must* come after membersQ in subscribe, otherwise _user will only get the fields restricted by party-members in store.coffee. Strang bug, but easy to get around + partyQ = model.query('groups').withIds(groupsInfo.partyId) + if _.isEmpty(groupsInfo.guildIds) + finished [partyQ, selfQ], ['_party', '_user'] + else + guildsQ = model.query('groups').withIds(groupsInfo.guildIds) + finished [partyQ, guildsQ, selfQ], ['_party', '_guilds', '_user'] # ========== ROUTES ==========