Skip to content

Commit cde90d7

Browse files
authored
Merge pull request #133 from wravery/merge-cached-validation
Merge cached validation
2 parents fb4a589 + b88ba8e commit cde90d7

File tree

105 files changed

+8904
-4128
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+8904
-4128
lines changed

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Debug/
66
Release/
77
Testing/
88
Win32/
9-
/include/graphqlservice/IntrospectionSchema.h
9+
/include/graphqlservice/introspection/IntrospectionSchema.h
1010
/IntrospectionSchema.cpp
1111
*.filters
1212
*.vcxproj
@@ -27,12 +27,16 @@ Makefile
2727
.ninja_*
2828
schemagen
2929
settings.json
30+
/samples/benchmark
31+
/samples/benchmark_nointrospection
3032
/samples/sample
33+
/samples/sample_nointrospection
3134
/src/cmake/
3235
/test/argument_tests
3336
/test/pegtl_tests
3437
/test/response_tests
3538
/test/today_tests
39+
/test/nointrospection_tests
3640
build/
3741
install/
3842
isenseconfig/

doc/subscriptions.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ tell which operation type it is without parsing the query and searching for
8383
a specific operation name, so it's hard to tell whether you should call
8484
`resolve` or `subscribe` when the request is received that way. To help with
8585
that, there's a public `Request::findOperationDefinition` method which returns
86-
the operation type as a `std::string` along with a pointer to the AST node for
86+
the operation type as a `std::string_view` along with a pointer to the AST node for
8787
the selected operation in the parsed query:
8888
```cpp
89-
std::pair<std::string, const peg::ast_node*> findOperationDefinition(const peg::ast_node& root, const std::string& operationName) const;
89+
std::pair<std::string_view, const peg::ast_node*> findOperationDefinition(peg::ast& root, std::string_view operationName) const;
9090
```

include/SchemaGenerator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ struct GeneratorOptions
237237
const bool verbose = false;
238238
const bool separateFiles = false;
239239
const bool noStubs = false;
240+
const bool noIntrospection = false;
240241
};
241242

242243
// RAII object to help with emitting matching include guard begin and end statements
@@ -280,7 +281,7 @@ class PendingBlankLine
280281
bool reset() noexcept;
281282

282283
private:
283-
bool _pending = false;
284+
bool _pending = true;
284285
std::ostream& _outputFile;
285286
};
286287

include/Validation.h

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
#ifndef VALIDATION_H
77
#define VALIDATION_H
88

9+
#include "graphqlservice/GraphQLSchema.h"
910
#include "graphqlservice/GraphQLService.h"
10-
#include "graphqlservice/IntrospectionSchema.h"
1111

