@@ -1735,6 +1735,7 @@ void SubscriptionDefinitionVisitor::visitInlineFragment(const peg::ast_node& inl
17351735
17361736Request::Request (TypeMap operationTypes, std::shared_ptr<schema::Schema> schema)
17371737 : _operations(std::move(operationTypes))
1738+ , _schema(schema)
17381739 , _validation(std::make_unique<ValidateExecutableVisitor>(std::move(schema)))
17391740{
17401741}
@@ -1746,6 +1747,82 @@ Request::~Request()
17461747 // forward declaration of the class.
17471748}
17481749
1750+ std::shared_ptr<const Request> Request::stitch (const std::shared_ptr<const Request>& added) const
1751+ {
1752+ TypeMap operations;
1753+ auto itrOriginalQuery = _operations.find (strQuery);
1754+ auto itrAddedQuery = added->_operations .find (strQuery);
1755+
1756+ if (itrOriginalQuery != _operations.end () && itrOriginalQuery->second )
1757+ {
1758+ if (itrAddedQuery != added->_operations .end () && itrAddedQuery->second )
1759+ {
1760+ operations.emplace (strQuery,
1761+ itrOriginalQuery->second ->StitchObject (itrAddedQuery->second ));
1762+ }
1763+ else
1764+ {
1765+ operations.emplace (strQuery, itrOriginalQuery->second );
1766+ }
1767+ }
1768+ else if (itrAddedQuery != added->_operations .end () && itrAddedQuery->second )
1769+ {
1770+ operations.emplace (strQuery, itrAddedQuery->second );
1771+ }
1772+
1773+ auto itrOriginalMutation = _operations.find (strMutation);
1774+ auto itrAddedMutation = added->_operations .find (strMutation);
1775+
1776+ if (itrOriginalMutation != _operations.end () && itrOriginalMutation->second )
1777+ {
1778+ if (itrAddedMutation != added->_operations .end () && itrAddedMutation->second )
1779+ {
1780+ operations.emplace (strMutation,
1781+ itrOriginalMutation->second ->StitchObject (itrAddedMutation->second ));
1782+ }
1783+ else
1784+ {
1785+ operations.emplace (strMutation, itrOriginalMutation->second );
1786+ }
1787+ }
1788+ else if (itrAddedMutation != added->_operations .end () && itrAddedMutation->second )
1789+ {
1790+ operations.emplace (strMutation, itrAddedMutation->second );
1791+ }
1792+
1793+ auto itrOriginalSubscription = _operations.find (strSubscription);
1794+ auto itrAddedSubscription = added->_operations .find (strSubscription);
1795+
1796+ if (itrOriginalSubscription != _operations.end () && itrOriginalSubscription->second )
1797+ {
1798+ if (itrAddedSubscription != added->_operations .end () && itrAddedSubscription->second )
1799+ {
1800+ operations.emplace (strSubscription,
1801+ itrOriginalSubscription->second ->StitchObject (itrAddedSubscription->second ));
1802+ }
1803+ else
1804+ {
1805+ operations.emplace (strSubscription, itrOriginalSubscription->second );
1806+ }
1807+ }
1808+ else if (itrAddedSubscription != added->_operations .end () && itrAddedSubscription->second )
1809+ {
1810+ operations.emplace (strSubscription, itrAddedSubscription->second );
1811+ }
1812+
1813+ class StitchedRequest : public Request
1814+ {
1815+ public:
1816+ StitchedRequest (TypeMap operations, std::shared_ptr<schema::Schema> schema)
1817+ : Request { std::move (operations), std::move (schema) }
1818+ {
1819+ }
1820+ };
1821+
1822+ return std::make_shared<StitchedRequest>(std::move (operations),
1823+ _schema->StitchSchema (added->_schema ));
1824+ }
1825+
17491826std::list<schema_error> Request::validate (peg::ast& query) const
17501827{
17511828 std::list<schema_error> errors;
0 commit comments