Skip to content

Commit d4b6d45

Browse files
authored
Simplify getting all package names and use itemCache in Browse (#1049)
* Simplify getting all package names * Browse: Avoid linear amount of map lookups
1 parent efe31ba commit d4b6d45

File tree

5 files changed

+22
-25
lines changed

5 files changed

+22
-25
lines changed

src/Distribution/Server/Features/Browse.hs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Control.Monad.Except (ExceptT, liftIO, throwError)
66
import Control.Monad.Trans.Class (lift)
77
import Control.Monad.Trans.Except (except)
88
import Data.ByteString.Lazy (ByteString)
9+
import qualified Data.Map as Map
910
import Data.Time (getCurrentTime)
1011

1112
import Data.Aeson (Value(Array), eitherDecode, object, toJSON, (.=))
@@ -14,17 +15,16 @@ import qualified Data.Vector as V
1415

1516
import Distribution.Server.Features.Browse.ApplyFilter (applyFilter)
1617
import Distribution.Server.Features.Browse.Options (BrowseOptions(..), IsSearch(..))
17-
import Distribution.Server.Features.Core (CoreFeature(CoreFeature), queryGetPackageIndex, coreResource)
18+
import Distribution.Server.Features.Core (CoreFeature(CoreFeature), coreResource)
1819
import Distribution.Server.Features.Distro (DistroFeature)
19-
import Distribution.Server.Features.PackageList (ListFeature(ListFeature), makeItemList)
20+
import Distribution.Server.Features.PackageList (ListFeature(ListFeature), getAllLists, makeItemList)
2021
import Distribution.Server.Features.Search (SearchFeature(SearchFeature), searchPackages)
2122
import Distribution.Server.Features.Tags (TagsFeature(TagsFeature), tagsResource)
2223
import Distribution.Server.Features.Users (UserFeature(UserFeature), userResource)
2324
import Distribution.Server.Framework.Error (ErrorResponse(ErrorResponse))
2425
import Distribution.Server.Framework.Feature (HackageFeature(..), emptyHackageFeature)
2526
import Distribution.Server.Framework.Resource (Resource(..), resourceAt)
2627
import Distribution.Server.Framework.ServerEnv (ServerEnv(..))
27-
import qualified Distribution.Server.Pages.Index as Pages
2828

2929
import Happstack.Server.Monads (ServerPartT)
3030
import Happstack.Server.Response (ToMessage(toResponse))
@@ -92,14 +92,18 @@ paginate PaginationConfig{totalNumberOfElements, pageNumber} = do
9292
)
9393

9494
getNewPkgList :: CoreFeature -> UserFeature -> TagsFeature -> ListFeature -> SearchFeature -> DistroFeature -> ServerPartT (ExceptT ErrorResponse IO) Response
95-
getNewPkgList CoreFeature{queryGetPackageIndex, coreResource} UserFeature{userResource} TagsFeature{tagsResource} ListFeature{makeItemList} SearchFeature{searchPackages} distroFeature = do
95+
getNewPkgList CoreFeature{coreResource} UserFeature{userResource} TagsFeature{tagsResource} ListFeature{getAllLists, makeItemList} SearchFeature{searchPackages} distroFeature = do
9696
browseOptionsBS <- lookBS "browseOptions"
9797
browseOptions <- lift (parseBrowseOptions browseOptionsBS)
98-
(isSearch, packageNames) <-
99-
case boSearchTerms browseOptions of
100-
[] -> (IsNotSearch,) <$> Pages.toPackageNames <$> queryGetPackageIndex
101-
terms -> (IsSearch,) <$> liftIO (searchPackages terms)
102-
pkgDetails <- liftIO (makeItemList packageNames)
98+
(isSearch, pkgDetails) <-
99+
liftIO $ case boSearchTerms browseOptions of
100+
[] -> do
101+
allItemsMap <- getAllLists
102+
pure (IsNotSearch, Map.elems allItemsMap)
103+
terms -> do
104+
packageNames <- searchPackages terms
105+
items <- makeItemList packageNames
106+
pure (IsSearch, items)
103107
now <- liftIO getCurrentTime
104108
listOfPkgs <- liftIO $ applyFilter now isSearch coreResource userResource tagsResource distroFeature browseOptions pkgDetails
105109
let config =

