hydra-pg 0.17.2 → 0.17.3
raw patch · 19 files changed
+135/−130 lines, 19 filesdep ~hydra-kerneldep ~hydra-rdfPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hydra-kernel, hydra-rdf
API changes (from Hackage documentation)
Files
- hydra-pg.cabal +3/−3
- src/main/haskell/Hydra/Cypher/OpenCypher.hs +1/−1
- src/main/haskell/Hydra/Decode/Neo4j/Model.hs +4/−4
- src/main/haskell/Hydra/Decode/Pg/Mapping.hs +2/−2
- src/main/haskell/Hydra/Decode/Pg/Model.hs +5/−5
- src/main/haskell/Hydra/Demos/Genpg/Transform.hs +15/−15
- src/main/haskell/Hydra/Graphviz/Coder.hs +12/−11
- src/main/haskell/Hydra/Graphviz/Serde.hs +5/−5
- src/main/haskell/Hydra/Neo4j/Pg.hs +7/−6
- src/main/haskell/Hydra/Pg/Coder.hs +18/−17
- src/main/haskell/Hydra/Pg/Graphson/Coder.hs +1/−1
- src/main/haskell/Hydra/Pg/Graphson/Utils.hs +1/−1
- src/main/haskell/Hydra/Pg/Printing.hs +8/−8
- src/main/haskell/Hydra/Pg/TermsToElements.hs +11/−11
- src/main/haskell/Hydra/Pg/Utils.hs +2/−2
- src/main/haskell/Hydra/Print/Error/Pg.hs +14/−14
- src/main/haskell/Hydra/Tinkerpop/Language.hs +5/−5
- src/main/haskell/Hydra/Validate/Neo4j.hs +7/−6
- src/main/haskell/Hydra/Validate/Pg.hs +14/−13
hydra-pg.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: hydra-pg-version: 0.17.2+version: 0.17.3 synopsis: Hydra's property-graph (TinkerPop/Gremlin) model and coder support description: Hydra is an implementation of the LambdaGraph data model, which takes advantage of an isomorphism between labeled hypergraphs and typed lambda calculus: in Hydra, "graphs are programs, and programs are graphs". Property graph support for Hydra category: Data@@ -77,7 +77,7 @@ base >=4.19.0 && <4.22 , bytestring >=0.11.5 && <0.13 , containers >=0.6.7 && <0.8- , hydra-kernel ==0.17.2- , hydra-rdf ==0.17.2+ , hydra-kernel ==0.17.3+ , hydra-rdf ==0.17.3 , scientific >=0.3.7 && <0.4 default-language: Haskell2010
src/main/haskell/Hydra/Cypher/OpenCypher.hs view
@@ -461,7 +461,7 @@ _MultiPartQuery_body = Core.Name "body" --- | A multiplicative expression: a power expression with zero or more */÷/% terms+-- | A multiplicative expression: a power expression with zero or more multiply, divide, or modulo terms data MultiplyDivideModuloExpression = MultiplyDivideModuloExpression { multiplyDivideModuloExpressionLeft :: PowerOfExpression,
src/main/haskell/Hydra/Decode/Neo4j/Model.hs view
@@ -40,7 +40,7 @@ ( Core.Name "propertyUniqueness", (\input -> Eithers.map (\t -> Model.ConstraintPropertyUniqueness t) (propertyUniquenessConstraint cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -73,7 +73,7 @@ Maps.fromList [ (Core.Name "node", (\input -> Eithers.map (\t -> Model.ElementNode t) (node cx input))), (Core.Name "relationship", (\input -> Eithers.map (\t -> Model.ElementRelationship t) (relationship cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -480,7 +480,7 @@ _ -> Left (Errors.DecodingError "expected string literal") _ -> Left (Errors.DecodingError "expected literal")) (ExtractCore.stripWithDecodingError cx input)))), (Core.Name "time", (\input -> Eithers.map (\t -> Model.ValueTime t) (offsetTime cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -514,7 +514,7 @@ (Core.Name "list", (\input -> Eithers.map (\t -> Model.ValueTypeList t) (valueType cx input))), (Core.Name "vector", (\input -> Eithers.map (\t -> Model.ValueTypeVector t) (vectorType cx input))), (Core.Name "union", (\input -> Eithers.map (\t -> Model.ValueTypeUnion t) (ExtractCore.decodeList valueType cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))
src/main/haskell/Hydra/Decode/Pg/Mapping.hs view
@@ -132,7 +132,7 @@ Maps.fromList [ (Core.Name "vertex", (\input -> Eithers.map (\t -> Mapping.ElementSpecVertex t) (vertexSpec cx input))), (Core.Name "edge", (\input -> Eithers.map (\t -> Mapping.ElementSpecEdge t) (edgeSpec cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -167,7 +167,7 @@ Core.LiteralString v2 -> Right v2 _ -> Left (Errors.DecodingError "expected string literal") _ -> Left (Errors.DecodingError "expected literal")) (ExtractCore.stripWithDecodingError cx input))))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))
src/main/haskell/Hydra/Decode/Pg/Model.hs view
@@ -47,7 +47,7 @@ (Core.Name "in", (\input -> Eithers.map (\t -> Model.DirectionIn) (ExtractCore.decodeUnit cx input))), (Core.Name "both", (\input -> Eithers.map (\t -> Model.DirectionBoth) (ExtractCore.decodeUnit cx input))), (Core.Name "undirected", (\input -> Eithers.map (\t -> Model.DirectionUndirected) (ExtractCore.decodeUnit cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -104,7 +104,7 @@ Maps.fromList [ (Core.Name "vertex", (\input -> Eithers.map (\t -> Model.ElementVertex t) (vertex v cx input))), (Core.Name "edge", (\input -> Eithers.map (\t -> Model.ElementEdge t) (edge v cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -122,7 +122,7 @@ Maps.fromList [ (Core.Name "vertex", (\input -> Eithers.map (\t -> Model.ElementKindVertex) (ExtractCore.decodeUnit cx input))), (Core.Name "edge", (\input -> Eithers.map (\t -> Model.ElementKindEdge) (ExtractCore.decodeUnit cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -151,7 +151,7 @@ Maps.fromList [ (Core.Name "vertex", (\input -> Eithers.map (\t2 -> Model.ElementTypeVertex t2) (vertexType t cx input))), (Core.Name "edge", (\input -> Eithers.map (\t2 -> Model.ElementTypeEdge t2) (edgeType t cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))@@ -202,7 +202,7 @@ Maps.fromList [ (Core.Name "vertex", (\input -> Eithers.map (\t -> Model.LabelVertex t) (vertexLabel cx input))), (Core.Name "edge", (\input -> Eithers.map (\t -> Model.LabelEdge t) (edgeLabel cx input)))]- in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.cat [+ in (Optionals.cases (Maps.lookup fname variantMap) (Left (Errors.DecodingError (Strings.concat [ "no such field ", (Core.unName fname), " in union"]))) (\f -> f fterm))
src/main/haskell/Hydra/Demos/Genpg/Transform.hs view
@@ -67,31 +67,31 @@ decodeValue = \value -> let parseError =- Strings.cat [+ Strings.concat [ "Invalid value for column ", cname, ": ", value] in case typ of Core.TypeLiteral v0 -> case v0 of- Core.LiteralTypeBoolean -> Optionals.cases (Literals.readBoolean value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralBoolean parsed))))+ Core.LiteralTypeBoolean -> Optionals.cases (Literals.parseBoolean value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralBoolean parsed)))) Core.LiteralTypeFloat v1 -> case v1 of Core.FloatTypeFloat32 -> Optionals.cases (Literals.readFloat32 value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 parsed))))) Core.FloatTypeFloat64 -> Optionals.cases (Literals.readFloat64 value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 parsed)))))- _ -> Left (Strings.cat [+ _ -> Left (Strings.concat [ "Unsupported float type for column ", cname]) Core.LiteralTypeInteger v1 -> case v1 of Core.IntegerTypeInt32 -> Optionals.cases (Literals.readInt32 value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 parsed))))) Core.IntegerTypeInt64 -> Optionals.cases (Literals.readInt64 value) (Left parseError) (\parsed -> Right (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 parsed)))))- _ -> Left (Strings.cat [+ _ -> Left (Strings.concat [ "Unsupported integer type for column ", cname]) Core.LiteralTypeString -> Right (Just (Core.TermLiteral (Core.LiteralString value)))- _ -> Left (Strings.cat [+ _ -> Left (Strings.concat [ "Unsupported literal type for column ", cname])- _ -> Left (Strings.cat [+ _ -> Left (Strings.concat [ "Unsupported type for column ", cname]) in (Optionals.cases mvalue (Right Nothing) decodeValue)@@ -143,14 +143,14 @@ let table = Pairs.first p v = Pairs.second p existing = Maps.lookup table m- current = Optionals.fromOptional ([], []) existing+ current = Optionals.withDefault ([], []) existing in (Maps.insert table (Lists.cons v (Pairs.first current), (Pairs.second current)) m) addEdge = \m -> \p -> let table = Pairs.first p e = Pairs.second p existing = Maps.lookup table m- current = Optionals.fromOptional ([], []) existing+ current = Optionals.withDefault ([], []) existing in (Maps.insert table (Pairs.first current, (Lists.cons e (Pairs.second current))) m) vertexMap = Lists.foldl addVertex Maps.empty vertexPairs in (Right (Lists.foldl addEdge vertexMap edgePairs)))))@@ -184,7 +184,7 @@ let extractMaybe = \k -> \term -> case term of Core.TermOptional v0 -> Right (Optionals.map (\v -> (k, v)) v0)- in (Eithers.map (\pairs -> Maps.fromList (Optionals.cat pairs)) (Eithers.mapList (\pair ->+ in (Eithers.map (\pairs -> Maps.fromList (Optionals.givens pairs)) (Eithers.mapList (\pair -> let k = Pairs.first pair spec = Pairs.second pair in (Eithers.bind (Reduction.reduceTerm cx g True (Core.TermApplication (Core.Application {@@ -238,7 +238,7 @@ let acc = Pairs.first (Pairs.first state) field = Pairs.second (Pairs.first state) inQuotes = Pairs.second state- in (Logic.ifElse (Equality.equal c 34) (Logic.ifElse inQuotes ((acc, field), False) (Logic.ifElse (Strings.null field) ((acc, field), True) ((acc, (Strings.cat2 field "\"")), inQuotes))) (Logic.ifElse (Logic.and (Equality.equal c 44) (Logic.not inQuotes)) ((Lists.cons (normalizeField field) acc, ""), False) ((acc, (Strings.cat2 field (Strings.fromList [+ in (Logic.ifElse (Equality.equal c 34) (Logic.ifElse inQuotes ((acc, field), False) (Logic.ifElse (Strings.null field) ((acc, field), True) ((acc, (Strings.concat2 field "\"")), inQuotes))) (Logic.ifElse (Logic.and (Equality.equal c 44) (Logic.not inQuotes)) ((Lists.cons (normalizeField field) acc, ""), False) ((acc, (Strings.concat2 field (Strings.fromList [ c]))), inQuotes))) -- | Parse a CSV line into fields. Empty fields become Nothing.@@ -264,12 +264,12 @@ parseTableLines :: Bool -> [String] -> Either String (Tabular.Table String) parseTableLines hasHeader rawLines = Eithers.bind (Eithers.mapList (\ln -> parseSingleLine ln) rawLines) (\parsedRows ->- let rows = Optionals.cat parsedRows+ let rows = Optionals.givens parsedRows in (Logic.ifElse hasHeader (Optionals.cases (Lists.uncons rows) (Left "empty rows: cannot parse header") (\p -> let headerRow = Pairs.first p dataRows = Pairs.second p in (Logic.ifElse (listAny (\m -> Optionals.isNone m) headerRow) (Left "null header column(s)") (Right (Tabular.Table {- Tabular.tableHeader = (Just (Tabular.HeaderRow (Optionals.cat headerRow))),+ Tabular.tableHeader = (Just (Tabular.HeaderRow (Optionals.givens headerRow))), Tabular.tableData = (Lists.map (\r -> Tabular.DataRow r) dataRows)}))))) (Right (Tabular.Table { Tabular.tableHeader = Nothing, Tabular.tableData = (Lists.map (\r -> Tabular.DataRow r) rows)}))))@@ -298,7 +298,7 @@ id, outId, inId] (Maps.elems props))- in (Logic.ifElse (Equality.equal (Sets.size tables) 1) (Optionals.cases (Lists.maybeHead (Sets.toList tables)) (Left "unreachable: empty tables set") (\x -> Right x)) (Left (Strings.cat [+ in (Logic.ifElse (Equality.equal (Sets.size tables) 1) (Optionals.cases (Lists.head (Sets.toList tables)) (Left "unreachable: empty tables set") (\x -> Right x)) (Left (Strings.concat [ "Specification for ", (PgModel.unEdgeLabel label), " edges has wrong number of tables"])))@@ -311,7 +311,7 @@ id = PgModel.vertexId vertex props = PgModel.vertexProperties vertex tables = findTablesInTerms (Lists.cons id (Maps.elems props))- in (Logic.ifElse (Equality.equal (Sets.size tables) 1) (Optionals.cases (Lists.maybeHead (Sets.toList tables)) (Left "unreachable: empty tables set") (\x -> Right x)) (Left (Strings.cat [+ in (Logic.ifElse (Equality.equal (Sets.size tables) 1) (Optionals.cases (Lists.head (Sets.toList tables)) (Left "unreachable: empty tables set") (\x -> Right x)) (Left (Strings.concat [ "Specification for ", (PgModel.unVertexLabel label), " vertices has wrong number of tables"])))@@ -338,7 +338,7 @@ -- | Transform a record through vertex and edge specifications to produce vertices and edges transformRecord :: t0 -> Graph.Graph -> [PgModel.Vertex Core.Term] -> [PgModel.Edge Core.Term] -> Core.Term -> Either Errors.Error ([PgModel.Vertex Core.Term], [PgModel.Edge Core.Term]) transformRecord cx g vspecs especs record =- Eithers.bind (Eithers.mapList (\spec -> evaluateVertex cx g spec record) vspecs) (\mVertices -> Eithers.bind (Eithers.mapList (\spec -> evaluateEdge cx g spec record) especs) (\mEdges -> Right (Optionals.cat mVertices, (Optionals.cat mEdges))))+ Eithers.bind (Eithers.mapList (\spec -> evaluateVertex cx g spec record) vspecs) (\mVertices -> Eithers.bind (Eithers.mapList (\spec -> evaluateEdge cx g spec record) especs) (\mEdges -> Right (Optionals.givens mVertices, (Optionals.givens mEdges)))) -- | Transform all rows from a table through vertex/edge specifications transformTableRows :: t0 -> Graph.Graph -> [PgModel.Vertex Core.Term] -> [PgModel.Edge Core.Term] -> Tabular.TableType -> [Tabular.DataRow Core.Term] -> Either Errors.Error ([PgModel.Vertex Core.Term], [PgModel.Edge Core.Term])
src/main/haskell/Hydra/Graphviz/Coder.hs view
@@ -118,6 +118,7 @@ (Packaging.ModuleName "hydra.lib.maps", "maps"), (Packaging.ModuleName "hydra.lib.math", "math"), (Packaging.ModuleName "hydra.lib.optionals", "optionals"),+ (Packaging.ModuleName "hydra.lib.ordering", "ordering"), (Packaging.ModuleName "hydra.lib.pairs", "pairs"), (Packaging.ModuleName "hydra.lib.regex", "regex"), (Packaging.ModuleName "hydra.lib.sets", "sets"),@@ -134,24 +135,24 @@ Core.TermAnnotated _ -> simpleLabel "@{}" Core.TermApplication _ -> simpleLabel (Logic.ifElse compact "$" "apply") Core.TermLambda _ -> simpleLabel (Logic.ifElse compact "\955" "lambda")- Core.TermProject v0 -> simpleLabel (Strings.cat [+ Core.TermProject v0 -> simpleLabel (Strings.concat [ "{", (Names.compactName namespaces (Core.projectionTypeName v0)), "}.", (Core.unName (Core.projectionFieldName v0))])- Core.TermCases v0 -> simpleLabel (Strings.cat [+ Core.TermCases v0 -> simpleLabel (Strings.concat [ "cases_{", (Names.compactName namespaces (Core.caseStatementTypeName v0)), "}"])- Core.TermUnwrap v0 -> simpleLabel (Strings.cat [+ Core.TermUnwrap v0 -> simpleLabel (Strings.concat [ "unwrap_{", (Names.compactName namespaces v0), "}"]) Core.TermLet _ -> simpleLabel "let" Core.TermList _ -> simpleLabel (Logic.ifElse compact "[]" "list") Core.TermLiteral v0 -> simpleLabel (case v0 of- Core.LiteralBinary v1 -> Literals.binaryToString v1- Core.LiteralBoolean v1 -> Literals.showBoolean v1+ Core.LiteralBinary v1 -> Literals.binaryToBase64 v1+ Core.LiteralBoolean v1 -> Literals.printBoolean v1 Core.LiteralInteger v1 -> case v1 of Core.IntegerValueBigint v2 -> Literals.showBigint v2 Core.IntegerValueInt8 v2 -> Literals.showInt8 v2@@ -171,12 +172,12 @@ _ -> "?") Core.TermMap _ -> simpleLabel (Logic.ifElse compact "<,>" "map") Core.TermOptional _ -> simpleLabel (Logic.ifElse compact "opt" "optional")- Core.TermRecord v0 -> simpleLabel (Strings.cat2 "\8743" (Names.compactName namespaces (Core.recordTypeName v0)))+ Core.TermRecord v0 -> simpleLabel (Strings.concat2 "\8743" (Names.compactName namespaces (Core.recordTypeName v0))) Core.TermTypeLambda _ -> simpleLabel "tyabs" Core.TermTypeApplication _ -> simpleLabel "tyapp"- Core.TermInject v0 -> simpleLabel (Strings.cat2 "\8891" (Names.compactName namespaces (Core.injectionTypeName v0)))+ Core.TermInject v0 -> simpleLabel (Strings.concat2 "\8891" (Names.compactName namespaces (Core.injectionTypeName v0))) Core.TermVariable v0 -> simpleLabel (Names.compactName namespaces v0)- Core.TermWrap v0 -> simpleLabel (Strings.cat [+ Core.TermWrap v0 -> simpleLabel (Strings.concat [ "(", (Names.compactName namespaces (Core.wrappedTermTypeName v0)), ")"])@@ -281,12 +282,12 @@ \stVis -> \binding -> let bname = Core.bindingName binding bterm = Core.bindingTerm binding- blab = Dot.unId (Optionals.fromOptional (Dot.Id "?") (Maps.lookup bname ids1))+ blab = Dot.unId (Optionals.withDefault (Dot.Id "?") (Maps.lookup bname ids1)) in (encode (Just (blab, nodeStyleElement)) True ids1 (Just selfId) stVis (Paths.SubtermStepLetBinding bname, bterm)) stmts1 = Lists.foldl addBindingTerm (selfStmts, selfVisited) bindings in (encode Nothing False ids1 (Just selfId) stmts1 (Paths.SubtermStepLetBody, env)) Core.TermVariable v0 -> Optionals.cases (Maps.lookup v0 ids) dflt (\i -> (Lists.concat2 stmts [- toAccessorEdgeStmt accessor style (Optionals.fromOptional selfId mparent) i], visited))+ toAccessorEdgeStmt accessor style (Optionals.withDefault selfId mparent) i], visited)) _ -> dflt in (Pairs.first (encode Nothing False Maps.empty Nothing ([], Sets.empty) (Paths.SubtermStepAnnotatedBody, term))) @@ -317,7 +318,7 @@ let lab1 = Paths.subtermNodeId (Paths.subtermEdgeSource edge) lab2 = Paths.subtermNodeId (Paths.subtermEdgeTarget edge) pathAccessors = Paths.unSubtermPath (Paths.subtermEdgePath edge)- showPath = Strings.intercalate "/" (Optionals.cat (Lists.map PrintPaths.subtermStep pathAccessors))+ showPath = Strings.join "/" (Optionals.givens (Lists.map PrintPaths.subtermStep pathAccessors)) in (toEdgeStmt (Dot.Id lab1) (Dot.Id lab2) (Just (Dot.AttrList [ [ labelAttr showPath]])))
src/main/haskell/Hydra/Graphviz/Serde.hs view
@@ -132,7 +132,7 @@ -- | Convert an identifier to an expression idToExpr :: Dot.Id -> Ast.Expr idToExpr i =- Serialization.cst (Strings.cat [+ Serialization.cst (Strings.concat [ "\"", (Dot.unId i), "\""])@@ -143,7 +143,7 @@ let i = Dot.nodeIdId nid mp = Dot.nodeIdPort nid- in (Serialization.noSep (Optionals.cat [+ in (Serialization.noSep (Optionals.givens [ Optionals.pure (idToExpr i), (Optionals.map portToExpr mp)])) @@ -160,7 +160,7 @@ let i = Dot.nodeStmtId ns attr = Dot.nodeStmtAttributes ns- in (Serialization.spaceSep (Optionals.cat [+ in (Serialization.spaceSep (Optionals.givens [ Optionals.pure (nodeIdToExpr i), (Optionals.map attrListToExpr attr)])) @@ -195,7 +195,7 @@ -- | Convert a subgraph identifier to an expression subgraphIdToExpr :: Dot.SubgraphId -> Ast.Expr subgraphIdToExpr sid =- Serialization.spaceSep (Optionals.cat [+ Serialization.spaceSep (Optionals.givens [ Optionals.pure (Serialization.cst "subgraph"), (Optionals.map idToExpr (Dot.unSubgraphId sid))]) @@ -207,6 +207,6 @@ stmts = Dot.subgraphStatements sg body = Serialization.brackets Serialization.curlyBraces Serialization.inlineStyle (Serialization.spaceSep (Lists.map (stmtToExpr directed) stmts))- in (Serialization.spaceSep (Optionals.cat [+ in (Serialization.spaceSep (Optionals.givens [ Optionals.map subgraphIdToExpr mid, (Optionals.pure body)]))
src/main/haskell/Hydra/Neo4j/Pg.hs view
@@ -12,6 +12,7 @@ import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic import qualified Hydra.Overlay.Haskell.Lib.Maps as Maps import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals+import qualified Hydra.Overlay.Haskell.Lib.Ordering as Ordering import qualified Hydra.Overlay.Haskell.Lib.Pairs as Pairs import qualified Hydra.Overlay.Haskell.Lib.Sets as Sets import qualified Hydra.Overlay.Haskell.Lib.Strings as Strings@@ -32,11 +33,11 @@ startStr = Neo4jModel.unNodeLabel startLabel endStr = Neo4jModel.unNodeLabel endLabel expanded =- Strings.cat [+ Strings.concat [ Formatting.decapitalize (Formatting.convertCase Util.CaseConventionPascal Util.CaseConventionCamel startStr), (Formatting.capitalize camelType), (Formatting.capitalize (Formatting.convertCase Util.CaseConventionPascal Util.CaseConventionCamel endStr))]- in (PgModel.EdgeLabel (Logic.ifElse (Equality.gt (Lists.length matching) 1) expanded camelType))+ in (PgModel.EdgeLabel (Logic.ifElse (Ordering.gt (Lists.length matching) 1) expanded camelType)) -- | Convert a property-graph edge to a Neo4j relationship (edge label -> UPPER_SNAKE type). edgeToRelationship :: Neo4jModel.Neo4jMapping t0 -> PgModel.Edge t0 -> Either String Neo4jModel.Relationship@@ -61,9 +62,9 @@ (\nodes2 -> \eid -> let m = Maps.fromList (Lists.map (\n -> (Neo4jModel.unElementId (Neo4jModel.nodeId n), (Sets.toList (Neo4jModel.nodeLabels n)))) nodes2)- in (Optionals.cases (Maps.lookup (Neo4jModel.unElementId eid) m) (Left (Strings.cat [+ in (Optionals.cases (Maps.lookup (Neo4jModel.unElementId eid) m) (Left (Strings.concat [ "no node with id ",- (Neo4jModel.unElementId eid)])) (\labels -> Logic.ifElse (Equality.equal (Lists.length labels) 1) (Right (Optionals.fromOptional (Neo4jModel.NodeLabel "") (Lists.maybeHead labels))) (Left (Strings.cat [+ (Neo4jModel.unElementId eid)])) (\labels -> Logic.ifElse (Equality.equal (Lists.length labels) 1) (Right (Optionals.withDefault (Neo4jModel.NodeLabel "") (Lists.head labels))) (Left (Strings.concat [ "endpoint node is not single-labeled: ", (Neo4jModel.unElementId eid)]))))) nodes in (Eithers.bind (Eithers.mapList (\n -> nodeToVertex mapping n) nodes) (\vertices -> Eithers.bind (Eithers.mapList (\r -> Eithers.bind (labelOf (Neo4jModel.relationshipStart r)) (\startLabel -> Eithers.bind (labelOf (Neo4jModel.relationshipEnd r)) (\endLabel -> relationshipToEdge mapping gt startLabel endLabel r))) rels) (\edges -> Right (vertices, edges))))@@ -73,11 +74,11 @@ nodeToVertex mapping node = let labels = Sets.toList (Neo4jModel.nodeLabels node)- soleLabel = Optionals.fromOptional (Neo4jModel.NodeLabel "") (Lists.maybeHead labels)+ soleLabel = Optionals.withDefault (Neo4jModel.NodeLabel "") (Lists.head labels) in (Logic.ifElse (Equality.equal (Lists.length labels) 1) (Eithers.bind (Neo4jModel.neo4jMappingDecodeId mapping (Neo4jModel.nodeId node)) (\vid -> Eithers.bind ((\mapping2 -> \props -> Eithers.map (\pairs -> Maps.fromList pairs) (Eithers.mapList (\entry -> Eithers.map (\decoded -> (PgModel.PropertyKey (Neo4jModel.unKey (Pairs.first entry)), decoded)) (Neo4jModel.neo4jMappingDecodeValue mapping2 (Pairs.second entry))) (Maps.toList props))) mapping (Neo4jModel.nodeProperties node)) (\props -> Right (PgModel.Vertex { PgModel.vertexLabel = (PgModel.VertexLabel (Neo4jModel.unNodeLabel soleLabel)), PgModel.vertexId = vid,- PgModel.vertexProperties = props})))) (Left (Strings.cat [+ PgModel.vertexProperties = props})))) (Left (Strings.concat [ "cannot map a multi-label Neo4j node to a single-label property-graph vertex: ", (Neo4jModel.unElementId (Neo4jModel.nodeId node))])))
src/main/haskell/Hydra/Pg/Coder.hs view
@@ -25,6 +25,7 @@ import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic import qualified Hydra.Overlay.Haskell.Lib.Maps as Maps import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals+import qualified Hydra.Overlay.Haskell.Lib.Ordering as Ordering import qualified Hydra.Overlay.Haskell.Lib.Pairs as Pairs import qualified Hydra.Overlay.Haskell.Lib.Sets as Sets import qualified Hydra.Overlay.Haskell.Lib.Strings as Strings@@ -60,7 +61,7 @@ -- | Check that a record name matches the expected name checkRecordName :: t0 -> Core.Name -> Core.Name -> Either Errors.Error () checkRecordName cx expected actual =- check cx (Logic.or (Equality.equal (Core.unName expected) "placeholder") (Equality.equal (Core.unName actual) (Core.unName expected))) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "Expected record of type " (Core.unName expected)) ", found record of type ") (Core.unName actual)))))+ check cx (Logic.or (Equality.equal (Core.unName expected) "placeholder") (Equality.equal (Core.unName actual) (Core.unName expected))) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 (Strings.concat2 "Expected record of type " (Core.unName expected)) ", found record of type ") (Core.unName actual))))) -- | Construct an edge coder from components constructEdgeCoder :: t0 -> Graph.Graph -> PgModel.VertexLabel -> Mapping.Schema t1 t2 t3 Errors.Error -> Core.Type -> t2 -> t2 -> PgModel.Direction -> Core.Name -> [Core.FieldType] -> [Coders.Adapter Core.FieldType (PgModel.PropertyType t2) Core.Field (PgModel.Property t3) Errors.Error] -> Maybe (Core.FieldType, (Mapping.ValueSpec, (Maybe String))) -> Maybe (Core.FieldType, (Mapping.ValueSpec, (Maybe String))) -> Either Errors.Error (Coders.Adapter Core.Type (PgModel.ElementTypeTree t2) Core.Term (PgModel.ElementTree t3) Errors.Error)@@ -70,7 +71,7 @@ vertexIdsSchema = Mapping.schemaVertexIds schema in (Eithers.bind (edgeIdAdapter cx g schema eidType name (Core.Name (Mapping.annotationSchemaEdgeId (Mapping.schemaAnnotations schema))) fields) (\idAdapter -> Eithers.bind (Optionals.cases mOutSpec (Right Nothing) (\s -> Eithers.map (\x -> Just x) (projectionAdapter cx g vidType vertexIdsSchema s "out"))) (\outIdAdapter -> Eithers.bind (Optionals.cases mInSpec (Right Nothing) (\s -> Eithers.map (\x -> Just x) (projectionAdapter cx g vidType vertexIdsSchema s "in"))) (\inIdAdapter -> Eithers.bind (Optionals.cases mOutSpec (Right Nothing) (\s -> Eithers.map (\x -> Just x) (findIncidentVertexAdapter cx g schema vidType eidType s))) (\outVertexAdapter -> Eithers.bind (Optionals.cases mInSpec (Right Nothing) (\s -> Eithers.map (\x -> Just x) (findIncidentVertexAdapter cx g schema vidType eidType s))) (\inVertexAdapter -> let vertexAdapters =- Optionals.cat [+ Optionals.givens [ outVertexAdapter, inVertexAdapter] in (Eithers.bind (Optionals.cases mOutSpec (Right parentLabel) (\spec -> Optionals.cases (Pairs.second (Pairs.second spec)) (Left (Errors.ErrorOther (Errors.OtherError "no out-vertex label"))) (\a -> Right (PgModel.VertexLabel a)))) (\outLabel -> Eithers.bind (Optionals.cases mInSpec (Right parentLabel) (\spec -> Optionals.cases (Pairs.second (Pairs.second spec)) (Left (Errors.ErrorOther (Errors.OtherError "no in-vertex label"))) (\a -> Right (PgModel.VertexLabel a)))) (\inLabel -> Right (edgeCoder cx g dir schema source eidType name label outLabel inLabel idAdapter outIdAdapter inIdAdapter propAdapters vertexAdapters)))))))))))@@ -102,7 +103,7 @@ let deannot = Strip.deannotateTerm term unwrapped = case deannot of- Core.TermOptional v0 -> Optionals.fromOptional deannot v0+ Core.TermOptional v0 -> Optionals.withDefault deannot v0 _ -> deannot rec = case unwrapped of@@ -112,7 +113,7 @@ in (Eithers.bind (Optionals.cases mIdAdapter (Right (Mapping.schemaDefaultEdgeId schema)) (selectEdgeId cx fieldsm)) (\edgeId -> Eithers.bind (encodeProperties cx fieldsm propAdapters) (\props -> let getVertexId = \dirCheck -> \adapter -> Optionals.cases (Logic.ifElse (Equality.equal dir dirCheck) Nothing adapter) (Right (Mapping.schemaDefaultVertexId schema)) (selectVertexId cx fieldsm)- in (Eithers.bind (getVertexId PgModel.DirectionOut outAdapter) (\outId -> Eithers.bind (getVertexId PgModel.DirectionIn inAdapter) (\inId -> Eithers.bind (Eithers.map (\xs -> Optionals.cat xs) (Eithers.mapList (\va ->+ in (Eithers.bind (getVertexId PgModel.DirectionOut outAdapter) (\outId -> Eithers.bind (getVertexId PgModel.DirectionIn inAdapter) (\inId -> Eithers.bind (Eithers.map (\xs -> Optionals.givens xs) (Eithers.mapList (\va -> let fname = Pairs.first va ad = Pairs.second va in (Optionals.cases (Maps.lookup fname fieldsm) (Right Nothing) (\fterm -> Eithers.map (\x -> Just x) (Coders.coderEncode (Coders.adapterCoder ad) fterm)))) vertexAdapters)) (\deps -> Right (elementTreeEdge (PgModel.Edge {@@ -147,7 +148,7 @@ in (Eithers.bind (findPropertySpecs cx g schema kind v0) (\propSpecs -> Eithers.bind (Eithers.mapList (propertyAdapter cx g schema) propSpecs) (\propAdapters -> case kind of PgModel.ElementKindVertex -> constructVertexCoder cx g schema source vidType eidType name v0 propAdapters PgModel.ElementKindEdge -> constructEdgeCoder cx g parentLabel schema source vidType eidType dir name v0 propAdapters mOutSpec mInSpec))))))- _ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "Expected " "record type") ", found: ") "other type")))+ _ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 (Strings.concat2 "Expected " "record type") ", found: ") "other type"))) -- | Create an element tree for an edge elementTreeEdge :: PgModel.Edge t0 -> [PgModel.ElementTree t0] -> PgModel.ElementTree t0@@ -180,7 +181,7 @@ -- | Encode all properties from a field map using property adapters encodeProperties :: t0 -> M.Map Core.Name Core.Term -> [Coders.Adapter Core.FieldType t1 Core.Field (PgModel.Property t2) Errors.Error] -> Either Errors.Error (M.Map PgModel.PropertyKey t2) encodeProperties cx fields adapters =- Eithers.map (\props -> Maps.fromList (Lists.map (\prop -> (PgModel.propertyKey prop, (PgModel.propertyValue prop))) props)) (Eithers.map (\xs -> Optionals.cat xs) (Eithers.mapList (encodeProperty cx fields) adapters))+ Eithers.map (\props -> Maps.fromList (Lists.map (\prop -> (PgModel.propertyKey prop, (PgModel.propertyValue prop))) props)) (Eithers.map (\xs -> Optionals.givens xs) (Eithers.mapList (encodeProperty cx fields) adapters)) -- | Encode a single property from a field map using a property adapter encodeProperty :: t0 -> M.Map Core.Name Core.Term -> Coders.Adapter Core.FieldType t1 Core.Field t2 Errors.Error -> Either Errors.Error (Maybe t2)@@ -196,7 +197,7 @@ \v -> Eithers.map (\x -> Just x) (Coders.coderEncode (Coders.adapterCoder adapter) (Core.Field { Core.fieldName = fname, Core.fieldTerm = v}))- in (Optionals.cases (Maps.lookup fname fields) (Logic.ifElse isMaybe (Right Nothing) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "expected field not found in record: " (Core.unName fname)))))) (\value -> Logic.ifElse isMaybe (case (Strip.deannotateTerm value) of+ in (Optionals.cases (Maps.lookup fname fields) (Logic.ifElse isMaybe (Right Nothing) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "expected field not found in record: " (Core.unName fname)))))) (\value -> Logic.ifElse isMaybe (case (Strip.deannotateTerm value) of Core.TermOptional v0 -> Optionals.cases v0 (Right Nothing) encodeValue _ -> encodeValue value) (encodeValue value))) @@ -211,7 +212,7 @@ Core.FieldType, (PgModel.EdgeLabel, (Coders.Adapter Core.Type (PgModel.ElementTypeTree t2) Core.Term (PgModel.ElementTree t3) Errors.Error))))] findAdjacenEdgeAdapters cx g schema vidType eidType parentLabel dir fields =- Eithers.map (\xs -> Optionals.cat xs) (Eithers.mapList (\field ->+ Eithers.map (\xs -> Optionals.givens xs) (Eithers.mapList (\field -> let key = Core.Name (case dir of PgModel.DirectionOut -> Mapping.annotationSchemaOutEdgeLabel (Mapping.schemaAnnotations schema)@@ -221,7 +222,7 @@ -- | Find an id projection spec for a field findIdProjectionSpec :: t0 -> Bool -> Core.Name -> Core.Name -> [Core.FieldType] -> Either Errors.Error (Maybe (Core.FieldType, (Mapping.ValueSpec, (Maybe String)))) findIdProjectionSpec cx required tname idKey fields =- Eithers.bind (findSingleFieldWithAnnotationKey cx tname idKey fields) (\mid -> Optionals.cases mid (Logic.ifElse required (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "no " (Core.unName idKey)) " field")))) (Right Nothing)) (\mi -> Eithers.map (\spec -> Just (mi, (spec, (Optionals.map (\s -> Strings.toUpper s) Nothing)))) (Optionals.cases (Annotations.getTypeAnnotation idKey (Core.fieldTypeType mi)) (Right Mapping.ValueSpecValue) (TermsToElements.decodeValueSpec cx (Graph.Graph {+ Eithers.bind (findSingleFieldWithAnnotationKey cx tname idKey fields) (\mid -> Optionals.cases mid (Logic.ifElse required (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 "no " (Core.unName idKey)) " field")))) (Right Nothing)) (\mi -> Eithers.map (\spec -> Just (mi, (spec, (Optionals.map (\s -> Strings.toUpper s) Nothing)))) (Optionals.cases (Annotations.getTypeAnnotation idKey (Core.fieldTypeType mi)) (Right Mapping.ValueSpecValue) (TermsToElements.decodeValueSpec cx (Graph.Graph { Graph.graphBoundTerms = Maps.empty, Graph.graphBoundTypes = Maps.empty, Graph.graphClassConstraints = Maps.empty,@@ -282,7 +283,7 @@ findSingleFieldWithAnnotationKey cx tname key fields = let matches = Lists.filter (\f -> Optionals.isGiven (Annotations.getTypeAnnotation key (Core.fieldTypeType f))) fields- in (Logic.ifElse (Equality.gt (Lists.length matches) 1) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "Multiple fields marked as '" (Core.unName key)) "' in record type ") (Core.unName tname))))) (Right (Lists.maybeHead matches)))+ in (Logic.ifElse (Ordering.gt (Lists.length matches) 1) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 (Strings.concat2 "Multiple fields marked as '" (Core.unName key)) "' in record type ") (Core.unName tname))))) (Right (Lists.head matches))) -- | Determine whether the spec has vertex adapters based on direction and out/in specs hasVertexAdapters :: PgModel.Direction -> Maybe t0 -> Maybe t1 -> Bool@@ -305,8 +306,8 @@ Coders.adapterSource = (Core.fieldTypeType field), Coders.adapterTarget = idtype, Coders.adapterCoder = Coders.Coder {- Coders.coderEncode = (\typ -> Eithers.bind (traverseToSingleTerm cx (Strings.cat2 key "-projection") (traversal cx) typ) (\t -> Coders.coderEncode coder t)),- Coders.coderDecode = (\_ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "edge '" key) "' decoding is not yet supported"))))}})))+ Coders.coderEncode = (\typ -> Eithers.bind (traverseToSingleTerm cx (Strings.concat2 key "-projection") (traversal cx) typ) (\t -> Coders.coderEncode coder t)),+ Coders.coderDecode = (\_ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 "edge '" key) "' decoding is not yet supported"))))}}))) -- | Create a property adapter from a property spec propertyAdapter :: t0 -> t1 -> Mapping.Schema t2 t3 t4 Errors.Error -> (Core.FieldType, (Mapping.ValueSpec, (Maybe String))) -> Either Errors.Error (Coders.Adapter Core.FieldType (PgModel.PropertyType t3) Core.Field (PgModel.Property t4) Errors.Error)@@ -315,7 +316,7 @@ let tfield = Pairs.first spec values = Pairs.first (Pairs.second spec) alias = Pairs.second (Pairs.second spec)- key = PgModel.PropertyKey (Optionals.fromOptional (Core.unName (Core.fieldTypeName tfield)) alias)+ key = PgModel.PropertyKey (Optionals.withDefault (Core.unName (Core.fieldTypeName tfield)) alias) in (Eithers.bind (Coders.coderEncode (Mapping.schemaPropertyTypes schema) (Core.fieldTypeType tfield)) (\pt -> Eithers.bind (TermsToElements.parseValueSpec cx g values) (\traversal -> Right (Coders.Adapter { Coders.adapterIsLossy = True, Coders.adapterSource = tfield,@@ -343,7 +344,7 @@ let fname = Pairs.first ad adapter = Pairs.second ad- in (Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "no " (Core.unName fname)) " in record")))) (\t -> Coders.coderEncode (Coders.adapterCoder adapter) t))+ in (Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 "no " (Core.unName fname)) " in record")))) (\t -> Coders.coderEncode (Coders.adapterCoder adapter) t)) -- | Select a vertex id from record fields using an id adapter selectVertexId :: t0 -> M.Map Core.Name t1 -> (Core.Name, (Coders.Adapter t2 t3 t1 t4 Errors.Error)) -> Either Errors.Error t4@@ -351,12 +352,12 @@ let fname = Pairs.first ad adapter = Pairs.second ad- in (Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "no " (Core.unName fname)) " in record")))) (\t -> Coders.coderEncode (Coders.adapterCoder adapter) t))+ in (Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 "no " (Core.unName fname)) " in record")))) (\t -> Coders.coderEncode (Coders.adapterCoder adapter) t)) -- | Traverse to a single term, failing if zero or multiple terms are found traverseToSingleTerm :: t0 -> String -> (t1 -> Either Errors.Error [t2]) -> t1 -> Either Errors.Error t2 traverseToSingleTerm cx desc traversal term =- Eithers.bind (traversal term) (\terms -> Logic.ifElse (Lists.null terms) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 desc " did not resolve to a term")))) (Logic.ifElse (Equality.equal (Lists.length terms) 1) (Optionals.cases (Lists.maybeHead terms) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 desc " resolved to multiple terms")))) (\x -> Right x)) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 desc " resolved to multiple terms"))))))+ Eithers.bind (traversal term) (\terms -> Logic.ifElse (Lists.null terms) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 desc " did not resolve to a term")))) (Logic.ifElse (Equality.equal (Lists.length terms) 1) (Optionals.cases (Lists.head terms) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 desc " resolved to multiple terms")))) (\x -> Right x)) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 desc " resolved to multiple terms")))))) -- | Create a vertex coder given all components vertexCoder :: t0 -> t1 -> Mapping.Schema t2 t3 t4 t5 -> t6 -> t7 -> t8 -> PgModel.VertexLabel -> (Core.Name, (Coders.Adapter t9 t10 Core.Term t4 Errors.Error)) -> [Coders.Adapter Core.FieldType (PgModel.PropertyType t7) Core.Field (PgModel.Property t4) Errors.Error] -> [(@@ -382,7 +383,7 @@ let deannot = Strip.deannotateTerm term unwrapped = case deannot of- Core.TermOptional v0 -> Optionals.fromOptional deannot v0+ Core.TermOptional v0 -> Optionals.withDefault deannot v0 _ -> deannot rec = case unwrapped of
src/main/haskell/Hydra/Pg/Graphson/Coder.hs view
@@ -92,7 +92,7 @@ -- | Create a JSON object from a list of key-value pairs, filtering out Nothing values toJsonObject :: [(String, (Maybe Model.Value))] -> Model.Value toJsonObject pairs =- Model.ValueObject (Optionals.cat (Lists.map (\p -> Optionals.map (\v -> (Pairs.first p, v)) (Pairs.second p)) pairs))+ Model.ValueObject (Optionals.givens (Lists.map (\p -> Optionals.map (\v -> (Pairs.first p, v)) (Pairs.second p)) pairs)) -- | Create a typed JSON object with @type and @value fields typedValueToJson :: String -> Model.Value -> Model.Value
src/main/haskell/Hydra/Pg/Graphson/Utils.hs view
@@ -102,7 +102,7 @@ encodeTermValue term = case (Strip.deannotateTerm term) of Core.TermLiteral v0 -> case v0 of- Core.LiteralBinary v1 -> Right (Syntax.ValueBinary (Literals.binaryToString v1))+ Core.LiteralBinary v1 -> Right (Syntax.ValueBinary (Literals.binaryToBase64 v1)) Core.LiteralBoolean v1 -> Right (Syntax.ValueBoolean v1) Core.LiteralFloat v1 -> case v1 of Core.FloatValueFloat32 v2 -> Right (Syntax.ValueFloat (Syntax.FloatValueFinite v2))
src/main/haskell/Hydra/Pg/Printing.hs view
@@ -50,8 +50,8 @@ outId = printValue (PgModel.edgeOut edge) inId = printValue (PgModel.edgeIn edge) props =- Strings.intercalate ", " (Lists.map (\p -> printProperty printValue (Pairs.first p) (Pairs.second p)) (Maps.toList (PgModel.edgeProperties edge)))- in (Strings.cat [+ Strings.join ", " (Lists.map (\p -> printProperty printValue (Pairs.first p) (Pairs.second p)) (Maps.toList (PgModel.edgeProperties edge)))+ in (Strings.concat [ id, ": ", "(",@@ -77,20 +77,20 @@ let vertices = PgModel.lazyGraphVertices lg edges = PgModel.lazyGraphEdges lg- in (Strings.cat [+ in (Strings.concat [ "vertices:",- (Strings.cat (Lists.map (\v -> Strings.cat [+ (Strings.concat (Lists.map (\v -> Strings.concat [ "\n\t", (printVertex printValue v)]) vertices)), "\nedges:",- (Strings.cat (Lists.map (\e -> Strings.cat [+ (Strings.concat (Lists.map (\e -> Strings.concat [ "\n\t", (printEdge printValue e)]) edges))]) -- | Print a property using the provided value printer printProperty :: (t0 -> String) -> PgModel.PropertyKey -> t0 -> String printProperty printValue key value =- Strings.cat [+ Strings.concat [ PgModel.unPropertyKey key, ": ", (printValue value)]@@ -102,8 +102,8 @@ let label = PgModel.unVertexLabel (PgModel.vertexLabel vertex) id = printValue (PgModel.vertexId vertex) props =- Strings.intercalate ", " (Lists.map (\p -> printProperty printValue (Pairs.first p) (Pairs.second p)) (Maps.toList (PgModel.vertexProperties vertex)))- in (Strings.cat [+ Strings.join ", " (Lists.map (\p -> printProperty printValue (Pairs.first p) (Pairs.second p)) (Maps.toList (PgModel.vertexProperties vertex)))+ in (Strings.concat [ id, ": (", label,
src/main/haskell/Hydra/Pg/TermsToElements.hs view
@@ -60,7 +60,7 @@ Core.TermLiteral (Core.LiteralString firstLit)]) (Eithers.bind (Eithers.mapList (\pp -> Eithers.map (\terms -> (Lists.map (\t -> termToString t) terms, (Pairs.second pp))) (evalPath cx (Pairs.first pp) term)) pairs) (\evaluated -> Right (Lists.map (\s -> Core.TermLiteral (Core.LiteralString s)) (Lists.foldl (\accum -> \ep -> let pStrs = Pairs.first ep litP = Pairs.second ep- in (Lists.concat (Lists.map (\pStr -> Lists.map (\a -> Strings.cat2 (Strings.cat2 a pStr) litP) accum) pStrs))) [+ in (Lists.concat (Lists.map (\pStr -> Lists.map (\a -> Strings.concat2 (Strings.concat2 a pStr) litP) accum) pStrs))) [ firstLit] evaluated)))) -- | Decode an edge label from a term@@ -133,11 +133,11 @@ term]) (case (Strip.deannotateTerm term) of Core.TermList v0 -> Eithers.map (\xs -> Lists.concat xs) (Eithers.mapList (evalStep cx step) v0) Core.TermOptional v0 -> Optionals.cases v0 (Right []) (\t -> evalStep cx step t)- Core.TermRecord v0 -> Optionals.cases (Maps.lookup (Core.Name step) (Resolution.fieldMap (Core.recordFields v0))) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "No such field " step) " in record")))) (\t -> Right [+ Core.TermRecord v0 -> Optionals.cases (Maps.lookup (Core.Name step) (Resolution.fieldMap (Core.recordFields v0))) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 (Strings.concat2 "No such field " step) " in record")))) (\t -> Right [ t]) Core.TermInject v0 -> Logic.ifElse (Equality.equal (Core.unName (Core.fieldName (Core.injectionField v0))) step) (evalStep cx step (Core.fieldTerm (Core.injectionField v0))) (Right []) Core.TermWrap v0 -> evalStep cx step (Core.wrappedTermBody v0)- _ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Can't traverse through term for step " step))))+ _ -> Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "Can't traverse through term for step " step)))) -- | Extract a list from a term and apply a decoder to each element expectList :: t0 -> Graph.Graph -> (t0 -> Graph.Graph -> Core.Term -> Either Errors.Error t1) -> Core.Term -> Either Errors.Error [t1]@@ -179,13 +179,13 @@ parsePattern cx _g pat = let segments = Strings.splitOn "${" pat- firstLit = Optionals.fromOptional pat (Lists.maybeHead segments)+ firstLit = Optionals.withDefault pat (Lists.head segments) rest = Lists.drop 1 segments parsed = Lists.map (\seg -> let parts = Strings.splitOn "}" seg- pathStr = Optionals.fromOptional "" (Lists.maybeHead parts)- litPart = Strings.intercalate "}" (Lists.drop 1 parts)+ pathStr = Optionals.withDefault "" (Lists.head parts)+ litPart = Strings.join "}" (Lists.drop 1 parts) pathSteps = Strings.splitOn "/" pathStr in (pathSteps, litPart)) rest in (Right (\cx_ -> \term -> applyPattern cx_ firstLit parsed term))@@ -229,18 +229,18 @@ -- | Read a field from a map of fields by name readField :: t0 -> M.Map Core.Name t1 -> Core.Name -> (t1 -> Either Errors.Error t2) -> Either Errors.Error t2 readField cx fields fname fun =- Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such field: " (Core.unName fname))))) fun+ Optionals.cases (Maps.lookup fname fields) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "no such field: " (Core.unName fname))))) fun -- | Read an injection (union value) from a term readInjection :: t0 -> Graph.Graph -> [(Core.Name, (Core.Term -> Either Errors.Error t1))] -> Core.Term -> Either Errors.Error t1 readInjection cx g cases encoded = Eithers.bind (ExtractCore.map (\k -> Eithers.map (\_n -> Core.Name _n) (ExtractCore.string g k)) (\_v -> Right _v) g encoded) (\mp -> let entries = Maps.toList mp- in (Optionals.cases (Lists.maybeHead entries) (Left (Errors.ErrorOther (Errors.OtherError "empty injection"))) (\f ->+ in (Optionals.cases (Lists.head entries) (Left (Errors.ErrorOther (Errors.OtherError "empty injection"))) (\f -> let key = Pairs.first f val = Pairs.second f matching = Lists.filter (\c -> Equality.equal (Pairs.first c) key) cases- in (Optionals.cases (Lists.maybeHead matching) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected field: " (Core.unName key))))) (\m ->+ in (Optionals.cases (Lists.head matching) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "unexpected field: " (Core.unName key))))) (\m -> let handler = Pairs.second m in (handler val)))))) @@ -252,7 +252,7 @@ -- | Require exactly one result from a list-producing function requireUnique :: t0 -> String -> (t1 -> Either Errors.Error [t2]) -> t1 -> Either Errors.Error t2 requireUnique cx context fun term =- Eithers.bind (fun term) (\results -> Logic.ifElse (Lists.null results) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "No value found: " context)))) (Logic.ifElse (Equality.equal (Lists.length results) 1) (Optionals.cases (Lists.maybeHead results) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Multiple values found: " context)))) (\x -> Right x)) (Left (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Multiple values found: " context))))))+ Eithers.bind (fun term) (\results -> Logic.ifElse (Lists.null results) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "No value found: " context)))) (Logic.ifElse (Equality.equal (Lists.length results) 1) (Optionals.cases (Lists.head results) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "Multiple values found: " context)))) (\x -> Right x)) (Left (Errors.ErrorOther (Errors.OtherError (Strings.concat2 "Multiple values found: " context)))))) -- | Create an adapter that maps terms to property graph elements using a mapping specification termToElementsAdapter :: t0 -> Graph.Graph -> Mapping.Schema t1 t2 t3 Errors.Error -> Core.Type -> Either Errors.Error (Coders.Adapter Core.Type [PgModel.Label] Core.Term [PgModel.Element t3] Errors.Error)@@ -266,7 +266,7 @@ Coders.adapterCoder = Coders.Coder { Coders.coderEncode = (\_t -> Right []), Coders.coderDecode = (\_els -> Left (Errors.ErrorOther (Errors.OtherError "no corresponding element type")))}})) (\term -> Eithers.bind (expectList cx g decodeElementSpec term) (\specTerms -> Eithers.bind (Eithers.mapList (parseElementSpec cx g schema) specTerms) (\specs ->- let labels = Lists.nub (Lists.map (\_p -> Pairs.first _p) specs)+ let labels = Lists.distinct (Lists.map (\_p -> Pairs.first _p) specs) encoders = Lists.map (\_p -> Pairs.second _p) specs in (Right (Coders.Adapter { Coders.adapterIsLossy = False,
src/main/haskell/Hydra/Pg/Utils.hs view
@@ -118,7 +118,7 @@ (\x -> case x of PgModel.ElementVertex v0 -> Eithers.bind (Coders.coderDecode (Mapping.schemaVertexIds schema) (PgModel.vertexId v0)) (\term -> let labelJson = JsonModel.ValueString (PgModel.unVertexLabel (PgModel.vertexLabel v0))- in (Eithers.map (\propsJson -> JsonModel.ValueObject (Optionals.cat [+ in (Eithers.map (\propsJson -> JsonModel.ValueObject (Optionals.givens [ Just ("label", labelJson), (Just ("id", (JsonModel.ValueString (PrintCore.term term)))), propsJson])) ((\pairs -> Logic.ifElse (Maps.null pairs) (Right Nothing) (Eithers.map (\p -> Just ("properties", (JsonModel.ValueObject p))) (Eithers.mapList (\pair ->@@ -127,7 +127,7 @@ in (Eithers.bind (Coders.coderDecode (Mapping.schemaPropertyValues schema) v) (\term2 -> Right (PgModel.unPropertyKey key, (JsonModel.ValueString (PrintCore.term term2)))))) (Maps.toList pairs)))) (PgModel.vertexProperties v0)))) PgModel.ElementEdge v0 -> Eithers.bind (Coders.coderDecode (Mapping.schemaEdgeIds schema) (PgModel.edgeId v0)) (\term -> Eithers.bind (Coders.coderDecode (Mapping.schemaVertexIds schema) (PgModel.edgeOut v0)) (\termOut -> Eithers.bind (Coders.coderDecode (Mapping.schemaVertexIds schema) (PgModel.edgeIn v0)) (\termIn -> let labelJson = JsonModel.ValueString (PgModel.unEdgeLabel (PgModel.edgeLabel v0))- in (Eithers.map (\propsJson -> JsonModel.ValueObject (Optionals.cat [+ in (Eithers.map (\propsJson -> JsonModel.ValueObject (Optionals.givens [ Just ("label", labelJson), (Just ("id", (JsonModel.ValueString (PrintCore.term term)))), (Just ("out", (JsonModel.ValueString (PrintCore.term termOut)))),
src/main/haskell/Hydra/Print/Error/Pg.hs view
@@ -43,18 +43,18 @@ invalidEdgeError :: Pg.InvalidEdgeError -> String invalidEdgeError e = case e of- Pg.InvalidEdgeErrorId v0 -> Strings.cat2 "invalid id: " (invalidValueError v0)- Pg.InvalidEdgeErrorInVertexLabel v0 -> Strings.cat2 "wrong in-vertex label: " (wrongVertexLabelError v0)+ Pg.InvalidEdgeErrorId v0 -> Strings.concat2 "invalid id: " (invalidValueError v0)+ Pg.InvalidEdgeErrorInVertexLabel v0 -> Strings.concat2 "wrong in-vertex label: " (wrongVertexLabelError v0) Pg.InvalidEdgeErrorInVertexNotFound -> "in-vertex not found" Pg.InvalidEdgeErrorLabel v0 -> noSuchEdgeLabelError v0- Pg.InvalidEdgeErrorOutVertexLabel v0 -> Strings.cat2 "wrong out-vertex label: " (wrongVertexLabelError v0)+ Pg.InvalidEdgeErrorOutVertexLabel v0 -> Strings.concat2 "wrong out-vertex label: " (wrongVertexLabelError v0) Pg.InvalidEdgeErrorOutVertexNotFound -> "out-vertex not found" Pg.InvalidEdgeErrorProperty v0 -> invalidElementPropertyError v0 -- | Show an invalid element property error as a string invalidElementPropertyError :: Pg.InvalidElementPropertyError -> String invalidElementPropertyError e =- Strings.cat [+ Strings.concat [ "property ", (PgModel.unPropertyKey (Pg.invalidElementPropertyErrorKey e)), ": ",@@ -63,7 +63,7 @@ -- | Show an invalid graph edge error as a string, given a value printer invalidGraphEdgeError :: (t0 -> String) -> Pg.InvalidGraphEdgeError t0 -> String invalidGraphEdgeError printValue e =- Strings.cat [+ Strings.concat [ "edge ", (printValue (Pg.invalidGraphEdgeErrorId e)), ": ",@@ -79,7 +79,7 @@ -- | Show an invalid graph vertex error as a string, given a value printer invalidGraphVertexError :: (t0 -> String) -> Pg.InvalidGraphVertexError t0 -> String invalidGraphVertexError printValue e =- Strings.cat [+ Strings.concat [ "vertex ", (printValue (Pg.invalidGraphVertexErrorId e)), ": ",@@ -89,14 +89,14 @@ invalidPropertyError :: Pg.InvalidPropertyError -> String invalidPropertyError e = case e of- Pg.InvalidPropertyErrorInvalidValue v0 -> Strings.cat2 "invalid value: " (invalidValueError v0)- Pg.InvalidPropertyErrorMissingRequired v0 -> Strings.cat2 "missing required property: " (PgModel.unPropertyKey v0)- Pg.InvalidPropertyErrorUnexpectedKey v0 -> Strings.cat2 "unexpected property key: " (PgModel.unPropertyKey v0)+ Pg.InvalidPropertyErrorInvalidValue v0 -> Strings.concat2 "invalid value: " (invalidValueError v0)+ Pg.InvalidPropertyErrorMissingRequired v0 -> Strings.concat2 "missing required property: " (PgModel.unPropertyKey v0)+ Pg.InvalidPropertyErrorUnexpectedKey v0 -> Strings.concat2 "unexpected property key: " (PgModel.unPropertyKey v0) -- | Show an invalid value error as a string invalidValueError :: Pg.InvalidValueError -> String invalidValueError e =- Strings.cat [+ Strings.concat [ "expected ", (Pg.invalidValueErrorExpectedType e), ", got ",@@ -106,28 +106,28 @@ invalidVertexError :: Pg.InvalidVertexError -> String invalidVertexError e = case e of- Pg.InvalidVertexErrorId v0 -> Strings.cat2 "invalid id: " (invalidValueError v0)+ Pg.InvalidVertexErrorId v0 -> Strings.concat2 "invalid id: " (invalidValueError v0) Pg.InvalidVertexErrorLabel v0 -> noSuchVertexLabelError v0 Pg.InvalidVertexErrorProperty v0 -> invalidElementPropertyError v0 -- | Show a no-such-edge-label error as a string noSuchEdgeLabelError :: Pg.NoSuchEdgeLabelError -> String noSuchEdgeLabelError e =- Strings.cat [+ Strings.concat [ "no such edge label: ", (PgModel.unEdgeLabel (Pg.noSuchEdgeLabelErrorLabel e))] -- | Show a no-such-vertex-label error as a string noSuchVertexLabelError :: Pg.NoSuchVertexLabelError -> String noSuchVertexLabelError e =- Strings.cat [+ Strings.concat [ "no such vertex label: ", (PgModel.unVertexLabel (Pg.noSuchVertexLabelErrorLabel e))] -- | Show a wrong-vertex-label error as a string wrongVertexLabelError :: Pg.WrongVertexLabelError -> String wrongVertexLabelError e =- Strings.cat [+ Strings.concat [ "expected vertex label ", (PgModel.unVertexLabel (Pg.wrongVertexLabelErrorExpected e)), ", got ",
src/main/haskell/Hydra/Tinkerpop/Language.hs view
@@ -53,28 +53,28 @@ supportsLiterals = True supportsMaps = Features.dataTypeFeaturesSupportsMapValues vpFeatures literalVariants =- Sets.fromList (Optionals.cat [+ Sets.fromList (Optionals.givens [ cond Variants.LiteralVariantBinary (Features.dataTypeFeaturesSupportsByteArrayValues vpFeatures), (cond Variants.LiteralVariantBoolean (Features.dataTypeFeaturesSupportsBooleanValues vpFeatures)), (cond Variants.LiteralVariantFloat (Logic.or (Features.dataTypeFeaturesSupportsFloatValues vpFeatures) (Features.dataTypeFeaturesSupportsDoubleValues vpFeatures))), (cond Variants.LiteralVariantInteger (Logic.or (Features.dataTypeFeaturesSupportsIntegerValues vpFeatures) (Features.dataTypeFeaturesSupportsLongValues vpFeatures))), (cond Variants.LiteralVariantString (Features.dataTypeFeaturesSupportsStringValues vpFeatures))]) floatTypes =- Sets.fromList (Optionals.cat [+ Sets.fromList (Optionals.givens [ cond Core.FloatTypeFloat32 (Features.dataTypeFeaturesSupportsFloatValues vpFeatures), (cond Core.FloatTypeFloat64 (Features.dataTypeFeaturesSupportsDoubleValues vpFeatures))]) integerTypes =- Sets.fromList (Optionals.cat [+ Sets.fromList (Optionals.givens [ cond Core.IntegerTypeInt32 (Features.dataTypeFeaturesSupportsIntegerValues vpFeatures), (cond Core.IntegerTypeInt64 (Features.dataTypeFeaturesSupportsLongValues vpFeatures))]) termVariants =- Sets.fromList (Optionals.cat [+ Sets.fromList (Optionals.givens [ cond Variants.TermVariantList supportsLists, (cond Variants.TermVariantLiteral supportsLiterals), (cond Variants.TermVariantMap supportsMaps), (Optionals.pure Variants.TermVariantOptional)]) typeVariants =- Sets.fromList (Optionals.cat [+ Sets.fromList (Optionals.givens [ cond Variants.TypeVariantList supportsLists, (cond Variants.TypeVariantLiteral supportsLiterals), (cond Variants.TypeVariantMap supportsMaps),
src/main/haskell/Hydra/Validate/Neo4j.hs view
@@ -11,6 +11,7 @@ import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic import qualified Hydra.Overlay.Haskell.Lib.Maps as Maps import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals+import qualified Hydra.Overlay.Haskell.Lib.Ordering as Ordering import qualified Hydra.Overlay.Haskell.Lib.Pairs as Pairs import qualified Hydra.Overlay.Haskell.Lib.Sets as Sets import qualified Hydra.Neo4j.Model as Model@@ -46,9 +47,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -60,9 +61,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -210,7 +211,7 @@ Neo4j.propertyTypeErrorExpectedType = (Model.propertyTypeConstraintType v0), Neo4j.propertyTypeErrorValue = val})))))) Nothing] Model.ConstraintPropertyUniqueness _ -> [])))- in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Equality.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingNode p acc guarded)) (Validation.ValidationResult {+ in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Ordering.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingNode p acc guarded)) (Validation.ValidationResult { Validation.validationResultErrors = [], Validation.validationResultWarnings = []}) (Lists.cons noMatchCheck matchChecks)) @@ -249,6 +250,6 @@ Neo4j.propertyTypeErrorExpectedType = (Model.propertyTypeConstraintType v0), Neo4j.propertyTypeErrorValue = val})))))) Nothing] Model.ConstraintPropertyUniqueness _ -> []))- in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Equality.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingRelationship p acc guarded)) (Validation.ValidationResult {+ in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Ordering.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingRelationship p acc guarded)) (Validation.ValidationResult { Validation.validationResultErrors = [], Validation.validationResultWarnings = []}) (Lists.cons noSuchTypeCheck (Lists.cons noPatternCheck propChecks)))
src/main/haskell/Hydra/Validate/Pg.hs view
@@ -11,6 +11,7 @@ import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic import qualified Hydra.Overlay.Haskell.Lib.Maps as Maps import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals+import qualified Hydra.Overlay.Haskell.Lib.Ordering as Ordering import qualified Hydra.Overlay.Haskell.Lib.Pairs as Pairs import qualified Hydra.Overlay.Haskell.Lib.Sets as Sets import qualified Hydra.Pg.Model as Model@@ -27,9 +28,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -41,9 +42,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -55,9 +56,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -69,9 +70,9 @@ payload = Pairs.second rp errs = Validation.validationResultErrors acc wrns = Validation.validationResultWarnings acc- in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Equality.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult {+ in (Logic.ifElse (Sets.member ruleName (Validation.validationProfileErrorRules p)) (Logic.ifElse (Ordering.lt (Lists.length errs) (Validation.validationProfileMaxErrors p)) (Validation.ValidationResult { Validation.validationResultErrors = (Lists.concat2 errs (Lists.singleton payload)),- Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Equality.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult {+ Validation.validationResultWarnings = wrns}) acc) (Logic.ifElse (Sets.member ruleName (Validation.validationProfileWarningRules p)) (Logic.ifElse (Ordering.lt (Lists.length wrns) (Validation.validationProfileMaxWarnings p)) (Validation.ValidationResult { Validation.validationResultErrors = errs, Validation.validationResultWarnings = (Lists.concat2 wrns (Lists.singleton payload))}) acc) acc))) @@ -105,7 +106,7 @@ -- | Validate an edge against its EdgeType under the given ValidationProfile, returning a ValidationResult InvalidEdgeError. validateEdge :: Validation.ValidationProfile -> (t0 -> t1 -> Maybe Pg.InvalidValueError) -> Maybe (t1 -> Maybe Model.VertexLabel) -> Model.EdgeType t0 -> Model.Edge t1 -> Validation.ValidationResult Pg.InvalidEdgeError validateEdge p checkValue labelForVertexId typ el =- Lists.foldl (\acc -> \guarded -> Logic.ifElse (Equality.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingEdge p acc guarded)) (Validation.ValidationResult {+ Lists.foldl (\acc -> \guarded -> Logic.ifElse (Ordering.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingEdge p acc guarded)) (Validation.ValidationResult { Validation.validationResultErrors = [], Validation.validationResultWarnings = []}) [ Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.label")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.label", f)) (@@ -114,7 +115,7 @@ in (Logic.ifElse (Equality.equal (Model.unEdgeLabel actual) (Model.unEdgeLabel expected)) Nothing (Just (Pg.InvalidEdgeErrorLabel (Pg.NoSuchEdgeLabelError { Pg.noSuchEdgeLabelErrorLabel = actual})))))) Nothing, (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.id")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.id", f)) (Optionals.map (\err -> Pg.InvalidEdgeErrorId err) (checkValue (Model.edgeTypeId typ) (Model.edgeId el)))) Nothing),- (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.property")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.property", f)) (Optionals.map (\err -> Pg.InvalidEdgeErrorProperty err) (Lists.maybeHead (Validation.validationResultErrors (validateProperties p checkValue (Model.edgeTypeProperties typ) (Model.edgeProperties el)))))) Nothing),+ (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.property")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.property", f)) (Optionals.map (\err -> Pg.InvalidEdgeErrorProperty err) (Lists.head (Validation.validationResultErrors (validateProperties p checkValue (Model.edgeTypeProperties typ) (Model.edgeProperties el)))))) Nothing), (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.outVertexNotFound")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.outVertexNotFound", f)) (Optionals.cases labelForVertexId Nothing (\f -> Optionals.cases (f (Model.edgeOut el)) (Just Pg.InvalidEdgeErrorOutVertexNotFound) (\_label -> Nothing)))) Nothing), (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidEdgeError.outVertexLabel")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidEdgeError.outVertexLabel", f)) (Optionals.cases labelForVertexId Nothing (\f -> Optionals.cases (f (Model.edgeOut el)) Nothing (\label -> Logic.ifElse (Equality.equal (Model.unVertexLabel label) (Model.unVertexLabel (Model.edgeTypeOut typ))) Nothing (Just (Pg.InvalidEdgeErrorOutVertexLabel (Pg.WrongVertexLabelError { Pg.wrongVertexLabelErrorExpected = (Model.edgeTypeOut typ),@@ -180,14 +181,14 @@ (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidPropertyError.invalidValue")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidPropertyError.invalidValue", f)) (Optionals.cases (Maps.lookup key m) Nothing (\typ -> Optionals.map (\err -> Pg.InvalidElementPropertyError { Pg.invalidElementPropertyErrorKey = key, Pg.invalidElementPropertyErrorError = (Pg.InvalidPropertyErrorInvalidValue err)}) (checkValue typ val)))) Nothing)])- in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Equality.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingProperty p acc guarded)) (Validation.ValidationResult {+ in (Lists.foldl (\acc -> \guarded -> Logic.ifElse (Ordering.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingProperty p acc guarded)) (Validation.ValidationResult { Validation.validationResultErrors = [], Validation.validationResultWarnings = []}) (Lists.concat2 missingChecks valueChecks)) -- | Validate a vertex against its VertexType under the given ValidationProfile, returning a ValidationResult InvalidVertexError. validateVertex :: Validation.ValidationProfile -> (t0 -> t1 -> Maybe Pg.InvalidValueError) -> Model.VertexType t0 -> Model.Vertex t1 -> Validation.ValidationResult Pg.InvalidVertexError validateVertex p checkValue typ el =- Lists.foldl (\acc -> \guarded -> Logic.ifElse (Equality.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingVertex p acc guarded)) (Validation.ValidationResult {+ Lists.foldl (\acc -> \guarded -> Logic.ifElse (Ordering.gte (Lists.length (Validation.validationResultErrors acc)) (Validation.validationProfileMaxErrors p)) acc (appendFindingVertex p acc guarded)) (Validation.ValidationResult { Validation.validationResultErrors = [], Validation.validationResultWarnings = []}) [ Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidVertexError.label")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidVertexError.label", f)) (@@ -196,4 +197,4 @@ in (Logic.ifElse (Equality.equal (Model.unVertexLabel actual) (Model.unVertexLabel expected)) Nothing (Just (Pg.InvalidVertexErrorLabel (Pg.NoSuchVertexLabelError { Pg.noSuchVertexLabelErrorLabel = actual})))))) Nothing, (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidVertexError.id")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidVertexError.id", f)) (Optionals.map (\err -> Pg.InvalidVertexErrorId err) (checkValue (Model.vertexTypeId typ) (Model.vertexId el)))) Nothing),- (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidVertexError.property")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidVertexError.property", f)) (Optionals.map (\err -> Pg.InvalidVertexErrorProperty err) (Lists.maybeHead (Validation.validationResultErrors (validateProperties p checkValue (Model.vertexTypeProperties typ) (Model.vertexProperties el)))))) Nothing)]+ (Logic.ifElse (enabledPg p (Core.Name "hydra.error.pg.InvalidVertexError.property")) (Optionals.map (\f -> (Core.Name "hydra.error.pg.InvalidVertexError.property", f)) (Optionals.map (\err -> Pg.InvalidVertexErrorProperty err) (Lists.head (Validation.validationResultErrors (validateProperties p checkValue (Model.vertexTypeProperties typ) (Model.vertexProperties el)))))) Nothing)]