diff --git a/haskell-experiments/src/Datalog/NaiveDatabase.hs b/haskell-experiments/src/Datalog/NaiveDatabase.hs index e88c2f9..c0fdbd1 100644 --- a/haskell-experiments/src/Datalog/NaiveDatabase.hs +++ b/haskell-experiments/src/Datalog/NaiveDatabase.hs @@ -108,12 +108,6 @@ withFactsAndRules :: [Text] -> [Text] -> NaiveDatabase withFactsAndRules facts = foldr (addRule . extractRule) (withFacts facts) where -extractRule :: Text -> (Literal, [Literal]) -extractRule ruleText = - case parseDatalog ruleText of - Right (Rule (HeadSingle lhs) rhs) -> (lhs, rhs) - Right otherStatement -> throw $ NonRuleException ruleText otherStatement - Left ex -> throw $ CannotParseStatementException ruleText ex digestHead :: NaiveDatabase -> Relation -> Literal -> RuleContext digestHead db relation (Literal neg relationName terms) = RuleContext @@ -186,12 +180,6 @@ addRule (ruleHead, body) db = relationMap' = Map.insert relationName relation' relationMap constants' = constants db' -extractVariableNames :: [Term] -> [Text] -extractVariableNames = mapMaybe extractVariableName where - extractVariableName :: Term -> Maybe Text - extractVariableName (Var name) = Just name - extractVariableName _ = Nothing - query :: NaiveDatabase -> Text -> Text query db qText = case parseDatalog qText of @@ -199,14 +187,3 @@ query db qText = Right otherStatement -> throw $ NonQueryException qText otherStatement Left ex -> throw $ CannotParseStatementException qText ex -data NaiveDatabaseException - = CannotParseStatementException Text (ParseErrorBundle Text Void) - | NonFactException Text Statement - | NonRuleException Text Statement - | NonQueryException Text Statement - | BadArityException Text Int - | VariableLookupException Text [Text] - | UnexpectedConstantException Constant - deriving (Show) - -instance Exception NaiveDatabaseException \ No newline at end of file diff --git a/haskell-experiments/src/Datalog/Rules.hs b/haskell-experiments/src/Datalog/Rules.hs index 5104ad7..5b244f1 100644 --- a/haskell-experiments/src/Datalog/Rules.hs +++ b/haskell-experiments/src/Datalog/Rules.hs @@ -52,6 +52,13 @@ data BodyConstraint = BodyConstraint , _elements :: [RuleElement] } +extractRule :: Text -> (Literal, [Literal]) +extractRule ruleText = + case parseDatalog ruleText of + Right (Rule (HeadSingle lhs) rhs) -> (lhs, rhs) + Right otherStatement -> throw $ NonRuleException ruleText otherStatement + Left ex -> throw $ CannotParseStatementException ruleText ex + appendRule :: Relation -> RelationRule -> Relation appendRule relation rule = relation { @@ -65,3 +72,20 @@ toRuleBodyElement (BodyConstraint subRelation elements) = , _ruleElements = elements } +extractVariableNames :: [Term] -> [Text] +extractVariableNames = mapMaybe extractVariableName where + extractVariableName :: Term -> Maybe Text + extractVariableName (Var name) = Just name + extractVariableName _ = Nothing + +data DatalogDBException + = CannotParseStatementException Text (ParseErrorBundle Text Void) + | NonFactException Text Statement + | NonRuleException Text Statement + | NonQueryException Text Statement + | BadArityException Text Int + | VariableLookupException Text [Text] + | UnexpectedConstantException Constant + deriving (Show) + +instance Exception DatalogDBException