@@ -42,7 +42,8 @@ module Data.Query (
42 leaveGroupChat,
42 leaveGroupChat,
43 getGroupChatForUser,
43 getGroupChatForUser,
44 getFaculty,
44 getFaculty,
45− updateFaculty
45+ updateFaculty,
48import Squeal.PostgreSQL
49import Squeal.PostgreSQL
@@ -69,6 +70,7 @@ import Servant.Docs
69import Data.Proxy
70import Data.Proxy
70import Data.Vector (Vector, toList, fromList)
71import Data.Vector (Vector, toList, fromList)
71import Data.Text (Text)
72import Data.Text (Text)
73+import qualified Data.Text as T
72import Data.Channel.NamedChannel
74import Data.Channel.NamedChannel
73import Data.Channel.AnonymousChannel
75import Data.Channel.AnonymousChannel
74import Data.Maybe (fromMaybe)
76import Data.Maybe (fromMaybe)
@@ -78,6 +80,9 @@ import Data.Message
78import Server.Query.Dialog
80import Server.Query.Dialog
79import qualified Server.Query.Pagination as P
81import qualified Server.Query.Pagination as P
80import Data.Faculty
82import Data.Faculty
83+import Data.ByteString (ByteString)
84+import Data.Foldable (fold)
82-- MARK: Documentation
87-- MARK: Documentation
@@ -447,6 +452,56 @@ getGroupChatForUserQ = selectStar $
447 where_ (#groupChatId .== param @2) &
452 where_ (#groupChatId .== param @2) &
448 where_ (#groupChatUsers .? param @1)
453 where_ (#groupChatUsers .? param @1)
455+getFacultySearchResultQ :: Query Schema (TuplePG (Only Text)) (RowPG Faculty)
456+getFacultySearchResultQ = selectStar (from (table #faculties) &
457+ where_ (vector @@ query) &
458+ orderBy [tsRankCd vector query & Desc])
460+ vector = tsVector "russian" (textArrayToText [
464+ (arrayToText #facultyTags)])
465+ query = tsQuery (param @1)
468+ :: Expression schema from grouping params ('NotNull 'PGtext)
469+ -> Expression schema from grouping params ('NotNull 'PGtext)
470+ -> Expression schema from grouping params ('NotNull 'PGfloat4)
471+tsRankCd vector query = UnsafeExpression $
472+ "ts_rank_cd" <> parenthesized (commaSeparated . map renderExpression $ [vector, query])
475+ :: ByteString -- ^ Language
476+ -> Expression schema from grouping params ('NotNull 'PGtext)
477+ -> Expression schema from grouping params ('NotNull 'PGtext)
478+tsVector lang x = UnsafeExpression $
479+ "to_tsvector" <> parenthesized (commaSeparated [singleQuotedUtf8 lang, renderExpression x])
482+ :: Expression schema from grouping params ('NotNull 'PGtext)
483+ -> Expression schema from grouping params ('NotNull 'PGtext)
484+tsQuery = unsafeFunction "to_tsquery"
487+ :: Expression schema from grouping params ('NotNull ('PGvararray ('NotNull 'PGtext)))
488+ -> Expression schema from grouping params ('NotNull 'PGtext)
489+arrayToText x = UnsafeExpression $
490+ "array_to_string" <> parenthesized (commaSeparated [renderExpression x, "' '"])
493+ :: Expression schema from grouping params (nullity0 'PGtext)
494+ -> Expression schema from grouping params (nullity1 'PGtext)
495+ -> Expression schema from grouping params (nullity2 'PGbool)
496+(@@) = unsafeBinaryOp "@@"
498+space :: Expression schema from grouping params ('NotNull 'PGtext)
499+space = UnsafeExpression "' '"
502+ :: [Expression schema from grouping params ('NotNull 'PGtext)]
503+ -> Expression schema from grouping params ('NotNull 'PGtext)
504+textArrayToText = fold . L.intersperse space
451-- MARK: FrontEnd Data Structures
506-- MARK: FrontEnd Data Structures
@@ -694,8 +749,15 @@ getGroupChatForUser uId gId = do
694 (Just c) -> return c
749 (Just c) -> return c
695 Nothing -> lift $ S.throwError S.err404
750 Nothing -> lift $ S.throwError S.err404
752+getFacultyFromQuery :: T.Text -> StaticPQ [Faculty]
753+getFacultyFromQuery query =
754+ runQueryParams getFacultySearchResultQ (Only . queryFromText $ query) >>= getRows
697-- MARK: Utils
756-- MARK: Utils
758+queryFromText :: Text -> Text
759+queryFromText = T.unwords . L.intersperse "&" . map (`T.append` ":*") . filter (not . T.null) . T.split (not . isAlphaNum)
699directionToOperator
761directionToOperator
700 :: P.PaginationDirection
762 :: P.PaginationDirection
701 -> (ConditionOp schema0 from0 grouping0 params0 nullity0 nullity1 (ty :: PGType),
763 -> (ConditionOp schema0 from0 grouping0 params0 nullity0 nullity1 (ty :: PGType),