mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-09-20 15:09:02 +03:00
Fix support for multiple array relationships in BigQuery
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/3003 GitOrigin-RevId: 7a9bf10be6436da2d87d5555f589e23c40c76dd6
This commit is contained in:
parent
f00404e0f6
commit
279f22ed08
@ -37,6 +37,7 @@
|
|||||||
- server: provide option to explicitly recreate event triggers for sources in the `reload_metadata` API
|
- server: provide option to explicitly recreate event triggers for sources in the `reload_metadata` API
|
||||||
- server: fix `gen_hasura_uuid` migration to be idempotent, so that it doesn't fail if the database is already initialised with source migrations.
|
- server: fix `gen_hasura_uuid` migration to be idempotent, so that it doesn't fail if the database is already initialised with source migrations.
|
||||||
- server: fix mssql `table_by_pk` query returning empty array (fix #7784)
|
- server: fix mssql `table_by_pk` query returning empty array (fix #7784)
|
||||||
|
- server: fix BigQuery queries failing with more than one array relationship
|
||||||
- console: add comments to tracked functions
|
- console: add comments to tracked functions
|
||||||
- console: add select all columns option while selecting the columns in event triggers
|
- console: add select all columns option while selecting the columns in event triggers
|
||||||
- console: add request transforms for events
|
- console: add request transforms for events
|
||||||
|
@ -1249,7 +1249,7 @@ fromArrayRelationSelectG annRelationSelectG = do
|
|||||||
ArrayAgg
|
ArrayAgg
|
||||||
{ arrayAggProjections =
|
{ arrayAggProjections =
|
||||||
fmap
|
fmap
|
||||||
aliasToFieldProjection
|
(aliasToFieldProjection (fromAlias (selectFrom select)))
|
||||||
(selectProjections select),
|
(selectProjections select),
|
||||||
arrayAggOrderBy = Nothing,
|
arrayAggOrderBy = Nothing,
|
||||||
arrayAggTop = selectTop select
|
arrayAggTop = selectTop select
|
||||||
@ -1352,9 +1352,12 @@ fromArrayRelationSelectG annRelationSelectG = do
|
|||||||
} = annRelationSelectG
|
} = annRelationSelectG
|
||||||
|
|
||||||
-- | For entity projections, convert any entity aliases to their field
|
-- | For entity projections, convert any entity aliases to their field
|
||||||
-- names. TODO: Add an explanation for this.
|
-- names. ArrayEntityProjection and ExpressionProjection get converted
|
||||||
aliasToFieldProjection :: Projection -> Projection
|
-- to aliases to fields with the same names as all the expressions
|
||||||
aliasToFieldProjection =
|
-- have already aliases applied in select from ArrayAgg
|
||||||
|
-- (created in Hasura.Backends.BigQuery.ToQuery.fromArrayAgg)
|
||||||
|
aliasToFieldProjection :: EntityAlias -> Projection -> Projection
|
||||||
|
aliasToFieldProjection (EntityAlias selectAlias) =
|
||||||
\case
|
\case
|
||||||
EntityProjection Aliased {aliasedAlias = name, aliasedThing = fields} ->
|
EntityProjection Aliased {aliasedAlias = name, aliasedThing = fields} ->
|
||||||
EntityProjection
|
EntityProjection
|
||||||
@ -1365,7 +1368,18 @@ aliasToFieldProjection =
|
|||||||
(\(FieldName {..}, origin) -> (FieldName {fieldNameEntity = name, ..}, origin))
|
(\(FieldName {..}, origin) -> (FieldName {fieldNameEntity = name, ..}, origin))
|
||||||
fields
|
fields
|
||||||
}
|
}
|
||||||
|
ArrayEntityProjection _ aliased ->
|
||||||
|
aliasColumn aliased
|
||||||
|
ExpressionProjection aliased ->
|
||||||
|
aliasColumn aliased
|
||||||
p -> p
|
p -> p
|
||||||
|
where
|
||||||
|
aliasColumn :: Aliased a -> Projection
|
||||||
|
aliasColumn aliased =
|
||||||
|
ExpressionProjection
|
||||||
|
aliased
|
||||||
|
{ aliasedThing = ColumnExpression (FieldName {fieldName = aliasedAlias aliased, fieldNameEntity = selectAlias})
|
||||||
|
}
|
||||||
|
|
||||||
fromRelName :: Rql.RelName -> FromIr Text
|
fromRelName :: Rql.RelName -> FromIr Text
|
||||||
fromRelName relName =
|
fromRelName relName =
|
||||||
|
@ -0,0 +1,153 @@
|
|||||||
|
- description: Author with articles with cited articles
|
||||||
|
url: /v1/graphql
|
||||||
|
status: 200
|
||||||
|
response:
|
||||||
|
data:
|
||||||
|
hasura_test_author:
|
||||||
|
- id: '1'
|
||||||
|
name: Author 1
|
||||||
|
articles:
|
||||||
|
- id: '1'
|
||||||
|
title: Title 1
|
||||||
|
content: Content 1
|
||||||
|
article_citations:
|
||||||
|
- description: citing the 2nd
|
||||||
|
cited_article:
|
||||||
|
id: '2'
|
||||||
|
title: Title 2
|
||||||
|
content: Content 2
|
||||||
|
- description: citing the third as well
|
||||||
|
cited_article:
|
||||||
|
id: '3'
|
||||||
|
title: Title 3
|
||||||
|
content: Content 3
|
||||||
|
- id: '2'
|
||||||
|
title: Title 2
|
||||||
|
content: Content 2
|
||||||
|
article_citations:
|
||||||
|
- description: the second also cites the third
|
||||||
|
cited_article:
|
||||||
|
id: '3'
|
||||||
|
title: Title 3
|
||||||
|
content: Content 3
|
||||||
|
- id: '2'
|
||||||
|
name: Author 2
|
||||||
|
articles:
|
||||||
|
- id: '3'
|
||||||
|
title: Title 3
|
||||||
|
content: Content 3
|
||||||
|
article_citations: []
|
||||||
|
query:
|
||||||
|
query: |
|
||||||
|
query {
|
||||||
|
hasura_test_author (order_by: {id: asc}) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
articles (order_by: {id:asc}){
|
||||||
|
id
|
||||||
|
title
|
||||||
|
content
|
||||||
|
article_citations {
|
||||||
|
description
|
||||||
|
cited_article {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- description: Author with articles with count of cited articles
|
||||||
|
url: /v1/graphql
|
||||||
|
status: 200
|
||||||
|
response:
|
||||||
|
data:
|
||||||
|
hasura_test_author:
|
||||||
|
- id: '1'
|
||||||
|
name: Author 1
|
||||||
|
articles:
|
||||||
|
- id: '1'
|
||||||
|
title: Title 1
|
||||||
|
content: Content 1
|
||||||
|
article_citations_aggregate:
|
||||||
|
aggregate:
|
||||||
|
count: '2'
|
||||||
|
- id: '2'
|
||||||
|
title: Title 2
|
||||||
|
content: Content 2
|
||||||
|
article_citations_aggregate:
|
||||||
|
aggregate:
|
||||||
|
count: '1'
|
||||||
|
- id: '2'
|
||||||
|
name: Author 2
|
||||||
|
articles:
|
||||||
|
- id: '3'
|
||||||
|
title: Title 3
|
||||||
|
content: Content 3
|
||||||
|
article_citations_aggregate:
|
||||||
|
aggregate:
|
||||||
|
count: '0'
|
||||||
|
query:
|
||||||
|
query: |
|
||||||
|
query {
|
||||||
|
hasura_test_author (order_by: {id: asc}) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
articles (order_by: {id:asc}){
|
||||||
|
id
|
||||||
|
title
|
||||||
|
content
|
||||||
|
article_citations_aggregate {
|
||||||
|
aggregate {
|
||||||
|
count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- description: Author with articles with article_citations in remote source
|
||||||
|
url: /v1/graphql
|
||||||
|
status: 200
|
||||||
|
response:
|
||||||
|
data:
|
||||||
|
hasura_test_author:
|
||||||
|
- id: '1'
|
||||||
|
name: Author 1
|
||||||
|
articles:
|
||||||
|
- id: '1'
|
||||||
|
title: Title 1
|
||||||
|
content: Content 1
|
||||||
|
article_citations2:
|
||||||
|
- description: citing the 2nd
|
||||||
|
- description: citing the third as well
|
||||||
|
- id: '2'
|
||||||
|
title: Title 2
|
||||||
|
content: Content 2
|
||||||
|
article_citations2:
|
||||||
|
- description: the second also cites the third
|
||||||
|
- id: '2'
|
||||||
|
name: Author 2
|
||||||
|
articles:
|
||||||
|
- id: '3'
|
||||||
|
title: Title 3
|
||||||
|
content: Content 3
|
||||||
|
article_citations2: []
|
||||||
|
query:
|
||||||
|
query: |
|
||||||
|
query {
|
||||||
|
hasura_test_author (order_by: {id: asc}) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
articles (order_by: {id:asc}){
|
||||||
|
id
|
||||||
|
title
|
||||||
|
content
|
||||||
|
article_citations2 {
|
||||||
|
description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -152,3 +152,18 @@ args:
|
|||||||
"fear innoculum",
|
"fear innoculum",
|
||||||
1002 );
|
1002 );
|
||||||
SELECT * from hasura_test.Album;
|
SELECT * from hasura_test.Album;
|
||||||
|
|
||||||
|
CREATE TABLE `hasura_test.article_citation` (
|
||||||
|
`article_id` INT64,
|
||||||
|
`cited_article_id` INT64,
|
||||||
|
`description` STRING,
|
||||||
|
);
|
||||||
|
INSERT INTO hasura_test.article_citation
|
||||||
|
(article_id, cited_article_id, description)
|
||||||
|
VALUES (1, 2, 'citing the 2nd'),
|
||||||
|
(1, 3, 'citing the third as well'),
|
||||||
|
(2, 3, 'the second also cites the third');
|
||||||
|
|
||||||
|
-- a copy for remote joins as we can't have the same table tracked in two sources
|
||||||
|
CREATE TABLE `hasura_test.article_citation2`
|
||||||
|
AS SELECT * FROM `hasura_test.article_citation`;
|
||||||
|
@ -176,6 +176,13 @@ args:
|
|||||||
dataset: hasura_test
|
dataset: hasura_test
|
||||||
name: all_types
|
name: all_types
|
||||||
|
|
||||||
|
- type: bigquery_track_table
|
||||||
|
args:
|
||||||
|
source: bigquery
|
||||||
|
table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article_citation
|
||||||
|
|
||||||
# === hasura_global_limited ===
|
# === hasura_global_limited ===
|
||||||
|
|
||||||
## track tables
|
## track tables
|
||||||
@ -224,6 +231,36 @@ args:
|
|||||||
column_mapping:
|
column_mapping:
|
||||||
artist_self_id: artist_other_id
|
artist_self_id: artist_other_id
|
||||||
|
|
||||||
|
- type: bigquery_create_array_relationship
|
||||||
|
args:
|
||||||
|
source: bigquery
|
||||||
|
table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article
|
||||||
|
name: article_citations
|
||||||
|
using:
|
||||||
|
manual_configuration:
|
||||||
|
remote_table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article_citation
|
||||||
|
column_mapping:
|
||||||
|
id: article_id
|
||||||
|
|
||||||
|
- type: bigquery_create_object_relationship
|
||||||
|
args:
|
||||||
|
source: bigquery
|
||||||
|
table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article_citation
|
||||||
|
name: cited_article
|
||||||
|
using:
|
||||||
|
manual_configuration:
|
||||||
|
remote_table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article
|
||||||
|
column_mapping:
|
||||||
|
cited_article_id: id
|
||||||
|
|
||||||
# === hasura_test/bigquery2 ===
|
# === hasura_test/bigquery2 ===
|
||||||
- type: bigquery_track_table
|
- type: bigquery_track_table
|
||||||
args:
|
args:
|
||||||
@ -265,3 +302,27 @@ args:
|
|||||||
table:
|
table:
|
||||||
name: article2
|
name: article2
|
||||||
dataset: hasura_test
|
dataset: hasura_test
|
||||||
|
|
||||||
|
- type: bigquery_track_table
|
||||||
|
args:
|
||||||
|
source: bigquery2
|
||||||
|
table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article_citation2
|
||||||
|
|
||||||
|
- type: bigquery_create_remote_relationship
|
||||||
|
args:
|
||||||
|
source: bigquery
|
||||||
|
table:
|
||||||
|
dataset: hasura_test
|
||||||
|
name: article
|
||||||
|
name: article_citations2
|
||||||
|
definition:
|
||||||
|
to_source:
|
||||||
|
relationship_type: array
|
||||||
|
field_mapping:
|
||||||
|
id: article_id
|
||||||
|
source: bigquery2
|
||||||
|
table:
|
||||||
|
name: article_citation2
|
||||||
|
dataset: hasura_test
|
||||||
|
@ -210,6 +210,9 @@ class TestGraphQLQueryBasicBigquery:
|
|||||||
def test_basic_remote_join(self, hge_ctx, transport):
|
def test_basic_remote_join(self, hge_ctx, transport):
|
||||||
check_query_f(hge_ctx, self.dir() + "/basic_remote_joins.yaml", transport)
|
check_query_f(hge_ctx, self.dir() + "/basic_remote_joins.yaml", transport)
|
||||||
|
|
||||||
|
def test_nested_array_relationships(self, hge_ctx, transport):
|
||||||
|
check_query_f(hge_ctx, self.dir() + "/nested_array_relationships.yaml", transport)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def dir(cls):
|
def dir(cls):
|
||||||
return 'queries/graphql_query/bigquery'
|
return 'queries/graphql_query/bigquery'
|
||||||
|
Loading…
Reference in New Issue
Block a user