module Components.ObjectHandlers.ObjectsHandler where


import Control.Exception (throw)
import Model.ServerExceptions (
        ReferenceException(
            UnrecognisedObjectException,
            DisagreeingObjectFieldsException,
            UnrecognisedScalarException,
            UnrecognisedArgumentException,
            UnrecognisedRelationshipException
        )
    )
import Model.ServerObjectTypes (
        NestedObject(..),
        ServerObject,
        ScalarType(..),
        Alias,
        SubSelection,
        SubFields,
        Field,
        InlinefragmentObject(..),
        Argument,
        Transformation
    )
import Components.Util (fst3,fst4)


-- SCALAR FIELDS
getScalarFieldLabel :: ScalarType -> String
getScalarFieldLabel :: ScalarType -> String
getScalarFieldLabel (ScalarType Nothing name :: String
name _ _) = String
name
getScalarFieldLabel (ScalarType (Just alias :: String
alias) _ _ _) = String
alias

-- NESTED OBJECTS
getServerObject :: NestedObject -> ServerObject
getServerObject :: NestedObject -> String
getServerObject (NestedObject _ _ sobj :: String
sobj _ _) = String
sobj
withSubSelection :: NestedObject -> Bool
withSubSelection :: NestedObject -> Bool
withSubSelection (NestedObject _ _ _ ss :: SubSelection
ss _) = (SubSelection
ssSubSelection -> SubSelection -> Bool
forall a. Eq a => a -> a -> Bool
/=SubSelection
forall a. Maybe a
Nothing)
getSubSelectionField :: NestedObject -> String
getSubSelectionField :: NestedObject -> String
getSubSelectionField (NestedObject _ _ _ (Just (ScalarType _ name :: String
name _ _)) _) = String
name
getSubSelectionField _ = String -> String
forall a. HasCallStack => String -> a
error "Subselection request value is not found (source error)."
getSubSelectionArgument :: NestedObject -> String
getSubSelectionArgument :: NestedObject -> String
getSubSelectionArgument (NestedObject _ _ _ (Just (ScalarType _ _ _ (Just arg :: String
arg))) _) = String
arg
getSubSelectionArgument _ = String -> String
forall a. HasCallStack => String -> a
error "Subselection request value is not found (source error)."
getSubFields :: NestedObject -> SubFields
getSubFields :: NestedObject -> SubFields
getSubFields (NestedObject _ _ _ _ sf :: SubFields
sf) = SubFields
sf
isSameNObjectReference :: NestedObject -> NestedObject -> Bool
isSameNObjectReference :: NestedObject -> NestedObject -> Bool
isSameNObjectReference (NestedObject alias1 :: Maybe String
alias1 name1 :: String
name1 sobj1 :: String
sobj1 _ _) (NestedObject alias2 :: Maybe String
alias2 name2 :: String
name2 sobj2 :: String
sobj2 _ _) = Maybe String
alias1Maybe String -> Maybe String -> Bool
forall a. Eq a => a -> a -> Bool
==Maybe String
alias2Bool -> Bool -> Bool
&&String
name1String -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
name2Bool -> Bool -> Bool
&&String
sobj1String -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
sobj2
isSameObjectSubSelection :: NestedObject -> NestedObject -> Bool
isSameObjectSubSelection :: NestedObject -> NestedObject -> Bool
isSameObjectSubSelection (NestedObject _ _ _ ss1 :: SubSelection
ss1 _) (NestedObject _ _ _ ss2 :: SubSelection
ss2 _) = SubSelection
ss1SubSelection -> SubSelection -> Bool
forall a. Eq a => a -> a -> Bool
==SubSelection
ss2
getNestedObjectFieldLabel :: NestedObject -> String
getNestedObjectFieldLabel :: NestedObject -> String
getNestedObjectFieldLabel (NestedObject Nothing name :: String
name _ _ _) = String
name
getNestedObjectFieldLabel (NestedObject (Just alias :: String
alias) _ _ _ _) = String
alias

