Merge pull request #439 from ruslantalpa/master
Fix bug in many-many relation detection
This commit is contained in:
+4
-1
@@ -3,6 +3,9 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
#Unreleased
|
||||||
|
- Fix bug in many-many relation detection - @ruslantalpa
|
||||||
|
|
||||||
## [0.3.0.2] - 2015-12-16
|
## [0.3.0.2] - 2015-12-16
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
@@ -13,7 +16,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
- Fix #396 include records with missing parents - @ruslantalpa
|
- Fix #396 include records with missing parents - @ruslantalpa
|
||||||
- `pgFmtIdent` always quotes #388 - @calebmer
|
- `pgFmtIdent` always quotes #388 - @calebmer
|
||||||
- Default schema, changed from `"1"` to `public` - @calebmer
|
- Default schema, changed from `"1"` to `public` - @calebmer
|
||||||
- #414 revert to separate count query
|
- #414 revert to separate count query - @ruslantalpa
|
||||||
- Fix #399, allow inserting in tables with no select privileges using "Prefer: representation=minimal" - @ruslantalpa
|
- Fix #399, allow inserting in tables with no select privileges using "Prefer: representation=minimal" - @ruslantalpa
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -127,12 +127,14 @@ addParentRelations [] = []
|
|||||||
addParentRelations (rel@(Relation t c ft fc _ _ _ _):rels) = Relation ft fc t c Parent Nothing Nothing Nothing : rel : addParentRelations rels
|
addParentRelations (rel@(Relation t c ft fc _ _ _ _):rels) = Relation ft fc t c Parent Nothing Nothing Nothing : rel : addParentRelations rels
|
||||||
|
|
||||||
addManyToManyRelations :: [Relation] -> [Relation]
|
addManyToManyRelations :: [Relation] -> [Relation]
|
||||||
addManyToManyRelations rels = rels ++ mapMaybe link2Relation links
|
addManyToManyRelations rels = rels ++ addMirrorRelation (mapMaybe link2Relation links)
|
||||||
where
|
where
|
||||||
links = join $ map (combinations 2) $ filter (not . null) $ groupWith groupFn $ filter ( (==Child). relType) rels
|
links = join $ map (combinations 2) $ filter (not . null) $ groupWith groupFn $ filter ( (==Child). relType) rels
|
||||||
groupFn :: Relation -> Text
|
groupFn :: Relation -> Text
|
||||||
groupFn (Relation{relTable=Table{tableSchema=s, tableName=t}}) = s<>"_"<>t
|
groupFn (Relation{relTable=Table{tableSchema=s, tableName=t}}) = s<>"_"<>t
|
||||||
combinations k ns = filter ((k==).length) (subsequences ns)
|
combinations k ns = filter ((k==).length) (subsequences ns)
|
||||||
|
addMirrorRelation [] = []
|
||||||
|
addMirrorRelation (rel@(Relation t c ft fc _ lt lc1 lc2):rels') = Relation ft fc t c Many lt lc2 lc1 : rel : addMirrorRelation rels'
|
||||||
link2Relation [
|
link2Relation [
|
||||||
Relation{relTable=lt, relColumns=lc1, relFTable=t, relFColumns=c},
|
Relation{relTable=lt, relColumns=lc1, relFTable=t, relFColumns=c},
|
||||||
Relation{ relColumns=lc2, relFTable=ft, relFColumns=fc}
|
Relation{ relColumns=lc2, relFTable=ft, relFColumns=fc}
|
||||||
|
|||||||
@@ -129,7 +129,6 @@ addRelations schema allRelations parentNode node@(Node readNode@(query, (name, _
|
|||||||
where
|
where
|
||||||
rel = note ("no relation between " <> parentTable <> " and " <> name)
|
rel = note ("no relation between " <> parentTable <> " and " <> name)
|
||||||
$ findRelationByTable schema name parentTable
|
$ findRelationByTable schema name parentTable
|
||||||
<|> findRelationByTable schema parentTable name
|
|
||||||
<|> findRelationByColumn schema parentTable name
|
<|> findRelationByColumn schema parentTable name
|
||||||
addRel :: (ReadQuery, (NodeName, Maybe Relation)) -> Relation -> (ReadQuery, (NodeName, Maybe Relation))
|
addRel :: (ReadQuery, (NodeName, Maybe Relation)) -> Relation -> (ReadQuery, (NodeName, Maybe Relation))
|
||||||
addRel (q, (n, _)) r = (q {from=fromRelation}, (n, Just r))
|
addRel (q, (n, _)) r = (q {from=fromRelation}, (n, Just r))
|
||||||
|
|||||||
@@ -214,6 +214,11 @@ spec struct pool = around (withApp cfgDefault struct pool) $ do
|
|||||||
get "/tasks?select=id,users{id}" `shouldRespondWith`
|
get "/tasks?select=id,users{id}" `shouldRespondWith`
|
||||||
[str|[{"id":1,"users":[{"id":1},{"id":3}]},{"id":2,"users":[{"id":1}]},{"id":3,"users":[{"id":1}]},{"id":4,"users":[{"id":1}]},{"id":5,"users":[{"id":2},{"id":3}]},{"id":6,"users":[{"id":2}]},{"id":7,"users":[{"id":2}]},{"id":8,"users":[]}]|]
|
[str|[{"id":1,"users":[{"id":1},{"id":3}]},{"id":2,"users":[{"id":1}]},{"id":3,"users":[{"id":1}]},{"id":4,"users":[{"id":1}]},{"id":5,"users":[{"id":2},{"id":3}]},{"id":6,"users":[{"id":2}]},{"id":7,"users":[{"id":2}]},{"id":8,"users":[]}]|]
|
||||||
|
|
||||||
|
|
||||||
|
it "requesting many<->many relation reverse" $
|
||||||
|
get "/users?select=id,tasks{id}" `shouldRespondWith`
|
||||||
|
[str|[{"id":1,"tasks":[{"id":1},{"id":2},{"id":3},{"id":4}]},{"id":2,"tasks":[{"id":5},{"id":6},{"id":7}]},{"id":3,"tasks":[{"id":1},{"id":5}]}]|]
|
||||||
|
|
||||||
it "requesting parents and children on views" $
|
it "requesting parents and children on views" $
|
||||||
get "/projects_view?id=eq.1&select=id, name, clients{*}, tasks{id, name}" `shouldRespondWith`
|
get "/projects_view?id=eq.1&select=id, name, clients{*}, tasks{id, name}" `shouldRespondWith`
|
||||||
[str|[{"id":1,"name":"Windows 7","clients":{"id":1,"name":"Microsoft"},"tasks":[{"id":1,"name":"Design w7"},{"id":2,"name":"Code w7"}]}]|]
|
[str|[{"id":1,"name":"Windows 7","clients":{"id":1,"name":"Microsoft"},"tasks":[{"id":1,"name":"Design w7"},{"id":2,"name":"Code w7"}]}]|]
|
||||||
|
|||||||
Reference in New Issue
Block a user