Skip to content

Commit 2dba609

Browse files
authored
Merge pull request #121 from wravery/flat-resolver-map
Flat resolver map
2 parents e1e6aef + a28ce83 commit 2dba609

29 files changed

+351
-286
lines changed

cmake/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.2.4
1+
3.3.0

include/graphqlservice/GraphQLResponse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
#include <memory>
2020
#include <string>
21-
#include <vector>
2221
#include <unordered_map>
22+
#include <vector>
2323

2424
namespace graphql::response {
2525

include/graphqlservice/GraphQLService.h

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,24 @@
1919
#include "graphqlservice/GraphQLParse.h"
2020
#include "graphqlservice/GraphQLResponse.h"
2121

22-
#include <memory>
23-
#include <optional>
24-
#include <variant>
25-
#include <string_view>
26-
#include <string>
27-
#include <sstream>
28-
#include <vector>
2922
#include <functional>
30-
#include <unordered_map>
31-
#include <unordered_set>
32-
#include <stdexcept>
33-
#include <type_traits>
3423
#include <future>
24+
#include <map>
25+
#include <memory>
3526
#include <mutex>
27+
#include <optional>
3628
#include <queue>
37-
#include <map>
3829
#include <set>
30+
#include <sstream>
31+
#include <string>
32+
#include <string_view>
33+
#include <stdexcept>
34+
#include <type_traits>
35+
#include <tuple>
36+
#include <unordered_map>
37+
#include <unordered_set>
38+
#include <variant>
39+
#include <vector>
3940

4041
namespace graphql::service {
4142

@@ -243,7 +244,7 @@ struct ResolverParams : SelectionSetParams
243244
};
244245

245246
using Resolver = std::function<std::future<response::Value>(ResolverParams&&)>;
246-
using ResolverMap = std::unordered_map<std::string, Resolver>;
247+
using ResolverMap = std::vector<std::pair<std::string_view, Resolver>>;
247248

248249
// Binary data and opaque strings like IDs are encoded in Base64.
249250
class Base64

samples/introspection/IntrospectionSchema.cpp

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
#include "graphqlservice/Introspection.h"
55

66
#include <algorithm>
7+
#include <array>
78
#include <functional>
9+
#include <stdexcept>
810
#include <sstream>
9-
#include <unordered_map>
10-
#include <exception>
11-
#include <array>
11+
#include <string_view>
12+
#include <tuple>
13+
#include <vector>
14+
15+
using namespace std::literals;
1216

1317
namespace graphql {
1418
namespace service {
@@ -118,12 +122,12 @@ Schema::Schema()
118122
: service::Object({
119123
"__Schema"
120124
}, {
121-
{ "types", [this](service::ResolverParams&& params) { return resolveTypes(std::move(params)); } },
122-
{ "queryType", [this](service::ResolverParams&& params) { return resolveQueryType(std::move(params)); } },
123-
{ "mutationType", [this](service::ResolverParams&& params) { return resolveMutationType(std::move(params)); } },
124-
{ "subscriptionType", [this](service::ResolverParams&& params) { return resolveSubscriptionType(std::move(params)); } },
125-
{ "directives", [this](service::ResolverParams&& params) { return resolveDirectives(std::move(params)); } },
126-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
125+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
126+
{ R"gql(directives)gql"sv, [this](service::ResolverParams&& params) { return resolveDirectives(std::move(params)); } },
127+
{ R"gql(mutationType)gql"sv, [this](service::ResolverParams&& params) { return resolveMutationType(std::move(params)); } },
128+
{ R"gql(queryType)gql"sv, [this](service::ResolverParams&& params) { return resolveQueryType(std::move(params)); } },
129+
{ R"gql(subscriptionType)gql"sv, [this](service::ResolverParams&& params) { return resolveSubscriptionType(std::move(params)); } },
130+
{ R"gql(types)gql"sv, [this](service::ResolverParams&& params) { return resolveTypes(std::move(params)); } }
127131
})
128132
{
129133
}
@@ -182,16 +186,16 @@ Type::Type()
182186
: service::Object({
183187
"__Type"
184188
}, {
185-
{ "kind", [this](service::ResolverParams&& params) { return resolveKind(std::move(params)); } },
186-
{ "name", [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
187-
{ "description", [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
188-
{ "fields", [this](service::ResolverParams&& params) { return resolveFields(std::move(params)); } },
189-
{ "interfaces", [this](service::ResolverParams&& params) { return resolveInterfaces(std::move(params)); } },
190-
{ "possibleTypes", [this](service::ResolverParams&& params) { return resolvePossibleTypes(std::move(params)); } },
191-
{ "enumValues", [this](service::ResolverParams&& params) { return resolveEnumValues(std::move(params)); } },
192-
{ "inputFields", [this](service::ResolverParams&& params) { return resolveInputFields(std::move(params)); } },
193-
{ "ofType", [this](service::ResolverParams&& params) { return resolveOfType(std::move(params)); } },
194-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
189+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
190+
{ R"gql(description)gql"sv, [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
191+
{ R"gql(enumValues)gql"sv, [this](service::ResolverParams&& params) { return resolveEnumValues(std::move(params)); } },
192+
{ R"gql(fields)gql"sv, [this](service::ResolverParams&& params) { return resolveFields(std::move(params)); } },
193+
{ R"gql(inputFields)gql"sv, [this](service::ResolverParams&& params) { return resolveInputFields(std::move(params)); } },
194+
{ R"gql(interfaces)gql"sv, [this](service::ResolverParams&& params) { return resolveInterfaces(std::move(params)); } },
195+
{ R"gql(kind)gql"sv, [this](service::ResolverParams&& params) { return resolveKind(std::move(params)); } },
196+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
197+
{ R"gql(ofType)gql"sv, [this](service::ResolverParams&& params) { return resolveOfType(std::move(params)); } },
198+
{ R"gql(possibleTypes)gql"sv, [this](service::ResolverParams&& params) { return resolvePossibleTypes(std::move(params)); } }
195199
})
196200
{
197201
}
@@ -316,13 +320,13 @@ Field::Field()
316320
: service::Object({
317321
"__Field"
318322
}, {
319-
{ "name", [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
320-
{ "description", [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
321-
{ "args", [this](service::ResolverParams&& params) { return resolveArgs(std::move(params)); } },
322-
{ "type", [this](service::ResolverParams&& params) { return resolveType(std::move(params)); } },
323-
{ "isDeprecated", [this](service::ResolverParams&& params) { return resolveIsDeprecated(std::move(params)); } },
324-
{ "deprecationReason", [this](service::ResolverParams&& params) { return resolveDeprecationReason(std::move(params)); } },
325-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
323+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
324+
{ R"gql(args)gql"sv, [this](service::ResolverParams&& params) { return resolveArgs(std::move(params)); } },
325+
{ R"gql(deprecationReason)gql"sv, [this](service::ResolverParams&& params) { return resolveDeprecationReason(std::move(params)); } },
326+
{ R"gql(description)gql"sv, [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
327+
{ R"gql(isDeprecated)gql"sv, [this](service::ResolverParams&& params) { return resolveIsDeprecated(std::move(params)); } },
328+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
329+
{ R"gql(type)gql"sv, [this](service::ResolverParams&& params) { return resolveType(std::move(params)); } }
326330
})
327331
{
328332
}
@@ -390,11 +394,11 @@ InputValue::InputValue()
390394
: service::Object({
391395
"__InputValue"
392396
}, {
393-
{ "name", [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
394-
{ "description", [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
395-
{ "type", [this](service::ResolverParams&& params) { return resolveType(std::move(params)); } },
396-
{ "defaultValue", [this](service::ResolverParams&& params) { return resolveDefaultValue(std::move(params)); } },
397-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
397+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
398+
{ R"gql(defaultValue)gql"sv, [this](service::ResolverParams&& params) { return resolveDefaultValue(std::move(params)); } },
399+
{ R"gql(description)gql"sv, [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
400+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
401+
{ R"gql(type)gql"sv, [this](service::ResolverParams&& params) { return resolveType(std::move(params)); } }
398402
})
399403
{
400404
}
@@ -444,11 +448,11 @@ EnumValue::EnumValue()
444448
: service::Object({
445449
"__EnumValue"
446450
}, {
447-
{ "name", [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
448-
{ "description", [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
449-
{ "isDeprecated", [this](service::ResolverParams&& params) { return resolveIsDeprecated(std::move(params)); } },
450-
{ "deprecationReason", [this](service::ResolverParams&& params) { return resolveDeprecationReason(std::move(params)); } },
451-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
451+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
452+
{ R"gql(deprecationReason)gql"sv, [this](service::ResolverParams&& params) { return resolveDeprecationReason(std::move(params)); } },
453+
{ R"gql(description)gql"sv, [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
454+
{ R"gql(isDeprecated)gql"sv, [this](service::ResolverParams&& params) { return resolveIsDeprecated(std::move(params)); } },
455+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } }
452456
})
453457
{
454458
}
@@ -498,11 +502,11 @@ Directive::Directive()
498502
: service::Object({
499503
"__Directive"
500504
}, {
501-
{ "name", [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
502-
{ "description", [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
503-
{ "locations", [this](service::ResolverParams&& params) { return resolveLocations(std::move(params)); } },
504-
{ "args", [this](service::ResolverParams&& params) { return resolveArgs(std::move(params)); } },
505-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
505+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
506+
{ R"gql(args)gql"sv, [this](service::ResolverParams&& params) { return resolveArgs(std::move(params)); } },
507+
{ R"gql(description)gql"sv, [this](service::ResolverParams&& params) { return resolveDescription(std::move(params)); } },
508+
{ R"gql(locations)gql"sv, [this](service::ResolverParams&& params) { return resolveLocations(std::move(params)); } },
509+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } }
506510
})
507511
{
508512
}

samples/separate/AppointmentConnectionObject.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -18,9 +20,9 @@ AppointmentConnection::AppointmentConnection()
1820
: service::Object({
1921
"AppointmentConnection"
2022
}, {
21-
{ "pageInfo", [this](service::ResolverParams&& params) { return resolvePageInfo(std::move(params)); } },
22-
{ "edges", [this](service::ResolverParams&& params) { return resolveEdges(std::move(params)); } },
23-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
23+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24+
{ R"gql(edges)gql"sv, [this](service::ResolverParams&& params) { return resolveEdges(std::move(params)); } },
25+
{ R"gql(pageInfo)gql"sv, [this](service::ResolverParams&& params) { return resolvePageInfo(std::move(params)); } }
2426
})
2527
{
2628
}

samples/separate/AppointmentEdgeObject.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -18,9 +20,9 @@ AppointmentEdge::AppointmentEdge()
1820
: service::Object({
1921
"AppointmentEdge"
2022
}, {
21-
{ "node", [this](service::ResolverParams&& params) { return resolveNode(std::move(params)); } },
22-
{ "cursor", [this](service::ResolverParams&& params) { return resolveCursor(std::move(params)); } },
23-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
23+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24+
{ R"gql(cursor)gql"sv, [this](service::ResolverParams&& params) { return resolveCursor(std::move(params)); } },
25+
{ R"gql(node)gql"sv, [this](service::ResolverParams&& params) { return resolveNode(std::move(params)); } }
2426
})
2527
{
2628
}

samples/separate/AppointmentObject.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -20,11 +22,11 @@ Appointment::Appointment()
2022
"UnionType",
2123
"Appointment"
2224
}, {
23-
{ "id", [this](service::ResolverParams&& params) { return resolveId(std::move(params)); } },
24-
{ "when", [this](service::ResolverParams&& params) { return resolveWhen(std::move(params)); } },
25-
{ "subject", [this](service::ResolverParams&& params) { return resolveSubject(std::move(params)); } },
26-
{ "isNow", [this](service::ResolverParams&& params) { return resolveIsNow(std::move(params)); } },
27-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
25+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
26+
{ R"gql(id)gql"sv, [this](service::ResolverParams&& params) { return resolveId(std::move(params)); } },
27+
{ R"gql(isNow)gql"sv, [this](service::ResolverParams&& params) { return resolveIsNow(std::move(params)); } },
28+
{ R"gql(subject)gql"sv, [this](service::ResolverParams&& params) { return resolveSubject(std::move(params)); } },
29+
{ R"gql(when)gql"sv, [this](service::ResolverParams&& params) { return resolveWhen(std::move(params)); } }
2830
})
2931
{
3032
}

samples/separate/CompleteTaskPayloadObject.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -18,9 +20,9 @@ CompleteTaskPayload::CompleteTaskPayload()
1820
: service::Object({
1921
"CompleteTaskPayload"
2022
}, {
21-
{ "task", [this](service::ResolverParams&& params) { return resolveTask(std::move(params)); } },
22-
{ "clientMutationId", [this](service::ResolverParams&& params) { return resolveClientMutationId(std::move(params)); } },
23-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
23+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24+
{ R"gql(clientMutationId)gql"sv, [this](service::ResolverParams&& params) { return resolveClientMutationId(std::move(params)); } },
25+
{ R"gql(task)gql"sv, [this](service::ResolverParams&& params) { return resolveTask(std::move(params)); } }
2426
})
2527
{
2628
}

samples/separate/ExpensiveObject.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -18,8 +20,8 @@ Expensive::Expensive()
1820
: service::Object({
1921
"Expensive"
2022
}, {
21-
{ "order", [this](service::ResolverParams&& params) { return resolveOrder(std::move(params)); } },
22-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
23+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24+
{ R"gql(order)gql"sv, [this](service::ResolverParams&& params) { return resolveOrder(std::move(params)); } }
2325
})
2426
{
2527
}

samples/separate/FolderConnectionObject.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
#include <algorithm>
99
#include <functional>
10+
#include <stdexcept>
1011
#include <sstream>
1112
#include <unordered_map>
12-
#include <exception>
13+
14+
using namespace std::literals;
1315

1416
namespace graphql::today {
1517
namespace object {
@@ -18,9 +20,9 @@ FolderConnection::FolderConnection()
1820
: service::Object({
1921
"FolderConnection"
2022
}, {
21-
{ "pageInfo", [this](service::ResolverParams&& params) { return resolvePageInfo(std::move(params)); } },
22-
{ "edges", [this](service::ResolverParams&& params) { return resolveEdges(std::move(params)); } },
23-
{ "__typename", [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } }
23+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24+
{ R"gql(edges)gql"sv, [this](service::ResolverParams&& params) { return resolveEdges(std::move(params)); } },
25+
{ R"gql(pageInfo)gql"sv, [this](service::ResolverParams&& params) { return resolvePageInfo(std::move(params)); } }
2426
})
2527
{
2628
}

0 commit comments

Comments
 (0)