Input validation patterns in GraphQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When we check inputs in GraphQL queries, it takes some time to run those checks. We want to understand how this time changes when inputs get bigger or more complex.
How does the time to validate inputs grow as we get more or larger inputs?
Analyze the time complexity of the following code snippet.
input UserInput {
name: String!
emails: [String!]!
}
type Mutation {
createUser(input: UserInput!): User
}
This snippet defines an input type with a list of emails and a mutation that accepts this input. Validation checks each email string.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Checking each email string in the emails list.
- How many times: Once for each email in the list.
As the number of emails grows, the time to check all emails grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 emails | 10 checks |
| 100 emails | 100 checks |
| 1000 emails | 1000 checks |
Pattern observation: The time grows directly with the number of emails. Double the emails, double the checks.
Time Complexity: O(n)
This means the time to validate inputs grows in a straight line with the number of emails provided.
[X] Wrong: "Validating inputs always takes the same time no matter how many items there are."
[OK] Correct: Each email must be checked, so more emails mean more work and more time.
Understanding how input validation time grows helps you write better queries and explain your code clearly in interviews. It shows you know how to think about performance in real situations.
"What if we added nested lists inside the emails input? How would the time complexity change?"
Practice
Solution
Step 1: Understand input validation role
Input validation checks data before it is saved or used to avoid errors or security issues.Step 2: Identify main goal in GraphQL
GraphQL uses input validation to keep data safe and correct before processing.Final Answer:
To ensure data is safe and correct before processing -> Option AQuick Check:
Input validation = data safety and correctness [OK]
- Confusing validation with performance optimization
- Thinking validation auto-generates UI
- Assuming validation stores data
Solution
Step 1: Review GraphQL schema capabilities
GraphQL schemas can define custom scalar types to validate formats like email or date.Step 2: Eliminate invalid options
SQL queries, CSS, and HTML are unrelated to schema validation.Final Answer:
Using custom scalar types for specific formats -> Option DQuick Check:
Custom scalars = validation in schema [OK]
- Confusing schema with UI styling
- Trying to embed SQL in schema
- Using HTML tags in schema definitions
input UserInput {
username: String!
}
resolver createUser(input: UserInput) {
if (input.username.length === 0) {
throw new Error('Username cannot be empty');
}
return saveUser(input);
}Solution
Step 1: Analyze resolver input check
The resolver checks if username length is zero and throws an error if true.Step 2: Understand effect of empty string input
Empty string triggers the error, so user is not saved.Final Answer:
The resolver throws an error and user is not saved -> Option BQuick Check:
Empty username triggers error in resolver [OK]
- Assuming schema rejects empty string automatically
- Thinking empty username is saved
- Ignoring resolver error handling
input ProductInput {
price: Float!
}
resolver addProduct(input: ProductInput) {
if (input.price < 0) {
return 'Price must be positive';
}
saveProduct(input);
return 'Product added';
}Solution
Step 1: Check error handling in resolver
The resolver returns a string on error instead of throwing an error, which may not stop execution properly.Step 2: Understand proper error signaling
Throwing an error is standard to halt processing and signal failure in GraphQL.Final Answer:
Returning a string error instead of throwing an error -> Option AQuick Check:
Errors should be thrown, not returned as strings [OK]
- Returning error messages instead of throwing
- Confusing Float and Int types
- Ignoring zero price validation
Solution
Step 1: Understand validation needs
Email must be valid format and lowercase before saving or processing.Step 2: Choose best GraphQL validation method
Custom scalar can enforce format; resolver can transform input to lowercase.Step 3: Evaluate other options
Relying only on String misses validation; directives alone can't transform; database validation is late.Final Answer:
Use a custom scalar for email format and transform input to lowercase in resolver -> Option CQuick Check:
Custom scalar + resolver transform = best validation [OK]
- Skipping format validation
- Expecting directives to transform input
- Validating only after saving data
