Skip to content

Commit

Permalink
skip generating client edge queries for base project fragments
Browse files Browse the repository at this point in the history
Summary:
This change is similar to what we already have in `refetchable_fragment` transform:

https://www.internalfb.com/code/fbsource/[cf6c8294ca8d123f9c1fb27d785cce3ebfe9f632]/fbcode/relay/oss/crates/relay-transforms/src/refetchable_fragment/mod.rs?lines=89-104

Where we do not generate queries for the base project fragments.

Reviewed By: captbaritone

Differential Revision: D49844401

fbshipit-source-id: 759b95eeef289bb7ea0eb62cefe46d0e580a083b
  • Loading branch information
alunyov authored and facebook-github-bot committed Oct 3, 2023
1 parent d06bdd7 commit c899a68
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 38 deletions.
2 changes: 1 addition & 1 deletion compiler/crates/relay-codegen/tests/client_edges/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub fn transform_fixture(fixture: &Fixture<'_>) -> Result<String, String> {
..Default::default()
};
let next_program = sort_selections(
&client_edges(&program, &project_config)
&client_edges(&program, &project_config, &Default::default())
.and_then(|program| relay_resolvers(ProjectName::default(), &program, true))
.unwrap(),
);
Expand Down
12 changes: 9 additions & 3 deletions compiler/crates/relay-transforms/src/apply_transforms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,9 @@ fn apply_reader_transforms(
.feature_flags
.enable_resolver_normalization_ast
{
program = log_event.time("client_edges", || client_edges(&program, project_config))?;
program = log_event.time("client_edges", || {
client_edges(&program, project_config, &base_fragment_names)
})?;

program = log_event.time("relay_resolvers", || {
relay_resolvers(
Expand Down Expand Up @@ -334,7 +336,9 @@ fn apply_operation_transforms(
skip_updatable_queries(&program)
});

program = log_event.time("client_edges", || client_edges(&program, project_config))?;
program = log_event.time("client_edges", || {
client_edges(&program, project_config, &base_fragment_names)
})?;
program = log_event.time("relay_resolvers", || {
relay_resolvers(
project_config.name,
Expand Down Expand Up @@ -650,7 +654,9 @@ fn apply_typegen_transforms(
)?;
}

program = log_event.time("client_edges", || client_edges(&program, project_config))?;
program = log_event.time("client_edges", || {
client_edges(&program, project_config, &base_fragment_names)
})?;

program = log_event.time(
"transform_assignable_fragment_spreads_in_regular_queries",
Expand Down
74 changes: 41 additions & 33 deletions compiler/crates/relay-transforms/src/client_edges.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ use common::ArgumentName;
use common::Diagnostic;
use common::DiagnosticsResult;
use common::DirectiveName;
use common::FeatureFlag;
use common::FeatureFlags;
use common::Location;
use common::NamedItem;
use common::ObjectName;
Expand All @@ -27,6 +25,7 @@ use graphql_ir::ExecutableDefinitionName;
use graphql_ir::Field;
use graphql_ir::FragmentDefinition;
use graphql_ir::FragmentDefinitionName;
use graphql_ir::FragmentDefinitionNameSet;
use graphql_ir::InlineFragment;
use graphql_ir::LinkedField;
use graphql_ir::OperationDefinition;
Expand All @@ -43,7 +42,6 @@ use intern::string_key::StringKeyMap;
use intern::Lookup;
use lazy_static::lazy_static;
use relay_config::ProjectConfig;
use relay_config::SchemaConfig;
use schema::DirectiveValue;
use schema::Schema;
use schema::Type;
Expand Down Expand Up @@ -149,12 +147,9 @@ impl<'a> ClientEdgeMetadata<'a> {
pub fn client_edges(
program: &Program,
project_config: &ProjectConfig,
base_fragment_names: &FragmentDefinitionNameSet,
) -> DiagnosticsResult<Program> {
let mut transform = ClientEdgesTransform::new(
program,
&project_config.schema_config,
&project_config.feature_flags,
);
let mut transform = ClientEdgesTransform::new(program, project_config, base_fragment_names);
let mut next_program = transform
.transform_program(program)
.replace_or_else(|| program.clone());
Expand All @@ -172,48 +167,45 @@ pub fn client_edges(
}
}

struct ClientEdgesTransform<'program, 'sc, 'flag> {
struct ClientEdgesTransform<'program, 'pc> {
path: Vec<&'program str>,
document_name: Option<WithLocation<ExecutableDefinitionName>>,
query_names: StringKeyMap<usize>,
program: &'program Program,
new_fragments: Vec<Arc<FragmentDefinition>>,
new_operations: Vec<OperationDefinition>,
errors: Vec<Diagnostic>,
schema_config: &'sc SchemaConfig,
project_config: &'pc ProjectConfig,
next_key: u32,
relay_resolver_enable_interface_output_type: &'flag FeatureFlag,
base_fragment_names: &'program FragmentDefinitionNameSet,
}

impl<'program, 'sc, 'flag> ClientEdgesTransform<'program, 'sc, 'flag> {
impl<'program, 'pc> ClientEdgesTransform<'program, 'pc> {
fn new(
program: &'program Program,
schema_config: &'sc SchemaConfig,
feature_flags: &'flag FeatureFlags,
project_config: &'pc ProjectConfig,
base_fragment_names: &'program FragmentDefinitionNameSet,
) -> Self {
Self {
program,
schema_config,
path: Default::default(),
query_names: Default::default(),
document_name: Default::default(),
new_fragments: Default::default(),
new_operations: Default::default(),
errors: Default::default(),
next_key: 0,
relay_resolver_enable_interface_output_type: &feature_flags
.relay_resolver_enable_interface_output_type,
project_config,
base_fragment_names,
}
}

fn generate_query_name(&mut self) -> OperationDefinitionName {
let document_name = self.document_name.expect("We are within a document");
let name_root = format!(
"ClientEdgeQuery_{}_{}",
document_name.item,
self.path.join("__")
)
.intern();
fn generate_query_name(
&mut self,
document_name: ExecutableDefinitionName,
) -> OperationDefinitionName {
let name_root =
format!("ClientEdgeQuery_{}_{}", document_name, self.path.join("__")).intern();

// Due to duplicate inline fragments, or inline fragments without type
// conditions, it's possible that multiple fields will have the same
Expand Down Expand Up @@ -266,7 +258,8 @@ impl<'program, 'sc, 'flag> ClientEdgesTransform<'program, 'sc, 'flag> {
selections,
};

let mut transformer = RefetchableFragment::new(self.program, self.schema_config, false);
let mut transformer =
RefetchableFragment::new(self.program, &self.project_config.schema_config, false);

let refetchable_fragment = transformer
.transform_refetch_fragment_with_refetchable_directive(
Expand Down Expand Up @@ -366,6 +359,8 @@ impl<'program, 'sc, 'flag> ClientEdgesTransform<'program, 'sc, 'flag> {
));
}
if !self
.project_config
.feature_flags
.relay_resolver_enable_interface_output_type
.is_fully_enabled()
&& !has_output_type(resolver_directive)
Expand Down Expand Up @@ -413,13 +408,26 @@ impl<'program, 'sc, 'flag> ClientEdgesTransform<'program, 'sc, 'flag> {
field_location,
));
}
let client_edge_query_name = self.generate_query_name();
let document_name = self.document_name.expect("We are within a document");
let client_edge_query_name = self.generate_query_name(document_name.item);

let should_generate_query =
if let ExecutableDefinitionName::FragmentDefinitionName(fragment_name) =
document_name.item
{
// For base fragments we don't need to generate refetch queries
!self.base_fragment_names.contains(&fragment_name)
} else {
true
};
if should_generate_query {
self.generate_client_edge_query(
client_edge_query_name,
field_type.type_.inner(),
selections,
);
}

self.generate_client_edge_query(
client_edge_query_name,
field_type.type_.inner(),
selections,
);
ClientEdgeMetadataDirective::ServerObject {
query_name: client_edge_query_name,
unique_id: self.get_key(),
Expand Down Expand Up @@ -524,7 +532,7 @@ fn create_inline_fragment_for_client_edge(
}
}

impl Transformer for ClientEdgesTransform<'_, '_, '_> {
impl Transformer for ClientEdgesTransform<'_, '_> {
const NAME: &'static str = "ClientEdgesTransform";
const VISIT_ARGUMENTS: bool = false;
const VISIT_DIRECTIVES: bool = false;
Expand Down
2 changes: 1 addition & 1 deletion compiler/crates/relay-transforms/tests/client_edges/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub fn transform_fixture(fixture: &Fixture<'_>) -> Result<String, String> {
feature_flags,
..Default::default()
};
let mut next_program = client_edges(&program, &project_config)
let mut next_program = client_edges(&program, &project_config, &Default::default())
.map_err(|diagnostics| diagnostics_to_sorted_string(fixture.content, &diagnostics))?;

next_program = relay_resolvers(ProjectName::default(), &next_program, true)
Expand Down

0 comments on commit c899a68

Please sign in to comment.