Skip to content

Commit baa12c8

Browse files
committed
add a test case
1 parent 016b79b commit baa12c8

File tree

3 files changed

+159
-1
lines changed

3 files changed

+159
-1
lines changed

src/merge.rs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use graphql_parser::query::{Field, Text};
1+
use graphql_parser::query::{Field, Text, Value};
22
use indexmap::IndexMap;
33

44
use crate::parser_util::alias_or_name;
@@ -13,6 +13,20 @@ where
1313
let response_key = alias_or_name(current_field);
1414
match merged.get_mut(&response_key) {
1515
Some(existing_field) => {
16+
if current_field.name != existing_field.name {
17+
return Err(format!(
18+
"Fields `{}` and `{}` are different",
19+
current_field.name.as_ref(),
20+
existing_field.name.as_ref(),
21+
));
22+
}
23+
if !same_arguments(&current_field.arguments, &existing_field.arguments) {
24+
return Err(format!(
25+
"Fields `{}` and `{}` are have different arguments",
26+
current_field.name.as_ref(),
27+
existing_field.name.as_ref(),
28+
));
29+
}
1630
existing_field
1731
.selection_set
1832
.items
@@ -32,3 +46,25 @@ where
3246

3347
Ok(fields)
3448
}
49+
50+
fn same_arguments<'a, 'b, T>(
51+
arguments_a: &[(T::Value, Value<'a, T>)],
52+
arguments_b: &[(T::Value, Value<'a, T>)],
53+
) -> bool
54+
where
55+
T: Text<'a> + Eq + AsRef<str> + Clone,
56+
{
57+
if arguments_a.len() != arguments_b.len() {
58+
return false;
59+
}
60+
61+
for (arg_a_name, arg_a_val) in arguments_a {
62+
for (arg_b_name, arg_b_val) in arguments_b {
63+
if arg_a_name == arg_b_name && arg_a_val != arg_b_val {
64+
return false;
65+
}
66+
}
67+
}
68+
69+
true
70+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
begin;
2+
-- https://github.com/supabase/pg_graphql/issues/237
3+
create table blog_post(
4+
id int primary key,
5+
a text,
6+
b text,
7+
c text,
8+
d text,
9+
e text,
10+
f text
11+
);
12+
insert into public.blog_post
13+
values (1, 'a', 'b', 'c', 'd', 'e', 'f');
14+
select jsonb_pretty(
15+
graphql.resolve($$
16+
query {
17+
blogPostCollection {
18+
edges {
19+
node {
20+
a
21+
...c_query
22+
... @include(if: true) {
23+
e
24+
}
25+
}
26+
}
27+
}
28+
blogPostCollection {
29+
edges {
30+
node {
31+
b
32+
...d_query
33+
... @include(if: true) {
34+
f
35+
}
36+
}
37+
}
38+
}
39+
}
40+
41+
fragment c_query on BlogPost {
42+
c
43+
}
44+
45+
fragment d_query on BlogPost {
46+
d
47+
}
48+
$$)
49+
);
50+
jsonb_pretty
51+
-----------------------------------
52+
{ +
53+
"data": { +
54+
"blogPostCollection": { +
55+
"edges": [ +
56+
{ +
57+
"node": { +
58+
"a": "a",+
59+
"b": "b",+
60+
"c": "c",+
61+
"d": "d",+
62+
"e": "e",+
63+
"f": "f" +
64+
} +
65+
} +
66+
] +
67+
} +
68+
} +
69+
}
70+
(1 row)
71+
72+
rollback;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
begin;
2+
-- https://github.com/supabase/pg_graphql/issues/237
3+
create table blog_post(
4+
id int primary key,
5+
a text,
6+
b text,
7+
c text,
8+
d text,
9+
e text,
10+
f text
11+
);
12+
insert into public.blog_post
13+
values (1, 'a', 'b', 'c', 'd', 'e', 'f');
14+
select jsonb_pretty(
15+
graphql.resolve($$
16+
query {
17+
blogPostCollection {
18+
edges {
19+
node {
20+
a
21+
...c_query
22+
... @include(if: true) {
23+
e
24+
}
25+
}
26+
}
27+
}
28+
blogPostCollection {
29+
edges {
30+
node {
31+
b
32+
...d_query
33+
... @include(if: true) {
34+
f
35+
}
36+
}
37+
}
38+
}
39+
}
40+
41+
fragment c_query on BlogPost {
42+
c
43+
}
44+
45+
fragment d_query on BlogPost {
46+
d
47+
}
48+
$$)
49+
);
50+
rollback;

0 commit comments

Comments
 (0)