src/Distribution/Server/Features/Core.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,8 +683,8 @@ coreFeature ServerEnv{serverBlobStore = store} UserFeature{..}
683683
servePackageList :: DynamicPath -> ServerPartE Response
684684
servePackageList _ = do
685685
pkgIndex <- queryGetPackageIndex
686-
let pkgs = PackageIndex.allPackagesByName pkgIndex
687-
list = [display . pkgName . pkgInfoId $ pkg | pkg <- map head pkgs]
686+
let pkgNames = PackageIndex.allPackageNames pkgIndex
687+
list = map display pkgNames
688688
-- We construct the JSON manually so that we control what it looks like;
689689
-- in particular, we use objects for the packages so that we can add
690690
-- additional fields later without (hopefully) breaking clients

src/Distribution/Server/Features/Tags.hs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,8 @@ tagsFeature CoreFeature{ queryGetPackageIndex }
242242

243243
-- tags on merging
244244
constructMergedTagIndex :: forall m. (Functor m, MonadIO m) => Tag -> Tag -> PackageIndex PkgInfo -> m PackageTags
245-
constructMergedTagIndex orig depr = foldM addToTags emptyPackageTags . PackageIndex.allPackagesByName
246-
where addToTags calcTags pkgList = do
247-
let info = pkgDesc $ last pkgList
248-
!pn = packageName info
245+
constructMergedTagIndex orig depr = foldM addToTags emptyPackageTags . PackageIndex.allPackageNames
246+
where addToTags calcTags pn = do
249247
pkgTags <- queryTagsForPackage pn
250248
if Set.member depr pkgTags
251249
then do

src/Distribution/Server/Packages/PackageIndex.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module Distribution.Server.Packages.PackageIndex (
4242
searchByNameSubstring,
4343

4444
-- ** Bulk queries
45+
allPackageNames,
4546
allPackages,
4647
allPackagesByName
4748
) where
@@ -257,6 +258,9 @@ allPackages (PackageIndex m) = concat (Map.elems m)
257258
allPackagesByName :: Package pkg => PackageIndex pkg -> [[pkg]]
258259
allPackagesByName (PackageIndex m) = Map.elems m
259260

261+
allPackageNames :: PackageIndex pkg -> [PackageName]
262+
allPackageNames (PackageIndex m) = Map.keys m
263+
260264
--
261265
-- * Lookups
262266
--

src/Distribution/Server/Pages/Index.hs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
-- Generate an HTML page listing all available packages
22

3-
module Distribution.Server.Pages.Index (packageIndex, toPackageNames) where
3+
module Distribution.Server.Pages.Index (packageIndex) where
44

55
import Distribution.Server.Pages.Template ( hackagePage )
66
import Distribution.Server.Pages.Util ( packageType )
@@ -31,15 +31,6 @@ packageIndex = formatPkgGroups
3131
. maximumBy (comparing packageVersion))
3232
. PackageIndex.allPackagesByName
3333

34-
toPackageNames :: PackageIndex.PackageIndex PkgInfo -> [PackageName]
35-
toPackageNames = map (pii_pkgName
36-
. mkPackageIndexInfo
37-
. flattenPackageDescription
38-
. pkgDesc
39-
. maximumBy (comparing packageVersion))
40-
. PackageIndex.allPackagesByName
41-
42-
4334
data PackageIndexInfo = PackageIndexInfo {
4435
pii_pkgName :: !PackageName,
4536
pii_categories :: ![Category],

0 commit comments

Comments
 (0)