1010use  GraphQL \SchemaGenerator \CodeGenerator \ObjectBuilderInterface ;
1111use  GraphQL \SchemaGenerator \CodeGenerator \QueryObjectClassBuilder ;
1212use  GraphQL \SchemaGenerator \CodeGenerator \UnionObjectBuilder ;
13+ use  GraphQL \SchemaGenerator \SchemaInspector \TypeSubQueryGenerator ;
1314use  GraphQL \SchemaObject \QueryObject ;
1415use  GraphQL \Util \StringLiteralFormatter ;
1516use  RuntimeException ;
@@ -55,19 +56,21 @@ class SchemaClassGenerator
5556     */ 
5657	public  function  __construct (Client $ clientstring  $ writeDir'' , string  $ namespaceDEFAULT_NAMESPACE )
5758    {
58-         $ this schemaInspector      = new  SchemaInspector ($ client
59+         $ this schemaInspector      = new  SchemaInspector ($ client,  new   TypeSubQueryGenerator () );
5960        $ this generatedObjects     = [];
6061        $ this writeDir             = $ writeDir
6162        $ this generationNamespace  = $ namespace
6263        $ this setWriteDir ();
6364    }
6465
6566    /** 
67+      * @param int $typeOfTypeDepth 
68+      * 
6669     * @return bool 
6770     */ 
68- 	public  function  generateRootQueryObject (): bool 
71+ 	public  function  generateRootQueryObject (int   $ typeOfTypeDepth  =  4 ): bool 
6972	{
70- 	    $ objectArray$ this schemaInspector ->getQueryTypeSchema ();
73+ 	    $ objectArray$ this schemaInspector ->getQueryTypeSchema ($ typeOfTypeDepth 
7174        $ rootObjectNameROOT_QUERY_OBJECT_NAME ;
7275        $ queryTypeName$ objectArray'name ' ];
7376        //$rootObjectDescr = $objectArray['description']; 
@@ -79,7 +82,7 @@ public function generateRootQueryObject(): bool
7982        $ this generatedObjects [$ queryTypeNametrue ;
8083
8184        $ queryObjectBuildernew  QueryObjectClassBuilder ($ this writeDir , $ rootObjectName$ this generationNamespace );
82-         $ this appendQueryObjectFields ($ queryObjectBuilder$ rootObjectName$ objectArray'fields ' ]);
85+         $ this appendQueryObjectFields ($ queryObjectBuilder$ rootObjectName$ objectArray'fields ' ],  $ typeOfTypeDepth 
8386        $ queryObjectBuilderbuild ();
8487
8588        return  true ;
@@ -91,8 +94,9 @@ public function generateRootQueryObject(): bool
9194     * @param QueryObjectClassBuilder $queryObjectBuilder 
9295     * @param string                  $currentTypeName 
9396     * @param array                   $fieldsArray 
97+      * @param int                     $typeOfTypeDepth 
9498     */ 
95- 	private  function  appendQueryObjectFields (QueryObjectClassBuilder $ queryObjectBuilderstring  $ currentTypeNamearray  $ fieldsArray) 
99+ 	private  function  appendQueryObjectFields (QueryObjectClassBuilder $ queryObjectBuilderstring  $ currentTypeNamearray  $ fieldsArray,  int   $ typeOfTypeDepth  =  4 ):  void 
96100    {
97101        foreach  ($ fieldsArrayas  $ fieldArray
98102            $ name$ fieldArray'name ' ];
@@ -110,7 +114,7 @@ private function appendQueryObjectFields(QueryObjectClassBuilder $queryObjectBui
110114            } else  {
111115
112116                // Generate nested type object if it wasn't generated 
113-                 $ objectGenerated$ this generateObject ($ typeName$ typeKind
117+                 $ objectGenerated$ this generateObject ($ typeName$ typeKind,  $ typeOfTypeDepth 
114118                if  ($ objectGenerated
115119
116120                    // Generate nested type arguments object if it wasn't generated 
@@ -129,20 +133,21 @@ private function appendQueryObjectFields(QueryObjectClassBuilder $queryObjectBui
129133    /** 
130134     * @param string $objectName 
131135     * @param string $objectKind 
136+      * @param int    $typeOfTypeDepth 
132137     * 
133138     * @return bool 
134139     */ 
135-     protected  function  generateObject (string  $ objectNamestring  $ objectKindbool 
140+     protected  function  generateObject (string  $ objectNamestring  $ objectKind,  int   $ typeOfTypeDepth  =  4 ): bool 
136141    {
137142        switch  ($ objectKind
138143            case  FieldTypeKindEnum::OBJECT :
139-                 return  $ this generateQueryObject ($ objectName
144+                 return  $ this generateQueryObject ($ objectName,  $ typeOfTypeDepth 
140145            case  FieldTypeKindEnum::INPUT_OBJECT :
141-                 return  $ this generateInputObject ($ objectName
146+                 return  $ this generateInputObject ($ objectName,  $ typeOfTypeDepth 
142147            case  FieldTypeKindEnum::ENUM_OBJECT :
143148                return  $ this generateEnumObject ($ objectName
144149            case  FieldTypeKindEnum::UNION_OBJECT :
145-                 return  $ this generateUnionObject ($ objectName
150+                 return  $ this generateUnionObject ($ objectName,  $ typeOfTypeDepth 
146151            default :
147152                print  "Couldn't generate type  $ objectName: generating  $ objectKind kind is not supported yet "  . PHP_EOL ;
148153                return  false ;
@@ -151,39 +156,41 @@ protected function generateObject(string $objectName, string $objectKind): bool
151156
152157    /** 
153158     * @param string $objectName 
159+      * @param int    $typeOfTypeDepth 
154160     * 
155161     * @return bool 
156162     */ 
157-     protected  function  generateQueryObject (string  $ objectNamebool 
163+     protected  function  generateQueryObject (string  $ objectName,  int   $ typeOfTypeDepth  =  4 ): bool 
158164    {
159165        if  (array_key_exists ($ objectName$ this generatedObjects )) {
160166            return  true ;
161167        }
162168
163169        $ this generatedObjects [$ objectNametrue ;
164-         $ objectArray$ this schemaInspector ->getObjectSchema ($ objectName
170+         $ objectArray$ this schemaInspector ->getObjectSchema ($ objectName,  $ typeOfTypeDepth 
165171        $ objectName$ objectArray'name ' ];
166172        $ objectBuildernew  QueryObjectClassBuilder ($ this writeDir , $ objectName$ this generationNamespace );
167173
168-         $ this appendQueryObjectFields ($ objectBuilder$ objectName$ objectArray'fields ' ]);
174+         $ this appendQueryObjectFields ($ objectBuilder$ objectName$ objectArray'fields ' ],  $ typeOfTypeDepth 
169175        $ objectBuilderbuild ();
170176
171177        return  true ;
172178    }
173179
174180    /** 
175181     * @param string $objectName 
182+      * @param int    $typeOfTypeDepth 
176183     * 
177184     * @return bool 
178185     */ 
179-     protected  function  generateInputObject (string  $ objectNamebool 
186+     protected  function  generateInputObject (string  $ objectName,  int   $ typeOfTypeDepth  =  4 ): bool 
180187    {
181188        if  (array_key_exists ($ objectName$ this generatedObjects )) {
182189            return  true ;
183190        }
184191
185192        $ this generatedObjects [$ objectNametrue ;
186-         $ objectArray$ this schemaInspector ->getInputObjectSchema ($ objectName
193+         $ objectArray$ this schemaInspector ->getInputObjectSchema ($ objectName,  $ typeOfTypeDepth 
187194        $ objectName$ objectArray'name ' ];
188195        $ objectBuildernew  InputObjectClassBuilder ($ this writeDir , $ objectName$ this generationNamespace );
189196
@@ -195,7 +202,7 @@ protected function generateInputObject(string $objectName): bool
195202
196203            $ objectGeneratedtrue ;
197204            if  ($ typeKindSCALAR ) {
198-                 $ objectGenerated$ this generateObject ($ typeName$ typeKind
205+                 $ objectGenerated$ this generateObject ($ typeName$ typeKind,  $ typeOfTypeDepth 
199206            }
200207
201208            if  ($ objectGenerated
@@ -245,10 +252,11 @@ protected function generateEnumObject(string $objectName): bool
245252
246253    /** 
247254     * @param string $objectName 
255+      * @param int    $typeOfTypeDepth 
248256     * 
249257     * @return bool 
250258     */ 
251-     protected  function  generateUnionObject (string  $ objectNamebool 
259+     protected  function  generateUnionObject (string  $ objectName,  int   $ typeOfTypeDepth  =  4 ): bool 
252260    {
253261        if  (array_key_exists ($ objectName$ this generatedObjects )) {
254262            return  true ;
@@ -261,7 +269,7 @@ protected function generateUnionObject(string $objectName): bool
261269        $ objectBuildernew  UnionObjectBuilder ($ this writeDir , $ objectName$ this generationNamespace );
262270
263271        foreach  ($ objectArray'possibleTypes ' ] as  $ possibleType
264-             $ this generateObject ($ possibleType'name ' ], $ possibleType'kind ' ]);
272+             $ this generateObject ($ possibleType'name ' ], $ possibleType'kind ' ],  $ typeOfTypeDepth 
265273            $ objectBuilderaddPossibleType ($ possibleType'name ' ]);
266274        }
267275        $ objectBuilderbuild ();
@@ -272,10 +280,11 @@ protected function generateUnionObject(string $objectName): bool
272280    /** 
273281     * @param string $argsObjectName 
274282     * @param array  $arguments 
283+      * @param int    $typeOfTypeDepth 
275284     * 
276285     * @return bool 
277286     */ 
278-     protected  function  generateArgumentsObject (string  $ argsObjectNamearray  $ argumentsbool 
287+     protected  function  generateArgumentsObject (string  $ argsObjectNamearray  $ arguments,  int   $ typeOfTypeDepth  =  4 ): bool 
279288    {
280289        if  (array_key_exists ($ argsObjectName$ this generatedObjects )) {
281290            return  true ;
@@ -293,7 +302,7 @@ protected function generateArgumentsObject(string $argsObjectName, array $argume
293302
294303            $ objectGeneratedtrue ;
295304            if  ($ typeKindSCALAR ) {
296-                 $ objectGenerated$ this generateObject ($ typeName$ typeKind
305+                 $ objectGenerated$ this generateObject ($ typeName$ typeKind,  $ typeOfTypeDepth 
297306            }
298307
299308            if  ($ objectGenerated
0 commit comments