From b1a8bd2391f87371022c7a1e2c78606b6fad0249 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 17 Jul 2018 11:44:34 -0500 Subject: [PATCH] Close #709, add test for embedding a view with CTE Also add test for embedding a view with subselect in FROM clause --- CHANGELOG.md | 1 + test/Feature/QuerySpec.hs | 17 ++++++++++- test/fixtures/data.sql | 29 ++++++++++++------ test/fixtures/privileges.sql | 2 ++ test/fixtures/schema.sql | 58 ++++++++++++++++++++++++++---------- 5 files changed, 81 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c33b1619a..8d3df9478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #1099, Add support for getting json/jsonb by array index - @steve-chavez - #1145, Add materialized view columns to OpenAPI output - @steve-chavez +- #709, Allow embedding on views with subselects/CTE - @steve-chavez ### Fixed diff --git a/test/Feature/QuerySpec.hs b/test/Feature/QuerySpec.hs index a0769213a..f6d2a9124 100644 --- a/test/Feature/QuerySpec.hs +++ b/test/Feature/QuerySpec.hs @@ -367,16 +367,31 @@ spec = do [json|[ { "title": "To Kill a Mockingbird", "author": { "name": "Harper Lee" } } ]|] { matchHeaders = [matchContentTypeJson] } - it "works with views that have subselects" $ do + it "works with views that have subselects" $ get "/authors_books_number?select=*,books(title)&id=eq.1" `shouldRespondWith` [json|[ {"id":1, "name":"George Orwell","num_in_forties":1,"num_in_fifties":0,"num_in_sixties":0,"num_in_all_decades":1, "books":[{"title":"1984"}]} ]|] { matchHeaders = [matchContentTypeJson] } + + it "works with views that have case subselects" $ get "/authors_have_book_in_decade?select=*,books(title)&id=eq.3" `shouldRespondWith` [json|[ {"id":3,"name":"Antoine de Saint-Exupéry","has_book_in_forties":true,"has_book_in_fifties":false,"has_book_in_sixties":false, "books":[{"title":"The Little Prince"}]} ]|] { matchHeaders = [matchContentTypeJson] } + it "works with views that have subselect in the FROM clause" $ + get "/forties_and_fifties_books?select=title,first_publisher,author:authors(name)&id=eq.1" `shouldRespondWith` + [json|[{"title":"1984","first_publisher":"Secker & Warburg","author":{"name":"George Orwell"}}]|] + { matchHeaders = [matchContentTypeJson] } + + it "works with views that have CTE" $ + get "/odd_years_publications?select=title,publication_year,first_publisher,author:authors(name)&id=in.(1,2,3)" `shouldRespondWith` + [json|[ + {"title":"1984","publication_year":1949,"first_publisher":"Secker & Warburg","author":{"name":"George Orwell"}}, + {"title":"The Diary of a Young Girl","publication_year":1947,"first_publisher":"Contact Publishing","author":{"name":"Anne Frank"}}, + {"title":"The Little Prince","publication_year":1947,"first_publisher":"Reynal & Hitchcock","author":{"name":"Antoine de Saint-Exupéry"}} ]|] + { matchHeaders = [matchContentTypeJson] } + it "works when having a capitalized table name and camelCase fk column" $ get "/foos?select=*,bars(*)" `shouldRespondWith` 200 diff --git a/test/fixtures/data.sql b/test/fixtures/data.sql index b20451440..b32180833 100644 --- a/test/fixtures/data.sql +++ b/test/fixtures/data.sql @@ -373,16 +373,27 @@ INSERT INTO authors VALUES (7, 'Harper Lee'); INSERT INTO authors VALUES (8, 'Kurt Vonnegut'); INSERT INTO authors VALUES (9, 'Ken Kesey'); +TRUNCATE TABLE publishers CASCADE; +INSERT INTO publishers VALUES (1, 'Secker & Warburg'); +INSERT INTO publishers VALUES (2, 'Contact Publishing'); +INSERT INTO publishers VALUES (3, 'Reynal & Hitchcock'); +INSERT INTO publishers VALUES (4, 'Little, Brown and Company'); +INSERT INTO publishers VALUES (5, 'Ballantine Books'); +INSERT INTO publishers VALUES (6, 'Faber and Faber'); +INSERT INTO publishers VALUES (7, 'J. B. Lippincott & Co.'); +INSERT INTO publishers VALUES (8, 'Delacorte'); +INSERT INTO publishers VALUES (9, 'Viking Press & Signet Books'); + TRUNCATE TABLE books CASCADE; -INSERT INTO books VALUES (1, '1984', 1949, 1); -INSERT INTO books VALUES (2, 'The Diary of a Young Girl', 1947, 2); -INSERT INTO books VALUES (3, 'The Little Prince', 1947, 3); -INSERT INTO books VALUES (4, 'The Catcher in the Rye', 1951, 4); -INSERT INTO books VALUES (5, 'Farenheit 451', 1953, 5); -INSERT INTO books VALUES (6, 'Lord of the Flies', 1954, 6); -INSERT INTO books VALUES (7, 'To Kill a Mockingbird', 1960, 7); -INSERT INTO books VALUES (8, 'Slaughterhouse-Five', 1969, 8); -INSERT INTO books VALUES (9, 'One Flew Over the Cuckoo''s Nest', 1962, 9); +INSERT INTO books VALUES (1, '1984', 1949, 1, 1); +INSERT INTO books VALUES (2, 'The Diary of a Young Girl', 1947, 2, 2); +INSERT INTO books VALUES (3, 'The Little Prince', 1947, 3, 3); +INSERT INTO books VALUES (4, 'The Catcher in the Rye', 1951, 4, 4); +INSERT INTO books VALUES (5, 'Farenheit 451', 1953, 5, 5); +INSERT INTO books VALUES (6, 'Lord of the Flies', 1954, 6, 6); +INSERT INTO books VALUES (7, 'To Kill a Mockingbird', 1960, 7, 7); +INSERT INTO books VALUES (8, 'Slaughterhouse-Five', 1969, 8, 8); +INSERT INTO books VALUES (9, 'One Flew Over the Cuckoo''s Nest', 1962, 9, 9); SET search_path = test, pg_catalog; diff --git a/test/fixtures/privileges.sql b/test/fixtures/privileges.sql index 5b2078b5b..d3b8957f2 100644 --- a/test/fixtures/privileges.sql +++ b/test/fixtures/privileges.sql @@ -84,6 +84,8 @@ GRANT ALL ON TABLE , jsonb_test , authors_books_number , authors_have_book_in_decade + , forties_and_fifties_books + , odd_years_publications , foos , bars , materialized_projects diff --git a/test/fixtures/schema.sql b/test/fixtures/schema.sql index 33715f2c6..e4bb32762 100755 --- a/test/fixtures/schema.sql +++ b/test/fixtures/schema.sql @@ -1396,11 +1396,17 @@ create table private.authors( name text ); +create table private.publishers( + id integer primary key, + name text +); + create table private.books( id integer primary key, title text, publication_year smallint, - author_id integer references private.authors(id) + author_id integer references private.authors(id), + first_publisher_id integer references private.publishers(id) ); create view test.authors as select id, name from private.authors; @@ -1506,23 +1512,43 @@ create view test.authors_have_book_in_decade as select id, name, - CASE - WHEN (x.id IN (SELECT author_id FROM test.forties_books)) - THEN true - ELSE false - END AS has_book_in_forties, - CASE - WHEN (x.id IN (SELECT author_id FROM test.fifties_books)) - THEN true - ELSE false - END AS has_book_in_fifties, - CASE - WHEN (x.id IN (SELECT author_id FROM test.sixties_books)) - THEN true - ELSE false - END AS has_book_in_sixties + case + when (x.id in (select author_id from test.forties_books)) + then true + else false + end as has_book_in_forties, + case + when (x.id in (select author_id from test.fifties_books)) + then true + else false + end as has_book_in_fifties, + case + when (x.id in (select author_id from test.sixties_books)) + then true + else false + end as has_book_in_sixties from private.authors x; +create view test.forties_and_fifties_books as +select x.id, x.title, x.publication_year, y.name as first_publisher, x.author_id +from ( + select id, title, publication_year, author_id, first_publisher_id from private.books + where publication_year >= 1940 and publication_year < 1960) x +join private.publishers y on y.id = x.first_publisher_id; + +create view test.odd_years_publications as +with +odd_years_books as( + select id, title, publication_year, author_id, first_publisher_id + from private.books + where publication_year % 2 <> 0 +) +select + x.id, x.title, x.publication_year, + y.name as first_publisher, x.author_id +from odd_years_books x +join private.publishers y on y.id = x.first_publisher_id; + CREATE TABLE test."Foo"( id int primary key, name text