-- BASIC
getIntersection :: Eq a => [[a]] -> [a]
getIntersection :: [[a]] -> [a]
getIntersection [] = []
getIntersection ([]:t :: [[a]]
t) = []
getIntersection ((h :: a
h:t1 :: [a]
t1):t2 :: [[a]]
t2) = if ([a] -> Bool) -> [[a]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem a
h) [[a]]
t2 then a
ha -> [a] -> [a]
forall a. a -> [a] -> [a]
:[[a]] -> [a]
forall a. Eq a => [[a]] -> [a]
getIntersection ([a]
t1[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
:[[a]]
t2) else [[a]] -> [a]
forall a. Eq a => [[a]] -> [a]
getIntersection ([a]
t1[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
:[[a]]
t2)

-- REFERENCE SCHEMA
{-
parsing frontend query to server query
- A valid argument is any string that is provided to reference database objects
-}
readServerObject :: String -> [(String,[String])] -> [(String,[String],[String])] -> ServerObject
readServerObject :: String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject str :: String
str ptv :: [(String, [String])]
ptv ((a :: String
a,b :: [String]
b,_):t :: [(String, [String], [String])]
t) = if (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
str [String]
b)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True then (String
a :: ServerObject) else String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject String
str [(String, [String])]
ptv [(String, [String], [String])]
t
readServerObject str :: String
str ((a :: String
a,b :: [String]
b):t :: [(String, [String])]
t) [] = if (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
str [String]
b)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True then (String
a :: ServerObject) else String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject String
str [(String, [String])]
t []
readServerObject _ [] [] = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
readFieldObject :: String -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> ServerObject -> ServerObject
readFieldObject :: String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject str :: String
str ((ptv :: String
ptv,objs :: [(String, [String])]
objs):rst :: [(String, [(String, [String])])]
rst) [] hld :: String
hld = if String
hldString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
ptv then
    String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject String
str [(String, [String])]
objs []
  else String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject String
str [(String, [(String, [String])])]
rst [] String
hld
readFieldObject str :: String
str ptvs :: [(String, [(String, [String])])]
ptvs ((pObj :: String
pObj,_,pCldn :: [String]
pCldn):rst :: [(String, [String], [String])]
rst) hld :: String
hld = if String
hldString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
pObj then 
    [String] -> String
findSingularObject ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\cld :: String
cld->String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject String
str [(String, [(String, [String])])]
ptvs [] String
cld) [String]
pCldn
  else String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject String
str [(String, [(String, [String])])]
ptvs [(String, [String], [String])]
rst String
hld
readFieldObject _ [] [] _ = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
findSingularObject :: [String] -> String
findSingularObject :: [String] -> String
findSingularObject (fst :: String
fst:rst :: [String]
rst) = if (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==) String
fst) [String]
rst then String
fst else ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
DisagreeingObjectFieldsException
findSingularObject [] = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
-- INLINE-FRAGMENTS
isSameIFObjectReference :: InlinefragmentObject -> InlinefragmentObject -> Bool
isSameIFObjectReference :: InlinefragmentObject -> InlinefragmentObject -> Bool
isSameIFObjectReference (InlinefragmentObject obj1 :: String
obj1 _) (InlinefragmentObject obj2 :: String
obj2 _) = String
obj1String -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
obj2
-- SERVER OBJECTS
isValidServerObjectChild :: ServerObject -> ServerObject -> [(String,[String],[String])] -> Bool
isValidServerObjectChild :: String -> String -> [(String, [String], [String])] -> Bool
isValidServerObjectChild pnt :: String
pnt cld :: String
cld ((so :: String
so,_,cdn :: [String]
cdn):t :: [(String, [String], [String])]
t) = if String
pntString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
so then String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
cld [String]
cdn else String -> String -> [(String, [String], [String])] -> Bool
isValidServerObjectChild String
pnt String
cld [(String, [String], [String])]
t
isValidServerObjectChild _ _ [] = Bool
False
-- SCHEMA HEIRARCHY
isServerObjectTable :: String -> ServerObject -> [(String,[String],String)] -> [(String,[String],[String])] -> Bool
isServerObjectTable :: String
-> String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> Bool
isServerObjectTable tbl :: String
tbl soj :: String
soj sodn :: [(String, [String], String)]
sodn soa :: [(String, [String], [String])]
soa = (([String], String) -> Bool) -> [([String], String)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==) String
tbl (String -> Bool)
-> (([String], String) -> String) -> ([String], String) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String], String) -> String
forall a b. (a, b) -> b
snd) ([([String], String)] -> Bool) -> [([String], String)] -> Bool
forall a b. (a -> b) -> a -> b
$ String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> [([String], String)]
translateServerObjectToDBName String
soj [(String, [String], String)]
sodn [(String, [String], [String])]
soa 
translateTableToObject :: String -> [(String,[String],String)] -> String
translateTableToObject :: String -> [(String, [String], String)] -> String
translateTableToObject tbl :: String
tbl ((pObj :: String
pObj,_,pTbl :: String
pTbl):rst :: [(String, [String], String)]
rst) = if String
tblString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
pTbl then String
pObj else String -> [(String, [String], String)] -> String
translateTableToObject String
tbl [(String, [String], String)]
rst
translateTableToObject _ [] = String -> String
forall a. HasCallStack => String -> a
error "Table not found in schema (source error)."
countTableIds :: String -> [(String,[String],String)] -> Int
countTableIds :: String -> [(String, [String], String)] -> Int
countTableIds tbl :: String
tbl ((_,ids :: [String]
ids,ntbl :: String
ntbl):t :: [(String, [String], String)]
t) = if String
tblString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
ntbl then [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ids else String -> [(String, [String], String)] -> Int
countTableIds String
tbl [(String, [String], String)]
t
countTableIds " " _ = 0
countTableIds _ [] = String -> Int
forall a. HasCallStack => String -> a
error "Table not found in schema (source error)."
fetchTableIds :: String -> [(String,[String],String)] -> [String]
fetchTableIds :: String -> [(String, [String], String)] -> [String]
fetchTableIds tbl :: String
tbl ((_,ids :: [String]
ids,ntbl :: String
ntbl):t :: [(String, [String], String)]
t) = if String
tblString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
ntbl then [String]
ids else String -> [(String, [String], String)] -> [String]
fetchTableIds String
tbl [(String, [String], String)]
t
{-
checking server type attributes
-}
-- returns exclusive list of valid fields that are found in the database table for each Server object 
-- this is used to check queries against valid subfields
isValidServerObjectScalarField :: ServerObject -> String -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
isValidServerObjectScalarField :: String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField sobj :: String
sobj name :: String
name ((ptv :: String
ptv,fds :: [(String, String, [(String, [(String, String, String, String)])])]
fds):t :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
t) []
 | String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
ptv = ((String, String, [(String, [(String, String, String, String)])])
 -> Bool)
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==) String
name (String -> Bool)
-> ((String, String,
     [(String, [(String, String, String, String)])])
    -> String)
