public void ValidateEntitiesDoNotGenerateDuplicateQueriesOrMutation()

in src/Core/Configurations/RuntimeConfigValidator.cs [449:506]


    public void ValidateEntitiesDoNotGenerateDuplicateQueriesOrMutation(DatabaseType databaseType, RuntimeEntities entityCollection)
    {
        HashSet<string> graphQLOperationNames = new();

        foreach ((string entityName, Entity entity) in entityCollection)
        {
            if (!entity.GraphQL.Enabled)
            {
                continue;
            }

            bool containsDuplicateOperationNames = false;
            if (entity.Source.Type is EntitySourceType.StoredProcedure)
            {
                // For Stored Procedures a single query/mutation is generated.
                string storedProcedureQueryName = GraphQLNaming.GenerateStoredProcedureGraphQLFieldName(entityName, entity);

                if (!graphQLOperationNames.Add(storedProcedureQueryName))
                {
                    containsDuplicateOperationNames = true;
                }
            }
            else
            {
                // For entities (table/view) that have graphQL exposed, two queries, three mutations for Relational databases (e.g. MYSQL, MSSQL etc.)
                // and four mutations for CosmosDb_NoSQL would be generated.
                // Primary Key Query: For fetching an item using its primary key.
                // List Query: To fetch a paginated list of items.
                // Query names for both these queries are determined.
                string pkQueryName = GraphQLNaming.GenerateByPKQueryName(entityName, entity);
                string listQueryName = GraphQLNaming.GenerateListQueryName(entityName, entity);

                // Mutations names for the exposed entities are determined.
                string createMutationName = $"create{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
                string updateMutationName = $"update{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
                string deleteMutationName = $"delete{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";
                string patchMutationName = $"patch{GraphQLNaming.GetDefinedSingularName(entityName, entity)}";

                if (!graphQLOperationNames.Add(pkQueryName)
                    || !graphQLOperationNames.Add(listQueryName)
                    || !graphQLOperationNames.Add(createMutationName)
                    || !graphQLOperationNames.Add(updateMutationName)
                    || !graphQLOperationNames.Add(deleteMutationName)
                    || ((databaseType is DatabaseType.CosmosDB_NoSQL) && !graphQLOperationNames.Add(patchMutationName)))
                {
                    containsDuplicateOperationNames = true;
                }
            }

            if (containsDuplicateOperationNames)
            {
                HandleOrRecordException(new DataApiBuilderException(
                    message: $"Entity {entityName} generates queries/mutation that already exist",
                    statusCode: HttpStatusCode.ServiceUnavailable,
                    subStatusCode: DataApiBuilderException.SubStatusCodes.ConfigValidationError));
            }
        }
    }