1212
namespace graphql::service {
1313

14-
using ValidateType = response::Value;
14+
using ValidateType = std::optional<std::reference_wrapper<const schema::BaseType>>;
15+
using SharedType = std::shared_ptr<const schema::BaseType>;
16+
17+
SharedType getSharedType(const ValidateType& type) noexcept;
18+
ValidateType getValidateType(const SharedType& type) noexcept;
1519

1620
struct ValidateArgument
1721
{
@@ -20,15 +24,15 @@ struct ValidateArgument
2024
ValidateType type;
2125
};
2226

23-
using ValidateTypeFieldArguments = std::map<std::string, ValidateArgument>;
27+
using ValidateTypeFieldArguments = std::map<std::string_view, ValidateArgument>;
2428

2529
struct ValidateTypeField
2630
{
2731
ValidateType returnType;
2832
ValidateTypeFieldArguments arguments;
2933
};
3034

31-
using ValidateDirectiveArguments = std::map<std::string, ValidateArgument>;
35+
using ValidateDirectiveArguments = std::map<std::string_view, ValidateArgument>;
3236

3337
struct ValidateDirective
3438
{
@@ -40,14 +44,14 @@ struct ValidateArgumentVariable
4044
{
4145
bool operator==(const ValidateArgumentVariable& other) const;
4246

43-
std::string name;
47+
std::string_view name;
4448
};
4549

4650
struct ValidateArgumentEnumValue
4751
{
4852
bool operator==(const ValidateArgumentEnumValue& other) const;
4953

50-
std::string value;
54+
std::string_view value;
5155
};
5256

5357
struct ValidateArgumentValue;
@@ -71,7 +75,7 @@ struct ValidateArgumentMap
7175
{
7276
bool operator==(const ValidateArgumentMap& other) const;
7377

74-
std::map<std::string, ValidateArgumentValuePtr> values;
78+
std::map<std::string_view, ValidateArgumentValuePtr> values;
7579
};
7680

7781
using ValidateArgumentVariant = std::variant<ValidateArgumentVariable, response::IntType,
@@ -118,29 +122,30 @@ class ValidateArgumentValueVisitor
118122
std::vector<schema_error>& _errors;
119123
};
120124

121-
using ValidateFieldArguments = std::map<std::string, ValidateArgumentValuePtr>;
125+
using ValidateFieldArguments = std::map<std::string_view, ValidateArgumentValuePtr>;
122126

123127
struct ValidateField
124128
{
125-
ValidateField(std::string&& returnType, std::optional<std::string>&& objectType,
126-
const std::string& fieldName, ValidateFieldArguments&& arguments);
129+
ValidateField(ValidateType&& returnType, ValidateType&& objectType, std::string_view fieldName,
130+
ValidateFieldArguments&& arguments);
127131

128132
bool operator==(const ValidateField& other) const;
129133

130-
std::string returnType;
131-
std::optional<std::string> objectType;
132-
std::string fieldName;
134+
ValidateType returnType;
135+
ValidateType objectType;
136+
std::string_view fieldName;
133137
ValidateFieldArguments arguments;
134138
};
135139

136-
using ValidateTypeKinds = std::map<std::string, introspection::TypeKind>;
140+
using ValidateTypes = std::map<std::string_view, ValidateType>;
137141

138142
// ValidateVariableTypeVisitor visits the AST and builds a ValidateType structure representing
139143
// a variable type in an operation definition as if it came from an Introspection query.
140144
class ValidateVariableTypeVisitor
141145
{
142146
public:
143-
ValidateVariableTypeVisitor(const ValidateTypeKinds& typeKinds);
147+
ValidateVariableTypeVisitor(
148+
const std::shared_ptr<schema::Schema>& schema, const ValidateTypes& types);
144149

145150
void visit(const peg::ast_node& typeName);
146151

@@ -152,7 +157,8 @@ class ValidateVariableTypeVisitor
152157
void visitListType(const peg::ast_node& listType);
153158
void visitNonNullType(const peg::ast_node& nonNullType);
154159

155-
const ValidateTypeKinds& _typeKinds;
160+
const std::shared_ptr<schema::Schema>& _schema;
161+
const ValidateTypes& _types;
156162

157163
bool _isInputType = false;
158164
ValidateType _variableType;
@@ -163,38 +169,34 @@ class ValidateVariableTypeVisitor
163169
class ValidateExecutableVisitor
164170
{
165171
public:
166-
ValidateExecutableVisitor(const Request& service);
172+
ValidateExecutableVisitor(const std::shared_ptr<schema::Schema>& schema);
167173

168174
void visit(const peg::ast_node& root);
169175

170176
std::vector<schema_error> getStructuredErrors();
171177

172178
private:
173-
response::Value executeQuery(std::string_view query) const;
174-
175-
static ValidateTypeFieldArguments getArguments(response::ListType&& argumentsMember);
179+
static ValidateTypeFieldArguments getArguments(
180+
const std::vector<std::shared_ptr<const schema::InputValue>>& args);
176181

177-
using FieldTypes = std::map<std::string, ValidateTypeField>;
178-
using TypeFields = std::map<std::string, FieldTypes>;
182+
using FieldTypes = std::map<std::string_view, ValidateTypeField>;
183+
using TypeFields = std::map<std::string_view, FieldTypes>;
179184
using InputFieldTypes = ValidateTypeFieldArguments;
180-
using InputTypeFields = std::map<std::string, InputFieldTypes>;
181-
using EnumValues = std::map<std::string, std::set<std::string>>;
185+
using InputTypeFields = std::map<std::string_view, InputFieldTypes>;
186+
using EnumValues = std::map<std::string_view, std::set<std::string_view>>;
182187

183-
std::optional<introspection::TypeKind> getTypeKind(const std::string& name) const;
184-
std::optional<introspection::TypeKind> getScopedTypeKind() const;
185188
constexpr bool isScalarType(introspection::TypeKind kind);
186189

187-
bool matchesScopedType(const std::string& name) const;
190+
bool matchesScopedType(std::string_view name) const;
188191

189192
TypeFields::const_iterator getScopedTypeFields();
190-
InputTypeFields::const_iterator getInputTypeFields(const std::string& name);
193+
InputTypeFields::const_iterator getInputTypeFields(std::string_view name);
191194
static const ValidateType& getValidateFieldType(const FieldTypes::mapped_type& value);
192195
static const ValidateType& getValidateFieldType(const InputFieldTypes::mapped_type& value);
193196
template <class _FieldTypes>
194-
static std::string getFieldType(const _FieldTypes& fields, const std::string& name);
197+
static ValidateType getFieldType(const _FieldTypes& fields, std::string_view name);
195198
template <class _FieldTypes>
196-
static std::string getWrappedFieldType(const _FieldTypes& fields, const std::string& name);
197-
static std::string getWrappedFieldType(const ValidateType& returnType);
199+
static ValidateType getWrappedFieldType(const _FieldTypes& fields, std::string_view name);
198200

199201
void visitFragmentDefinition(const peg::ast_node& fragmentDefinition);
200202
void visitOperationDefinition(const peg::ast_node& operationDefinition);
@@ -213,23 +215,22 @@ class ValidateExecutableVisitor
213215
bool validateVariableType(bool isNonNull, const ValidateType& variableType,
214216
const schema_location& position, const ValidateType& inputType);
215217

216-
const Request& _service;
218+
const std::shared_ptr<schema::Schema> _schema;
217219
std::vector<schema_error> _errors;
218220

219-
using OperationTypes = std::map<std::string_view, std::string>;
220-
using Directives = std::map<std::string, ValidateDirective>;
221-
using ExecutableNodes = std::map<std::string, const peg::ast_node&>;
222-
using FragmentSet = std::unordered_set<std::string>;
223-
using MatchingTypes = std::map<std::string, std::set<std::string>>;
224-
using ScalarTypes = std::set<std::string>;
225-
using VariableDefinitions = std::map<std::string, const peg::ast_node&>;
226-
using VariableTypes = std::map<std::string, ValidateArgument>;
221+
using Directives = std::map<std::string_view, ValidateDirective>;
222+
using ExecutableNodes = std::map<std::string_view, const peg::ast_node&>;
223+
using FragmentSet = std::unordered_set<std::string_view>;
224+
using MatchingTypes = std::map<std::string_view, std::set<std::string_view>>;
225+
using ScalarTypes = std::set<std::string_view>;
226+
using VariableDefinitions = std::map<std::string_view, const peg::ast_node&>;
227+
using VariableTypes = std::map<std::string_view, ValidateArgument>;
227228
using OperationVariables = std::optional<VariableTypes>;
228-
using VariableSet = std::set<std::string>;
229+
using VariableSet = std::set<std::string_view>;
229230

230231
// These members store Introspection schema information which does not change between queries.
231-
OperationTypes _operationTypes;
232-
ValidateTypeKinds _typeKinds;
232+
ValidateTypes _operationTypes;
233+
ValidateTypes _types;
233234
MatchingTypes _matchingTypes;
234235
Directives _directives;
235236
EnumValues _enumValues;
@@ -250,8 +251,8 @@ class ValidateExecutableVisitor
250251
size_t _fieldCount = 0;
251252
TypeFields _typeFields;
252253
InputTypeFields _inputTypeFields;
253-
std::string _scopedType;
254-
std::map<std::string, ValidateField> _selectionFields;
254+
ValidateType _scopedType;
255+
std::map<std::string_view, ValidateField> _selectionFields;
255256
};
256257

257258
} /* namespace graphql::service */

0 commit comments

Comments
 (0)