( getPage'
, putPage'
, deletePage'
+ , getDirContents'
, startIndexManager
+
+ , getAttachment'
+ , putAttachment'
)
where
import qualified Data.Set as S
import Network.HTTP.Lucu
import Network.URI
+import Prelude hiding (words)
+import Rakka.Attachment
import Rakka.Page
import Rakka.Storage.DefaultPage
import Rakka.Storage.Repos
import System.Directory
import System.FilePath
import System.IO
+import System.IO.Unsafe
import System.Log.Logger
import Text.HyperEstraier hiding (WriteLock)
p -> return p
-putPage' :: Repository -> Page -> IO StatusCode
+putPage' :: Repository -> Maybe String -> Page -> IO StatusCode
putPage' = putPageIntoRepository
-deletePage' :: Repository -> PageName -> IO StatusCode
+deletePage' :: Repository -> Maybe String -> PageName -> IO StatusCode
deletePage' = deletePageFromRepository
return . S.unions
+getDirContents' :: Repository -> PageName -> Maybe RevNum -> IO [PageName]
+getDirContents' repos name rev
+ = do reposPages <- getDirContentsInRevision repos name rev
+ defaultPages <- getDefaultDirContents name
+ return $ S.toList (reposPages `S.union` defaultPages)
+
+
getCurrentRevNum :: Repository -> IO RevNum
getCurrentRevNum repos
= getRepositoryFS repos >>= getYoungestRev
+getAttachment' :: Attachment a =>
+ Repository
+ -> PageName
+ -> String
+ -> Maybe RevNum
+ -> IO (Maybe a)
+getAttachment' = loadAttachmentInRepository
+
+
+putAttachment' :: Attachment a =>
+ Repository
+ -> Maybe String
+ -> Maybe RevNum
+ -> PageName
+ -> String
+ -> a
+ -> IO StatusCode
+putAttachment' = putAttachmentIntoRepository
+
+
startIndexManager :: FilePath -> Repository -> (Page -> IO Document) -> IO (TChan IndexReq)
startIndexManager lsdir repos mkDraft
= do chan <- newTChanIO
$ removeFile revFile
Right index <- openDatabase indexDir (Writer [Create []])
+ addAttrIndex index "@type" StrIndex
addAttrIndex index "@uri" SeqIndex
addAttrIndex index "rakka:revision" SeqIndex
+ addAttrIndex index "rakka:isTheme" StrIndex
+ addAttrIndex index "rakka:isFeed" StrIndex
noticeM logger ("Created an H.E. index on " ++ indexDir)
return index
mapM_ (updateIndex index repos mkDraft newRev) (S.toList pages)
-searchIndex :: Database -> Condition -> IO [(PageName, RevNum)]
+searchIndex :: Database -> Condition -> IO [SearchResult]
searchIndex index cond
- = searchDatabase index cond >>= mapM fromId
+ = do (ids, hint) <- searchDatabase' index cond
+ mapM (fromId $ map fst hint) ids
where
- fromId :: DocumentID -> IO (PageName, RevNum)
- fromId docId
- = do uri <- getDocURI index docId
- rev <- getDocAttr index docId "rakka:revision"
- >>= return . read . fromJust
- return (decodePageName $ uriPath uri, rev)
+ fromId :: [String] -> DocumentID -> IO SearchResult
+ fromId words docId
+ = do uri <- getDocURI index docId
+ rev <- getDocAttr index docId "rakka:revision"
+ >>= return . read . fromJust
+ snippet <- unsafeInterleaveIO $
+ do doc <- getDocument index docId [NoAttributes, NoKeywords]
+ sn <- makeSnippet doc words 300 80 80
+ return (map toFragment sn)
+ return SearchResult {
+ srPageName = decodePageName $ uriPath uri
+ , srPageRev = rev
+ , srSnippet = snippet
+ }
+
+ toFragment :: Either String (String, String) -> SnippetFragment
+ toFragment (Left t) = NormalText t
+ toFragment (Right (w, _)) = HighlightedWord w
updateIndex :: Database