-> (String, String, [(String, [(String, String, String, String)])])
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, String, [(String, [(String, String, String, String)])])
-> String
forall a b c. (a, b, c) -> a
fst3) [(String, String, [(String, [(String, String, String, String)])])]
fds
 | Bool
otherwise = String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField String
sobj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
t []
isValidServerObjectScalarField sobj :: String
sobj name :: String
name pvs :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs ((pnt :: String
pnt,_,cdn :: [String]
cdn):t :: [(String, [String], [String])]
t) = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
pnt then (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\x :: String
x->String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField String
x String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs []) [String]
cdn else String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField String
sobj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs [(String, [String], [String])]
t
isValidServerObjectScalarField _ _ [] _ = ReferenceException -> Bool
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
isValidScalarTransformation :: ServerObject -> String -> Transformation -> Argument -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
isValidScalarTransformation :: String
-> String
-> Maybe String
-> Maybe String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation _ _ Nothing _ _ _ = Bool
True
isValidScalarTransformation sobj :: String
sobj name :: String
name (Just trans :: String
trans) arg :: Maybe String
arg ((ptv :: String
ptv,fds :: [(String, String, [(String, [(String, String, String, String)])])]
fds):t :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
t) [] = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
ptv then String
-> String
-> Maybe String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> Bool
findAndCheckScalarTransformation String
name String
trans Maybe String
arg [(String, String, [(String, [(String, String, String, String)])])]
fds else String
-> String
-> Maybe String
-> Maybe String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation String
sobj String
name (String -> Maybe String
forall a. a -> Maybe a
Just String
trans) Maybe String
arg [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
t []
isValidScalarTransformation sobj :: String
sobj name :: String
name trans :: Maybe String
trans arg :: Maybe String
arg pvs :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs ((pnt :: String
pnt,_,cdn :: [String]
cdn):t :: [(String, [String], [String])]
t) = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
pnt then (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\x :: String
x->String
-> String
-> Maybe String
-> Maybe String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation String
x String
name Maybe String
trans Maybe String
arg [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs []) [String]
cdn else String
-> String
-> Maybe String
-> Maybe String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation String
sobj String
name Maybe String
trans Maybe String
arg [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
pvs [(String, [String], [String])]
t
isValidScalarTransformation _ _ _ _ [] _ = ReferenceException -> Bool
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
findAndCheckScalarTransformation :: String -> String -> Argument -> [(String,String,[(String,[(String,String,String,String)])])] -> Bool
findAndCheckScalarTransformation :: String
-> String
-> Maybe String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> Bool
findAndCheckScalarTransformation name :: String
name trans :: String
trans arg :: Maybe String
arg ((n :: String
n,_,args :: [(String, [(String, String, String, String)])]
args):t :: [(String, String, [(String, [(String, String, String, String)])])]
t) = if String
nameString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
n then String
-> Maybe String
-> [(String, [(String, String, String, String)])]
-> Bool
findAndCheckTransformationOption String
trans Maybe String
arg [(String, [(String, String, String, String)])]
args else String
-> String
-> Maybe String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> Bool
findAndCheckScalarTransformation String
name String
trans Maybe String
arg [(String, String, [(String, [(String, String, String, String)])])]
t
findAndCheckScalarTransformation name :: String
name trans :: String
trans arg :: Maybe String
arg [] = ReferenceException -> Bool
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedScalarException
findAndCheckTransformationOption :: String -> Argument -> [(String,[(String,String,String,String)])] -> Bool
findAndCheckTransformationOption :: String
-> Maybe String
-> [(String, [(String, String, String, String)])]
-> Bool
findAndCheckTransformationOption _ Nothing _ = Bool
True
findAndCheckTransformationOption trans :: String
trans (Just arg :: String
arg) ((name :: String
name,opts :: [(String, String, String, String)]
opts):t :: [(String, [(String, String, String, String)])]
t) = if String
transString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
name then ((String, String, String, String) -> Bool)
-> [(String, String, String, String)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==) String
arg (String -> Bool)
-> ((String, String, String, String) -> String)
-> (String, String, String, String)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, String, String, String) -> String
forall a b c d. (a, b, c, d) -> a
fst4) [(String, String, String, String)]
opts else String
-> Maybe String
-> [(String, [(String, String, String, String)])]
-> Bool
findAndCheckTransformationOption String
trans (String -> Maybe String
forall a. a -> Maybe a
Just String
arg) [(String, [(String, String, String, String)])]
t
findAndCheckTransformationOption _ _ [] = ReferenceException -> Bool
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedArgumentException
-- INTERFACES
-- split server object to sql query
-- EFFECTS: returns the database table references for the server object.
translateServerObjectToDBName :: ServerObject -> [(String,[String],String)] -> [(String,[String],[String])] -> [([String],String)]
translateServerObjectToDBName :: String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> [([String], String)]
translateServerObjectToDBName sobj :: String
sobj ((a :: String
a,b :: [String]
b,c :: String
c):t :: [(String, [String], String)]
t) [] = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
a then [([String]
b,String
c)] else String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> [([String], String)]
translateServerObjectToDBName String
sobj [(String, [String], String)]
t []
translateServerObjectToDBName sobj :: String
sobj pdn :: [(String, [String], String)]
pdn ((so :: String
so,_,cdn :: [String]
cdn):t :: [(String, [String], [String])]
t) = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
so then [[([String], String)]] -> [([String], String)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[([String], String)]] -> [([String], String)])
-> [[([String], String)]] -> [([String], String)]
forall a b. (a -> b) -> a -> b
$ (String -> [([String], String)])
-> [String] -> [[([String], String)]]
forall a b. (a -> b) -> [a] -> [b]
map (\x :: String
x->String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> [([String], String)]
translateServerObjectToDBName String
x [(String, [String], String)]
pdn []) [String]
cdn else String
-> [(String, [String], String)]
-> [(String, [String], [String])]
-> [([String], String)]
translateServerObjectToDBName String
sobj [(String, [String], String)]
pdn [(String, [String], [String])]
t
translateServerObjectToDBName _ [] _ = ReferenceException -> [([String], String)]
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
getDBObjectRelationships :: String -> String -> [(String,String,[String])] -> [String]
getDBObjectRelationships :: String -> String -> [(String, String, [String])] -> [String]
getDBObjectRelationships from :: String
from to :: String
to ((a :: String
a,b :: String
b,c :: [String]
c):t :: [(String, String, [String])]
t) = if String
fromString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
aBool -> Bool -> Bool
&&String
toString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
b then [String]
c else String -> String -> [(String, String, [String])] -> [String]
getDBObjectRelationships String
from String
to [(String, String, [String])]
t
getDBObjectRelationships _ _ [] = ReferenceException -> [String]
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedRelationshipException
isInterface :: [(String,[String],[String])] -> ServerObject -> Bool
isInterface :: [(String, [String], [String])] -> String -> Bool
isInterface ((so :: String
so,_,_):t :: [(String, [String], [String])]
t) sobj :: String
sobj = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
so then Bool
True else [(String, [String], [String])] -> String -> Bool
isInterface [(String, [String], [String])]
t String
so
isInterface [] _ = Bool
False
translateInterfaceToServerObjects :: [(String,[String],[String])] -> ServerObject -> [String]
translateInterfaceToServerObjects :: [(String, [String], [String])] -> String -> [String]
translateInterfaceToServerObjects ((so :: String
so,_,cdn :: [String]
cdn):t :: [(String, [String], [String])]
t) sobj :: String
sobj = if String
sobjString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
so then [String]
cdn else [(String, [String], [String])] -> String -> [String]
translateInterfaceToServerObjects [(String, [String], [String])]
t String
sobj
translateInterfaceToServerObjects _ _ = ReferenceException -> [String]
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException