riak-1.2.0.0: src/Network/Riak/Search.hs
-- | module: Network.Riak.Search
-- copyright: (c) 2016 Sentenai
-- author: Antonio Nikishaev <me@lelf.lu>
-- license: Apache
--
-- Solr search
--
-- http://docs.basho.com/riak/2.1.3/dev/using/search/
{-# LANGUAGE CPP #-}
module Network.Riak.Search
( IndexInfo
, SearchResult(..)
, Score
, indexInfo
, getIndex
, putIndex
, deleteIndex
, searchRaw
) where
#if __GLASGOW_HASKELL__ <= 708
import Control.Applicative
#endif
import qualified Data.Riak.Proto as Proto
import Network.Riak.Connection.Internal
import Network.Riak.Lens
import qualified Network.Riak.Request as Req
import qualified Network.Riak.Response as Resp
import Network.Riak.Types.Internal
-- | 'IndexInfo' smart constructor.
--
-- If 'Nothing', @schema@ defaults to @"_yz_default"@.
--
-- If 'Nothing', @n@ defaults to the default @n@ value for buckets that have not
-- explicitly set the property. In the default installation of @riak@, this is
-- 3 (see https://github.com/basho/riak_core/blob/develop/priv/riak_core.schema).
indexInfo :: Index -> Maybe Schema -> Maybe N -> IndexInfo
indexInfo ix schema nval = Proto.defMessage & Proto.name .~ ix
& Proto.maybe'schema .~ schema
& Proto.maybe'nVal .~ nval
-- | Get an index info for @Just index@, or get all indexes for @Nothing@.
--
-- https://docs.basho.com/riak/kv/2.1.4/developing/api/protocol-buffers/yz-index-get/
getIndex :: Connection -> Maybe Index -> IO [IndexInfo]
getIndex conn ix = Resp.getIndex <$> exchange conn (Req.getIndex ix)
-- | Create a new index or modify an existing index.
--
-- https://docs.basho.com/riak/kv/2.1.4/developing/api/protocol-buffers/yz-index-put/
putIndex :: Connection -> IndexInfo -> Maybe Timeout -> IO ([Proto.RpbContent], VClock)
putIndex conn info timeout = Resp.put <$> exchange conn (Req.putIndex info timeout)
-- | Delete an index.
--
-- https://docs.basho.com/riak/kv/2.1.4/developing/api/protocol-buffers/yz-index-delete/
deleteIndex :: Connection -> Index -> IO ()
deleteIndex conn ix = exchange_ conn (Req.deleteIndex ix)
-- | Search by raw 'SearchQuery' request (a 'Data.ByteString.Lazy.Bytestring')
-- using an 'Index'.
searchRaw :: Connection -> SearchQuery -> Index -> IO SearchResult
searchRaw conn q ix = Resp.search <$> exchange conn (Req.search q ix)